吳上泉, 高濤, 陳軍
(工業(yè)和信息化部電子第五研究所,廣東 廣州 510610)
近年來(lái),隨著國(guó)內(nèi)供給側(cè)改革的深入與檢測(cè)機(jī)構(gòu)服務(wù)型職能的轉(zhuǎn)變,檢測(cè)認(rèn)證的市場(chǎng)化程度有了明顯的提高,認(rèn)證行業(yè)的細(xì)分程度和領(lǐng)域也日益明顯,與此同時(shí),為了滿足各地不同企業(yè)差異化需求,檢測(cè)機(jī)構(gòu)紛紛建設(shè)異地實(shí)驗(yàn)室,為了保證檢測(cè)數(shù)據(jù)的有效和權(quán)威性,樣品流轉(zhuǎn)的記錄、測(cè)試數(shù)據(jù)的實(shí)時(shí)監(jiān)控、測(cè)試記錄的一致性溯源就顯得尤為關(guān)鍵[1]。
同時(shí)隨著移動(dòng)互聯(lián)網(wǎng)領(lǐng)域的興起,檢測(cè)工程師不再滿足于傳統(tǒng)的基于PC端的數(shù)據(jù)瀏覽和監(jiān)控,特別是對(duì)于測(cè)試周期長(zhǎng)、無(wú)需人工干預(yù)的各種環(huán)境試驗(yàn)、耐久試驗(yàn)等,再者由于標(biāo)準(zhǔn)光組件檢測(cè)實(shí)驗(yàn)室具有設(shè)備多樣、樣品輕便和位置隨機(jī)等特點(diǎn)[2],工程師們迫切希望通過(guò)移動(dòng)互聯(lián)終端對(duì)測(cè)試數(shù)據(jù)進(jìn)行篩選,對(duì)樣品的位置進(jìn)行跟蹤和追溯,這一切需求的前提都是移動(dòng)互聯(lián)網(wǎng)消息推送方案的實(shí)現(xiàn)[3]。
目前主要的推送方案包括XMPP(The Extensible Messaging and Presence Protocol)、GCM(Google Cloud Messaging)、HTTP(Hyper Text Transfer Protocol)以及MQTT(Message Queuing Telemetry Transport)協(xié)議,但是由于XMPP協(xié)議都是基于消息體進(jìn)行尋址的消息通信協(xié)議,消息體中包含了消息發(fā)送者、接受者以及用于消息路由的會(huì)話標(biāo)識(shí)等眾多頭域,因此存在協(xié)議復(fù)雜且占用資源較多等缺陷,而GCM服務(wù)則受限于Android版本(2.2版本以上),并且該服務(wù)器在國(guó)內(nèi)不夠穩(wěn)定,此外IOS上的APNS也僅適用于IOS,無(wú)法跨平臺(tái)使用[4]。相比于以上的其他消息推送協(xié)議,MQTT協(xié)議具有低硬件限制、低帶寬、低延時(shí)、跨平臺(tái)和高推送速度等優(yōu)點(diǎn)[5]。
因此,為了滿足便捷化和智能化應(yīng)用場(chǎng)景,實(shí)現(xiàn)多地光組件實(shí)驗(yàn)室的數(shù)據(jù)統(tǒng)一監(jiān)控和樣品流程追蹤,進(jìn)而為實(shí)現(xiàn)數(shù)據(jù)一致性比對(duì)和結(jié)果追溯提供保障,本文針對(duì)兩地的標(biāo)準(zhǔn)光組件檢測(cè)實(shí)驗(yàn)室搭建基于MQTT(消息隊(duì)列遙測(cè)傳輸)協(xié)議的智能化試驗(yàn)系統(tǒng)。
本智能化試驗(yàn)系統(tǒng)針對(duì)廣州和佛山兩地的標(biāo)準(zhǔn)光組件實(shí)驗(yàn)室進(jìn)行改造,其中廣州實(shí)驗(yàn)室主要包括環(huán)境與壽命實(shí)驗(yàn)設(shè)備、功率采集設(shè)備和溫度采集設(shè)備,而佛山實(shí)驗(yàn)室主要包括空間光譜測(cè)量?jī)x、高精度快速光輻射計(jì)以及其他的熱色光電機(jī)性能測(cè)試設(shè)備。
本系統(tǒng)采用分布式網(wǎng)絡(luò)化控制系統(tǒng),其架構(gòu)和通信協(xié)議如圖1所示。
圖1 系統(tǒng)架構(gòu)圖
其中MQTT服務(wù)器為整個(gè)架構(gòu)的中轉(zhuǎn)和核心[6],MQTT服務(wù)器部署在公網(wǎng),通過(guò)公網(wǎng)IP或域名進(jìn)行訪問(wèn)連接,其主要負(fù)責(zé)客戶端管理和消息中轉(zhuǎn),不對(duì)數(shù)據(jù)進(jìn)行任何的處理。其他數(shù)據(jù)來(lái)源和數(shù)據(jù)目的設(shè)備包括移動(dòng)客戶端、廣州實(shí)驗(yàn)室上位機(jī)和佛山實(shí)驗(yàn)室服務(wù)器等都屬于MQTT的客戶端,為了便于描述,前者本文簡(jiǎn)稱為客戶端,后兩者都稱為實(shí)驗(yàn)室。MQTT客戶端設(shè)置MQTT服務(wù)器的IP地址(或域名)、端口號(hào)還有客戶端ID,對(duì)MQTT服務(wù)器進(jìn)行連接。
佛山實(shí)驗(yàn)室服務(wù)器主要負(fù)責(zé)佛山實(shí)驗(yàn)室內(nèi)儀器測(cè)試數(shù)據(jù)的存儲(chǔ)與中轉(zhuǎn),而佛山實(shí)驗(yàn)室上位機(jī)主要通過(guò)現(xiàn)場(chǎng)總線比如RS485、RS232以及以太網(wǎng)等對(duì)底層的試驗(yàn)儀器進(jìn)行數(shù)據(jù)采集與控制,通信協(xié)議需要根據(jù)儀器的不同進(jìn)行定制化開(kāi)發(fā)。
廣州實(shí)驗(yàn)室上位機(jī)主要通過(guò)RS485以及WIFI對(duì)包括高低溫試驗(yàn)箱、快速溫變?cè)囼?yàn)箱、功率采集儀在內(nèi)的試驗(yàn)設(shè)備進(jìn)行數(shù)據(jù)同步采集和集中管理,并通過(guò)MQTT消息更新的方式將數(shù)據(jù)同步到MQTT服務(wù)器。
PC客戶端或者移動(dòng)客戶端,主要用于數(shù)據(jù)查詢、人機(jī)交互等。其中在移動(dòng)端部署了基于Android操作系統(tǒng)的監(jiān)視軟件,并安裝MQTT客戶服務(wù),根據(jù)用戶的操作分類訂閱不同實(shí)驗(yàn)室設(shè)備的相關(guān)數(shù)據(jù),并更新顯示列表,同時(shí)還可以對(duì)實(shí)驗(yàn)設(shè)備的歷史數(shù)據(jù)進(jìn)行查詢。
本文的主體程序架構(gòu)包括佛山實(shí)驗(yàn)室服務(wù)器程序架構(gòu)、廣州實(shí)驗(yàn)室上位機(jī)程序架構(gòu)、佛山實(shí)驗(yàn)室上位機(jī)程序架構(gòu)以及移動(dòng)客戶端程序架構(gòu)等,本章主要介紹MQTT的協(xié)議架構(gòu)。
本項(xiàng)目中實(shí)驗(yàn)室與客戶端的數(shù)據(jù)同步通過(guò)發(fā)布和訂閱主題的方法實(shí)現(xiàn)。根據(jù)數(shù)據(jù)流邏輯可以把主題分為三種:請(qǐng)求主題、響應(yīng)主題以及更新主題。各主題描述如表 1所示。
(1)請(qǐng)求主題:客戶端向?qū)嶒?yàn)室主動(dòng)請(qǐng)求數(shù)據(jù)訪問(wèn)發(fā)布的主題。
(2)響應(yīng)主題:實(shí)驗(yàn)室接收到客戶端的請(qǐng)求主題后,向客戶端返回響應(yīng)的發(fā)布的主題。與(1)組合實(shí)現(xiàn)客戶端請(qǐng)求和實(shí)驗(yàn)室響應(yīng)的查詢方式,用于實(shí)驗(yàn)室設(shè)備運(yùn)行狀態(tài)查詢和歷史數(shù)據(jù)查詢。
(3)更新主題:實(shí)驗(yàn)室周期地向MQTT代理服務(wù)器發(fā)布更新數(shù)據(jù)的主題,主要實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)在客戶端的顯示。
表1 消息主題類型
當(dāng)客戶端需要主動(dòng)獲取實(shí)驗(yàn)室的數(shù)據(jù)時(shí),數(shù)據(jù)流程如圖2所示,客戶端需要事先訂閱該數(shù)據(jù)的響應(yīng)主題,然后發(fā)布該數(shù)據(jù)的請(qǐng)求主題,而實(shí)驗(yàn)室則需要在事先已訂閱該客戶端的請(qǐng)求主題,此后移動(dòng)客戶端向MQTT代理服務(wù)器發(fā)送數(shù)據(jù)請(qǐng)求主題后,MQTT代理服務(wù)器直接向訂閱了該請(qǐng)求主題的實(shí)驗(yàn)室進(jìn)行消息推送,繼而實(shí)驗(yàn)室在收到該消息后,解析消息并發(fā)布相應(yīng)的數(shù)據(jù)響應(yīng)主題。同樣MQTT代理服務(wù)器會(huì)將該消息推送給訂閱了該響應(yīng)主題的移動(dòng)客戶端,最終移動(dòng)客戶端再進(jìn)行消息解析,得到檢測(cè)數(shù)據(jù)。
圖2 請(qǐng)求響應(yīng)數(shù)據(jù)流示意圖
而當(dāng)客戶端需要獲取實(shí)驗(yàn)室周期更新的數(shù)據(jù)時(shí),數(shù)據(jù)流程如圖3所示,客戶端需要事先訂閱該數(shù)據(jù)的更新主題。與請(qǐng)求響應(yīng)數(shù)據(jù)流不同的是,更新主題的請(qǐng)求發(fā)布以后,實(shí)驗(yàn)室間隔一定的周期不停發(fā)送數(shù)據(jù)包,直到相應(yīng)的設(shè)備停止或者移動(dòng)客戶端發(fā)布停止命令,該主題用于設(shè)備實(shí)時(shí)數(shù)據(jù)更新。
圖3 更新主題數(shù)據(jù)流示意圖
下面針對(duì)實(shí)驗(yàn)室提供的數(shù)據(jù)接口進(jìn)行說(shuō)明,如表2所示。
其中:消息主體(Body)中,“[]”為列表信息,消息主體里的設(shè)備狀態(tài)模型和數(shù)據(jù)模型按表3中的定義。
對(duì)于歷史數(shù)據(jù)查詢,首先某客戶端(通過(guò)客戶端ID區(qū)分)發(fā)布廣州或者佛山實(shí)驗(yàn)室(用實(shí)驗(yàn)室ID區(qū)分)的請(qǐng)求訪問(wèn)主題,在消息主體中,用mMachID字段對(duì)對(duì)應(yīng)的設(shè)備進(jìn)行檢索,在列表中可以訪問(wèn)多臺(tái)試驗(yàn)設(shè)備的歷史數(shù)據(jù),當(dāng)相應(yīng)實(shí)驗(yàn)室端接受到該請(qǐng)求主題后,用符合表3的字段進(jìn)行解析,并將相關(guān)設(shè)備的歷史數(shù)據(jù)通過(guò)表3的字段并采用Json格式,發(fā)布響應(yīng)主題的格式發(fā)送到MQTT代理服務(wù)器進(jìn)行轉(zhuǎn)發(fā)。實(shí)時(shí)數(shù)據(jù)更新數(shù)據(jù)流也類似,不予贅述。
表2 實(shí)驗(yàn)室接口的消息主題定義
前一章中已經(jīng)詳細(xì)介紹了系統(tǒng)架構(gòu)和各模塊程序的功能,本章主要介紹佛山實(shí)驗(yàn)室上位機(jī)基于Json數(shù)據(jù)格式的MQTT通信程序設(shè)計(jì)思路,并與移動(dòng)客戶端通過(guò)MQTT代理服務(wù)器通信,最終在移動(dòng)端顯示通信效果。
實(shí)驗(yàn)室上位機(jī)采用JAVA編程語(yǔ)言,程序設(shè)計(jì)思路如圖4所示。
其中:將數(shù)據(jù)庫(kù)中的數(shù)據(jù)轉(zhuǎn)化為Json數(shù)據(jù)格式,采用如下代碼:
StringBuilder jsonString = new StringBuilder();
jsonString.Append("[");
while (dataReader.Read())
{jsonString.Append("{");
for (inti= 0;i< dataReader.FieldCount;i++)
{Type type = dataReader.GetFieldType(i);
string strKey = dataReader.GetName(i);
string strValue = dataReader[i].ToString();
jsonString.Append(""" + strKey + "":");
strValue =String.Format(strValue, type);
…}
jsonString.Append(strValue);}
jsonString.Append("}");
jsonString.Append("]");
其中,strKey為Json數(shù)據(jù)格式的名稱,strValue為值,構(gòu)成“名稱/值”對(duì)。
當(dāng)接受到信息后,根據(jù)主題包含的關(guān)鍵字,進(jìn)行不同方式的響應(yīng),同時(shí)連接數(shù)據(jù)庫(kù),對(duì)數(shù)據(jù)庫(kù)內(nèi)容進(jìn)行讀取后,進(jìn)行主題和消息發(fā)布,部分代碼如下:
if [name.Equals("richTextBox_haas2000")] { Client.Publish("/user/cafe@/saibao/led/powerstate/response@/user/HAAs-2000", MysqlToJson(datareader), QoS.AcknowledgeDelivery, false); DisplayInfo(MysqlToJson(datareader), name); }
表3 消息主體定義
圖4 上位機(jī)程序框圖
圖5 移動(dòng)端數(shù)據(jù)顯示界面
同時(shí)移動(dòng)端調(diào)試完畢后,界面顯示如圖5所示。
本文針對(duì)異地標(biāo)準(zhǔn)光組件實(shí)驗(yàn)室搭建了一套基于MQTT協(xié)議的智能測(cè)試系統(tǒng),并采用了一套輕量級(jí)的數(shù)據(jù)格式——Jason數(shù)據(jù)格式,實(shí)現(xiàn)了各地實(shí)驗(yàn)室數(shù)據(jù)的集中監(jiān)控,可以在移動(dòng)互聯(lián)網(wǎng)端對(duì)各地實(shí)驗(yàn)室不同設(shè)備的運(yùn)行狀態(tài)、測(cè)試實(shí)時(shí)數(shù)據(jù)和測(cè)試歷史數(shù)據(jù)進(jìn)行查詢、控制等,這些都為各地實(shí)驗(yàn)室的數(shù)據(jù)一致性比對(duì)提供了支撐保障。試驗(yàn)結(jié)果證明,該系統(tǒng)功能齊全,運(yùn)行穩(wěn)定,操作方便,有很大的實(shí)用和推廣價(jià)值。