Управление ардуинкой с web сервера

Тема в разделе "Arduino & Shields", создана пользователем duchess, 15 мар 2017.

  1. duchess

    duchess Нуб

    Всем привет, можете пожалуйста помочь. Делаю проект на ардуино, с платой GRPS_SHIELD с SIM900, на сервер передаю данные с датчиков через http запрос, так как на сервере отсутствует TCP, но хочу реализовать чтобы мог управлять ардуинкой с сайта, как можно это сделать? ничего пока что не смог найти, находил только примеры с ethernet шилдом, но я выхожу в интернет по мобильной сети.
    Так же был вариант, чтобы управлять с мобильного приложения, но вопрос снова же встал с тем, как подключится к ардуино по сети через приложение и им управлять.
     
  2. mcureenab

    mcureenab Гуру

    Что?
     
  3. rkit

    rkit Гуру

    Не смущает, что HTTP работает по TCP?
     
  4. duchess

    duchess Нуб

    Да, я просто написал не верно. Было просто два варианта через TCP/IP или через HTTP с помощью GET запроса
     
  5. rkit

    rkit Гуру

    Давайте еще вернее пишите. Что у вас клиент, что сервер?
     
  6. mcureenab

    mcureenab Гуру

    Ну и что? GET как забирает файл с сервера так и отправляет на него данные в строке URL. Так что данные и туда и обратно ходят. В чем проблема то?
     
  7. duchess

    duchess Нуб

    Вообщем, у меня есть Arduino с GRPS_SHIELD на SIM900. Цель, это чтобы я мог отправлять данные (к примеру темперартуру) с ардуино на сервер и отображать их на сайте (что я уже осуществил) и с помощью сайта отправлять запрос на саму ардуинку (к примеру перезагрузить его или выключить вовсе).
     
  8. duchess

    duchess Нуб

    Тогда, как сделать с помощью GET запроса, чтобы я управлял ардуино? Вот какой код у меня
     

    Вложения:

  9. rkit

    rkit Гуру

    Запрашиваете get-запросом команду и интерпретируете ее.
     
  10. duchess

    duchess Нуб

    Вот это, конечно, извините, но вот не понял как сделать такое
     
  11. rkit

    rkit Гуру

    Так же, как и обычно информацию запрашиваете. Числа вы принимаете? Вот пронумеруйте команды, запрашиваете число, и выполняете команду, соответствующую этому числу.
     
  12. duchess

    duchess Нуб

    не доходит до меня что-то в итоге, ладно, спасибо
     
  13. user999

    user999 Гик

    Вы обращаетесь к странице Get запросом

    Код (C++):
        client.connect(server, 80);
        client.print( "GET /data.php?");
    А страница вам выдает ответ. Какой либо ответ
    Вы его читаете
    Код (C++):
    c = client.read();
    Ну и потом на ардуино обрабатываете ответ.
    Например, обратились к странице index.php?off
    Получили ответ: "1"
    В коде пишите:
    if (anver == 1) { выключить мою ардуинку}
    В общем подход такой.

    У вас же ардуино - клиент. Поэтому сервер не может посылать команды ардуино, следовательно выход: ардуино обращаться к серверу и получать ответы.
     
    arkadyf нравится это.
  14. duchess

    duchess Нуб

    А как тогда соединить то что вы написали? Просто вот мой вариант, как я обращался к серверу, если это не правильно, то буду только рад, если поправите.
     

    Вложения:

  15. user999

    user999 Гик

    это ваш сервер remote-motor.ru или на нем есть страница к которая отвечает за перезагрузку или выключение ардуино?
    Если нет то не получится отдавать команды ардуино.
    Создайте страничку, которая будет отдавать "1" и научитесь обрабатывать ответы сервера. Примеры есть в библиотеке ethernet. Для gprs, думаю будет схожий код.
     
    arkadyf нравится это.
  16. duchess

    duchess Нуб

    да, это мой сервер
     
  17. user999

    user999 Гик

    ну так напишите php файлик типа:
    example.php
    PHP:
    if(isset($_GET["reboot"])){
       echo "1";
    }
    и обратитесь к нему
    example.php?reboot
    А дальше читайте ответ сервера, выводите его в serial порт и смотрите как вытащить эту единицу.
    Я не нашел готового решения что бы парсить ответы и сделал так:
    Код (C++):
    client.connect(myserver, 80);
      client.print( "GET /data.php?action");
      client.println(" HTTP/1.1");
      client.print( "Host: " );
      client.println(server);
      client.println( "Connection: close" );
      client.println();
      client.println();
      while(b == 0) {
        if (client.available()) {
          c = client.read();
          if (c == '\n') startRead ++;
          if (startRead == 7) {
            if (c!= '\n') ansver += c;
          }
        } else {
          if (ansver.length() > 0) {
    //тут присваиваю переменной значение из ответа или выполняю какие то действия
          }
       }
    }
     
  18. duchess

    duchess Нуб

    не получается сделать, так как не видит функции connect(), stop(). Сделал как было у меня + добавил немного строчек, но заработал только один раз и не могу уловить почему и то с 10 раза подключался к серверу и обновил, поменять чтобы вместо 1 было 0, теперь снова жду когда заработает
     

    Вложения:

  19. user999

    user999 Гик

    Так сервер не только "1" выдает. Ответ сервера из многих символов состоит и заголовок занимает 6-7 строк, потом пустая строка, а потом уже ответ. Вы в порт выведите "с" и увидите, что сервер выдал. Я решил считать окончания строк. и как их будет 7 то значит началось тело ответа. Посмотрите в моем примере. Но это тоже не лучший вариант, т.к. он не универсальных, сервер может и 6 и 7 и больше строк в заголовке отдать. Это мой временный вариант
     
  20. duchess

    duchess Нуб

    Понял, у меня тогда еще вопрос, как считать вот такие данные со строки "http://www.remote-motor.ru/getstate.php?reboot=1"
    У меня же получается вместо 1 и 0 может быть, но как сделать проверку такого запроса? Получается нужно сделать get запрос так "http://www.remote-motor.ru/getstate.php?reboot="+data+"", но тогда что поставить в переменную data. Я так понимаю он должен вернуть это значение