Не работает HTTP запрос к веб серверу

Тема в разделе "Arduino & Shields", создана пользователем Pavel666666, 6 окт 2019.

  1. Pavel666666

    Pavel666666 Нуб

    Добрый день. Стоит задача передачи данных с Arduino Uno на веб сервер. Хотел сначала делать через FTP, но потом решил через HTTP. Итак вот скетч:
    Код (C++):
    #include <SPI.h>
    #include <Ethernet.h>

    byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
    const int analogInPin = A0;
    int sensorValue = 0;
    char host[] ="www.mysite.ru";
    EthernetClient client;


    void setup()
    {

    Serial.begin(9600);
    pinMode(LEDPIN, OUTPUT);
    Ethernet.begin(mac);
    client.connect(host,80);
    }

    void loop()
    {
    sensorValue = analogRead(analogInPin);
    if(client.connected())
    {
    client.println("GET /dataupdate.php?");
    client.print("d=");
    client.print(sensorValue);
    client.println("HTTP/1.1");
    client.print("Host: ");
    client.println(host);
    client.println("Connection: keep-alive");
    client.println();
    client.println();
    if(client.available())
    {
    char c = client.read();
    Serial.print(c);
    }
    }
    else{ client.connect(host,80);}
    }
    На серверной части крутиться php скрипт:
    PHP:
    <?php
    $fd = fopen("/data.!!!", 'w');
    fwrite($fd, $_GET["d"]);
    fclose($fd);
    ?>
    Он записывает значения полученные от ардуино в файл. Далее страница html, используя xhr подгружает на страницу эти данные из файла:

    HTML:
    <html>
    <head>
    <title>JS</title>
    <script>
    function getdata(filepath, id)
    {
    let xmlhttp = new XMLHttpRequest();
    xmlhttp.open("GET", filepath, true);
    xmlhttp.send(null);
    xmlhttp.onreadystatechange = function(){
    document.getElementById(id).innerHTML = xmlhttp.responseText;
    }
    }
    setInterval(getdata, 500, "/data.!!!", "data")
    </script>
    </head>
    <body>
    <div id="data"></div>
    </body>
    </html>
    Монитор порта показывает ответ от сервера, что все Ok, код 200. Но данные не перезаписываются. Не могли бы подсказать в чем может быть причина?
     
  2. NikitOS

    NikitOS Король шутов Администратор

    Не работает, потому что скрипт не правильный
    Этот попробуйте:

    PHP:
    <?php
      file_put_contents('./file.txt', $_GET['d'], FILE_APPEND);
    И вообще,что за расширение "!!!"?
     
  3. Pavel666666

    Pavel666666 Нуб

    Спасибо за ответ, однако не помогло. Как я понял ваш скрипт это просто переделанный мой на другой лад. Расширение поставил для консперации)).
     
  4. NikitOS

    NikitOS Король шутов Администратор

    А файл на сервере-то перезаписывается?
    Или проблема в получении?
     
  5. Pavel666666

    Pavel666666 Нуб

    От запроса адруино файл не перезаписывается. Однако если напрямую послать запрос, например через адресную строку браузера, то запрос проходит. Логично предположить что, что-то не так со скетчем.
     
  6. NikitOS

    NikitOS Король шутов Администратор

    А для чего в коде Connection: keep-alive?
    Если это:
    Код (Text):
    client.println("GET /dataupdate.php?");
    client.print("d=");
    client.print(sensorValue);
    client.println("HTTP/1.1");
    client.print("Host: ");
    client.println(host);
    client.println("Connection: keep-alive");
    client.println();
    client.println();
     
    Заменить на это:
    Код (Text):
    client.print(
      String(
    "GET /dataupdate?d=" + String(sensorValue) + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"
    ));
    Работать будет? (я это из другого кода вырвал, там работает)
     
  7. Pavel666666

    Pavel666666 Нуб

    Попробовал, но все равно никак. Keep-alive надо потому, что клиент(Ардуинка), по времени отправляет данные на сервер, и нет необходимости разрывать соединение
     
  8. NikitOS

    NikitOS Король шутов Администратор

    А я как дурак всегда новые соединения создаю :(
     
  9. Pavel666666

    Pavel666666 Нуб

    Если делать close, то через монитор порта видно, что клиент не успевает принять данные и закрывает соединение, чего нет при keep-alive. В общем пока не понятно почему запрос не проходит, с первого взгляда вроде все правильно, ардуино формирует запрос, php скрипт должен его обрабатывать, и записывать в файл. Но почему-то этого не происходит(
     
  10. NikitOS

    NikitOS Король шутов Администратор

    А Content-Length кто добавлять будет? :)
     
  11. NikitOS

    NikitOS Король шутов Администратор

    Могу дать код для отправки данных на dweet.io, он для esp8266, но отличия там не большие
    Код (C++):

    #include <ESP8266WiFi.h>                             //Подключаем библиотеку для работы с WiFi
    #include <DHT11.h>                                   //Подключаем библиотеку для работы с датчиком температуры и влажности dht11

    DHT11 dht(D4);                                       //Создаем объект класса DHT11 с именем dht

    String Name = "MV-i_IoT";                            //Имя вашего устройства, должно быть уникальным
    String host = "dweet.io";                            //Адрес сервера на который будем отправлять данные
    const int port = 80;                                 //Порт для подключения к серверу

    const char* ssid = "ssid";                           //Имя Вашей сети WiFi
    const char* password = "password";                   //Пароль Вашей сети WiFi

    void setup(void) {
      WiFi.mode(WIFI_STA);                               //Режим работы WiFi
      WiFi.begin(ssid, password);                        //Подключение к сети WiFi
      dht.begin();                                       //Инициализация датчика dht11
    }

    void loop(void) {
      WiFiClient client;                                 //Инициализация WiFi клиента
      int temp = dht.getTemperature();                   //Переменная хранящая значение температуры
      int hum = dht.getHumidity();                       //Переменная хранящая значение влажности
      int check = dht.read();                            //Переменная хранящая данные с датчика dht11

      if (!client.connect(host, port)) {return;}         //Подключаемся к серверу
      switch (check) {                                   //Проверяем наличие ошибок данных dht11
        case DHT_OK:                                     //Если ошибок нет
        client.print(String("GET /dweet/for/" + Name +"?Temperature=" + String(temp) + "&Humidity=" + String(hum) + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n")); //Передаем данные на сервер
        delay(10);                                       //Небольшая задержка...
        while (client.available()) {}                    //Получаем ответ сервера
        break;                                           //Обрываем цикл, начинаем сначала
      }
    }
     
     
  12. Pavel666666

    Pavel666666 Нуб

    Спасибо большое. Сам я кстати использую шилд WIZNet. Завтра поизучаю ваш скетч, и отпишусь по результатам
     
  13. Pavel666666

    Pavel666666 Нуб

    В общем походу не работает из-за того, что хостинг использую бесплатный. В ответе от сервера приходит такое:
    Код (Javascript):
    <html>
    <body>
    <script type="text/javascript" src="/aes.js" >
    </script>
    <script>function toNumbers(d){var e=[];d.replace(/(..)/g,function(d){e.push(parseInt(d,16))});return e}function toHex(){for(var d=[],d=1==arguments.length&&arguments[0].constructor==Array?arguments[0]:arguments,e="",f=0;f<d.length;f++)e+=(16>d[f]?"0":"")+d[f].toString(16);return e.toLowerCase()}var a=toNumbers("f655ba9d09a112d4968c63579db590b4"),b=toNumbers("98344c2eee86c3994890592585b49f80"),c=toNumbers("b4064f445ed7b3f91d5b9b7ab5edfa11");document.cookie="__test="+toHex(slowAES.decrypt(c,2,a,b))+"; expires=Thu, 31-Dec-37 23:55:55 GMT; path=/"; location.href="http://pasha9696.qlihost.ru/dataupdate.php?d=111&i=1";</script>
    <noscript>This site requires Javascript to work, please enable Javascript in your browser or use a browser with Javascript support</noscript>
    </body>
    </html>
    Почитал в гугле, и вроде говорят что такая жопа из-за бесплатного хостинга
     
  14. NikitOS

    NikitOS Король шутов Администратор

    Ну да, 000webhost, самое то XD
    Уж почему не взять у того же HostiMan`a бесплатный...
     
  15. Pavel666666

    Pavel666666 Нуб

    В общем заработало. Действительно, перешел на другой хостинг и все пошло. Однако до сих пор интересно как тот хостинг перехватывает сообщения от ардуинки, и не пускает их. Кажется мне здесь замешаны куки
     
  16. Memfis09

    Memfis09 Нерд

    Доброго времени суток,
    могли бы дать ссылки на библиотеки для данного скетча?
    А то пишет либо несколько и не знает какую выбрать, либо просто отсутствует.
    Спасибо!
     
  17. NikitOS

    NikitOS Король шутов Администратор

    Библиотека ESP8266WiFi идёт вместе с пакетом ESP8266, а вместо библиотеки DHT11 можно использовать TroykaDHT, будет работать. Только название сменить
     
  18. Memfis09

    Memfis09 Нерд

    Код (C++):
    #include <ESP8266WiFi.h>                             //Подключаем библиотеку для работы с WiFi
    #include <TroykaDHT.h>                                   //Подключаем библиотеку для работы с датчиком температуры и влажности dht11

    DHT11 dht(D4);                                       //Создаем объект класса DHT11 с именем dht

    String Name = "xxxxx";                            //Имя вашего устройства, должно быть уникальным
    String host = "dweet.io";                            //Адрес сервера на который будем отправлять данные
    const int port = 80;                                 //Порт для подключения к серверу

    const char* ssid = "xxx";                           //Имя Вашей сети WiFi
    const char* password = "xxx";                   //Пароль Вашей сети WiFi

    void setup(void) {
      WiFi.mode(WIFI_STA);                               //Режим работы WiFi
      WiFi.begin(ssid, password);                        //Подключение к сети WiFi
      TroykaDHT.begin();                                       //Инициализация датчика dht11
    }

    void loop(void) {
      WiFiClient client;                                 //Инициализация WiFi клиента
      int temp = TroykaDHT.getTemperature();                   //Переменная хранящая значение температуры
      int hum = TroykaDHT.getHumidity();                       //Переменная хранящая значение влажности
      int check = TroykaDHT.read();                            //Переменная хранящая данные с датчика dht11
      if (!client.connect(host, port)) {return;}         //Подключаемся к серверу
      switch (check) {                                   //Проверяем наличие ошибок данных dht11
        case TroykaDHT_OK:                                     //Если ошибок нет
        client.print(String("GET /dweet/for/" + Name +"?Temperature=" + String(temp) + "&Humidity=" + String(hum) + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n")); //Передаем данные на сервер
        delay(10);                                       //Небольшая задержка...
        while (client.available()) {}                    //Получаем ответ сервера
        break;                                           //Обрываем цикл, начинаем сначала
      }
    }
    получился код выше, но теперь ругается на 'TroykaDHT' was not declared in this scope
    данный код ведь надо будет заливать в модуль ESP?
     
  19. NikitOS

    NikitOS Король шутов Администратор

    В моем коде заменить «#include <DHT11.h>» на «#include <TroykaDHT.h>» и «DHT11 dht(D4);» на «DHT dht(D4, DHT11); »
    Остальное не трогать
     
  20. Memfis09

    Memfis09 Нерд

    на строчку DHT dht(D4, DHT11); ругается
    exit status 1
    'D4' was not declared in this scope