物联网IOT之云端WIFI

刚进入大学的黄毛小子心高气傲,都不知道自己被亲朋好友的吹捧飘到哪里去了,转眼间从学校的大门溜出来了,发现天空蓝蓝的,白云一飘一飘,而对自己的工作却迷迷茫茫,高不成低不就,无奈之下跑到了深圳富士康做一线员工,当时正好赶上郑州港区富士康的建厂,都说从这工作后直接回到郑州富士康都是管理、技术、质检等不错的职位,我却不屑,犹如每天“机器人”的工作,三个月就又回到老地方了。

作为电子信息工程毕业的我,一没人脉,二没技术,一个研发也找不到,只能从维修售后做起,慢慢到了小小电源研发,中间磕磕碰碰,摸爬滚打,写过多少笔记,去过多少县城,走过多少乡镇,下过多少煤矿,堪称电源人生的“一带一路”。

电源也慢慢做到了控制这块,从STC89C52开始的入门和STC12C5A60S2的系统学习,到今天STM32的嵌入式研发,“一幕幕、一路路”,后续的ARM-linux更期待。

进入正题,随着物联网的兴起,使传感器网络、感知中国、RFID无线射频识别、无线短距离通讯、云计算等技术的应用走向热潮。

我们来看看云端wifi的具体原理:

其实就是一键配置功能,简单的说就是:当设备还没有连上WiFi的时候,此时通过手机App可以将WiFi的SSID及密码一键配置到智能插座上去。

看看具体怎么工作:

1. 设备进入初始化状态,开始收听附近的 WiFi 数据包。

2. 手机/平板设置 WiFi 名字和密码后,发送 UDP 广播包。

3. 设备通过 UDP 包(长度)获取配置信息,切换网络模式,连接上家里 WiFi,配置完成。

看实物咋样。

我们现在开始看看8266是怎么实现远程控制的?

以智能插座为例,看看云端wifi是怎么控制的。

首先,我们先要设置与创建自己的产品。

选择第一个云端wifi。

点击保存后 点击添加数据点。

点击新建数据点。

选择MCU开发,SOC 8266-32M 刚才生成的序列号。

点击生成代码后。

这个时候可以搭建开发环境来更改代码。

我们先用windows的开发环境,用安信可 ESP 系列一体化开发环境,是安信可科技为方便广大用户而推出的基于 Windows + Cygwin + Eclipse + GCC 的综合 IDE 环境。

下载地址http://pan.baidu.com/s/1skRvR1j

软件的安装。

打开软件简单配置一下。

这是打开的软件界面。

我们主要改的是APP文件。

我们现在根据模块的硬件电路来改程序。

我们上面的图片中工作模式选择就是红圈中的定义,接地和高电平 都是针对GPIO0,正常工作就是从FLASH启动,写固件时就是串口下载程序。

我们开始搭建硬件电路按键S1长按就是进入airlink配网模式了,按键S1是配置按键,按键S2按下接通时候就是串口下载了, LED是接在GPIO12和VCC之间的。

我们需要改的程序的地方不多,第一处修改。

我们把按键改一下,我们用了一个按键接的是GPIO4来配置。

第二处修改,把与第二个按键有关的程序删除。

第三处修改,我们用GPIO12来做开关用,在主函数添加初始化程序。

第四处修改我们的8266收到指令后做出的动作,看看怎么修改程序。

修改后。

这个就是一个开灯和关灯的0x01和0x00。

再看看整体的SOC方案通讯原理图。

这是MCU通过烧录好GAgent固件的WIFI模组与服务器交互的逻辑。

“机智云”是一个面向开发者的免费开放的互联网服务平台,通过这个服务器将以单片机为主的智能硬件与智能手机联系起来,实现三者之间的通信,这就是所谓的“物联网”技术(IOT)。

而单片机+互联网+手机APP开发,这三种都需要学习。

说说互联网TCP/IP协议(面向网络传输层的通信协议,解决数据如何传输的问题),UDP协议,DHCP(动态主机配置协议,IP地址动态分配),HTTP协议(面向应用层的文本传输协议,解决数据怎么用的问题) ;TCP服务端(sever)和客户端(client),就如同打电话一样需要一个主叫和被叫一样,端口号就如同电话的分机。TCP或者UDP通信必须有TCP服务端(sever)和客户端(client)这二者,作为TCP服务端(sever)时无需配置IP地址和端口号,但是作为客户端(client)时就必须知道通信对方的IP地址和端口号。ARP地址解析协议,URL(统一资源地址,针对服务器而言)等等这些概念必须学习了解。

对于互联网的链接有三种方式

1.硬件网口

2.WIFI

3.GPRS

通过互联网这块最终还是TCP/UDP协议,在59楼一个简单的介绍,硬件网口就不多说了,wifi的通信前面已经说过了,过几天用APP控制看看效果咋样。

而gprs联网的话,这是简单的原理。

对于目前的4G模块都是利用手机SIM卡和运营商GPRS网络提供无线网络数据通信,目前的共享单车就是这种方案。

具体的通信原理

1、TCP连接

TCP(Transmission Control Protocol) 传输控制协议。TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握确认建立一个连接。位码即tcp标志位,有6种 标示:SYN(synchronous建立联机) ACK(acknowledgement 确认) PSH(push传送) FIN(finish结束) RST(reset重置) URG(urgent紧急)Sequence number(顺序号码) Acknowledge number(确认号码)。手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。

建立起一个TCP连接需要经过“三次握手”:

第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。握手完成后,两台主机开始传输数据了。

2、HTTP连接

HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

1)在HTTP 1.0中,客户端的每次请求都要求建立一次单独的连接,在处理完本次请求后,就自动释放连接。

2)在HTTP 1.1中则可以在一次连接中处理多个请求,并且多个请求可以重叠进行,不需要等待一个请求结束后再发送下一个请求。

由于HTTP在每次请求结束后都会主动释放连接,因此HTTP连接是一种“短连接”,要保持客户端程序的在线状态,需要不断地向服务器发起连接请求。通常的做法是即时不需要获得任何数据,客户端也保持每隔一段固定的时间向服务器发送一次“保持连接”的请求,服务器在收到该请求后对客户端进行回复,表明知道 客户端“在线”。若服务器长时间无法收到客户端的请求,则认为客户端“下线”,若客户端长时间无法收到服务器的回复,则认为网络已经断开。

而目前的4G通信采用SOCKET链接。

1.套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议口。

应用层通过传输层进行数据通信时,TCP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了套接字(Socket)接口。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

这是SOCKET的连接过程。

2. 建立socket连接建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发 给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

在TCP中我们常用长连接实现通信。

当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接 时它们可以释放这个连接,连接的建立是需要3次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的。

这是短链接和长连接的区别。

目前物联网系统共由四部分组成:

  • 物联网设备端
  • 物联网设备云平台端
  • 物联网WEB后台服务器
  • 用户端

这是一个接入系统框架。

具体的微信扫描原理。

服务器通过GPRS/3G流量来完成数据交互,过程如下:

一、手机扫描自行车,获得自行车唯一的ID标志,手机接着会向服务器提交一个请求(提交信息里包含:用户信息,请求动作,车辆ID);

二、服务器收到用户开锁请求,此时会根据请求信息,接着向指定ID的自行车发出开锁指令;

三、自行车收到服务器指令,会执行相应的开锁动作。

前面我们主要讲的是ESP8266wifi模块是怎么控制设备。

下面结合实例讲一下esp8266wifi模块通过MCU来控制设备。

创建数据点就不介绍了,和SOC方案一样。

主要区别是这里。

我们选择独立MCU方案的103。

在这里可以生成工程源码。

我们再看看MCU方案的的整体原理。

这个体系包含设备、APP、M2M服务、业务服务、以及云对接等各种环节。

这是下载的源码。

板子回来了。

其实生成的MCU代码只是一个框架,没有加任何外设功能,需要我们根据协议来执行不同的功能。

这是相关协议文件的介绍。

程序实现原理

协议实现机制:

协议解析后,将P0数据区的有效数据点生成对应的数据点事件,再按事件处理数据点。

数据点转换事件的说明:

根据协议P0数据区的attr_flags位判断出有效数据点,并将其转化成对应的数据点事件,然后在事件处理函数中(gizwitsEventProcess)完成事件的处理。

其实上面介绍的云平台的API接口就是设备MCU和wifi模块之间的一个桥梁,我们就是通过这个桥梁并根据代码框架来实现开发,在这基础之上去实现不同的功能,需要我们在串口接受函数里实现不同的功能。

上面是程序的简单介绍,后续详细分析,下面我们来看一下GAgent固件。

GAgent是运行在各种通讯模组上的一款应用程序(固件),可以提供上层应用(手机APP等控制端、云端)到产品设备的双向数据通讯,此外,还提供对设备的配置入网、发现绑定、程序升级等功能。

产品开发者使用GAgent后,只需要关心产品的业务逻辑开发,不用关心数据的通讯功能开发,大大降低了开发的难度。该固件遵循以下协议《机智云平台标准接入协议之MCU与WiFi模组通讯》、《机智云平台标准接入协议之设备与云端通讯》、《机智云平台标准接入协议之App与设备通讯》。

目前机智云提供由机智云移植的WiFi模组对应固件有:汉枫 LPB100/ LPB120/ LPT120/ LPT220、乐鑫8266、高通4004 、RealTek 8711AM 、联盛德 TLN13SP01、锐凌微 TinyCon3350-M26、庆科3162等;GPRS模组对应固件有:广和通G510等。

看看整个配置流程。

这是怎们绑定设备的,最关键的。

我们了解了上面的功能后进行平台移植。

开发者在移植前要确保被移植平台的硬件参数满足以下的要求:

A. 平台支持两个串口接口(至少一个),一个负责与wifi模组间的数据收发(必须),一个用于调试信息打印(可复用数据收发串口)。

B.平台支持定时器功能(1ms精确定时)。

C.平台支持至少2K的RAM空间(可调整环形缓冲区大小来解决此问题,但易导致数据协议的处理异常)。

注:环形缓冲区修改位置: Gizwits\gizwits_protocol.h

原代码中MAX_PACKAGE_LEN = 950,即环形缓冲区所占RAM空间大小为950*2 = 1900 字节,开发者可以此来调整程序所占RAM空间的大小。

上面的基本原理了解后,我们来建立微信智能宠物屋,就是RGB控制,红外对射,电机控制 ,温湿度上传。

第一步

下载gagent固件到wifi模块。

下载好的烧录到ESP8266即可,这里不做详细介绍。

第二步

建立数据点生成STM32工程。

如何生成工程在91楼,需要添加相关驱动文件。

第三步

添加驱动文件并下载程序带MCU。

并添加好文件和编译路径。

编译没有问题。

第四步

下载机智云的APP。

登陆账号并绑定设备就可以开启智能控制了。

看看是怎么控制的。

RGB颜色控制,电机,红外对射,温湿度上传都可以实现。

这是视频链接链接: https://pan.baidu.com/s/1o8VGFQ6 密码: 4b4c

现在我们讲一下具体怎么移植工程。

把下载的驱动文件复制到工程中去。

添加文件。

在MCU_STM32F103C8x_source\User\main.c 文件中添加各驱动库的头文件

然后我们在添加传感器驱动的初始化文件和头文件。

具体不再讲解了。

下面我们简单说一下数据结构:

在这里用到了环形队列。

队列:一种特殊的线性表,包含队列头、队列尾,只允许在队列头进行删除操作,在队列尾进行删除操作可以分为顺序队列和环形队列。

顺序队列: 在内存中是一段连续的存储空间,并有队列头指针和队列尾指针,打个比喻吧: 顺序队列就像在排队买车票,排在最前面(第一个人)的就是队头,排在最后的就是队尾,第一个买完票,离开(FIFO,先进先出,先排队的先走),第二个人变成了队头,整体队列前进,每走一个人,整个队列都要前进,可见整体性能不会多么的好。

环形队列: 可以将队列空间想象成一个环形空间,这能使队列空间重复使用:无论插入还是删除,front(队头)指针增1或front(队尾)指针加1时超出所分配的空间,就让它指向这片连续空间的起始地址FIFO(先进先出)取元素时先从队列头开始,取完后,下一个元素就成了队列头,依次循环只有一个元素时,既是队列头,也是队列尾。

这个就是对串口接受数据的处理。

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
觉得内容不错的朋友,别忘了一键三连哦!
赞 16
收藏 11
关注 159
成为作者 赚取收益
全部留言
0/200
  • 小董 2021-04-17 10:12
    8266功能强大啊
    回复
  • dy-blNlwnWV 2021-02-21 21:20
    不亚于看了一篇高质量论文
    回复
  • 喂,你好 2020-12-16 12:20
    学习了
    回复
  • 米修儿 2020-12-01 12:54
    大开眼界,真是好文
    回复
  • lihui710884923 2020-08-17 13:58
    源码免费分享
    回复 1条回复