服务端

物联网(二)---原理分析[STM32+OneNET+ESP82

2019-05-08  本文已影响164人  keep1234quiet

物联网(一)---快速上手[STM32+OneNET+ESP8266]
物联网(二)---原理分析[STM32+OneNET+ESP8266]
物联网(三)---WEB下发命令控制单片机[STM32+OneNET+ESP8266]
物联网(四)---搭建自己的TCP服务器[ESP8266]
物联网(五)---搭建自己的云平台[ESP8266+Django]

阅读本文需要对计算机网络知识等有一定的了解。
具体:
了解HTTP请求、软件抓包,AT指令

前面已经实现了单片机通过ESP8266将数据上传到互联网上去,但是并没有对其中的原理进行分析,到底这个过程是怎么实现的呢?本章将做出详细讲解。

上图:


ESP8266工作流程.png

图片上信息已经很丰富了,这里再稍微解释一下。

一、ESP8266配置入网步骤

1. ESP8266参数配置

单片机通过串口先发送AT指令ESP8266完成参数配置,配置完成后将ESP8266断电重启一次,以使配置生效(这一步可由AT指令完成)。

ESP8266-AT指令.png
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-init.png

数据是怎么发送给服务器的呢?由于前面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的延时,这个是为了等待完成数据发送、接收。

4层网络模型
3.服务器接受数据、处理数据、返回数据

服务器再接收到数据后会对所提交的数据做出响应。提交成功后,服务器会返回数据如下:


ESP8266-rec-data.png

到这里就完成了整个流程了,但是你上面说看到的数据并不是ESP8266与服务器交互的真正数据,而是单片机通过串口输出的处理过的数据,也就是说,这些数据可能不是真实的数据,那去哪里看真实的数据呢?这里推荐使用wireshark软件抓包分析,这里就要求ESP8266所使用的流量必须经过你的电脑了,否则这个过程是无法查看的。

这里推荐使用电脑开热点给ESP8266连接的方式,这样可以方便数据的抓取。

二、ESP8266与服务器真实的交互数据分析

1.首先让ESP8266连接你的电脑热点

这里多ESP8266也产生了一个WIFI信号,这是由于使用了AT指令配置了AP+STA模式,ESP8266在这里可以充当一个中继的角色.

WIFI-relationship.png
连接成功后,去网络设置里面查看ESP8266IP地址,如下(不固定,每个人都可能不一样),我这ESP8266IP地址是192.168.137.80
ESP8266-IP.png
2.打开wireshark软件查看交互数据

这里要注意的是,必须选择你电脑热点的接口,不能是其他接口,否则数据是无法查看到的,这里我选择的是我电脑的热点。


接口选择

ESP8266 请求与服务器建立TCP连接,当连接建立完成后便可发送数据。

TCP三次握手

ESP8266上传数据查看,下面的图片中我已经做了详细说明了(这次干脆连打码都省了)。
ESP8266IP(Source:源地址)192.168.137.80,这与我们前面在网络和设置中查看到是ESP8266IP地址是一致的,而这个服务器IP地址(Destination:目的地址)则是我们在程序中配置好了的。ESP8266通过POST请求向服务器发送数据,其中包含了api-key,DeviceID,Data(上传的数据,这里是temp温度),这里就完成了数据的上传。

wireshark-data.jpg

但是怎么知道数据是否上传成功了呢?这个也不用担心,服务器也会返回数据,告诉我们请求是否成功。如下图,服务器返回了状态码200,表示请求成功,这表明数据是真的上传成功并被服务器接收了的。

下面的{"errno":0,"error":"succ"}也恰好和我们前面串口助手里看到的信息相符合。

服务端数据响应.png

如果和上一片文章一样配置好了的话,就可以在服务器端OneNET上查看数据了,像下面这样。

依然是使用FOR循环产生的数据

至此,从ESP8266发送数据到服务器接收数据的整个流程就介绍完毕了。

有哪里讲解不到位或者错误的可以在下面评论,我会及时补充的,感谢批评指正。

上一篇下一篇

猜你喜欢

热点阅读