PHP ESP8266 Wifi芯片发送GET请求,网站未收到
PHP GET request sent by ESP8266 Wifi chip but not received by website
我正在构建一个简单的网站,它应该在主机从连接到同一网络的另一台设备接收到数据时更新文本文件。所讨论的设备是一个测量温度的小型气象站。温度由站点在 PHP GET 命令中通过 Wifi 从 ESP8266 芯片发送。信号由家庭路由器接收并重定向到托管网站的网络上的笔记本电脑。
我遇到问题是因为 ESP8266 芯片似乎正确发送了 data/PHP GET 命令。然而该网站从不更新自己。
为了简化故障排除系统,气象站被笔记本电脑取代。笔记本电脑通过 USB 转串口 (UART) 电缆直接连接到 ESP8266 芯片。所有与ESP8266芯片通信的AT命令都在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
该网站是托管在 apache2 服务器上的 php 文件。执行时,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
发送到 PHP 文件的任何 GET 请求都应包含温度,以便 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 转串口 (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
所以此时,消息 "Temperature is 10 oC." 应该出现在串行监视器中,数字“10”应该附加到文件 "data.txt"。但是什么也没发生...
有什么建议吗?
补充说明
1) 我使用的 PHP 和 AT 代码与 post 中提供的代码非常相似:https://www.youtube.com/watch?v=q02f4sPghSo .
2) 正如下面一些评论中所指出的,GET 命令可能不那么传统。 POST 或 PUT 可能更合适。然而目前我只是想了解为什么网站没有响应芯片。
好的,我已经找到问题了。
事实证明,Arduino IDE 串口监视器无法将“\r”和“\n”识别为特殊字符,并将它们视为 4 个字符。但是,当我在 Arduino IDE 串行监视器中键入 "Enter"(或单击 "Send button")时,它会自动发送回车符 return 和换行符(两个字符比我要发送的字符串还要多)。因此,无论何时我想通过 IDE 发送“\r\n”到 Serial,我都需要按 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=33
OK
> GET /index.php?temp=10 HTTP/1.1 (here I press "Enter")
Recv 33 bytes
SEND OK
AT+CIPSEND=21
OK
> Host: 192.168.1.2 (here I press "Enter")
Recv 21 bytes
SEND OK
请注意 "GET /index.php?temp=10 HTTP/1.1" 的长度为 31 个字符。当我点击 "Enter" 时,串行监视器将添加两个字符。这解释了发送此行的 AT+CIPSEND=33
,而不是 AT+CIPSEND=31
。
同理,"Host: 192.168.1.2"也是19个字符长。当为 carriage-return-and-line-feed 添加 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
我正在构建一个简单的网站,它应该在主机从连接到同一网络的另一台设备接收到数据时更新文本文件。所讨论的设备是一个测量温度的小型气象站。温度由站点在 PHP GET 命令中通过 Wifi 从 ESP8266 芯片发送。信号由家庭路由器接收并重定向到托管网站的网络上的笔记本电脑。
我遇到问题是因为 ESP8266 芯片似乎正确发送了 data/PHP GET 命令。然而该网站从不更新自己。
为了简化故障排除系统,气象站被笔记本电脑取代。笔记本电脑通过 USB 转串口 (UART) 电缆直接连接到 ESP8266 芯片。所有与ESP8266芯片通信的AT命令都在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
该网站是托管在 apache2 服务器上的 php 文件。执行时,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
发送到 PHP 文件的任何 GET 请求都应包含温度,以便 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 转串口 (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
所以此时,消息 "Temperature is 10 oC." 应该出现在串行监视器中,数字“10”应该附加到文件 "data.txt"。但是什么也没发生...
有什么建议吗?
补充说明
1) 我使用的 PHP 和 AT 代码与 post 中提供的代码非常相似:https://www.youtube.com/watch?v=q02f4sPghSo .
2) 正如下面一些评论中所指出的,GET 命令可能不那么传统。 POST 或 PUT 可能更合适。然而目前我只是想了解为什么网站没有响应芯片。
好的,我已经找到问题了。
事实证明,Arduino IDE 串口监视器无法将“\r”和“\n”识别为特殊字符,并将它们视为 4 个字符。但是,当我在 Arduino IDE 串行监视器中键入 "Enter"(或单击 "Send button")时,它会自动发送回车符 return 和换行符(两个字符比我要发送的字符串还要多)。因此,无论何时我想通过 IDE 发送“\r\n”到 Serial,我都需要按 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=33
OK
> GET /index.php?temp=10 HTTP/1.1 (here I press "Enter")
Recv 33 bytes
SEND OK
AT+CIPSEND=21
OK
> Host: 192.168.1.2 (here I press "Enter")
Recv 21 bytes
SEND OK
请注意 "GET /index.php?temp=10 HTTP/1.1" 的长度为 31 个字符。当我点击 "Enter" 时,串行监视器将添加两个字符。这解释了发送此行的 AT+CIPSEND=33
,而不是 AT+CIPSEND=31
。
同理,"Host: 192.168.1.2"也是19个字符长。当为 carriage-return-and-line-feed 添加 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