我正在构建一个简单的网站,当主机从连接到同一网络的其他设备接收数据时,该网站应更新文本文件。有问题的设备是一个测量温度的小型气象站。站点通过PHP GET命令通过ESP8266芯片的Wifi发送温度。该信号由家用路由器接收,并重定向到托管该网站的网络上的笔记本电脑。
我遇到了问题,因为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
以下文字显示在浏览器&amp;数字“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)正如下面的一些评论所指出的,GET命令可能不那么传统。 POST或PUT可能更合适。但目前我只想了解为什么网站没有响应芯片。
答案 0 :(得分:1)
好的,我已经找到了问题。
事实证明,Arduino IDE串行监视器不会将“\ r”和“\ n”识别为特殊字符,并将它们视为4个字符。但是,当我在Arduino IDE串行监视器中输入“Enter”(或单击“发送按钮”)时,它会自动发送一个回车符&amp;换行符(比我尝试发送的字符串多两个字符)。因此,每当我想通过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
。
同样,“主机:192.168.1.2”长度为19个字符。为car-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