基于 ESP8266WiFi 模塊和 MQTT 協(xié)議的物聯(lián)網(wǎng)傳感節(jié)點(diǎn)設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
0 引 言
隨著物聯(lián)網(wǎng)技術(shù)日趨成熟,物聯(lián)網(wǎng)已被廣泛應(yīng)用在醫(yī)療、交通與物流、能源與公用事業(yè)、零售業(yè)等領(lǐng)域 [1]。據(jù)思科公司(Cisco)思科視覺化網(wǎng)絡(luò)指數(shù)顯示,到 2022 年全球有超過半數(shù)設(shè)備和連接將會是機(jī)器對機(jī)器(M2M)的互聯(lián),比2017 年增加 34%。智能音箱、固定設(shè)備、移動設(shè)備及其他物件的連接數(shù)將從 2017 年的 61 億增至 2022 年的 146 億 [2]?;ヂ?lián)設(shè)備的數(shù)量和類型越來越多,應(yīng)用環(huán)境日趨復(fù)雜,實(shí)現(xiàn)資源有限或帶寬有限環(huán)境下的傳感器聯(lián)網(wǎng)和保證傳感數(shù)據(jù)的可靠傳輸成為物聯(lián)網(wǎng)技術(shù)應(yīng)用應(yīng)重點(diǎn)考慮的問題之一。
物聯(lián)網(wǎng)傳感節(jié)點(diǎn)作為物聯(lián)網(wǎng)和物理世界交互的邊界節(jié)點(diǎn),負(fù)責(zé)信息的采集和簡單處理,與將數(shù)據(jù)傳輸?shù)綉?yīng)用層進(jìn)行數(shù)據(jù)分析和處理 [3]。傳感器節(jié)點(diǎn)的通信方式主要分為近距離通信和遠(yuǎn)距離通信,傳感器節(jié)點(diǎn)之間一般采用短距離無線通信,如藍(lán)牙,ZigBee,WiFi等 ;傳感器與物聯(lián)網(wǎng)云服務(wù)器或應(yīng)用服務(wù)器采用遠(yuǎn)距離通信,如固網(wǎng)、移動網(wǎng)絡(luò)
(2G/3G/4G)、NB-IoT網(wǎng)絡(luò)等。無線網(wǎng)絡(luò)連接類型(WiFi、移動網(wǎng)絡(luò))是主流?,F(xiàn)在越來越多的應(yīng)用場合要求傳感器節(jié)點(diǎn)自帶接入網(wǎng)關(guān),即支持物聯(lián)網(wǎng)網(wǎng)絡(luò)接入服務(wù)。由于傳感器節(jié)點(diǎn)資源有限,受 CPU處理能力、內(nèi)存等限制,通常在LwIP協(xié)議棧上采用輕量級物聯(lián)網(wǎng)傳輸協(xié)議。目前,應(yīng)用最廣泛的物聯(lián)網(wǎng)標(biāo)準(zhǔn)傳輸協(xié)議包括 MQTT、CoAP。MQTT是一種在 TCP/IP協(xié)議上的基于訂閱 /發(fā)布模式的輕量級傳輸協(xié)議, 適用于引入第三方云平臺的物聯(lián)網(wǎng)應(yīng)用。CoAP 即約束應(yīng)用協(xié)議,類似 HTTP,是一種文檔傳輸協(xié)議,也是一種基于請求 / 響應(yīng)的客戶端 / 服務(wù)器端輕量級 UDP 傳輸協(xié)議,適合將物聯(lián)網(wǎng)應(yīng)用嵌入到現(xiàn)有 Web 服務(wù)器中 [4]。
本文基于 ESP8266 WiFi 模塊和 MQTT 協(xié)議設(shè)計(jì)了一種低成本物聯(lián)網(wǎng)傳感節(jié)點(diǎn),以 ESP8266 嵌入式處理器為核心,采用 AM2302 傳感器采集溫濕度數(shù)據(jù),進(jìn)行簡單處理后將傳感數(shù)據(jù)通過 MQTT 協(xié)議發(fā)布到百度天工物聯(lián)網(wǎng)云平臺IoTHub。數(shù)據(jù)采集中心采用 Visual C# 實(shí)現(xiàn),能自動識別傳感節(jié)點(diǎn)和訂購傳感器的數(shù)據(jù),可保存、處理和顯示傳感節(jié)點(diǎn)的溫濕度數(shù)據(jù)。數(shù)據(jù)采集中心可通過云平臺 IoTHub 下發(fā)命令,實(shí)現(xiàn)傳感器節(jié)點(diǎn)參數(shù)配置并讓傳感節(jié)點(diǎn)執(zhí)行指定操作(打開/ 關(guān)閉繼電器)。傳感器節(jié)點(diǎn)性能可靠,擴(kuò)展性強(qiáng),通用性好。
1 系統(tǒng)總體結(jié)構(gòu)
系統(tǒng)由傳感節(jié)點(diǎn)、數(shù)據(jù)采集中心和百度天工物聯(lián)網(wǎng)云平臺組成,如圖 1 所示。傳器節(jié)點(diǎn)由ESP8266 和 AM2302 構(gòu)成, 實(shí)現(xiàn)溫濕度的采集和上報(bào) ;數(shù)據(jù)采集中心基于 Visual C# 開發(fā),實(shí)現(xiàn)傳感數(shù)據(jù)的接收、存儲、分析和顯示 ;百度天工物聯(lián)網(wǎng)云平臺 IoTHub 作為 MQTT 消息代理,負(fù)責(zé)主題訂閱管理、消息轉(zhuǎn)發(fā)和緩沖,實(shí)現(xiàn)傳感節(jié)點(diǎn)與數(shù)據(jù)采集中心的信息交互。傳感節(jié)點(diǎn)與數(shù)據(jù)采集中心的交互數(shù)據(jù)類型為 JSON 格式。
2 傳感節(jié)點(diǎn)設(shè)計(jì)
傳感節(jié)點(diǎn)負(fù)責(zé)采集感知對象相關(guān)信息,并通過相應(yīng)的通信模塊將數(shù)據(jù)通過 MQTT 消息代理推送到遠(yuǎn)端數(shù)據(jù)采集中心。
2.1 硬件設(shè)計(jì)
傳感節(jié)點(diǎn)以 ESP8266EX WiFi 模塊為核心,通過 I/O 外接傳感器 AM2302 及其他設(shè)備。傳感節(jié)點(diǎn)硬件框圖如圖 2 所示。
ESP8266 WiFi 模塊集成了一 ESP826EX 芯片和一 4 MB SPI FLASH,帶有 PCB WiFi 天線,支持三種 WiFi 工作模式(SoftAP,Station,SoftAP+Station)。ESP826EX 擁有完整的 WiFi 功能,內(nèi)嵌 Tensilica’s L106 32 位內(nèi)核處理器,CPU 時(shí)鐘速度為 80 MHz,最高可支持 160 MHz,集成片上 SRAM, 可獨(dú)立作為 MCU 并通過 I/O 外接傳感器實(shí)現(xiàn)物聯(lián)網(wǎng)應(yīng)用。ESP8266 WiFi 模塊支持 IEEE802.11 b/g/n 無線標(biāo)準(zhǔn)與 IPv4, TCP/UDP/HTTP/MQTT 等協(xié)議 [5]。AM2302 是一款含有已校準(zhǔn)數(shù)字信號輸出的溫濕度復(fù)合傳感器,它包括一個(gè)電容式感濕元件和一個(gè)高精度 NTC 測溫元件。AM2302 的溫度測量精度為 1 ℃,濕度測量精度在 5% 以內(nèi) [6]。AM2302 與ESP8266EX 通過單總線協(xié)議通信,占用一個(gè) GPIO 端口。
2.2 軟件設(shè)計(jì)
傳感節(jié)點(diǎn)軟件基于 NodeMCU 固件開發(fā)。NodeMCU 固件使用 Lua 腳本語言編程,在樂鑫 ESP8266 Non-OS SDK 上開發(fā)而來。NodeMCU 固件封裝了 ESP8266 硬件操作的應(yīng)用編程接口函數(shù) API,同時(shí)還提供 I2C,SPI,UART 等外設(shè)總線驅(qū)動函數(shù)及 OLED/TFT 顯示驅(qū)動、各種類型傳感器驅(qū)動、網(wǎng)絡(luò)協(xié)議庫(TCP/UDP,HTTP,MQTT 等),開發(fā)者無需了解底層硬件驅(qū)動即可快速開發(fā)應(yīng)用。傳感節(jié)點(diǎn)程序主要通過數(shù)據(jù)采集模塊、MQTT 客戶端和網(wǎng)絡(luò)連接模塊實(shí)現(xiàn)。數(shù)據(jù)采集模塊負(fù)責(zé)定時(shí)讀取溫濕度數(shù)據(jù) ;MQTT 客戶端負(fù)責(zé)維護(hù)與MQTT 消息代理 IoTHub 的連接、發(fā)布傳感數(shù)據(jù)、接收并響應(yīng)數(shù)據(jù)采集中心的命令 ;網(wǎng)絡(luò)連接模塊負(fù)責(zé) WiFi 連接。系統(tǒng)軟件主流程如圖 3 所示。
2.2.1 數(shù)據(jù)采集模塊
數(shù)據(jù)采集模塊創(chuàng)建了一個(gè) tmr 定時(shí)器,周期調(diào)用 dht 庫的 read()函數(shù)讀取溫濕度數(shù)據(jù),再使用 string.format 函數(shù)將溫濕度數(shù)據(jù)轉(zhuǎn)換為 JSON 格式。讀取傳感器數(shù)據(jù)代碼 :
pin = pin or 2
status,temp,humi,temp_dec,humi_dec = dht.read(pin)
將溫濕度轉(zhuǎn)換為 JSON 格式代碼 :
topicmsg='{"reported" :{"time" :"%d","temperature" :%0.2f,
"humidity" : %0.1f}}'
msg = string.format(topicmsg,rtctime.get(),temp,humi)
2.2.2 MQTT客戶端
傳感節(jié)點(diǎn)和數(shù)據(jù)采集中心基于訂購 / 發(fā)布機(jī)制的 MQTT 協(xié)議通信進(jìn)行信息交互。傳感節(jié)點(diǎn)和數(shù)據(jù)采集中心作為MQTT 客戶端,百度 IoTHub 云平臺作為 MQTT 代理。消息的發(fā)布和訂購基于主題(topic)進(jìn)行。MQTT 代理負(fù)責(zé)管理訂閱關(guān)系或緩存消息(保留標(biāo)志為真的消息),將消息轉(zhuǎn)發(fā)給已訂閱主題的 MQTT 客戶端。為了實(shí)現(xiàn)傳感節(jié)點(diǎn)與數(shù)據(jù)采集中心的數(shù)據(jù)交互,兩者發(fā)布與訂閱的主題見表 1 所列。
傳感節(jié)點(diǎn) MQTT 客戶端初始化代碼如下 :
msghandler 為訂購消息處理函數(shù),用于解析和處理從數(shù)據(jù)采集中心收到的 JSON 格式數(shù)據(jù)。JSON 數(shù)據(jù)采用鍵(key) 值(value)對結(jié)構(gòu),key 可用來表示消息類型,value 為消息內(nèi)容。JSON 格式數(shù)據(jù)用 sjson 模塊的 decode()函數(shù)解析成 table 表格數(shù)據(jù)。傳感節(jié)點(diǎn)調(diào)用 publish 函數(shù)向某個(gè)主題發(fā)布消息, 語法 :mqtt :publish(topic,payload,qos,retain[,function(client)])。topic 是發(fā)布的主題 ;payload 為將發(fā)布的消息 ;qos 為QoS 服務(wù)質(zhì)量 ;0 表示只發(fā)送最多一次便可送達(dá),1 表示至少一次可送達(dá),2 表示一次便到達(dá) ;Retain 為保留標(biāo)志,指示服務(wù)端是否需要存儲當(dāng)前消息 ;function(client) 為消息發(fā)布成功回調(diào)函數(shù),在收到代理發(fā)布確認(rèn) PUBACK 消息后執(zhí)行函數(shù)。
3 數(shù)據(jù)采集中心設(shè)計(jì)
數(shù)據(jù)采集中心負(fù)責(zé)傳感節(jié)點(diǎn)的管理及傳感數(shù)據(jù)的顯示, 其中傳感節(jié)點(diǎn)管理包括節(jié)點(diǎn)自動識別、節(jié)點(diǎn)主題訂閱、節(jié)點(diǎn)控制等。數(shù)據(jù)采集中心與傳感節(jié)點(diǎn)通過 MQTT 協(xié)議的訂購 / 發(fā)布機(jī)制進(jìn)行異步通信,兩者不必知道對方的 IP 地址,所有消息均通過 MQTT 消息代理轉(zhuǎn)發(fā)。數(shù)據(jù)采集中心識別傳感節(jié)點(diǎn)流程如圖 4 所示。傳感節(jié)點(diǎn)上線時(shí)向主題 $baidu/iot/ general/data/id/status 發(fā)布保留標(biāo)志為真的消息“online”,離線時(shí)通過最后遺囑(Last Will)發(fā)布離線消息“offline”。數(shù)據(jù)采集中心連接到 MQTT 消息代理 IoTHub, 在訂閱主題$baidu/iot/general/data/+/status 后,會收到所有傳感節(jié)點(diǎn)的狀態(tài)消息,從消息主題解析出節(jié)點(diǎn) ID(+ 通配符所對應(yīng)的字段),如果是新節(jié)點(diǎn),則先添加節(jié)點(diǎn)再更新狀態(tài),否則直接更新節(jié)點(diǎn)狀態(tài)。
數(shù)據(jù)采集中心訂購傳感節(jié)點(diǎn)主題 $baidu/iot/general/data/ id/data 后, 當(dāng)傳感節(jié)點(diǎn)向此主題發(fā)布消息時(shí), 消息代理IoTHub 將會把消息轉(zhuǎn)發(fā)給數(shù)據(jù)采集中心。數(shù)據(jù)采集中心收到傳感節(jié)點(diǎn)數(shù)據(jù)后,解析 JSON 格式消息獲得消息的數(shù)據(jù)類型。如果是傳感數(shù)據(jù),則存儲后顯示 ;如果是傳感節(jié)點(diǎn)配置信息,則存儲到節(jié)點(diǎn)信息。信息處理流程如圖 5 所示。
數(shù)據(jù)采集中心界面如圖 6 所示。界面上部分顯示節(jié)點(diǎn)列表及最新的節(jié)點(diǎn)傳感數(shù)據(jù),下部分顯示節(jié)點(diǎn)數(shù)據(jù)曲線圖。
4 結(jié) 語
本文設(shè)計(jì)了基于 MQTT 協(xié)議的物聯(lián)網(wǎng)傳感節(jié)點(diǎn),采用ESP8266WiFi 模塊 + 傳感器采集數(shù)據(jù)與 NodeMCU 物聯(lián)網(wǎng)平臺的 MQTT 模塊實(shí)現(xiàn)傳感節(jié)點(diǎn)與數(shù)據(jù)采集中心交互,數(shù)據(jù)采集中心采用 Visual C# + MQTTnet 庫實(shí)現(xiàn)傳感節(jié)點(diǎn)的自動識別與控制、傳感節(jié)點(diǎn)數(shù)據(jù)的存儲與顯示。系統(tǒng)運(yùn)行穩(wěn)定,擴(kuò)展性強(qiáng),搭配不同傳感器就能實(shí)現(xiàn)特定的物聯(lián)網(wǎng)傳感節(jié)點(diǎn)。