李曉明 Thierno Gueye
摘? 要:在物聯網應用開發中,其軟件系統的開發往往受制于硬件節點的開發進度和完善程度,造成開發進度緩慢,需求不斷變更,軟件測試維護困難等問題。如果能在開發初期迅速搭建一個物聯網節點的模擬單元則能夠極大促進系統的開發和完善。Arduino提供了一個開源的、通用的、簡單易用的硬件平臺,非常適合模擬物聯網的硬件節點功能。本論文基于Arduino及其開發框架,提出了一個通用的物聯網節點的模擬單元模型,基于該模型開發了智能靶的虛擬節點用于智能靶網管控系統的開發,開發實踐表明該模型和方法可以快速實現物聯網節點功能和數據的模擬,提高物聯網系統的開發質量。
關鍵詞:物聯網;Arduino;軟件框架
中圖分類號:TP311.5? ? ?文獻標識碼:A
Abstract:Software development in Internet of Things (IoT) is often constrained by the development progress and the perfection of hardware nodes,resulting in slow development progress,changing requirements,and difficulties in software testing and maintenance.If an IoT node simulation unit can be built in the early stage of the development,it will greatly promote the development of the system.Arduino provides an open-source,universal and easy-to-use hardware platform,which is very suitable for simulating the hardware node functions.This paper presents a general simulation unit model of Internet of Things nodes.Based on this model,a simulated intelligent target node is developed for the intelligent targets control system.The development practice shows that the proposed model and software framework can be used to quickly realize the simulation of functions and the data of nodes in IoT system,and can improve the development quality of IoT system as well.
Keywords:Internet of Things;Arduino;software framework
1? ?引言(Introduction)
物聯網(IoT, Internet of Things)的繁榮帶動了大量的物聯網應用的開發需求,一個完整的物聯網應用開發包括基于智能硬件的節點開發,以及移動端、PC端的網絡應用開發,即使是一個小規模的物聯網應用也是如此。由于硬件開發的周期較長,網絡應用軟件的開發則相對較快,造成了軟件測試受制于硬件開發進度的矛盾,特別是對于那些依賴于快速迭代的軟件開發技術的項目,會因此而受到很大的制約。此外,由于軟硬件開發通常由不同的團隊完成,測試帶來的人力和協調方面的成本也會很高[1]。
為了解決上述問題,在軟件工程實踐中,通常是采用標準化的物聯網通訊協議或者數據封裝來解耦硬件和軟件系統之間的依賴。例如在物聯網應用開發中廣泛使用的MQTT協議[2,3],以及基于TLV的數據封裝格式[4]等。但由于具體應用千變萬化,物聯網絡結構復雜,感知層網絡類型不統一等問題的存在,這種方法并不能很好地解決開發中的問題。半物理仿真的概念是在仿真回路中引入部分實物,即硬件在環的方法,進行控制系統的仿真[5],同樣,在軟件開發和測試過程中,借鑒半物理仿真的思想,引入通用硬件技術,對物聯網節點進行模擬,可以很好地解決物聯網應用開發過程中的矛盾。
Arduino是一種開源的通用硬件平臺,具有開發簡單,接口豐富,成本低廉等優點,非常適合作為物聯網節點的模擬設備[6]。本論文將基于Arduino硬件平臺,通過設計實現面向物聯網應用的節點模擬軟件框架和模型,并以靶網管理系統軟件開發為應用背景,探討如何實現智能靶節點的模擬,以降低軟件開發的周期和成本。
2? ?軟件系統建模(Software modeling)
2.1? ?框架設計
對于物聯網應用來說,本質上是物聯網智能節點與服務器之間的數據交換。由于物聯網底層和互聯網通常采用的協議不同,數據交換通常是基于一個物聯網關實現[2,7]。物聯網應用系統的典型結構模型如圖1所示。
物聯網傳輸協議有很多種,例如Zigbee、工業以太網、工業總線、NB-IoT等。對于Arduino而言,都有專門的模塊和轉接板對應于這些網絡。通常Arduino與這些模塊之間是通過串口進行通訊的,因此在設計基于Arduino的物聯網節點模擬軟件框架如圖2所示。
該軟件框架是從基于時間的嵌入式多任務框架[8]中擴展而來,其中方框表示軟件模塊/任務,而箭頭表示調用關系。該框架包括以下內容:
(1)“定時器”模塊提供了多任務的運行時間片參考。該定時器使用了Arduino板上單片機的硬件定時器,并利用定時器的中斷服務來運行任務調度模塊。
(2)“任務調度模塊”實現了對任務的管理和執行。任務調度模塊會在定時器產生的時間間隔內依次調用系統內的任務模塊,這些任務模塊實現了對輸入的協議數據的解析,數據處理,模擬設備模型的執行,以及生成返回給服務器的數據。這些任務模塊包括數據解析任務模塊、協議處理任務模塊、模擬設備任務模塊和數據發送任務模塊。其中模擬設備任務模塊是為了模擬節點的功能,例如和執行控制、狀態更新等。
(3)“數據通訊模塊”實現了基于串口的與通訊設備的數據交換機制,針對不同的通訊設備,該模塊的實現不同,主要封裝了針對不同設備的通訊細節;“設備實體/狀態模擬模塊”實現了節點功能和狀態的仿真,通常情況下是存儲與被模擬節點相關的數據。
2.2? ?工作原理
該框架的工作原理如圖3所示。根據程序流程分為Setup(設置)和Loop(運行)兩個部分,前者主要完成調度器的初始化,后者主要負責執行任務和與通訊設備通訊。
首先,系統上電后執行Setup()部分,該部分主要是初始化任務調度器,并將需要運行的任務增加到任務列表中,并在最后啟動任務調度器的執行,完成初始化的工作。然后系統進入運行狀態,開始循環調用loop()部分。在這部分主要工作是(1)根據調度結果執行任務調度器中的任務,主要包括獲取接收緩沖區的數據,根據具體的應用協議進行解析,然后根據解析的結果執行對應的操作,之后運行被模擬設備的控制功能,并更新被模擬設備的狀態。最后根據應用協議的要求生成相應的數據并放入發送緩沖區。(2)處理串口應用層數據的收發。其主要操作是判斷是否有串口數據需要讀取,如有數據則根據具體設備的傳輸層通訊協議進行解析和接收,將收到的合法數據存入接收緩沖區內。然后判斷發送緩沖區是否有數據需要發送,如有則將其按照傳輸協議寫入串口中。除了loop()主線程外,還有定時器周期觸發的中斷線程,在該線程中主要是進行任務的調度[5]。
3? ?系統實現(Implementation)
3.1? ?Arduino的編程框架
Arduino的編程是采用一種類似Java和C的語言,本質是C++的語言,因此采用C程序設計的風格對上一節描述的框架進行了實現。
將整個框架功能分散在多個C和h文件中實現,其中TaskManager、Main等有具體的代碼實現,并提供Jobs和Communication的頭文件,供用戶在進行具體測試應用時進行開發。
3.2? ?接收/發送緩沖區的數據結構
考慮到存在變長數據幀的情況,將通訊數據緩沖區長度設置為1024個字節,同時只存放一幀數據(即最新),并設置一個Ready變量解決讀寫的同步問題。即對于輸入緩沖區通訊模塊在寫完完整一幀數據后將ready置1,對于輸出緩沖區則只有在ready為1時才讀取并發送。
4 應用:智能靶網控制系統軟件測試(Application:Testing in target network control software system)
4.1? ?智能靶網控制系統結構及靶網節點功能
智能靶網控制系統是將智能靶機組合成網絡,結合控制軟件和觸控面板,用于部隊射擊和戰術訓練的一整套系統。其核心是智能靶機組成的物聯網絡,其結構如圖5所示。
智能靶與服務器通過Zigbee網絡進行數據交換,操作人員可通過服務器控制靶的動作(舉靶、倒靶),對靶進行編組,并進行成組控制,可控制多個靶和靶組按照指定的順序進行動作等。智能靶同時可以通過Zigbee網絡上傳靶機狀態數據,并且在射擊時主動上報射擊成績等。由于靶機數量多、功能多,靶網數據流量較大(隨著節點數目增多而增大),Zigbee通訊不穩定等問題會導致服務器端軟件開發簡單但調試工作量巨大。另外智能靶機成本高,體積重量大,移動困難,可用于調試的靶機數量不能滿足開發需要,造成后期開發人力成本居高不下。
4.2? ?智能靶網節點模擬方案
為了解決上述問題,基于Arduino和物聯網節點模擬框架,開發了智能靶網節點模擬單元,以一塊Arduino板代替了圖5中的“智能靶”硬件設備,降低了測試成本,提高了開發效率。
在圖6中,Arduino板子上外接了一塊XBee/Zigbee通訊模塊用于和服務器通訊,并基于Arduino的I/O口模擬了報靶、故障注入、靶機編碼等觸發功能和立倒狀態指示燈等顯示功能。其中狀態指示燈利用的Arduino的板載LED代替,這樣幾乎就沒有什么外接設備。
4.3? ?具體模塊實現
(1)數據通訊模塊
數據通訊模塊實現有兩種方案,一種是基于XBee提供的Arduino開發庫開發[9]。使用該庫使得Arduino與Zigbee設備的通訊極大簡化,并使得通訊更為可靠。另外一種是使用XBee提供的透傳模式[10]。在透傳模式下只需要根據應用協議檢測數據的幀頭并按長度接收即可。不過透傳模式無法對XBee設備進行更多的控制,犧牲了靈活性。本系統中使用XBee的透傳模式,根據應用協議,服務器發送的數據是以0x55開頭,固定長度的數據包,根據該特點就可以實現數據通訊模塊的接收。發送數據由于是已經按照應用協議編碼之后的數據,因此可以直接發送。
(2)協議解析與處理
根據靶網通訊協議,節點與服務器之間的通訊主要包括以下過程,如圖8所示。其中每一行代表一條通訊協議。其中協議1—4需要按照流程順序執行,而協議6—8則根據需要隨機發起,協議5則為周期性發送的狀態數據。協議解析與處理模塊主要工作流程為:a.解析協議,判斷其為協議1—8中的哪種;b.執行對應協議的命令動作;c.對于NETINIT和SETID協議,生成應答數據幀并存入發送緩沖區。
(3)設備模擬模塊
設備模擬模塊主要存儲了靶機的狀態(ID、服務器節點MAC地址、立/倒狀態、配置參數、分組編號、模擬的GPS數據等),并在立靶/倒靶命令時加入時延,模擬物理靶機執行所需的時間。設備模擬模塊根據協議解析模塊收到的命令和數據進行相應的虛擬動作,并根據狀態變化發送到I/O口顯示靶機狀態。
(4)數據發送模塊
根據協議要求,靶機節點需要定期發送狀態信息給服務器,該功能由數據發送模塊實現。數據發送模塊根據設備模擬模塊的數據進行封裝后寫入通訊模塊的發送數據緩沖區。該模塊按照一定的頻率(默認執行周期為5秒)由任務調度器調度執行,同時如果發送數據緩沖區已有其他數據則暫緩一個周期的數據發送。
以上各個模塊通過全局數據變量(定義在Main模塊中)進行之間的數據交換。
4.4? ?測試
按照上述設計編寫程序后下載到Arduino上執行。然后在計算機上連接XBee的模塊,搭建測試系統如圖7所示,通過串口調試助手發送和接收測試數據。上位機的XBee模塊工作在API模式下,因此發送和接收數據時候包含了XBee本身的數據幀結構。以下為網絡初始化指令(NETINIT)和狀態指令(STATUS)為例說明測試結果。
圖9顯示了發送網絡初始化NETINIT指令數據,以及收到的應答數據。發送區發送的是網絡初始化指令(0x55后的0x01),收到的是應答指令(接收區兩個連續的0x01,第一個0x01表示NETINIT_READY,第二個表示靶機內部保存的ID,此例為1)。
報靶指令是將IO口(2)與Arduino電源相連,觸發高電平,模擬子彈射中靶板的狀態,此時Arduino將模擬的命中數據發送給服務器。其中0x06表示SHOOT指令,0x01為模擬的靶ID,0x0C代表命中區域,0x09代表命中環數。
5? ?結論(Conclusion)
本文提出了一種以Arduino作為硬件載體模擬物聯網系統的節點功能及其通訊的模型,用于物聯網應用軟件的測試,采用半實物仿真的思想,讓軟件測試過程更接近真實場景,從而加速軟件開發的進程,提高物聯網應用軟件系統的開發效率,降低開發成本。所開發的模擬節點獲得的經驗更可以用于指導真實物聯網智能硬件節點的設計和開發。本文提出了基于Arduino的物聯網節點的模擬軟件框架和實現方法,該軟件框架和實現在智能靶網控制軟件中進行了應用,所獲得的模擬靶機硬件能夠真實地模擬靶機的功能和交互,為靶網控制軟件的快速迭代發揮了重要作用。
目前該軟件框架以源碼的方式應用在開發中,在將來可以將其封裝成Arduino的庫,以庫的形式集成在應用中,這樣可以進一步簡化開發,實現代碼分離。
參考文獻(References)
[1] Antero Taivalsaari,Tommi Mikkonen.A Roadmap to the Programmable World:Software Challenges in IoT Era[J].IEEE Software,2017,34(1):72-80.
[2] 趙丹,諶建飛,鄧敏,等.基于MQTT的步進電機遠程控制方案實現[J].測控技術,2018(6):126-129.
[3] 譚方勇,王昂,劉子寧.基于Zigbee與MQTT的物聯網網關通信框架的設計與實現[J].軟件工程,2017(4):43-45.
[4] 朱江彥,呂霖,向晉祥,等.基于BER-TLV報文格式的航標與水位動態數據交換技術[J].中國水運,2017(7):81-87.
[5] 蔡安江,蔣周月,郭師虹,等.半物理仿真技術工業應用現狀及發展趨勢[J].航天控制,2018(6):52-56.
[6] Anand Nayyar,Er Vikram Puri.A Review of Arduino Board's,Lilypad's & Arduino Shields[C].2016 3rd International Conference on Computing for Sustainable Global Development,New Delhi,2016:1485-1492.
[7] 陳琦,韓冰,秦偉俊,等.基于Zigbee/GPRS物聯網網關系統的設計與實現[J].計算機研究與發展,2011(S2):367-372.
[8] Micheal J.Pont.Patterns for time-triggered embedded system[M].Addison Wesley,2001.
[9] Andrew Rapp.Arduino library for communicating with XBee radios in API mode[EB/OL].https://github.com/andrewrapp/xbee-arduino.
[10] Digi International Inc.XBee/Xbee-PRO S2C Zigbee RF Module User Guide[EB/OL].2018.