ESP8266 Wifi芯片发送PHP GET请求但网站未收到
Posted
技术标签:
【中文标题】ESP8266 Wifi芯片发送PHP GET请求但网站未收到【英文标题】:PHP GET request sent by ESP8266 Wifi chip but not received by website 【发布时间】:2016-08-01 02:55:59 【问题描述】:我正在构建一个简单的网站,当主机从连接到同一网络的另一台设备接收数据时,它应该更新一个文本文件。有问题的设备是一个测量温度的小型气象站。温度由站通过 ESP8266 芯片的 Wifi 以 php GET 命令发送。信号由家庭路由器接收并重定向到托管该网站的网络上的笔记本电脑。
我遇到了问题,因为 ESP8266 芯片似乎可以正确发送数据/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
所以此时,消息“温度为 10 oC”。应该出现在串行监视器中,并且数字“10”应该附加到文件“data.txt”中。但是什么也没发生……
有什么建议吗?
附加说明
1) 我使用的 PHP 和 AT 代码与这篇文章中介绍的非常相似:https://www.youtube.com/watch?v=q02f4sPghSo。
2) 正如在下面的一些 cmets 中所指出的,GET 命令可能不那么传统。 POST 或 PUT 可能更合适。然而目前我只是想了解为什么网站没有响应芯片。
【问题讨论】:
仅供参考,使用 GET 请求来修改服务器的状态是很差/非常规/相反的风格。您应该使用 POST 或 PUT。 使用协议嗅探器查看网络上实际发生的情况,了解正在发生的请求/响应。 @barny:感谢您提供上述信息。有什么协议嗅探器可以推荐吗?我不熟悉协议嗅探器。 wireshark.org 可能是您的最佳选择,它有一个图形化的前端并且很容易上手。Recv 56 bytes
- 他们是什么?
【参考方案1】:
好的,我已经解决了问题。
事实证明,Arduino IDE 串行监视器无法将“\r”和“\n”识别为特殊字符,并将它们视为 4 个字符。但是,当我在 Arduino IDE 串行监视器中键入“Enter”(或单击“发送按钮”)时,它会自动发送一个回车符和一个换行符(比我尝试发送的字符串多两个字符)。因此,每当我想通过 IDE 向 Serial 发送“\r\n”时,我都需要按 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
。
同样,“主机: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
【讨论】:
以上是关于ESP8266 Wifi芯片发送PHP GET请求但网站未收到的主要内容,如果未能解决你的问题,请参考以下文章