我正在构建一个简单的网站,当主机从连接到同一网络的另一台设备接收数据时,该网站应更新文本文件 . 有问题的设备是一个测量温度的小型气象站 . 站点通过PHP GET命令通过来自ESP8266芯片的Wifi发送温度 . 该信号由家庭路由器接收并重定向到托管该网站的网络上的笔记本电脑 .
我有问题,因为ESP8266芯片似乎正确发送数据/ PHP GET命令 . 然而,该网站从未更新自己 .
为了简化故障排除系统,气象站由笔记本电脑取代 . 笔记本电脑通过USB转串口(UART)电缆直接连接到ESP8266芯片 . 所有与ESP8266芯片通信的AT命令都在Arduino IDE串行监视器中输入 .
The website
该网站非常简单 . 每当它从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.
The ESP8266 Chip
如上所述,在最终系统中,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” . 但没有任何反应......
有什么建议?
Additional Notes
1)我使用的PHP和AT代码与本文中的内容非常相似:https://www.youtube.com/watch?v=q02f4sPghSo .
2)正如下面的一些评论所指出的,GET命令可能不那么传统 . POST或PUT可能更合适 . 但目前我只是想了解为什么网站没有响应芯片 .
1 回答
好的,我已经找到了问题所在 .
事实证明,Arduino IDE串行监视器不会将“\ r”和“\ n”识别为特殊字符,并将它们视为4个字符 . 但是,当我在Arduino IDE串行监视器中键入“Enter”(或单击“发送按钮”)时,它会自动发送回车符和换行符(比我尝试发送的字符串多两个字符) . 因此,每当我想通过IDE向串口发送“\ r \ n”时,我需要按Enter键来完成 . 如果在我要发送的字符串中间有这样的“\ r \ n”(就像我的例子中的情况那样),则必须将字符串剪切为两个(或更多) .
因此我修改了我的代码的这一部分:
这样:
请注意"GET /index.php?temp=10 HTTP/1.1"长度为31个字符 . 单击"Enter"时,串行监视器将添加两个字符 . 这解释
AT+CIPSEND=33
用于发送此行,而不是AT+CIPSEND=31
.同样,"Host: 192.168.1.2"长度为19个字符 . 当为回车和换行添加2个字符时,我们得到21个字符,所以
AT+CIPSEND=21
.然后,服务器以正确的响应进行应答 .