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