李曉明 Thierno Gueye
摘? 要:在物聯(lián)網(wǎng)應(yīng)用開發(fā)中,其軟件系統(tǒng)的開發(fā)往往受制于硬件節(jié)點的開發(fā)進度和完善程度,造成開發(fā)進度緩慢,需求不斷變更,軟件測試維護困難等問題。如果能在開發(fā)初期迅速搭建一個物聯(lián)網(wǎng)節(jié)點的模擬單元則能夠極大促進系統(tǒng)的開發(fā)和完善。Arduino提供了一個開源的、通用的、簡單易用的硬件平臺,非常適合模擬物聯(lián)網(wǎng)的硬件節(jié)點功能。本論文基于Arduino及其開發(fā)框架,提出了一個通用的物聯(lián)網(wǎng)節(jié)點的模擬單元模型,基于該模型開發(fā)了智能靶的虛擬節(jié)點用于智能靶網(wǎng)管控系統(tǒng)的開發(fā),開發(fā)實踐表明該模型和方法可以快速實現(xiàn)物聯(lián)網(wǎng)節(jié)點功能和數(shù)據(jù)的模擬,提高物聯(lián)網(wǎng)系統(tǒng)的開發(fā)質(zhì)量。
關(guān)鍵詞:物聯(lián)網(wǎng);Arduino;軟件框架
中圖分類號:TP311.5? ? ?文獻標(biāo)識碼: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)
物聯(lián)網(wǎng)(IoT, Internet of Things)的繁榮帶動了大量的物聯(lián)網(wǎng)應(yīng)用的開發(fā)需求,一個完整的物聯(lián)網(wǎng)應(yīng)用開發(fā)包括基于智能硬件的節(jié)點開發(fā),以及移動端、PC端的網(wǎng)絡(luò)應(yīng)用開發(fā),即使是一個小規(guī)模的物聯(lián)網(wǎng)應(yīng)用也是如此。由于硬件開發(fā)的周期較長,網(wǎng)絡(luò)應(yīng)用軟件的開發(fā)則相對較快,造成了軟件測試受制于硬件開發(fā)進度的矛盾,特別是對于那些依賴于快速迭代的軟件開發(fā)技術(shù)的項目,會因此而受到很大的制約。此外,由于軟硬件開發(fā)通常由不同的團隊完成,測試帶來的人力和協(xié)調(diào)方面的成本也會很高[1]。
為了解決上述問題,在軟件工程實踐中,通常是采用標(biāo)準(zhǔn)化的物聯(lián)網(wǎng)通訊協(xié)議或者數(shù)據(jù)封裝來解耦硬件和軟件系統(tǒng)之間的依賴。例如在物聯(lián)網(wǎng)應(yīng)用開發(fā)中廣泛使用的MQTT協(xié)議[2,3],以及基于TLV的數(shù)據(jù)封裝格式[4]等。但由于具體應(yīng)用千變?nèi)f化,物聯(lián)網(wǎng)絡(luò)結(jié)構(gòu)復(fù)雜,感知層網(wǎng)絡(luò)類型不統(tǒng)一等問題的存在,這種方法并不能很好地解決開發(fā)中的問題。半物理仿真的概念是在仿真回路中引入部分實物,即硬件在環(huán)的方法,進行控制系統(tǒng)的仿真[5],同樣,在軟件開發(fā)和測試過程中,借鑒半物理仿真的思想,引入通用硬件技術(shù),對物聯(lián)網(wǎng)節(jié)點進行模擬,可以很好地解決物聯(lián)網(wǎng)應(yīng)用開發(fā)過程中的矛盾。
Arduino是一種開源的通用硬件平臺,具有開發(fā)簡單,接口豐富,成本低廉等優(yōu)點,非常適合作為物聯(lián)網(wǎng)節(jié)點的模擬設(shè)備[6]。本論文將基于Arduino硬件平臺,通過設(shè)計實現(xiàn)面向物聯(lián)網(wǎng)應(yīng)用的節(jié)點模擬軟件框架和模型,并以靶網(wǎng)管理系統(tǒng)軟件開發(fā)為應(yīng)用背景,探討如何實現(xiàn)智能靶節(jié)點的模擬,以降低軟件開發(fā)的周期和成本。
2? ?軟件系統(tǒng)建模(Software modeling)
2.1? ?框架設(shè)計
對于物聯(lián)網(wǎng)應(yīng)用來說,本質(zhì)上是物聯(lián)網(wǎng)智能節(jié)點與服務(wù)器之間的數(shù)據(jù)交換。由于物聯(lián)網(wǎng)底層和互聯(lián)網(wǎng)通常采用的協(xié)議不同,數(shù)據(jù)交換通常是基于一個物聯(lián)網(wǎng)關(guān)實現(xiàn)[2,7]。物聯(lián)網(wǎng)應(yīng)用系統(tǒng)的典型結(jié)構(gòu)模型如圖1所示。
物聯(lián)網(wǎng)傳輸協(xié)議有很多種,例如Zigbee、工業(yè)以太網(wǎng)、工業(yè)總線、NB-IoT等。對于Arduino而言,都有專門的模塊和轉(zhuǎn)接板對應(yīng)于這些網(wǎng)絡(luò)。通常Arduino與這些模塊之間是通過串口進行通訊的,因此在設(shè)計基于Arduino的物聯(lián)網(wǎng)節(jié)點模擬軟件框架如圖2所示。
該軟件框架是從基于時間的嵌入式多任務(wù)框架[8]中擴展而來,其中方框表示軟件模塊/任務(wù),而箭頭表示調(diào)用關(guān)系。該框架包括以下內(nèi)容:
(1)“定時器”模塊提供了多任務(wù)的運行時間片參考。該定時器使用了Arduino板上單片機的硬件定時器,并利用定時器的中斷服務(wù)來運行任務(wù)調(diào)度模塊。
(2)“任務(wù)調(diào)度模塊”實現(xiàn)了對任務(wù)的管理和執(zhí)行。任務(wù)調(diào)度模塊會在定時器產(chǎn)生的時間間隔內(nèi)依次調(diào)用系統(tǒng)內(nèi)的任務(wù)模塊,這些任務(wù)模塊實現(xiàn)了對輸入的協(xié)議數(shù)據(jù)的解析,數(shù)據(jù)處理,模擬設(shè)備模型的執(zhí)行,以及生成返回給服務(wù)器的數(shù)據(jù)。這些任務(wù)模塊包括數(shù)據(jù)解析任務(wù)模塊、協(xié)議處理任務(wù)模塊、模擬設(shè)備任務(wù)模塊和數(shù)據(jù)發(fā)送任務(wù)模塊。其中模擬設(shè)備任務(wù)模塊是為了模擬節(jié)點的功能,例如和執(zhí)行控制、狀態(tài)更新等。
(3)“數(shù)據(jù)通訊模塊”實現(xiàn)了基于串口的與通訊設(shè)備的數(shù)據(jù)交換機制,針對不同的通訊設(shè)備,該模塊的實現(xiàn)不同,主要封裝了針對不同設(shè)備的通訊細節(jié);“設(shè)備實體/狀態(tài)模擬模塊”實現(xiàn)了節(jié)點功能和狀態(tài)的仿真,通常情況下是存儲與被模擬節(jié)點相關(guān)的數(shù)據(jù)。
2.2? ?工作原理
該框架的工作原理如圖3所示。根據(jù)程序流程分為Setup(設(shè)置)和Loop(運行)兩個部分,前者主要完成調(diào)度器的初始化,后者主要負責(zé)執(zhí)行任務(wù)和與通訊設(shè)備通訊。
首先,系統(tǒng)上電后執(zhí)行Setup()部分,該部分主要是初始化任務(wù)調(diào)度器,并將需要運行的任務(wù)增加到任務(wù)列表中,并在最后啟動任務(wù)調(diào)度器的執(zhí)行,完成初始化的工作。然后系統(tǒng)進入運行狀態(tài),開始循環(huán)調(diào)用loop()部分。在這部分主要工作是(1)根據(jù)調(diào)度結(jié)果執(zhí)行任務(wù)調(diào)度器中的任務(wù),主要包括獲取接收緩沖區(qū)的數(shù)據(jù),根據(jù)具體的應(yīng)用協(xié)議進行解析,然后根據(jù)解析的結(jié)果執(zhí)行對應(yīng)的操作,之后運行被模擬設(shè)備的控制功能,并更新被模擬設(shè)備的狀態(tài)。最后根據(jù)應(yīng)用協(xié)議的要求生成相應(yīng)的數(shù)據(jù)并放入發(fā)送緩沖區(qū)。(2)處理串口應(yīng)用層數(shù)據(jù)的收發(fā)。其主要操作是判斷是否有串口數(shù)據(jù)需要讀取,如有數(shù)據(jù)則根據(jù)具體設(shè)備的傳輸層通訊協(xié)議進行解析和接收,將收到的合法數(shù)據(jù)存入接收緩沖區(qū)內(nèi)。然后判斷發(fā)送緩沖區(qū)是否有數(shù)據(jù)需要發(fā)送,如有則將其按照傳輸協(xié)議寫入串口中。除了loop()主線程外,還有定時器周期觸發(fā)的中斷線程,在該線程中主要是進行任務(wù)的調(diào)度[5]。
3? ?系統(tǒng)實現(xiàn)(Implementation)
3.1? ?Arduino的編程框架
Arduino的編程是采用一種類似Java和C的語言,本質(zhì)是C++的語言,因此采用C程序設(shè)計的風(fēng)格對上一節(jié)描述的框架進行了實現(xiàn)。
將整個框架功能分散在多個C和h文件中實現(xiàn),其中TaskManager、Main等有具體的代碼實現(xiàn),并提供Jobs和Communication的頭文件,供用戶在進行具體測試應(yīng)用時進行開發(fā)。
3.2? ?接收/發(fā)送緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu)
考慮到存在變長數(shù)據(jù)幀的情況,將通訊數(shù)據(jù)緩沖區(qū)長度設(shè)置為1024個字節(jié),同時只存放一幀數(shù)據(jù)(即最新),并設(shè)置一個Ready變量解決讀寫的同步問題。即對于輸入緩沖區(qū)通訊模塊在寫完完整一幀數(shù)據(jù)后將ready置1,對于輸出緩沖區(qū)則只有在ready為1時才讀取并發(fā)送。
4 應(yīng)用:智能靶網(wǎng)控制系統(tǒng)軟件測試(Application:Testing in target network control software system)
4.1? ?智能靶網(wǎng)控制系統(tǒng)結(jié)構(gòu)及靶網(wǎng)節(jié)點功能
智能靶網(wǎng)控制系統(tǒng)是將智能靶機組合成網(wǎng)絡(luò),結(jié)合控制軟件和觸控面板,用于部隊射擊和戰(zhàn)術(shù)訓(xùn)練的一整套系統(tǒng)。其核心是智能靶機組成的物聯(lián)網(wǎng)絡(luò),其結(jié)構(gòu)如圖5所示。
智能靶與服務(wù)器通過Zigbee網(wǎng)絡(luò)進行數(shù)據(jù)交換,操作人員可通過服務(wù)器控制靶的動作(舉靶、倒靶),對靶進行編組,并進行成組控制,可控制多個靶和靶組按照指定的順序進行動作等。智能靶同時可以通過Zigbee網(wǎng)絡(luò)上傳靶機狀態(tài)數(shù)據(jù),并且在射擊時主動上報射擊成績等。由于靶機數(shù)量多、功能多,靶網(wǎng)數(shù)據(jù)流量較大(隨著節(jié)點數(shù)目增多而增大),Zigbee通訊不穩(wěn)定等問題會導(dǎo)致服務(wù)器端軟件開發(fā)簡單但調(diào)試工作量巨大。另外智能靶機成本高,體積重量大,移動困難,可用于調(diào)試的靶機數(shù)量不能滿足開發(fā)需要,造成后期開發(fā)人力成本居高不下。
4.2? ?智能靶網(wǎng)節(jié)點模擬方案
為了解決上述問題,基于Arduino和物聯(lián)網(wǎng)節(jié)點模擬框架,開發(fā)了智能靶網(wǎng)節(jié)點模擬單元,以一塊Arduino板代替了圖5中的“智能靶”硬件設(shè)備,降低了測試成本,提高了開發(fā)效率。
在圖6中,Arduino板子上外接了一塊XBee/Zigbee通訊模塊用于和服務(wù)器通訊,并基于Arduino的I/O口模擬了報靶、故障注入、靶機編碼等觸發(fā)功能和立倒?fàn)顟B(tài)指示燈等顯示功能。其中狀態(tài)指示燈利用的Arduino的板載LED代替,這樣幾乎就沒有什么外接設(shè)備。
4.3? ?具體模塊實現(xiàn)
(1)數(shù)據(jù)通訊模塊
數(shù)據(jù)通訊模塊實現(xiàn)有兩種方案,一種是基于XBee提供的Arduino開發(fā)庫開發(fā)[9]。使用該庫使得Arduino與Zigbee設(shè)備的通訊極大簡化,并使得通訊更為可靠。另外一種是使用XBee提供的透傳模式[10]。在透傳模式下只需要根據(jù)應(yīng)用協(xié)議檢測數(shù)據(jù)的幀頭并按長度接收即可。不過透傳模式無法對XBee設(shè)備進行更多的控制,犧牲了靈活性。本系統(tǒng)中使用XBee的透傳模式,根據(jù)應(yīng)用協(xié)議,服務(wù)器發(fā)送的數(shù)據(jù)是以0x55開頭,固定長度的數(shù)據(jù)包,根據(jù)該特點就可以實現(xiàn)數(shù)據(jù)通訊模塊的接收。發(fā)送數(shù)據(jù)由于是已經(jīng)按照應(yīng)用協(xié)議編碼之后的數(shù)據(jù),因此可以直接發(fā)送。
(2)協(xié)議解析與處理
根據(jù)靶網(wǎng)通訊協(xié)議,節(jié)點與服務(wù)器之間的通訊主要包括以下過程,如圖8所示。其中每一行代表一條通訊協(xié)議。其中協(xié)議1—4需要按照流程順序執(zhí)行,而協(xié)議6—8則根據(jù)需要隨機發(fā)起,協(xié)議5則為周期性發(fā)送的狀態(tài)數(shù)據(jù)。協(xié)議解析與處理模塊主要工作流程為:a.解析協(xié)議,判斷其為協(xié)議1—8中的哪種;b.執(zhí)行對應(yīng)協(xié)議的命令動作;c.對于NETINIT和SETID協(xié)議,生成應(yīng)答數(shù)據(jù)幀并存入發(fā)送緩沖區(qū)。
(3)設(shè)備模擬模塊
設(shè)備模擬模塊主要存儲了靶機的狀態(tài)(ID、服務(wù)器節(jié)點MAC地址、立/倒?fàn)顟B(tài)、配置參數(shù)、分組編號、模擬的GPS數(shù)據(jù)等),并在立靶/倒靶命令時加入時延,模擬物理靶機執(zhí)行所需的時間。設(shè)備模擬模塊根據(jù)協(xié)議解析模塊收到的命令和數(shù)據(jù)進行相應(yīng)的虛擬動作,并根據(jù)狀態(tài)變化發(fā)送到I/O口顯示靶機狀態(tài)。
(4)數(shù)據(jù)發(fā)送模塊
根據(jù)協(xié)議要求,靶機節(jié)點需要定期發(fā)送狀態(tài)信息給服務(wù)器,該功能由數(shù)據(jù)發(fā)送模塊實現(xiàn)。數(shù)據(jù)發(fā)送模塊根據(jù)設(shè)備模擬模塊的數(shù)據(jù)進行封裝后寫入通訊模塊的發(fā)送數(shù)據(jù)緩沖區(qū)。該模塊按照一定的頻率(默認執(zhí)行周期為5秒)由任務(wù)調(diào)度器調(diào)度執(zhí)行,同時如果發(fā)送數(shù)據(jù)緩沖區(qū)已有其他數(shù)據(jù)則暫緩一個周期的數(shù)據(jù)發(fā)送。
以上各個模塊通過全局數(shù)據(jù)變量(定義在Main模塊中)進行之間的數(shù)據(jù)交換。
4.4? ?測試
按照上述設(shè)計編寫程序后下載到Arduino上執(zhí)行。然后在計算機上連接XBee的模塊,搭建測試系統(tǒng)如圖7所示,通過串口調(diào)試助手發(fā)送和接收測試數(shù)據(jù)。上位機的XBee模塊工作在API模式下,因此發(fā)送和接收數(shù)據(jù)時候包含了XBee本身的數(shù)據(jù)幀結(jié)構(gòu)。以下為網(wǎng)絡(luò)初始化指令(NETINIT)和狀態(tài)指令(STATUS)為例說明測試結(jié)果。
圖9顯示了發(fā)送網(wǎng)絡(luò)初始化NETINIT指令數(shù)據(jù),以及收到的應(yīng)答數(shù)據(jù)。發(fā)送區(qū)發(fā)送的是網(wǎng)絡(luò)初始化指令(0x55后的0x01),收到的是應(yīng)答指令(接收區(qū)兩個連續(xù)的0x01,第一個0x01表示NETINIT_READY,第二個表示靶機內(nèi)部保存的ID,此例為1)。
報靶指令是將IO口(2)與Arduino電源相連,觸發(fā)高電平,模擬子彈射中靶板的狀態(tài),此時Arduino將模擬的命中數(shù)據(jù)發(fā)送給服務(wù)器。其中0x06表示SHOOT指令,0x01為模擬的靶ID,0x0C代表命中區(qū)域,0x09代表命中環(huán)數(shù)。
5? ?結(jié)論(Conclusion)
本文提出了一種以Arduino作為硬件載體模擬物聯(lián)網(wǎng)系統(tǒng)的節(jié)點功能及其通訊的模型,用于物聯(lián)網(wǎng)應(yīng)用軟件的測試,采用半實物仿真的思想,讓軟件測試過程更接近真實場景,從而加速軟件開發(fā)的進程,提高物聯(lián)網(wǎng)應(yīng)用軟件系統(tǒng)的開發(fā)效率,降低開發(fā)成本。所開發(fā)的模擬節(jié)點獲得的經(jīng)驗更可以用于指導(dǎo)真實物聯(lián)網(wǎng)智能硬件節(jié)點的設(shè)計和開發(fā)。本文提出了基于Arduino的物聯(lián)網(wǎng)節(jié)點的模擬軟件框架和實現(xiàn)方法,該軟件框架和實現(xiàn)在智能靶網(wǎng)控制軟件中進行了應(yīng)用,所獲得的模擬靶機硬件能夠真實地模擬靶機的功能和交互,為靶網(wǎng)控制軟件的快速迭代發(fā)揮了重要作用。
目前該軟件框架以源碼的方式應(yīng)用在開發(fā)中,在將來可以將其封裝成Arduino的庫,以庫的形式集成在應(yīng)用中,這樣可以進一步簡化開發(fā),實現(xiàn)代碼分離。
參考文獻(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的步進電機遠程控制方案實現(xiàn)[J].測控技術(shù),2018(6):126-129.
[3] 譚方勇,王昂,劉子寧.基于Zigbee與MQTT的物聯(lián)網(wǎng)網(wǎng)關(guān)通信框架的設(shè)計與實現(xiàn)[J].軟件工程,2017(4):43-45.
[4] 朱江彥,呂霖,向晉祥,等.基于BER-TLV報文格式的航標(biāo)與水位動態(tài)數(shù)據(jù)交換技術(shù)[J].中國水運,2017(7):81-87.
[5] 蔡安江,蔣周月,郭師虹,等.半物理仿真技術(shù)工業(yè)應(yīng)用現(xiàn)狀及發(fā)展趨勢[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物聯(lián)網(wǎng)網(wǎng)關(guān)系統(tǒng)的設(shè)計與實現(xiàn)[J].計算機研究與發(fā)展,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.