杜 渂 王聚全
(1.上海迪愛斯通信設(shè)備有限公司 上海 200030 2.電信科學(xué)技術(shù)第一研究所 上海 200032)
近年來,隨著物聯(lián)網(wǎng)智能設(shè)備大量的應(yīng)用,針對(duì)物聯(lián)網(wǎng)智能設(shè)備數(shù)據(jù)采集和監(jiān)控系統(tǒng)的需求也越來越多,基于這樣的市場(chǎng)需求,筆者所在的研發(fā)團(tuán)隊(duì)研發(fā)了一款基于物聯(lián)網(wǎng)的智能數(shù)據(jù)采集設(shè)備和相對(duì)應(yīng)的數(shù)據(jù)采集和監(jiān)控系統(tǒng)。
本單位研發(fā)的物聯(lián)網(wǎng)智能數(shù)據(jù)采集和監(jiān)控系統(tǒng),以物聯(lián)網(wǎng)智能終端設(shè)備為基礎(chǔ)應(yīng)用設(shè)備,通過物聯(lián)網(wǎng)數(shù)據(jù)采集設(shè)備進(jìn)行數(shù)據(jù)采集,以計(jì)算機(jī)網(wǎng)絡(luò)為通信平臺(tái),將本單位研發(fā)的物聯(lián)網(wǎng)智能數(shù)據(jù)采集和監(jiān)控系統(tǒng)作為上層應(yīng)用,實(shí)現(xiàn)各種智能終端設(shè)備的統(tǒng)一接入、統(tǒng)一數(shù)據(jù)采集、統(tǒng)一監(jiān)控。
本文將介紹基于物聯(lián)網(wǎng)的智能數(shù)據(jù)采集和監(jiān)控系統(tǒng)在后臺(tái)服務(wù)上的一些設(shè)計(jì)方法。
早期的智能設(shè)備采集和監(jiān)控系統(tǒng),采用的設(shè)計(jì)理念是針對(duì)每個(gè)智能設(shè)備編寫一個(gè)采集和監(jiān)控程序。這樣的設(shè)計(jì)方式不易動(dòng)態(tài)增加設(shè)備,在開發(fā)上導(dǎo)致每一個(gè)設(shè)備的采集和監(jiān)控程序都需要控制通信、轉(zhuǎn)換和容錯(cuò)等處理功能。同時(shí),新增加的采集監(jiān)控程序需要下載到數(shù)據(jù)采集設(shè)備中,并進(jìn)行調(diào)試和測(cè)試,上位機(jī)系統(tǒng)也需要增加相應(yīng)功能的采集和監(jiān)控程序。
基于物聯(lián)網(wǎng)的智能數(shù)據(jù)采集和監(jiān)控系統(tǒng),實(shí)現(xiàn)了各種智能終端設(shè)備的統(tǒng)一接入、統(tǒng)一數(shù)據(jù)采集和統(tǒng)一監(jiān)控。系統(tǒng)在服務(wù)設(shè)計(jì)上采用了通過配置實(shí)現(xiàn)解耦的設(shè)計(jì)思想,將面向設(shè)備的設(shè)計(jì)理念通過多層抽象、解耦和協(xié)議轉(zhuǎn)換,轉(zhuǎn)變成編寫設(shè)備協(xié)議轉(zhuǎn)換規(guī)則的模式,使得智能設(shè)備可以通過配置的方式快速接入到系統(tǒng),如圖1所示。解決了不同廠商、不同功能的智能終端設(shè)備的接入問題,大大提高了系統(tǒng)的實(shí)施效率和可擴(kuò)展性。
圖1 通過配置實(shí)現(xiàn)解耦的架構(gòu)體系
通過這種設(shè)計(jì)方式,在產(chǎn)品化方面,通過配置即可達(dá)到接入大部分智能設(shè)備的功能。通過多層抽象,編寫通用的業(yè)務(wù)模型組件、通信協(xié)議組件和協(xié)議轉(zhuǎn)換組件,將設(shè)備數(shù)據(jù)交互抽象成為某一數(shù)據(jù)轉(zhuǎn)換協(xié)議,通過配置協(xié)議轉(zhuǎn)換組件達(dá)到接入大部分智能設(shè)備的功能。
在可擴(kuò)展方面,針對(duì)某些使用自定義協(xié)議的智能設(shè)備或者無法通過配置協(xié)議轉(zhuǎn)換規(guī)則接入的智能設(shè)備,可以采用編寫應(yīng)用插件的方式進(jìn)行擴(kuò)展。應(yīng)用插件采用對(duì)協(xié)議轉(zhuǎn)換規(guī)則進(jìn)行抽象封裝,使得以后使用同種協(xié)議模式的智能設(shè)備的不需要再進(jìn)行開發(fā)即可方便的接入到系統(tǒng)中。
在開發(fā)復(fù)雜度方面,數(shù)據(jù)采集設(shè)備內(nèi)不需要編寫復(fù)雜的智能設(shè)備接入程序,僅需下載配置好的解析文件即可采集智能設(shè)備的各種數(shù)據(jù),使得采集設(shè)備內(nèi)的嵌入式軟件開發(fā)復(fù)雜度降低。同時(shí),業(yè)務(wù)模型層-解析層-視圖模型層-界面層等各層之間業(yè)務(wù)和數(shù)據(jù)進(jìn)行了解耦,各層之間通過配置后的協(xié)議轉(zhuǎn)換組件進(jìn)行通信和解析,使得監(jiān)控系統(tǒng)開發(fā)的復(fù)雜度降低。由于采用了統(tǒng)一框架的模式,由系統(tǒng)框架來統(tǒng)一處理各種設(shè)備的數(shù)據(jù)、通信和界面顯示等異常情況,使得定制開發(fā)和插件開發(fā)的復(fù)雜度降低。
在實(shí)施過程中,由于采用動(dòng)態(tài)界面的設(shè)計(jì)模式,使得界面上所有展現(xiàn)組件可根據(jù)使用場(chǎng)景隨意添加和布局。針對(duì)大部分設(shè)備,由工程人員通過配置化操作即可實(shí)施,降低了項(xiàng)目實(shí)施的復(fù)雜度。
系統(tǒng)后臺(tái)服務(wù)主要由業(yè)務(wù)模型層、解析層、資源層、通信層和公用模塊組成,本章主要通過介紹業(yè)務(wù)模型層、解析層和資源層的設(shè)計(jì)思想,描述可配置的智能設(shè)備接入方案的實(shí)現(xiàn)原理。系統(tǒng)的各層模型如圖2所示。
業(yè)務(wù)模型層主要用來描述業(yè)務(wù)的基礎(chǔ)模型和設(shè)備模型,也包含了監(jiān)控相關(guān)的流程。業(yè)務(wù)模型層主要由三部分組成,分別是基礎(chǔ)模型、設(shè)備模型和業(yè)務(wù)模型層配置化消息解析功能。
基礎(chǔ)模型定義了系統(tǒng)中所有類的基類。
設(shè)備模型定義了物聯(lián)網(wǎng)數(shù)據(jù)采集設(shè)備及終端設(shè)備的層次結(jié)構(gòu)、設(shè)備屬性、設(shè)備中測(cè)點(diǎn)的屬性、ModbusTCP消息解析協(xié)議和數(shù)據(jù)轉(zhuǎn)換協(xié)議等內(nèi)容,同時(shí)對(duì)物聯(lián)網(wǎng)數(shù)據(jù)采集設(shè)備與終端設(shè)備的消息收發(fā)與解析進(jìn)行相應(yīng)的操作。設(shè)備模型中還定義了設(shè)備的監(jiān)控過程,包括消息的發(fā)送、接收、解析、數(shù)據(jù)轉(zhuǎn)換、采集的數(shù)據(jù)是否在正常范圍內(nèi)、異常事件通知等業(yè)務(wù)邏輯。設(shè)備模型是業(yè)務(wù)模型層的核心模型,也是整個(gè)系統(tǒng)的基礎(chǔ)。
圖2 后臺(tái)服務(wù)模型圖
系統(tǒng)中所有消息解析的規(guī)則都是在XML文件中進(jìn)行配置的,包括消息的解析、消息變量的解析和數(shù)據(jù)轉(zhuǎn)換等,現(xiàn)系統(tǒng)主要包含了對(duì)ModbusTCP協(xié)議的01和03消息的解析。針對(duì)每種消息類型,設(shè)計(jì)有相應(yīng)的消息解析器,如果需要解析其它的消息類型,可以采用開發(fā)消息解析插件的方式編寫相應(yīng)的解析器類,并在XML中進(jìn)行配置,動(dòng)態(tài)加載使用。
通過配置化的解析過程,使得系統(tǒng)能夠靈活適應(yīng)不同設(shè)備的監(jiān)控需求。當(dāng)現(xiàn)有系統(tǒng)中的轉(zhuǎn)換器不能滿足要求,也可以通過編寫轉(zhuǎn)換器插件進(jìn)行擴(kuò)展,并在XML文件中配置后動(dòng)態(tài)加載使用。
業(yè)務(wù)模型層的消息解析結(jié)構(gòu)如圖3所示。
圖3 業(yè)務(wù)模型層消息解析圖
解析層架構(gòu)由ModbusTCP消息解析器、數(shù)據(jù)轉(zhuǎn)換器及XML解析器三部分組成,主要用于對(duì)消息的解析及XML配置文件的讀取解析。
(1)ModbusTCP消息解析器
ModbusTCP消息解析器用于對(duì)ModbusTCP消息的封裝和解析,現(xiàn)包含01和03消息的解析器插件,針對(duì)業(yè)務(wù)上的需求,可以通過擴(kuò)展插件的方式進(jìn)行解析器的擴(kuò)展。
ModbusTCP 01/03消息解析需要對(duì)字節(jié)流按照ModbusTCP協(xié)議分解為7個(gè)字節(jié)的消息頭,并根據(jù)功能碼是否正常保存相關(guān)數(shù)據(jù),返回解析后的消息包。功能碼如果收發(fā)消息一致則正常,如果接收的消息功能碼是發(fā)送消息功能碼加上0x80,則表示消息異常,程序中需要保存錯(cuò)誤信息。
01/03消息封裝需要將上層的消息包按照ModbusTCP協(xié)議填充到字節(jié)流中,需要注意的是由于協(xié)議中規(guī)定需要按照Big Endian方式傳遞消息,故在填充時(shí)需要將數(shù)據(jù)按照這種方式來轉(zhuǎn)換,最后生成包含字節(jié)流和原始功能碼的發(fā)送消息包。在設(shè)計(jì)時(shí)考慮將原始功能碼封裝到包中是為了達(dá)到判斷接收消息中的功能碼是否正常的目的。
(2)數(shù)據(jù)轉(zhuǎn)換器
數(shù)據(jù)轉(zhuǎn)換器主要針對(duì)智能設(shè)備每個(gè)測(cè)點(diǎn)采集的監(jiān)測(cè)數(shù)據(jù)進(jìn)行數(shù)據(jù)轉(zhuǎn)換使用,轉(zhuǎn)換器可以配置參數(shù)并進(jìn)行擴(kuò)展。
01/03消息數(shù)據(jù)轉(zhuǎn)換過程實(shí)際上涉及到模型層中定義的接收消息處理流程。對(duì)于01消息只需要將字節(jié)流轉(zhuǎn)化為位數(shù)組,采用默認(rèn)的ByteToBitConverter轉(zhuǎn)換器即可實(shí)現(xiàn)。03消息較復(fù)雜,需要根據(jù)每個(gè)設(shè)備測(cè)點(diǎn)在字節(jié)流中的位置先將字節(jié)流中的數(shù)據(jù)分離出來,再根據(jù)每個(gè)測(cè)點(diǎn)對(duì)應(yīng)的數(shù)據(jù)轉(zhuǎn)換器數(shù)組進(jìn)行依次的數(shù)據(jù)轉(zhuǎn)換。兩種消息在數(shù)據(jù)轉(zhuǎn)換完成時(shí),都需要進(jìn)行數(shù)據(jù)的效驗(yàn),最終進(jìn)行測(cè)點(diǎn)賦值。
由于需要監(jiān)控的終端設(shè)備千變?nèi)f化,每種設(shè)備的測(cè)點(diǎn)數(shù)據(jù)在從物聯(lián)網(wǎng)數(shù)據(jù)采集設(shè)備中獲得時(shí)可能還不能直觀的顯示給用戶,因此需要做一定的轉(zhuǎn)換。例如從溫濕度計(jì)獲得的數(shù)據(jù)可能并不是攝氏度的方式表達(dá)的,就需要轉(zhuǎn)換為攝氏度。在轉(zhuǎn)換的過程中,系統(tǒng)提供了相應(yīng)的數(shù)據(jù)轉(zhuǎn)換器對(duì)測(cè)點(diǎn)數(shù)據(jù)進(jìn)行處理。但由于轉(zhuǎn)換過程的不定性,不可能窮盡所有的轉(zhuǎn)換方式,在設(shè)計(jì)時(shí)可以將一些轉(zhuǎn)換方式分解,然后根據(jù)實(shí)際需求采用多個(gè)轉(zhuǎn)換器累加串聯(lián)的模式,即上一個(gè)轉(zhuǎn)換器得到的結(jié)果將被應(yīng)用于下一個(gè)轉(zhuǎn)換器,使用多個(gè)轉(zhuǎn)換器來實(shí)現(xiàn)同一個(gè)數(shù)據(jù)的轉(zhuǎn)換,并獲得最終的結(jié)果,實(shí)現(xiàn)了更多的轉(zhuǎn)換功能。
針對(duì)業(yè)務(wù)上特殊的需求,用現(xiàn)有的轉(zhuǎn)換器無法對(duì)數(shù)據(jù)進(jìn)行有效轉(zhuǎn)換的話,可以以開發(fā)插件的方式新編寫一個(gè)或多個(gè)轉(zhuǎn)換器來應(yīng)對(duì)出現(xiàn)的特殊轉(zhuǎn)換,當(dāng)然在研發(fā)時(shí)需要盡量進(jìn)行抽象設(shè)計(jì),保證新的轉(zhuǎn)換器能被應(yīng)用到新的場(chǎng)合。這種方式通過使用多個(gè)轉(zhuǎn)換器就能對(duì)復(fù)雜的數(shù)據(jù)進(jìn)行轉(zhuǎn)換并獲得結(jié)果,最大程度的復(fù)用了轉(zhuǎn)換器,并通過使用不同的轉(zhuǎn)換器參數(shù)還能完成同一個(gè)轉(zhuǎn)換器的不同功能。相對(duì)應(yīng)的,在XML配置時(shí)則需要對(duì)每個(gè)測(cè)點(diǎn)配置多個(gè)轉(zhuǎn)換器,配置順序決定了轉(zhuǎn)換器執(zhí)行的順序。
轉(zhuǎn)換器累加串聯(lián)結(jié)構(gòu)如圖4所示。
圖4 轉(zhuǎn)換器串聯(lián)結(jié)構(gòu)圖
(3)配置解析器
配置解析器用于所有XML配置文件的解析與驗(yàn)證,同時(shí)支持解析器的擴(kuò)展。
配置解析過程包括:加載XML配置文件,解析XML配置文件根元素,根據(jù)根元素獲取對(duì)應(yīng)的解析器,并進(jìn)行XML配置文件架構(gòu)驗(yàn)證,最后再使用解析器解析XML配置文件獲得對(duì)應(yīng)對(duì)象。如果解析器在解析配置的過程中,該XML配置文件還關(guān)聯(lián)了其它XML配置文件,則會(huì)對(duì)關(guān)聯(lián)的所有XML配置文件進(jìn)行再解析。系統(tǒng)中的XML配置文件是從第一個(gè)主XML文件開始,將所有XML文件關(guān)聯(lián)起來的,因此只需要調(diào)用一次加載方法即可將所有的XML配置文件加載起來。
在配置解析器設(shè)計(jì)中采用的是工廠模式的設(shè)計(jì)方法。一般的工廠模式是將選擇權(quán)交給工廠,本系統(tǒng)則將選擇權(quán)配置在XML文件中。每種類型的工廠存儲(chǔ)了該類型相關(guān)的解析器或轉(zhuǎn)換器,對(duì)應(yīng)于相應(yīng)的XML配置。同時(shí)工廠中的每個(gè)解析器或轉(zhuǎn)換器的ID又被其它XML文件引用,從而確定了運(yùn)行時(shí)需要的具體對(duì)象類型。這樣的方式類似于IoC,能夠?qū)㈩愔g的依賴放在配置中而不是代碼中,有利于修改和擴(kuò)展功能。調(diào)用解析器/轉(zhuǎn)換器過程如圖5所示。
圖5 調(diào)用解析器/轉(zhuǎn)換器過程圖
在定義解析器或轉(zhuǎn)換器的同時(shí),也可以定義其默認(rèn)參數(shù)和用戶參數(shù)。默認(rèn)參數(shù)是在工廠對(duì)應(yīng)的XML文件中定義的,屬于出廠時(shí)的參數(shù),在其它XML引用工廠中對(duì)象時(shí),可以更改默認(rèn)參數(shù)為實(shí)際的用戶參數(shù),最終使用的參數(shù)將是這兩種參數(shù)的組合,其中用戶參數(shù)優(yōu)先。默認(rèn)參數(shù)和用戶參數(shù)的定參過程如圖6所示。
圖6 定參過程圖
XML配置文件的解析實(shí)際上采用了兩種方式:一種是自解析,即XML根元素已經(jīng)描述了如何解析該XML文件,主要包含創(chuàng)建解析器需要使用的程序集和對(duì)象類型,以及架構(gòu)驗(yàn)證需要的文件路徑。另一種是通過根元素名稱在XML解析器工廠對(duì)應(yīng)的XML文件中進(jìn)行匹配。分別使用這兩種方式的原因在于,第二種方式的使用前提是XML解析器工廠已經(jīng)從XML文件中加載起來,這樣該工廠對(duì)應(yīng)的這個(gè)XML就必須要先完成自解析,即第一種方式是第二種方式的前提。
采用根元素來匹配的方式也簡(jiǎn)化了系統(tǒng)中的判斷流程,根元素名稱決定了該XML的類型和所使用的解析器類型。同時(shí)這種設(shè)計(jì)方法可以在解析XML配置文件的時(shí)候重用,例如系統(tǒng)中大部分的數(shù)據(jù)字典在XML結(jié)構(gòu)上都是一樣的,所以只需要采用同一個(gè)根元素名稱,就能使用同一個(gè)解析器進(jìn)行解析,不需要再增加額外的解析器。
系統(tǒng)在解析時(shí)還采用了XML架構(gòu)文件來驗(yàn)證XML的結(jié)構(gòu)正確性,這樣設(shè)計(jì)的目的是為了簡(jiǎn)化程序代碼中對(duì)XML的效驗(yàn),同樣每個(gè)根元素名稱也對(duì)應(yīng)唯一一個(gè)XML架構(gòu)文件。XML配置文件解析方法如圖7所示。
圖7 XML配置文件解析方法
(1)資源層的設(shè)計(jì)
資源層主要包含了系統(tǒng)需要使用的相關(guān)資源,包含了界面需要使用的控件庫、容器庫、監(jiān)控主題、配置需要使用的模板字典、加載XML配置文件的統(tǒng)一入口信息,以及系統(tǒng)需要使用的數(shù)據(jù)類型和字典資源。
資源層供其它模塊和層次調(diào)用,也采用類似解析層使用的工廠模式設(shè)計(jì)方法進(jìn)行設(shè)計(jì),可進(jìn)行資源的配置、擴(kuò)展和替換。
資源層最主要的應(yīng)用場(chǎng)景是使用監(jiān)控主題,監(jiān)控主題主要是將所監(jiān)控的各個(gè)設(shè)備以及設(shè)備上的各個(gè)測(cè)點(diǎn)依據(jù)用戶的需求動(dòng)態(tài)組合在一個(gè)監(jiān)控界面中,并結(jié)合布局進(jìn)行動(dòng)態(tài)展示。
監(jiān)控主題主要由主題、主題映射及自定義主題三個(gè)部分組成,其中主題用于展示界面需要顯示的監(jiān)控內(nèi)容,由主題工廠、主題、布局容器和前端展現(xiàn)控件組成。主題工廠層次如圖8所示。
圖8 主題工廠關(guān)系圖
主題映射是主題與界面對(duì)象之間的映射關(guān)系,通過映射關(guān)系可關(guān)聯(lián)到主題集合,進(jìn)而可關(guān)聯(lián)到每個(gè)主題,使得前臺(tái)界面層能依據(jù)主題映射關(guān)系動(dòng)態(tài)加載用戶需要展現(xiàn)的主題。主題映射層次如圖9所示。
圖9 主題映射關(guān)系圖
(2)通信層的設(shè)計(jì)
通信層主要用于建立ModbusTCP連接,可同步或異步收發(fā)ModbusTCP消息。通信層的核心為通信適配器,通過通信適配器可以同其它支持ModbusTCP協(xié)議的設(shè)備建立連接和收發(fā)消息(ModbusTCP協(xié)議默認(rèn)端口為502)。
通過構(gòu)建通信適配器插件的方式也可擴(kuò)展通信層支持的協(xié)議類型。
(3)業(yè)務(wù)公共層的設(shè)計(jì)
公共層主要包含通用輔助類庫、異常中心及系統(tǒng)配置模塊。
通用輔助類用于定義系統(tǒng)使用的一些通用方法和信息。異常中心用于記錄異常的日志信息以及發(fā)出異常通知消息。系統(tǒng)配置模塊用于讀取和保存系統(tǒng)中使用的各種配置項(xiàng)。
本文結(jié)合物聯(lián)網(wǎng)智能數(shù)據(jù)采集和監(jiān)控系統(tǒng)實(shí)際應(yīng)用需求,通過對(duì)該系統(tǒng)后臺(tái)服務(wù)設(shè)計(jì)理念和架構(gòu)設(shè)計(jì)的論述,闡述了該系統(tǒng)的研究設(shè)計(jì)成果,對(duì)構(gòu)建具有良好的擴(kuò)展能力、高性能和易實(shí)施的物聯(lián)網(wǎng)智能數(shù)據(jù)采集和監(jiān)控系統(tǒng)具有一定的指導(dǎo)意義。通過使用該系統(tǒng),可以顯著降低研發(fā)人員工作量,縮短項(xiàng)目履行人員實(shí)施周期,提高工作效率和提升項(xiàng)目質(zhì)量,具有良好的應(yīng)用價(jià)值和前景。
[1] 杜渂,王聚全,雷霆,基于物聯(lián)網(wǎng)的智能數(shù)據(jù)采集和監(jiān)控系統(tǒng)設(shè)計(jì)[J].電信快報(bào),2013(7):14-17.
[2] 杜渂,基于RFID技術(shù)的公共交通調(diào)度系統(tǒng)開發(fā)與應(yīng)用[J].電信快報(bào),2010(6):10-13,18.