apache — запрос PHP GET, отправленный чипом ESP8266 Wifi, но не полученный веб-сайтом

Я создаю простой веб-сайт, который должен обновлять текстовый файл, когда хост получает данные от другого устройства, подключенного к той же сети. Данное устройство представляет собой небольшую метеостанцию, которая измеряет температуру. Температура отправляется станцией в виде команды PHP GET через Wifi с чипа ESP8266. Сигнал принимается домашним маршрутизатором и перенаправляется на ноутбук в сети, где размещается веб-сайт.

У меня возникли проблемы, потому что чип ESP8266, кажется, правильно отправляет команду data / PHP GET. Тем не менее, сайт никогда не обновляется.

Чтобы упростить систему поиска неисправностей, метеостанция заменена на ноутбук. Ноутбук подключается напрямую к микросхеме ESP8266 через кабель USB-to-Serial (UART). Все AT-команды для связи с чипом ESP8266 набираются в последовательном мониторе Arduino IDE.

Веб-сайт

Сайт очень прост. Всякий раз, когда он получает данные от микросхемы ESP8266, он записывает их в текстовом файле.

Сайт хранится на ноутбуке с IP-адресом 192.168.1.2.

phodor@UBUNTU:~$ ifconfig
wlp2s0    Link encap:Ethernet  HWaddr 18:cf:5e:ee:3f:10
inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0

Сайт представляет собой php-файл, размещенный на сервере apache2. При запуске файл php сохраняет температуру в файле data.txt. Файлы хранятся в / var / www / html.

phodor@UBUNTU:~$ ls -la /var/www/html
-rwxrwxrwx 1 root root     0 Jul 31 22:41 data.txt
-rwxr-xr-x 1 root root   127 Jul 31 21:40 index.php

Любой запрос GET, отправляемый в файл PHP, должен содержать температуру, чтобы файл PHP мог сохранять температуру в файле data.txt.

phodor@UBUNTU:~$ cat /var/www/html/index.php

<!DOCTYPE html>
<html>
<body>
<?php
$a = $_GET['temp'];
$dataSaved = file_put_contents("data.txt",$a . "\n",FILE_APPEND);
echo "Temperature is " . $a . " oC.";
?>
</body>
</html>

Когда я набираю вручную следующую строку в Firefox:

http://192.168.1.2/index.php?temp=28

Следующий текст отображается в браузере & число «28» сохраняется в файле data.txt.

Temperature is 28 oC.

Чип ESP8266

Как объяснено выше, в финальной системе чип ESP8266 будет получать последовательные инструкции от небольшой метеостанции. Но чтобы упростить отладку, чип теперь подключен к ноутбуку с помощью кабеля USB-to-Serial (UART). Последовательные команды отправляются на чип с помощью последовательного монитора Arduino IDE. Вот отправленные команды.

AT

OK
AT+CWLAP
+CWLAP:(3,"MYMODEM",-31,"aa:bb:cc:dd:ee:ff",1,21)

OK
AT+CWJAP="MYMODEM","mypassword"
WIFI CONNECTED
WIFI GOT IP

OK
AT+CIPSTART="TCP","192.168.1.2",80
CONNECT

OK
AT+CIPSEND=56

OK
> GET /index.php?temp=10 HTTP/1.1\r\nHost: 192.168.1.2\r\n\r\n

busy s...

Recv 56 bytes

SEND OK
CLOSED

Поэтому в этот момент появляется сообщение «Температура равна 10 oC». должен появиться в Serial Monitor, а число «10» должно быть добавлено в файл «data.txt». Но ничего не происходит …

Какие-либо предложения?

Дополнительные примечания

1) Я использую код PHP и AT, очень похожий на тот, что представлен в этом посте: https://www.youtube.com/watch?v=q02f4sPghSo .

2) Как было указано в некоторых комментариях ниже, команда GET может быть менее обычной. POST или PUT могут быть более подходящими. Пока что я только пытаюсь понять, почему веб-сайт не отвечает на чип.

1

Решение

Хорошо, я понял проблему.

Оказывается, что Arduino IDE Serial Monitor не распознает «\ r» и «\ n» как специальные символы и обрабатывает их как 4 символа. Однако, когда я набираю «Enter» (или нажимаю «Отправить») в Arduino IDE Serial Monitor, он автоматически отправляет возврат каретки & символ перевода строки (на два символа больше, чем строка, которую я пытаюсь отправить). Поэтому всякий раз, когда я хочу отправить «\ r \ n» в Serial через IDE, мне нужно сделать это, нажав Enter. Если в середине строки, которую я хочу отправить, есть такой «\ r \ n» (как в моем примере), строка должна быть разрезана на две (или больше).

Поэтому я изменил эту часть моего кода:

AT+CIPSEND=56

OK
> GET /index.php?temp=10 HTTP/1.1\r\nHost: 192.168.1.2\r\n\r\n

этим:

AT+CIPSEND=33OK
> GET /index.php?temp=10 HTTP/1.1        (here I press "Enter")
Recv 33 bytes

SEND OK
AT+CIPSEND=21OK
> Host: 192.168.1.2          (here I press "Enter")
Recv 21 bytes

SEND OK

Обратите внимание, что длина «GET /index.php?temp=10 HTTP / 1.1» составляет 31 символ. Когда я нажму «Enter», Serial Monitor добавит два символа. Это объясняет AT+CIPSEND=33 для отправки этой строки, а не AT+CIPSEND=31,

Аналогично, «Host: 192.168.1.2» имеет длину 19 символов. При добавлении 2 символов для возврата каретки и перевода строки мы получаем 21 символ, поэтому AT+CIPSEND=21,

Затем сервер отвечает с правильным ответом.

+IPD,215:HTTP/1.1 200 OK
Date: Sat, 06 Aug 2016 13:39:59 GMT
Server: Apache/2.4.18 (Ubuntu)
Content-Length: 67
Content-Type: text/html; charset=UTF-8

<!DOCTYPE html>
<html>
<body>
Temperature is 10 oC.</body>
</html>
CLOSED
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector