【发布时间】: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- 他们是什么?
标签: php apache serial-port at-command esp8266