付佳威,姚毅*,何雷,任紅,藍嵐,趙燕,陳琦
(1.南昌市農業(yè)科學院南昌市農業(yè)物聯(lián)網(wǎng)智能裝備集成開發(fā)重點實驗室,江西 南昌 330038;2.江西超鼎科技有限公司,江西 南昌 330038;3.江西農業(yè)大學,江西 南昌 330038)
如何從軟件層面入手設計一個交互協(xié)議,實現(xiàn)不同廠家設備的接入及應用?類似的問題在傳統(tǒng)物聯(lián)網(wǎng)系統(tǒng)中一直存在,導致用戶使用物聯(lián)網(wǎng)時需要在不同系統(tǒng)之間跳轉或者針對第三方平臺做定制化接入,這些操作既麻煩,也提高了開發(fā)成本。項目組針對上述問題,提出并應用了虛擬網(wǎng)關方案,實現(xiàn)了“一對多”異構系統(tǒng)的接入控制,在不改變雙方系統(tǒng)功能代碼的情況下,直接通過網(wǎng)關方案來對異構系統(tǒng)做接入控制,將第三方平臺直接映射到系統(tǒng)成為一個網(wǎng)關,然后將該平臺設備也作為網(wǎng)關下的子設備通過協(xié)議層交互的方式掛載上來,實現(xiàn)異構系統(tǒng)設備的接入。
本系統(tǒng)主要包括物聯(lián)網(wǎng)基礎平臺、第三方設備供應商灌溉進排水設備云平臺2 個系統(tǒng),以第三方平臺接入物聯(lián)網(wǎng)基礎平臺為例,對該方案進行介紹說明。
該方案主要分為三塊:基礎平臺、第三方平臺、虛擬網(wǎng)關。物聯(lián)網(wǎng)基礎平臺對外提供MQTT 設備接入服務,并需要具有支持設備類型這一特性,設備類型分為直連設備、網(wǎng)關設備、網(wǎng)關子設備三種,基礎平臺通過設備類型區(qū)分設備之間的關聯(lián)關系及進行消息權限管控。第三方平臺需要提供2 個對外接口,通過設備編號查詢設備狀態(tài)信息和通過設備編號控制設備執(zhí)行動作。
虛擬網(wǎng)關則是在軟件層面創(chuàng)建一個中間設備,通過走網(wǎng)關協(xié)議,模擬一個真實的網(wǎng)關設備與基礎平臺進行通信,需要支持MQTT v3.1 客戶端協(xié)議,然后再模擬一個HTTP/MQTT/其他協(xié)議類型的客戶端,通過第三方平臺的API 與第三方平臺進行上下行數(shù)據(jù)交互,從而將設備掛載到基礎平臺。通信架構如圖1 所示。
圖1 虛擬網(wǎng)關方案架構圖
MQTT 是一個基于客戶端-服務器的消息發(fā)布/訂閱傳輸協(xié)議。MQTT協(xié)議具有輕量、簡單、開放和易于實現(xiàn)的特點,這些特點使它的適用范圍非常廣泛,甚至包括在受限的環(huán)境中,如:機器與機器(M2M)通信和物聯(lián)網(wǎng)(IoT)。其在通過衛(wèi)星鏈路通信傳感器、偶爾撥號的醫(yī)療設備、智能家居及一些小型化設備中已廣泛使用??紤]到所有的交互都是長連接且需要保持連接狀態(tài)及心跳監(jiān)測,而在物聯(lián)網(wǎng)中MQTT符合這一特性并且運用十分廣泛,因此,使用MQTT 協(xié)議做為通信層的基礎協(xié)議非常合適。
JSON(JavaScript Object Notation)是一種輕量級的數(shù)據(jù)交換格式,易于人類閱讀和編寫,可以在多種語言之間進行數(shù)據(jù)交換,同時也易于機器解析和生成。目前在各類系統(tǒng)中,JSON 都作為數(shù)據(jù)傳輸格式得到廣泛應用,本文也選用其作為數(shù)據(jù)載體進行消息通信。
Java 是一門面向對象的編程語言,不僅吸收了C++語言的各種優(yōu)點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java 語言具有功能強大和簡單易用兩個特征。Java 語言作為靜態(tài)面向對象編程語言的代表,極好地實現(xiàn)了面向對象理論,允許程序員以優(yōu)雅的思維方式進行復雜的編程。同時Java 生態(tài)中的基于Maven 包管理的倉庫具有海量的第三方工具包及擴展庫,能極大減少編碼強度負擔,因此選用Java 作為本文中實現(xiàn)的編程語言,并配合Spring Boot 作為業(yè)務基礎框架。
交互協(xié)議使用MQTT 作為傳輸層,JSON 格式數(shù)據(jù)作為應用層來實現(xiàn)。每個設備都具有唯一ID 作為該設備身份標識(mqtt client_id),系統(tǒng)通過該標識便能索引到該設備,向其發(fā)送消息。
MQTT 基于topic 的發(fā)布訂閱模式進行通信,而設備交互是上下行雙向的,因此可以定義兩個topic對數(shù)據(jù)進行分類。
上行topic: /iot/data/up/{clientID} 設備端發(fā)送到平臺
下行topic: /iot/data/down/{clientID} 平臺下發(fā)給設備端
3.1.1 數(shù)據(jù)包格式
詳見下表。
?
3.1.2 數(shù)據(jù)包實例
本文為第三方排水灌溉設備定義2 個屬性:一個是排水閥,使用標識符valve(true 為開啟,false 為關閉);一個是閥門,當前運行狀態(tài)status(正轉/反轉/停止)。
3.1.3 協(xié)議數(shù)據(jù)交互流程
(1)使用Java 構建MQTT 客戶端,作為虛擬網(wǎng)關設備連接到基礎平臺,并訂閱topic(/iot/data/up/{clientID}),網(wǎng)關上線。
(2)網(wǎng)關每隔3 分鐘調用第三方平臺開放接口,查詢每個子設備的狀態(tài),然后將子設備狀態(tài)構建出數(shù)據(jù)包,并發(fā)送到topic(/iot/data/up/{clientID}),基礎平臺收到后通過header 字段判斷該數(shù)據(jù)包類型是網(wǎng)關上報子設備狀態(tài),然后通過body 字段內的子設備ID,將各個子設備狀態(tài)進行提取解析。如圖2 所示。
圖2 定時同步第三方設備狀態(tài)
(3)當需要對閥門進行控制時,基礎平臺構建控制指令數(shù)據(jù)包,并生成唯一消息id,將其設置到數(shù)據(jù)包id 字段,發(fā)送到topic(/iot/data/down/{clientID})并構建異步等待任務,等待虛擬網(wǎng)關反饋控制結果,虛擬網(wǎng)關將會收到該條消息,隨后虛擬網(wǎng)關從消息內取出header 字段判斷是控制指令,從extend 內取出目標子設備,然后從body 中取出要控制的灌溉設備閥門設置值,調用第三方開放接口執(zhí)行控制動作,等待第三方接口返回操作結果。虛擬網(wǎng)關收到操作結果后,構建應答指令包,將結果反饋回基礎平臺,平臺收到后根據(jù)消息中的id 字段,判斷是哪一次的控制指令,找到對應指令的等待任務,并將其取消等待響應給基礎平臺的用戶側,隨后虛擬網(wǎng)關立即再執(zhí)行一次狀態(tài)上報,整個控制流程結束。在本次操作中,對于用戶來說全程是基于基礎平臺的,整個流程屏蔽了不同系統(tǒng)之間的交互。如圖3 所示。
圖3 控制操作交互流程
3.2.1 開發(fā)環(huán)境
搭建開發(fā)環(huán)境包含JDK1.8、Maven3.2、MySQL8.0、InfluxDB 1.7、EMQX,使用JetBrains 的IDEA 作為IDE 開發(fā)工具對整個項目進行構建。
3.2.2 偽代碼實現(xiàn)
為了快速實現(xiàn)需求,簡化開發(fā)建議導入以下框架依賴:paho-mqtt、springboot 全家桶、influxdb-jdbc、mysqljdbc、hutool??蚣軇?chuàng)建過程如下:
本文以物聯(lián)網(wǎng)平臺在農業(yè)領域接入第三方灌溉設備為例,創(chuàng)新性提出虛擬網(wǎng)關的接入方案,通過自定義一套標準的網(wǎng)關協(xié)議來模擬硬件設備與物聯(lián)網(wǎng)平臺交互的方案對異構系統(tǒng)進行設備兼容,大大提升了在農業(yè)生產中,物聯(lián)網(wǎng)系統(tǒng)與各類農業(yè)環(huán)境采集、作業(yè)控制類設備的融合接入能力,相較于傳統(tǒng)多平臺模式(每個設備廠家有一套自己的系統(tǒng)),用戶要控制灌溉設備,還需要再去打開該灌溉設備平臺進行操作,而本方案集成后所有操作均可在一個統(tǒng)一平臺進行實現(xiàn)。
本文所述的交互設計及實現(xiàn)方式,不僅適用于農業(yè)領域,在其他領域同樣能應用本套設計方案,能夠有效降低平臺對接的開發(fā)工作量及難度,實現(xiàn)在不改動平臺軟件的前提下通過網(wǎng)關協(xié)議將不同系統(tǒng)的設備進行無縫融合。