李 名(廣州市賽皓達智能科技有限公司,廣東 廣州 510032)
物聯(lián)網(wǎng)節(jié)點Wi-Fi接入模塊設計
李 名(廣州市賽皓達智能科技有限公司,廣東 廣州 510032)
物聯(lián)網(wǎng)系統(tǒng)中設備端基于CC3200的接入互聯(lián)網(wǎng)以及與服務器端通信交換數(shù)據(jù)功能的實現(xiàn)。設備端,CPU通過傳感器獲得相關設備參數(shù)。傳感器與Wi-Fi模塊通過I2C連接進行通信,Wi-Fi模塊通過STA模式接入WLAN網(wǎng)絡,然后跟服務器端通過TCP/IP協(xié)議建立連接,通過HTTP協(xié)議與服務器實現(xiàn)數(shù)據(jù)的交換。Wi-Fi模塊定時向服務器端發(fā)送請求建立連接,進行數(shù)據(jù)通信。數(shù)據(jù)傳輸完畢,CPU設置冬眠(HIB,Hibernate)模式,使模塊工作在低功耗狀態(tài)。此時,用內(nèi)部實時時鐘來記錄“冬眠”的時間,當計時一到,CPU退出HIB模式,重新連接網(wǎng)絡并與服務器建立連接,進行數(shù)據(jù)傳輸。
物聯(lián)網(wǎng);智能硬件;CC3200;Wi-Fi模塊;HTTP
近幾年來,隨著物聯(lián)網(wǎng)技術取得長足的進步。將所有的傳統(tǒng)物體改造成智能終端,這無疑會給這個世界注入一股新鮮的血液,大大改善我們的生活方式和人生體驗。本文就是基于這樣的設計理念,采用CC3200這款Wi-Fi芯片來實現(xiàn)一個典型物聯(lián)網(wǎng)系統(tǒng)中設備節(jié)點聯(lián)網(wǎng)通信的功能。而本次設計最主要的目標就是解決“怎樣讓物聯(lián)網(wǎng)”的問題,之后,只需要配置調(diào)整相應參數(shù),便可以投入實際應用中。
硬件基于CC3200,它是TI無線連接SimpleLink Wi-Fi和物聯(lián)網(wǎng)(IoT)解決方案于2014年推出的一款Wi-Fi MCU,它包括MCU、Wi-Fi網(wǎng)絡處理器CC3100和電源管理三大部分,是業(yè)界第一款具有內(nèi)置Wi-Fi的無線MCU,專門針對物聯(lián)網(wǎng)應用。同時,它還提供強大的軟件開發(fā)包支持,不僅提供軟件驅(qū)動庫,還包含多個應用例程和對應的說明文檔,給開發(fā)者提供參考和幫助。
軟件基于CCS,它的全稱是Code Composer Studio,是一種集成開發(fā)環(huán)境(IDE),支持TI的全部微控制器和嵌入式處理器產(chǎn)品系列。CCS包含一整套用于開發(fā)和調(diào)試嵌入式應用的工具,并且將 Eclipse 軟件框架的優(yōu)點和 TI 先進的嵌入式調(diào)試功能相結合,為嵌入式開發(fā)人員提供了一個引人注目、功能豐富的開發(fā)環(huán)境。
2.1 系統(tǒng)初始化
開發(fā)板的初始化:主要包括設置中斷向量表的基地址,設置處理器中斷,設置系統(tǒng)時鐘中斷和MCU啟動程序。引腳復用配置,主要包括開啟GPIO,串口,I2C等外設時鐘,設置串口的發(fā)送和接收引腳,設置GPIO的輸入輸出引腳,以及設置I2C的SCL和SDA引腳。串口配置,主要是設定串口傳輸?shù)母鞣N參數(shù),包括示UART端口的基地址; UART工作的時鐘頻率;傳輸?shù)牟ㄌ芈?;傳輸?shù)臄?shù)據(jù)位,停止位和校驗位。I2C外設使能將MCU與外設之間的數(shù)據(jù)傳輸速度設置為快速模式。
2.2 Wi-Fi連接
Wi-Fi連接是本次設計最核心的部分,也是“萬物互聯(lián)”最關鍵的技術。由于CC3200提供的完善封裝的網(wǎng)絡接口函數(shù)以及豐富的例程,方便快速地構建起與這次設計作業(yè)相關的應用代碼。CC3200 Wi-Fi的連接分為系統(tǒng)設置STA模式,板子連接到可用的AP兩個步驟。
第一階段設置系統(tǒng)為STA模式。設備便相當于無線終端。設備要想接入互聯(lián)網(wǎng)從而和遠程服務器通信,必須工作在STA模式才可以連接到可用的無線網(wǎng)絡。
第二階段將板子連接到可用的AP。首先,創(chuàng)建名為SlSecParams_t的結構體,保存Wi-Fi的安全類型,密碼及密碼長度信息。然后,通過函數(shù)sl_WlanConnect鏈接指定的Wi-Fi。它包含Wi-Fi名和長度,MAC地址,安全類型,是不是企業(yè)模式等參數(shù)。同時,設備自動連接Wi-Fi的時有時間限制,超時則連接失敗,需手動從串口助手中輸入Wi-Fi信息給設備使其連接。這里使用定時器計算時間,每隔5000ms產(chǎn)生一次中斷,中斷產(chǎn)生后進入中斷處理函數(shù),在這里設置連接超時功能。如果變量g_ulStatus被置位,則代表鏈接成功。當在函數(shù)void SimpleLinkWlanEventHandler (SlWlanEvent_t *pWlanEvent)中被置位,表示成功連接到Wi-Fi,如果在函數(shù)voidSimpleLinkNetAppEvent-Handler (SlNetAppEvent_t *pNetAppEvent)中被置位,表示鏈接AP成功。
2.3 服務器連接與數(shù)據(jù)傳輸
服務器連接與數(shù)據(jù)傳輸?shù)目傮w流程很簡單,先連接服務器,再通過I2C外設從傳感器獲得相關數(shù)據(jù),最后通過HTTP協(xié)議將數(shù)據(jù)傳給服務器以及從服務器獲取相應的數(shù)據(jù)。服務器鏈接是通過函數(shù)sl_NetAppDnsGetHostByName ((signedchar *)HOST_NAME, strlen((constchar *)HOST_NAME), &g_ulDestinationIP,SL_AF_ INET);獲取服務器的IP地址,包含服務器主機名,主機名字節(jié)長度,IP地址的變量地址,和協(xié)議族等參數(shù)。當?shù)谝粋€參數(shù)不是主機名,而是主機的IP地址時,該函數(shù)便直接將其保存在第三個參數(shù)地址所指的變量中。而連接相關的參數(shù)包含服務器地址所屬的地址族,服務器端應用程序的端口地址,服務器的IP地址。其中后兩個參數(shù)分別調(diào)用方法htons和sl_Htonl,將變量或者常量從主機字節(jié)順序變?yōu)榫W(wǎng)絡字節(jié)順序,即高字節(jié)放在低地址,低字節(jié)放在高地址。這樣保證數(shù)據(jù)能夠在不同的主機之間設備之間正確傳遞。然后,函數(shù)HTTPCli_construct初始化一個HTTP客戶端,HTTP客戶端是一個名為HTTPCli_construct結構體,在將結構體的各個成員變量賦初值后,接著便調(diào)用HTTPCli_connect連接服務器。其工作原理如圖1所示。
圖1 服務器連接程序流程圖
2.4 獲取傳感器數(shù)據(jù)
利用溫度和加速度傳感器來設計物聯(lián)網(wǎng)系統(tǒng)設備端的完整工作流程。通過控制傳感器定時采集數(shù)據(jù),然后將溫度傳感器的數(shù)據(jù)和加速度傳感器采集到的三個方向上的速度數(shù)據(jù)中的兩個一起保存到內(nèi)存中并發(fā)送給服務器。溫度傳感器采用的是TMP006,共有五個寄存器,后兩個寄存器分別表示自身溫度寄存器和傳感電壓寄存器,通過兩次調(diào)用函數(shù)int GetRegisterValue(unsigned char ucRegAddr, unsigned short *pusRegValue)讀取這兩個值進行相關計算后就可以得到溫度測量值。加速傳感器是BMA222,它可以測量三個垂直方向上的速度,通過兩次測量值差可以確定設備在各個方向上的加速度。本次通過間隔30ms兩次調(diào)用函數(shù)BMA222Read(signed char *pcAccX, signed char *pcAccY, signed char *pcAccZ),兩值求差而得到的加速度。
2.5 HTTP通信
本次設計設備和服務器的HTTP通信用到了GET請求和POST請求。GET請求從服務器端獲取數(shù)據(jù),POST請求則向服務器提交設備相關參數(shù)。
GET請求發(fā)送三個請求首部字段,分別是服務器主機名,客戶端可以接受的應答數(shù)據(jù)類型和請求實體主體的長度。定義好首部字段,調(diào)用HTTPCli_setRequestFields(httpClient , fields)函數(shù)將首部字段及相應值賦給HTTP客戶端結構體,然后便可調(diào)用函數(shù)HTTPCli_ sendRequest(httpClient, HTTPCli_METHOD _GET, GET_ REQUEST_URI, moreFlags)發(fā)送GET請求。它包含HTTP客戶端結構體,HTTP請求類型,請求資源在服務器主機上的存儲路徑,標志位等參數(shù)。其中,標志位表示除了首部字段外是否需要發(fā)送其它字段,這里設置moreFlags=0,不發(fā)送其它字段。發(fā)送完GET請求之后,調(diào)用readResponse(httpClient)函數(shù)讀取服務器應答報文。在這之前將getFlag標志位置1,這樣做的目的是當發(fā)送GET請求時,當服務器的應答報文主體的內(nèi)容為特定字符時,CPU需要根據(jù)字符的內(nèi)容作出相應的動作,這里采用了輸出PWM波控制LED燈來模擬整個過程。其工作原理如圖2所示。
圖2 HTTP通信程序流程圖
圖3 接收應答報文程序流程圖
GET請求的應答報文處理完畢后,接著發(fā)送POST請求。同上,在發(fā)送完首部字段之后,還需要向服務器發(fā)送請求的主體字段,以便向服務器提交設備的相關參數(shù)。通過函數(shù)int HTTPCli_sendRequestBody(HTTPCli_Handle cli, const char *body,int len)將HTTP客戶端結構體,發(fā)送的主體內(nèi)容,主體字符串長度發(fā)送服務器,之后接受服務器的應答報文。首先,通過函數(shù)HTTPCli_getResponseStatus(httpClient)返回服務器對客戶端發(fā)出的請求的相應狀態(tài),簡單起見只考慮狀態(tài)200和非200情況,非200表示本次HTTP通信請求失敗。其次,函數(shù)HTTPCli_setResponseFields(httpClient, (const char **)ids),ids表示客戶端希望接收應答首部字段,因此該函數(shù)將ids的內(nèi)容賦值給客戶端結構體的成員resFields。之后,通過函數(shù)HTTPCli_ getResponseField(httpClient, (char *)g_buff, sizeof(g_buff), &moreFlags)將客戶端希望接收的應答首部字段值存入g_buff指定的內(nèi)存空間中。moreFlags是一個輸出標志位,當一個字段的值不能被一次性接收完畢時,該標志位被置1。該函數(shù)被重復調(diào)用,直到服務器所有的應答首部字段都被輪詢完畢,此時函數(shù)返回值為HTTPCli_FIELD_ID_END,否則函數(shù)返回定義在ids數(shù)組中的字段的索引。最后,通過函數(shù)HTTPCli_readResponseBody (httpC lient, (char *) dataBuffer, len, &moreFlags)將應答主體報文存儲到dataBuffer內(nèi)存中,次接收的數(shù)據(jù)的長度由len指定。由于len已經(jīng)被賦值為應答主體報文的長度,因此函數(shù)執(zhí)行一次便接收了全部數(shù)據(jù)。moreFlags也是一個輸出標志位,當一次調(diào)用沒有接收完所有數(shù)據(jù)時,被置1,此時需要重復調(diào)用知道所有數(shù)據(jù)接收完畢。其工作原理如圖3所示。
2.6 HIB模式
該模式是指設備工作在“冬眠”模式,這種模式耗電量低,可以輕松使用電池供電。在設備與服務器通信結束之后,便可將設備設置HIB模式,只有實時時鐘工作,用來定時將設備從HIB模式中喚醒。喚醒相當于復位,所有配置都會被清除。因此,在進入HIB模式之前要將一些狀態(tài)保存到FLASH閃存當中,喚醒的時候再從FLASH閃存中讀取出來。本次設計需要保存用戶從串口助手中輸入的Wi-Fi的名稱和密碼,防止每次喚醒都要手動輸入。這里將Wi-Fi名和密碼保存在一個變量里面,這樣只需對FLASH進行一次讀寫操作就能完成數(shù)據(jù)的保存和恢復的功能。首先,利用函數(shù)_i32 sl_FsOpen(const _u8 *pFileName,const _u32 AccessModeAndMaxSize,_u32 *pToken,_i32 *pFileHandle)打開文件或創(chuàng)建新的文件,包含要打開的文件名,打開方式和文件指針等參數(shù)。其次,利用函數(shù)_i32 sl_FsWrite(const _i32 FileHdl,_u32 Offset,_u8* pData,_u32 Len);向文件寫入數(shù)據(jù),包含文件地址指針,寫入第一個數(shù)據(jù)在文件中偏移位置,數(shù)據(jù)內(nèi)容指針,數(shù)據(jù)長度等參數(shù)。最后,利用函數(shù)_i16 sl_FsClose (const _i32 FileHdl,const _u8* pCeritificateFileName, const _u8* pSignature,const _u32 SignatureLen);關閉參數(shù)所指向的文件,并保存參數(shù)為今后使用。以上可以看出,操作FLASH的基本流程為:打開文件->讀寫文件->關閉文件。
將數(shù)據(jù)寫入FLASH之后,設備進入HIB模式,關鍵代碼如下:
MAP_PRCMHibernateIntervalSet(5 * SLOW_CLK_FREQ);
MAP_PRCMHibernateWakeupSourceEnable(PRCM_HIB_ SLOW_CLK_CTR);
MAP_PRCMHibernateEnter();
首先調(diào)用第一個函數(shù)設置設備工作在HIB模式時間,在這里傳遞一個5s的時間參數(shù),5s后喚醒設備。然后調(diào)用第二個函數(shù),實時時鐘開始計時。之后調(diào)用第三個函數(shù),進入HIB模式。計時時間到,退出HIB模式,設備復位。
復位后需要從FLASH閃存中恢復數(shù)據(jù),其流程為:首先調(diào)用函數(shù)unsigned long PRCMSysResetCauseGet(void)判斷是否是從HIB模式中復位,如果是,則調(diào)用函數(shù)_i32 sl_FsRead(const _i32 FileHdl,_ u32 Offset,_u8* pData,_u32 Len);讀取數(shù)據(jù),它包含讀取數(shù)據(jù)文件指針,讀取的第一個數(shù)據(jù)在文件中的偏移字節(jié)數(shù),指向保存從村建忠讀取的數(shù)據(jù)變量指針,所讀取數(shù)據(jù)的字節(jié)長度等參數(shù)。
使用HIB模式的優(yōu)點顯而易見,能使設備在使用時的功耗降低許多,但是隨之而來的麻煩便是必要數(shù)據(jù)的備份和恢復,因此在設計過程中應盡量避免使用需要備份的全局數(shù)據(jù)。
本設計實現(xiàn)了物聯(lián)網(wǎng)節(jié)點的接入功能以外,借助于CC3200良好的函數(shù)接口封裝性和強大的軟件開發(fā)包等資源,還額外添加了電源管理模塊,即讓設備在空閑時工作在HIB模式,具有重要的意義。眾所周知,如何給電子設備配備能夠提供持久的電量并且不占空間的電池一直是一個很大的難題,CC3200提供的這種低功耗模式就在很大程度上解決了這個問題。
[1] (美) 陳涓, 趙振平譯. HTTP權威指南[M]. 北京:人民郵電出版社, 2012.
[2] 陳穎瑩. 芯片上的網(wǎng)絡 TI SimpleLink Wi-Fi讓聯(lián)網(wǎng)如此簡單[J]. 電子技術應用, 2014, 7 : 2.
[3] 郭書軍. ARM Cortex-M4+Wi-Fi MCU應用指南 : CC3200 CCS基礎篇[M].北京 : 電子工業(yè)出版社, 2015.
[4] 郭書軍, 田志鵬. 基于單片Wi-Fi MCU CC3200的無線串口[J].儀器儀表用戶, 2016, 23 (1) : 24 - 27.
[5] 林婷, 王磊. 基于CC3200及MT9D111的嵌入式無線圖像采集系統(tǒng)設計[J].技術與市場, 2015, 22 (9) : 9 - 11.
[6] 沈建華. CC3200 Wi-Fi微控制器原理與實踐 : 基于MiCO物聯(lián)網(wǎng)操作系統(tǒng)[M]. 北京: 北京航空航天大學出版社, 2015.
[7] 謝希仁. 計算機網(wǎng)絡 (第六版) [M]. 北京:電子工業(yè)出版社, 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-),男,漢族,廣西北海人,碩士,現(xiàn)任廣州市賽皓達智能科技有限公司總經(jīng)理,主要研究方向為智能自動化。
B
1003-0492(2016)12-0088-04
TN926