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

物联网(一)---快速上手[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发送数据到服务器接收数据的整个流程就介绍完毕了。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342