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