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