上一篇博客主要謝了傳感器節(jié)點(diǎn)(上一篇叫采集節(jié)點(diǎn),我覺得在物聯(lián)網(wǎng)中叫傳感節(jié)點(diǎn)更合適)的電路設(shè)計(jì),這一篇介紹傳感器節(jié)點(diǎn)的軟件設(shè)計(jì)。 傳感器節(jié)點(diǎn)的軟件主要完成兩項(xiàng)任務(wù):感知和WiFi通信。感知這塊比較簡(jiǎn)單,主要是AD的控制。在使用之前,仔細(xì)閱讀STM32的說(shuō)明書,設(shè)置好與AD有關(guān)的IO、時(shí)鐘、工作方式等,并適時(shí)啟動(dòng)AD以及讀取轉(zhuǎn)換值即可。不過值得一提的是STM32支持DMA通道,在DMA模式下,可以設(shè)置AD轉(zhuǎn)換后的值存放到DMA通道的入口地址處,DMA通道的出口地址可以指向自定義的一段緩存,或者串口、SPI等通信端口的寫入地址,這樣無(wú)需CPU過問,AD轉(zhuǎn)換后的值就可以被直接送到指定緩存或者通信外設(shè)的寫入地址,可以減輕CPU的負(fù)擔(dān),因此建議使用DMA通道。 WiFi通信是軟件設(shè)計(jì)的難點(diǎn),好在大多數(shù)工作都被前人完成了,我們只需站在巨人的肩膀上關(guān)注我們的應(yīng)用就可以了。 要實(shí)現(xiàn)WIFI通信,至少要實(shí)現(xiàn)WIFI驅(qū)動(dòng)以及TCP/IP協(xié)議,大體結(jié)構(gòu)如下圖所示: 最底層是WIFI芯片,再上層是WIFI驅(qū)動(dòng)層(包括SDIO驅(qū)動(dòng)和WLAN驅(qū)動(dòng)),最上層是TCP/IP協(xié)議層,TCP/IP協(xié)議層使用LWIP協(xié)議棧。 1. WIFI驅(qū)動(dòng)Marvell 88w8686 WiFi模塊驅(qū)動(dòng)主要包括802.11協(xié)議驅(qū)動(dòng)和SDIO接口驅(qū)動(dòng)兩部分。如圖。 在通過無(wú)線局域網(wǎng)傳輸數(shù)據(jù)的過程中,需要完成安全性設(shè)計(jì),即數(shù)據(jù)加密。我們采用WPA認(rèn)證,WPA又名PSK,長(zhǎng)度一般為8~63字節(jié),它通過一定的算法可以得到PMK。認(rèn)證的時(shí)候會(huì)生成一個(gè)PTK,這是一組密鑰。PTK加上報(bào)文數(shù)據(jù)采用一定的算法,得到密文,同時(shí)得到一個(gè)簽名。認(rèn)證的原理是在獲取所有參數(shù)后,客戶端發(fā)出一個(gè)MIC,把原文同MIC一起發(fā)給AP,AP采用相同的參數(shù)和算法計(jì)算出MIC,并與客戶端發(fā)過來(lái)的比較,如果一致,則認(rèn)證通過,否則失敗。 2. LWIP協(xié)議棧LwIP是用于嵌入式系統(tǒng)的開源裁剪版TCP/IP協(xié)議棧,可運(yùn)行在無(wú)操作系統(tǒng)的平臺(tái)上,整個(gè)協(xié)議棧實(shí)現(xiàn)了基本的IP、ICMP、UDP、TCP協(xié)議。它只需要十幾KB的RAM和40K的ROM就可運(yùn)行,尤其適用于內(nèi)存資源有限的嵌入式系統(tǒng)。 典型的 LWIP 應(yīng)用系統(tǒng)包括這樣的三個(gè)進(jìn)程:首先啟動(dòng)的是上層應(yīng)用程序進(jìn)程,然后是 LWIP 協(xié)議棧進(jìn)程,最后是底層硬件數(shù)據(jù)包接收發(fā)送進(jìn)程。通常 LWIP協(xié)議棧進(jìn)程是在應(yīng)用程序中調(diào)用 LWIP 協(xié)議棧初始化函數(shù)來(lái)創(chuàng)建的。但是在初始化LwIP協(xié)議棧之前,需要將各協(xié)議移植到開發(fā)板上,使其支持TCP和UDP兩種方式。LwIP主要包括以下子目錄:存放應(yīng)用程序接口文件子目錄、提供核心代碼文件的core子目錄、提供整個(gè)協(xié)議棧使用頭文件的子目錄、提供網(wǎng)絡(luò)接口驅(qū)動(dòng)程序基本框架的netif子目錄和移植過程中自定義的子目錄。移植LwIP協(xié)議棧,還需要完成對(duì)頭文件的定義。 LWIP簡(jiǎn)化了傳統(tǒng)的OSI七層模型,只保留了網(wǎng)絡(luò)接口層、網(wǎng)絡(luò)層、傳輸層和應(yīng)用層,各層數(shù)據(jù)包接收與發(fā)送的全過程如圖。 WIFI驅(qū)動(dòng)和LWIP協(xié)議棧包含的東西實(shí)在太多,要花大量的時(shí)間才可能研究透徹,我實(shí)在沒這個(gè)精力,所以也只知道個(gè)大概。如果感興趣,可以閱讀老衲五木的博客,寫得十分全面。 3.應(yīng)用我應(yīng)該更關(guān)注LWIP的應(yīng)用,怎么樣才能用起來(lái)是關(guān)鍵。 傳感節(jié)點(diǎn)既可以主動(dòng)往外推數(shù)據(jù),也可以作為服務(wù)器被動(dòng)地響應(yīng)客戶的請(qǐng)求,我選擇了后者。那么應(yīng)用層主要分為兩個(gè)過程:一是WiFi關(guān)聯(lián)過程,二是數(shù)據(jù)請(qǐng)求和響應(yīng)過程。 WiFi關(guān)聯(lián)過程有兩種方式,一種是采集節(jié)點(diǎn)作為AP,其他設(shè)備接入AP;另一種是采集節(jié)點(diǎn)接入到路由器。這和手機(jī)是一樣的。工作流程如下圖。 首先對(duì)STM32微控制器的時(shí)鐘、端口、A/DC、中斷向量、串口、內(nèi)存進(jìn)行初始化,對(duì)Marvell模塊驅(qū)動(dòng)進(jìn)行初始化配置(SDIO的設(shè)備枚舉,加載設(shè)備固件等)。在完成上述初始化過程之后,掃描WiFi網(wǎng),將結(jié)果存放在數(shù)據(jù)域中,隨后進(jìn)行網(wǎng)絡(luò)關(guān)聯(lián),若返回值為0,說(shuō)明網(wǎng)絡(luò)關(guān)聯(lián)成功,否則說(shuō)明關(guān)聯(lián)失敗,接著對(duì)LWIP協(xié)議棧進(jìn)行配置,并建立TCP服務(wù)器。至此,用戶終端就已經(jīng)可以發(fā)送數(shù)據(jù)請(qǐng)求,進(jìn)行數(shù)據(jù)信息的訪問了。 當(dāng)客戶端發(fā)起數(shù)據(jù)訪問請(qǐng)求時(shí),首先通過連接請(qǐng)求接口發(fā)出請(qǐng)求連接指令,如果連接失敗,則重新連接,若連接成功,客戶端發(fā)出數(shù)據(jù)請(qǐng)求指令,此時(shí)服務(wù)器進(jìn)行數(shù)據(jù)解析,并將客戶端請(qǐng)求的數(shù)據(jù)發(fā)送回去,當(dāng)數(shù)據(jù)發(fā)送完畢時(shí),通信結(jié)束,否則客戶端繼續(xù)通過請(qǐng)求數(shù)據(jù)指令,獲取所需數(shù)據(jù)。數(shù)據(jù)請(qǐng)求與響應(yīng)流程如圖。 |
|