刚进入大学的黄毛小子心高气傲,都不知道自己被亲朋好友的吹捧飘到哪里去了,转眼间从学校的大门溜出来了,发现天空蓝蓝的,白云一飘一飘,而对自己的工作却迷迷茫茫,高不成低不就,无奈之下跑到了深圳富士康做一线员工,当时正好赶上郑州港区富士康的建厂,都说从这工作后直接回到郑州富士康都是管理、技术、质检等不错的职位,我却不屑,犹如每天“机器人”的工作,三个月就又回到老地方了。
作为电子信息工程毕业的我,一没人脉,二没技术,一个研发也找不到,只能从维修售后做起,慢慢到了小小电源研发,中间磕磕碰碰,摸爬滚打,写过多少笔记,去过多少县城,走过多少乡镇,下过多少煤矿,堪称电源人生的“一带一路”。
电源也慢慢做到了控制这块,从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(先进先出)取元素时先从队列头开始,取完后,下一个元素就成了队列头,依次循环只有一个元素时,既是队列头,也是队列尾。
这个就是对串口接受数据的处理。