首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP请求由ESP8266 Wifi芯片发送,但未被网站接收

PHP请求由ESP8266 Wifi芯片发送,但未被网站接收
EN

Stack Overflow用户
提问于 2016-08-01 02:55:59
回答 1查看 1.4K关注 0票数 1

我正在构建一个简单的网站,当主机接收到连接到同一网络的另一个设备的数据时,应该更新一个文本文件。这个装置是一个测量温度的小型气象站。温度由站在PHP命令中从ESP8266芯片通过Wifi发送。该信号由家庭路由器接收并重定向到承载网站的网络上的膝上型计算机。

我遇到了问题,因为ESP8266芯片似乎正确地发送了数据/PHP命令。然而,该网站从来不更新自己。

为了简化故障排除系统,气象站被笔记本电脑取代。笔记本电脑通过USB(UART)电缆直接连接到ESP8266芯片.所有与ESP8266芯片通信的AT命令都是在Arduino IDE串行监视器中输入的。

网站

这个网站很简单。每当从ESP8266芯片接收数据时,它都会将其写入文本文件中。

该网站存储在一台IP为192.168.1.2的笔记本电脑上。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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中。

代码语言:javascript
复制
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中手动输入以下行时:

代码语言:javascript
复制
http://192.168.1.2/index.php?temp=28

以下文本将显示在浏览器中&编号"28“保存在data.txt中。

代码语言:javascript
复制
Temperature is 28 oC.

ESP8266芯片

如前所述,在最终系统中,ESP8266芯片将接收来自一个小型气象站的串行指令。但是为了简化调试,芯片现在用USB到串行(UART)电缆连接到笔记本电脑上。串行命令通过Arduino IDE串行监视器发送到芯片。这是发送的命令。

代码语言:javascript
复制
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可能更合适。然而,目前我只是试图理解为什么网站没有回应芯片。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-06 13:56:28

好的,我已经解决了问题。

事实证明,Arduino IDE串行监视器不将"\r“和"\n”识别为特殊字符,并将它们视为4个字符。但是,当我在Arduino IDE Serial中键入"Enter“(或单击"Send按钮”)时,它会自动发送回车符&一个行提要字符(比我试图发送的字符串多两个字符)。因此,每当我想通过IDE将"\r\n“发送到Serial时,我需要按Enter键。如果在我要发送的字符串中间有这样的"\r\n“(就像我的示例中的情况一样),则必须将字符串切成两个(或更多)。

因此,我修改了代码的这一部分:

代码语言:javascript
复制
AT+CIPSEND=56

OK
> GET /index.php?temp=10 HTTP/1.1\r\nHost: 192.168.1.2\r\n\r\n

通过这一点:

代码语言:javascript
复制
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“时,Serial将添加两个字符。这就解释了AT+CIPSEND=33为什么要发送这一行,而不是AT+CIPSEND=31

类似地,“主机: 192.168.1.2”有19个字符长。当为回车和行提要添加两个字符时,我们得到21个字符,所以是AT+CIPSEND=21.

然后,服务器用正确的响应进行应答。

代码语言:javascript
复制
+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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38690388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档