物联网(一)---快速上手[STM32+OneNET+ESP8266]
物联网(二)---原理分析[STM32+OneNET+ESP8266]
物联网(三)---WEB下发命令控制单片机[STM32+OneNET+ESP8266]
物联网(四)---搭建自己的TCP服务器[ESP8266]
物联网(五)---搭建自己的云平台[ESP8266+Django]
阅读本文需要对计算机网络知识等有一定的了解。
具体:
了解HTTP请求
、软件抓包,AT指令
。
前面已经实现了单片机通过
ESP8266
将数据上传到互联网上去,但是并没有对其中的原理进行分析,到底这个过程是怎么实现的呢?本章将做出详细讲解。
上图:
图片上信息已经很丰富了,这里再稍微解释一下。
一、ESP8266配置入网步骤
1. ESP8266
参数配置
单片机通过串口先发送AT指令给ESP8266
完成参数配置,配置完成后将ESP8266
断电重启一次,以使配置生效(这一步可由AT指令
完成)。
2.ESP8266
联网
ESP8266
重启后将会自动连接AT指令
所指定的WIFI
名称,连接成功后会通过串口返回OK
,程序中可以通过检测是否返回OK
来判断是否成功连接网络,下面使ESP8266
的初始化程序。
#define AT "AT\r\n"
#define CWMODE "AT+CWMODE=3\r\n" //STA+AP模式
#define RST "AT+RST\r\n"
#define CIFSR "AT+CIFSR\r\n"
#define CWJAP "AT+CWJAP=\"Your-WIFI-Name\",\"Your-Wifi-Password\"\r\n" //
//#define CIPSTART "AT+CIPSTART=\"TCP\",\"183.230.40.39\",876\r\n" //EDP服务器 183.230.40.39/876
#define CIPSTART "AT+CIPSTART=\"TCP\",\"183.230.40.33\",80\r\n" //HTTP服务器183.230.40.33/80
#define CIPMODE0 "AT+CIPMODE=0\r\n" //非透传模式
#define CIPMODE1 "AT+CIPMODE=1\r\n" //透传模式
#define CIPSEND "AT+CIPSEND\r\n"
#define CIPSTATUS "AT+CIPSTATUS\r\n" //网络状态查询
/*
* @brief ESP8266模块初始化
*/
void ESP8266_Init(void)
{
#if 1
SendCmd(AT, "OK", 1000); //模块有效性检查
SendCmd(CWMODE, "OK", 1000); //模块工作模式
SendCmd(RST, "OK", 2000); //模块重置
SendCmd(CIFSR, "OK", 1000); //查询网络信息
SendCmd(CWJAP, "OK", 2000); //配置需要连接的WIFI热点SSID和密码
SendCmd(CIPSTART, "OK", 2000); //TCP连接
SendCmd(CIPMODE1, "OK", 1000); //配置透传模式
SendCmd(CIPSEND, ">", 1000); //进入透传模式
USART2_Clear();
#endif
}
/*
* @brief USART2串口发送AT命令用
* @para cmd AT命令
* @para result 预期的正确返回信息
* @para timeOut延时时间,ms
*/
void SendCmd(char* cmd, char* result, int timeOut)
{
while(1)
{
USART2_Clear();
USART2_Write(USART2, (unsigned char *)cmd, strlen((const char *)cmd));
mDelay(timeOut);
printf("%s %d cmd:%s,rsp:%s\n", __func__, __LINE__, cmd, usart2_rcv_buf);
if((NULL != strstr((const char *)usart2_rcv_buf, result))) //判断是否有预期的结果
{
break;
}
else
{
mDelay(100);
}
}
}
当
ESP8266
初始化完成后,便会开始建立连接,发送POST请求
,向服务器提交数据。
数据是怎么发送给服务器的呢?由于前面
ESP8266
与服务器之间已经建立好了TCP连接,所以现在我们只需要通过串口发送数据给ESP8266
就行了,但是发送的数据还得按照一定的格式发送服务器才会认,这里采用的是HTTP协议。至于TCP和HTTP什么关系可以看下4层网络模型。如下:
USART2_Clear();
len = HTTP_PostPkt(HTTP_Buf, API_KEY, DEV_ID, "temp", tempStr); //HTTP组包
USART2_Write(USART2, (unsigned char *)(HTTP_Buf), len); //报文发送
printf("send HTTP msg:\r\n%s\r\n", HTTP_Buf);
mDelay(1000);
你可能注意到有一个1000ms
的延时,这个是为了等待完成数据发送、接收。
3.服务器接受数据、处理数据、返回数据
服务器再接收到数据后会对所提交的数据做出响应。提交成功后,服务器会返回数据如下:
到这里就完成了整个流程了,但是你上面说看到的数据并不是
ESP8266
与服务器交互的真正数据,而是单片机通过串口输出的处理过的数据,也就是说,这些数据可能不是真实的数据,那去哪里看真实的数据呢?这里推荐使用wireshark软件
抓包分析,这里就要求ESP8266
所使用的流量必须经过你的电脑了,否则这个过程是无法查看的。
这里推荐使用电脑开热点给ESP8266连接的方式,这样可以方便数据的抓取。
二、ESP8266与服务器真实的交互数据分析
1.首先让ESP8266
连接你的电脑热点
这里多ESP8266
也产生了一个WIFI
信号,这是由于使用了AT指令
配置了AP+STA
模式,ESP8266
在这里可以充当一个中继的角色.
连接成功后,去网络设置里面查看
ESP8266
的IP
地址,如下(不固定,每个人都可能不一样),我这ESP8266
的IP
地址是192.168.137.80
:2.打开wireshark软件查看交互数据
这里要注意的是,必须选择你电脑热点的接口,不能是其他接口,否则数据是无法查看到的,这里我选择的是我电脑的热点。
ESP8266 请求与服务器建立TCP连接,当连接建立完成后便可发送数据。
ESP8266
上传数据查看,下面的图片中我已经做了详细说明了(这次干脆连打码都省了)。
ESP8266
的IP(Source:源地址)
是192.168.137.80
,这与我们前面在网络和设置中查看到是ESP8266
的IP
地址是一致的,而这个服务器IP
地址(Destination:目的地址)
则是我们在程序中配置好了的。ESP8266
通过POST请求
向服务器发送数据,其中包含了api-key
,DeviceID
,Data(上传的数据,这里是temp温度)
,这里就完成了数据的上传。
但是怎么知道数据是否上传成功了呢?这个也不用担心,服务器也会返回数据,告诉我们请求是否成功。如下图,服务器返回了
状态码200
,表示请求成功,这表明数据是真的上传成功并被服务器接收了的。
下面的{"errno":0,"error":"succ"}
也恰好和我们前面串口助手里看到的信息相符合。
如果和上一片文章一样配置好了的话,就可以在服务器端OneNET上查看数据了,像下面这样。
至此,从ESP8266发送数据到服务器接收数据的整个流程就介绍完毕了。
有哪里讲解不到位或者错误的可以在下面评论,我会及时补充的,感谢批评指正。