ESP8266 Wifi芯片发送的PHP GET请求但未被网站

时间:2016-08-01 02:55:59

标签: php apache serial-port at-command esp8266

我正在构建一个简单的网站,当主机从连接到同一网络的其他设备接收数据时,该网站应更新文本文件。有问题的设备是一个测量温度的小型气象站。站点通过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可能更合适。但目前我只想了解为什么网站没有响应芯片。

1 个答案:

答案 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