物联网节点Wi-Fi接入模块设计
2016-02-09广州市赛皓达智能科技有限公司广东广州510032
李 名(广州市赛皓达智能科技有限公司,广东 广州 510032)
物联网节点Wi-Fi接入模块设计
李 名(广州市赛皓达智能科技有限公司,广东 广州 510032)
物联网系统中设备端基于CC3200的接入互联网以及与服务器端通信交换数据功能的实现。设备端,CPU通过传感器获得相关设备参数。传感器与Wi-Fi模块通过I2C连接进行通信,Wi-Fi模块通过STA模式接入WLAN网络,然后跟服务器端通过TCP/IP协议建立连接,通过HTTP协议与服务器实现数据的交换。Wi-Fi模块定时向服务器端发送请求建立连接,进行数据通信。数据传输完毕,CPU设置冬眠(HIB,Hibernate)模式,使模块工作在低功耗状态。此时,用内部实时时钟来记录“冬眠”的时间,当计时一到,CPU退出HIB模式,重新连接网络并与服务器建立连接,进行数据传输。
物联网;智能硬件;CC3200;Wi-Fi模块;HTTP
近几年来,随着物联网技术取得长足的进步。将所有的传统物体改造成智能终端,这无疑会给这个世界注入一股新鲜的血液,大大改善我们的生活方式和人生体验。本文就是基于这样的设计理念,采用CC3200这款Wi-Fi芯片来实现一个典型物联网系统中设备节点联网通信的功能。而本次设计最主要的目标就是解决“怎样让物联网”的问题,之后,只需要配置调整相应参数,便可以投入实际应用中。
1 开发平台支持
硬件基于CC3200,它是TI无线连接SimpleLink Wi-Fi和物联网(IoT)解决方案于2014年推出的一款Wi-Fi MCU,它包括MCU、Wi-Fi网络处理器CC3100和电源管理三大部分,是业界第一款具有内置Wi-Fi的无线MCU,专门针对物联网应用。同时,它还提供强大的软件开发包支持,不仅提供软件驱动库,还包含多个应用例程和对应的说明文档,给开发者提供参考和帮助。
软件基于CCS,它的全称是Code Composer Studio,是一种集成开发环境(IDE),支持TI的全部微控制器和嵌入式处理器产品系列。CCS包含一整套用于开发和调试嵌入式应用的工具,并且将 Eclipse 软件框架的优点和 TI 先进的嵌入式调试功能相结合,为嵌入式开发人员提供了一个引人注目、功能丰富的开发环境。
2 系统设计
2.1 系统初始化
开发板的初始化:主要包括设置中断向量表的基地址,设置处理器中断,设置系统时钟中断和MCU启动程序。引脚复用配置,主要包括开启GPIO,串口,I2C等外设时钟,设置串口的发送和接收引脚,设置GPIO的输入输出引脚,以及设置I2C的SCL和SDA引脚。串口配置,主要是设定串口传输的各种参数,包括示UART端口的基地址; UART工作的时钟频率;传输的波特率;传输的数据位,停止位和校验位。I2C外设使能将MCU与外设之间的数据传输速度设置为快速模式。
2.2 Wi-Fi连接
Wi-Fi连接是本次设计最核心的部分,也是“万物互联”最关键的技术。由于CC3200提供的完善封装的网络接口函数以及丰富的例程,方便快速地构建起与这次设计作业相关的应用代码。CC3200 Wi-Fi的连接分为系统设置STA模式,板子连接到可用的AP两个步骤。
第一阶段设置系统为STA模式。设备便相当于无线终端。设备要想接入互联网从而和远程服务器通信,必须工作在STA模式才可以连接到可用的无线网络。
第二阶段将板子连接到可用的AP。首先,创建名为SlSecParams_t的结构体,保存Wi-Fi的安全类型,密码及密码长度信息。然后,通过函数sl_WlanConnect链接指定的Wi-Fi。它包含Wi-Fi名和长度,MAC地址,安全类型,是不是企业模式等参数。同时,设备自动连接Wi-Fi的时有时间限制,超时则连接失败,需手动从串口助手中输入Wi-Fi信息给设备使其连接。这里使用定时器计算时间,每隔5000ms产生一次中断,中断产生后进入中断处理函数,在这里设置连接超时功能。如果变量g_ulStatus被置位,则代表链接成功。当在函数void SimpleLinkWlanEventHandler (SlWlanEvent_t *pWlanEvent)中被置位,表示成功连接到Wi-Fi,如果在函数voidSimpleLinkNetAppEvent-Handler (SlNetAppEvent_t *pNetAppEvent)中被置位,表示链接AP成功。
2.3 服务器连接与数据传输
服务器连接与数据传输的总体流程很简单,先连接服务器,再通过I2C外设从传感器获得相关数据,最后通过HTTP协议将数据传给服务器以及从服务器获取相应的数据。服务器链接是通过函数sl_NetAppDnsGetHostByName ((signedchar *)HOST_NAME, strlen((constchar *)HOST_NAME), &g_ulDestinationIP,SL_AF_ INET);获取服务器的IP地址,包含服务器主机名,主机名字节长度,IP地址的变量地址,和协议族等参数。当第一个参数不是主机名,而是主机的IP地址时,该函数便直接将其保存在第三个参数地址所指的变量中。而连接相关的参数包含服务器地址所属的地址族,服务器端应用程序的端口地址,服务器的IP地址。其中后两个参数分别调用方法htons和sl_Htonl,将变量或者常量从主机字节顺序变为网络字节顺序,即高字节放在低地址,低字节放在高地址。这样保证数据能够在不同的主机之间设备之间正确传递。然后,函数HTTPCli_construct初始化一个HTTP客户端,HTTP客户端是一个名为HTTPCli_construct结构体,在将结构体的各个成员变量赋初值后,接着便调用HTTPCli_connect连接服务器。其工作原理如图1所示。
图1 服务器连接程序流程图
2.4 获取传感器数据
利用温度和加速度传感器来设计物联网系统设备端的完整工作流程。通过控制传感器定时采集数据,然后将温度传感器的数据和加速度传感器采集到的三个方向上的速度数据中的两个一起保存到内存中并发送给服务器。温度传感器采用的是TMP006,共有五个寄存器,后两个寄存器分别表示自身温度寄存器和传感电压寄存器,通过两次调用函数int GetRegisterValue(unsigned char ucRegAddr, unsigned short *pusRegValue)读取这两个值进行相关计算后就可以得到温度测量值。加速传感器是BMA222,它可以测量三个垂直方向上的速度,通过两次测量值差可以确定设备在各个方向上的加速度。本次通过间隔30ms两次调用函数BMA222Read(signed char *pcAccX, signed char *pcAccY, signed char *pcAccZ),两值求差而得到的加速度。
2.5 HTTP通信
本次设计设备和服务器的HTTP通信用到了GET请求和POST请求。GET请求从服务器端获取数据,POST请求则向服务器提交设备相关参数。
GET请求发送三个请求首部字段,分别是服务器主机名,客户端可以接受的应答数据类型和请求实体主体的长度。定义好首部字段,调用HTTPCli_setRequestFields(httpClient , fields)函数将首部字段及相应值赋给HTTP客户端结构体,然后便可调用函数HTTPCli_ sendRequest(httpClient, HTTPCli_METHOD _GET, GET_ REQUEST_URI, moreFlags)发送GET请求。它包含HTTP客户端结构体,HTTP请求类型,请求资源在服务器主机上的存储路径,标志位等参数。其中,标志位表示除了首部字段外是否需要发送其它字段,这里设置moreFlags=0,不发送其它字段。发送完GET请求之后,调用readResponse(httpClient)函数读取服务器应答报文。在这之前将getFlag标志位置1,这样做的目的是当发送GET请求时,当服务器的应答报文主体的内容为特定字符时,CPU需要根据字符的内容作出相应的动作,这里采用了输出PWM波控制LED灯来模拟整个过程。其工作原理如图2所示。
图2 HTTP通信程序流程图
图3 接收应答报文程序流程图
GET请求的应答报文处理完毕后,接着发送POST请求。同上,在发送完首部字段之后,还需要向服务器发送请求的主体字段,以便向服务器提交设备的相关参数。通过函数int HTTPCli_sendRequestBody(HTTPCli_Handle cli, const char *body,int len)将HTTP客户端结构体,发送的主体内容,主体字符串长度发送服务器,之后接受服务器的应答报文。首先,通过函数HTTPCli_getResponseStatus(httpClient)返回服务器对客户端发出的请求的相应状态,简单起见只考虑状态200和非200情况,非200表示本次HTTP通信请求失败。其次,函数HTTPCli_setResponseFields(httpClient, (const char **)ids),ids表示客户端希望接收应答首部字段,因此该函数将ids的内容赋值给客户端结构体的成员resFields。之后,通过函数HTTPCli_ getResponseField(httpClient, (char *)g_buff, sizeof(g_buff), &moreFlags)将客户端希望接收的应答首部字段值存入g_buff指定的内存空间中。moreFlags是一个输出标志位,当一个字段的值不能被一次性接收完毕时,该标志位被置1。该函数被重复调用,直到服务器所有的应答首部字段都被轮询完毕,此时函数返回值为HTTPCli_FIELD_ID_END,否则函数返回定义在ids数组中的字段的索引。最后,通过函数HTTPCli_readResponseBody (httpC lient, (char *) dataBuffer, len, &moreFlags)将应答主体报文存储到dataBuffer内存中,次接收的数据的长度由len指定。由于len已经被赋值为应答主体报文的长度,因此函数执行一次便接收了全部数据。moreFlags也是一个输出标志位,当一次调用没有接收完所有数据时,被置1,此时需要重复调用知道所有数据接收完毕。其工作原理如图3所示。
2.6 HIB模式
该模式是指设备工作在“冬眠”模式,这种模式耗电量低,可以轻松使用电池供电。在设备与服务器通信结束之后,便可将设备设置HIB模式,只有实时时钟工作,用来定时将设备从HIB模式中唤醒。唤醒相当于复位,所有配置都会被清除。因此,在进入HIB模式之前要将一些状态保存到FLASH闪存当中,唤醒的时候再从FLASH闪存中读取出来。本次设计需要保存用户从串口助手中输入的Wi-Fi的名称和密码,防止每次唤醒都要手动输入。这里将Wi-Fi名和密码保存在一个变量里面,这样只需对FLASH进行一次读写操作就能完成数据的保存和恢复的功能。首先,利用函数_i32 sl_FsOpen(const _u8 *pFileName,const _u32 AccessModeAndMaxSize,_u32 *pToken,_i32 *pFileHandle)打开文件或创建新的文件,包含要打开的文件名,打开方式和文件指针等参数。其次,利用函数_i32 sl_FsWrite(const _i32 FileHdl,_u32 Offset,_u8* pData,_u32 Len);向文件写入数据,包含文件地址指针,写入第一个数据在文件中偏移位置,数据内容指针,数据长度等参数。最后,利用函数_i16 sl_FsClose (const _i32 FileHdl,const _u8* pCeritificateFileName, const _u8* pSignature,const _u32 SignatureLen);关闭参数所指向的文件,并保存参数为今后使用。以上可以看出,操作FLASH的基本流程为:打开文件->读写文件->关闭文件。
将数据写入FLASH之后,设备进入HIB模式,关键代码如下:
MAP_PRCMHibernateIntervalSet(5 * SLOW_CLK_FREQ);
MAP_PRCMHibernateWakeupSourceEnable(PRCM_HIB_ SLOW_CLK_CTR);
MAP_PRCMHibernateEnter();
首先调用第一个函数设置设备工作在HIB模式时间,在这里传递一个5s的时间参数,5s后唤醒设备。然后调用第二个函数,实时时钟开始计时。之后调用第三个函数,进入HIB模式。计时时间到,退出HIB模式,设备复位。
复位后需要从FLASH闪存中恢复数据,其流程为:首先调用函数unsigned long PRCMSysResetCauseGet(void)判断是否是从HIB模式中复位,如果是,则调用函数_i32 sl_FsRead(const _i32 FileHdl,_ u32 Offset,_u8* pData,_u32 Len);读取数据,它包含读取数据文件指针,读取的第一个数据在文件中的偏移字节数,指向保存从村建忠读取的数据变量指针,所读取数据的字节长度等参数。
使用HIB模式的优点显而易见,能使设备在使用时的功耗降低许多,但是随之而来的麻烦便是必要数据的备份和恢复,因此在设计过程中应尽量避免使用需要备份的全局数据。
3 结语
本设计实现了物联网节点的接入功能以外,借助于CC3200良好的函数接口封装性和强大的软件开发包等资源,还额外添加了电源管理模块,即让设备在空闲时工作在HIB模式,具有重要的意义。众所周知,如何给电子设备配备能够提供持久的电量并且不占空间的电池一直是一个很大的难题,CC3200提供的这种低功耗模式就在很大程度上解决了这个问题。
[1] (美) 陈涓, 赵振平译. HTTP权威指南[M]. 北京:人民邮电出版社, 2012.
[2] 陈颖莹. 芯片上的网络 TI SimpleLink Wi-Fi让联网如此简单[J]. 电子技术应用, 2014, 7 : 2.
[3] 郭书军. ARM Cortex-M4+Wi-Fi MCU应用指南 : CC3200 CCS基础篇[M].北京 : 电子工业出版社, 2015.
[4] 郭书军, 田志鹏. 基于单片Wi-Fi MCU CC3200的无线串口[J].仪器仪表用户, 2016, 23 (1) : 24 - 27.
[5] 林婷, 王磊. 基于CC3200及MT9D111的嵌入式无线图像采集系统设计[J].技术与市场, 2015, 22 (9) : 9 - 11.
[6] 沈建华. CC3200 Wi-Fi微控制器原理与实践 : 基于MiCO物联网操作系统[M]. 北京: 北京航空航天大学出版社, 2015.
[7] 谢希仁. 计算机网络 (第六版) [M]. 北京:电子工业出版社, 2013.
The Design of Wi-Fi Access Module of IoT Node
This paper presents the implementation of the Internet access of the device-side based on CC3200 as well as its communication and data interchange with the server-side in an IoT system. On the device-side, the CPU acquires the device parameters with different sensors. The communication between the sensors and the Wi-Fi module is based on the I2C serial bus interface. The Wi-Fi module is set to STA (Station) mode to connect the WLAN. Once connected successfully, the Wi-Fi module establishes connection with the server-side based on the TCP/IP protocol, and then exchange data via the HTTP protocol. The Wi-Fi module sends the connecting request to the server-side regularly to interchange data. After data interchange is fnished, the CPU is set to low power state by switching to HIB (Hibernate) mode. During this time, the internal RTC (Real time clock) records the time of HIB. Once HIB time is over, the CPU exits HIB mode immediately and connects WLAN again. Then it establishes connection with the server-side and exchanges data.
Internet of Things (IoT); Intelligent hardware; CC3200; Wi-Fi module; HTTP
李名(1965-),男,汉族,广西北海人,硕士,现任广州市赛皓达智能科技有限公司总经理,主要研究方向为智能自动化。
B
1003-0492(2016)12-0088-04
TN926