李鵬程,張文勝+,郭 棟,郝孜奇
(1.石家莊鐵道大學(xué) 交通運(yùn)輸學(xué)院,河北 石家莊 050043;2.中鐵十四局集團(tuán)公司遂道工程有限公司, 山東 濟(jì)南 250000;3.山東省交通規(guī)劃設(shè)計(jì)院集團(tuán)有限公司 科技研發(fā)中心,山東 濟(jì)南 250101)
MQTT、WebScoket運(yùn)行在傳輸控制協(xié)議/網(wǎng)際協(xié)議之上[1],用于物聯(lián)網(wǎng)[2](Internet of things,IoT)設(shè)備的消息傳遞。前者通過(guò)發(fā)布/訂閱模式實(shí)現(xiàn)[3,4],憑借耗電慢、吞吐量小等優(yōu)點(diǎn)[5],常用于智能家居[6]等領(lǐng)域。但是受限于傳輸能力和消息質(zhì)量等級(jí),有數(shù)據(jù)重復(fù)、傳輸節(jié)點(diǎn)通道不穩(wěn)定等問(wèn)題。后者傳輸時(shí)僅需一次握手,便可實(shí)現(xiàn)雙向數(shù)據(jù)推送[7],常用于服務(wù)器數(shù)據(jù)交互領(lǐng)域[8],比如疫情軌跡追蹤等。在用于物聯(lián)網(wǎng)領(lǐng)域時(shí),由于數(shù)據(jù)格式的不同,需對(duì)其進(jìn)行封裝處理。
針對(duì)兩種協(xié)議的特點(diǎn),國(guó)內(nèi)外學(xué)者進(jìn)行了研究。馬鑫龍等針對(duì)數(shù)據(jù)傳輸,提出了基于MQTT協(xié)議的傳輸方法[9]。呂閆等設(shè)計(jì)了WebSocket實(shí)時(shí)數(shù)據(jù)推送方法[10]。Mileva Aleksandra等研究了MQTT所選數(shù)據(jù)隱藏技術(shù)[11]。Linh Manh Pham等開(kāi)發(fā)了基于MQTT協(xié)議的消息件工具[12]。Mauro A.A等提出了物聯(lián)網(wǎng)傳輸中中間件的重要性[13]。
以上對(duì)兩種通信協(xié)議的研究工作都是單邊展開(kāi),未實(shí)質(zhì)解決兩類(lèi)協(xié)議在傳輸數(shù)據(jù)時(shí)的問(wèn)題。因此本文將對(duì)基于MQTT over WebSocket數(shù)據(jù)傳輸進(jìn)行研究。通過(guò)設(shè)身份標(biāo)識(shí)去重算法生成ID數(shù)據(jù),保證數(shù)據(jù)傳輸?shù)奈ㄒ恍裕鉀Q多節(jié)點(diǎn)傳輸通道數(shù)據(jù)重復(fù)問(wèn)題。然后對(duì)生成的ID數(shù)據(jù)進(jìn)行數(shù)據(jù)格式封裝匹配,使服務(wù)器可以主動(dòng)向應(yīng)用端推送封裝消息,避免單節(jié)點(diǎn)傳輸通道與服務(wù)器連接不穩(wěn)定的問(wèn)題。最終結(jié)合實(shí)例,開(kāi)發(fā)一套車(chē)輛信息管理系統(tǒng),用于驗(yàn)證方法的可行性和傳輸性能。
受限于MQTT協(xié)議的消息交付質(zhì)量等級(jí),IoT設(shè)備使用MQTT協(xié)議進(jìn)行消息傳輸時(shí)容易出現(xiàn)數(shù)據(jù)重復(fù)、冗雜等問(wèn)題。因此需要對(duì)消息進(jìn)行去重處理,身份標(biāo)識(shí)去重算法流程如圖1所示。根據(jù)自身的設(shè)備號(hào),在消息數(shù)據(jù)里設(shè)置一個(gè)身份標(biāo)識(shí)符(Client_ID),輔以獲取的數(shù)據(jù)信息,如經(jīng)緯度數(shù)據(jù)、溫度數(shù)據(jù)等。如果Client_ID不唯一,則進(jìn)行重新生成,如果唯一,訂閱端保存已經(jīng)收到的Client_ID。每當(dāng)接收到新消息,通過(guò)Client_ID判斷消息的獨(dú)立性,如果與儲(chǔ)存信息相同,則舍棄;如果沒(méi)有不同則更新Client_ID并存生成ID數(shù)據(jù)信息,如此可以保證數(shù)據(jù)傳輸?shù)莫?dú)立性。算法核心代碼如下:
sprintf(postDate, “{“IsFix”:“%s”, “Lat”:%lf, “Lon”:%lf}”
isFixedStr, latitude, longitude);//這里獲取設(shè)備數(shù)據(jù)信息
INFO_GetIMEI(imei);//這里獲取IMEI
sprintf(tClient, “{“Imei”:“%s”, “PostDatet”:%lf}”//融合信息
if (NULL == pJsonRoot){Trace(1, "tClient data pJsonRoot == NULL"); goto __tClient_Delete; }/執(zhí)行判斷
tClient *pJsonRoot = tClient_Parse(data)
MQTT_tClient* client = MQTT_tClientNew();
if (tClient_IsString(pCMD) && (tClient->valuestring != NULL))
_tClient_Delete:tClient_Delete(pJsonRoot);}
圖1 身份標(biāo)識(shí)去重算法流程
使用去重算法后進(jìn)行MQTT傳輸,保證了數(shù)據(jù)的準(zhǔn)確性,但是因?yàn)镸QTT協(xié)議特點(diǎn),應(yīng)用終端只能單方面接受IoT設(shè)備消息,由于網(wǎng)絡(luò)環(huán)境波動(dòng)和內(nèi)存緩沖區(qū)儲(chǔ)存的壓力,容易造成傳輸節(jié)點(diǎn)通道不穩(wěn)定,從而對(duì)數(shù)據(jù)傳輸速度產(chǎn)生影響。而使用WebSocket協(xié)議可以允許服務(wù)器端主動(dòng)向客戶(hù)端推送消息,可以通過(guò)握手建立的穩(wěn)定通道連接持久傳輸數(shù)據(jù)信息,來(lái)避免IoT設(shè)備通過(guò)節(jié)點(diǎn)通道直接向應(yīng)用終端傳輸消息,減少對(duì)數(shù)據(jù)傳輸速度的影響。但經(jīng)過(guò)去重算法后的MQTT傳輸?shù)南⒏袷讲环蟇ebSocket的格式要求,因此需要通過(guò)對(duì)端口信息、ID信息的數(shù)據(jù)格式進(jìn)行匹配,對(duì)消息進(jìn)行封裝,最終生成滿(mǎn)足WebSocket協(xié)議,包含ID數(shù)據(jù)以及設(shè)備數(shù)據(jù)的需求信息數(shù)據(jù)。數(shù)據(jù)格式匹配算法流程如圖2所示,算法核心代碼如下:
圖2 數(shù)據(jù)格式匹配算法流程
cJSON *pJsonRoot = cJSON_Parse(data);{//判斷是否為Json格式的數(shù)據(jù)
if (NULL == pJsonRoot){Trace(1, "MQTT data pJsonRoot == NULL"); goto __cJSON_Delete; }/執(zhí)行判斷
cJSON *pCMD = cJSON_GetObjectItemCaseSensitive(pJsonRoot, "cmd");
if (cJSON_IsString(pCMD) && (pCMD->valuestring != NULL))
_cJSON_Delete:cJSON_Delete(pJsonRoot);}
基于MQTT over WebSocket進(jìn)行數(shù)據(jù)傳輸,本質(zhì)上是為了綜合兩種通信協(xié)議的優(yōu)點(diǎn),彌補(bǔ)各自的不足,MQTT over Websocket傳輸數(shù)據(jù)的總體模型實(shí)現(xiàn)過(guò)程如圖3所示。首先以IoT設(shè)備作為MQTT客戶(hù)端,在獲取設(shè)備數(shù)據(jù)消息的同時(shí),通過(guò)身份標(biāo)識(shí)去重算法生成ID消息數(shù)據(jù),可以確保節(jié)點(diǎn)傳輸通道中的消息唯一性。此外,PC作為WebSocket服務(wù)器,對(duì)ID消息數(shù)據(jù)進(jìn)行格式匹配與封裝,有助于保證消息傳輸節(jié)點(diǎn)通道的穩(wěn)定性。最終在中間件消息服務(wù)器實(shí)現(xiàn)需求信息數(shù)據(jù)的訂閱與發(fā)布,使得消息數(shù)據(jù)能夠由服務(wù)器主動(dòng)向應(yīng)用終端推送,完成高效率、低流量、高穩(wěn)定性的數(shù)據(jù)傳輸。
圖3 MQTT over WebSocket數(shù)據(jù)傳輸模型
隨著我國(guó)高等教育快速發(fā)展,高校多校區(qū)建設(shè)成為常態(tài),往返校區(qū)間的校車(chē)成為師生通勤的重要選擇。隨著校車(chē)投放的增多,工作人員如何通過(guò)信息化手段管理校車(chē),師生如何實(shí)時(shí)了解校車(chē)運(yùn)行狀態(tài)成為了亟待解決的問(wèn)題。為了解決這些問(wèn)題,同時(shí)驗(yàn)證MQTT over WebSocket進(jìn)行數(shù)據(jù)傳輸?shù)目尚行?,開(kāi)發(fā)了車(chē)輛信息管理系統(tǒng)。
2.1.1 系統(tǒng)架構(gòu)
根據(jù)MQTT over WebScoket數(shù)據(jù)傳輸模型,車(chē)輛信息管理系統(tǒng)開(kāi)發(fā)采用三層軟件架構(gòu)體系,分別為硬件層、服務(wù)器層和軟件層,圖4為系統(tǒng)平臺(tái)架構(gòu)。
圖4 系統(tǒng)平臺(tái)架構(gòu)
其中硬件層位于整個(gè)系統(tǒng)最底層,主要完成硬件模塊的物理熔接、燒錄開(kāi)發(fā)、MQTT配置。并且在此層級(jí)使用身份標(biāo)識(shí)去重算法完成信息數(shù)據(jù)獲?。环?wù)器層是連接硬件層和軟件層的樞紐,需進(jìn)行環(huán)境搭建、服務(wù)器開(kāi)發(fā)以及MQTT服務(wù)器配置等工作。并且在此層級(jí)使用數(shù)據(jù)格式匹配算法完成信息數(shù)據(jù)封裝;軟件端是程序功能實(shí)現(xiàn)的平臺(tái),主要通過(guò)編寫(xiě)JS腳本以及相應(yīng)組件的掛載,實(shí)現(xiàn)車(chē)輛定位、車(chē)輛預(yù)約、信息管理、動(dòng)態(tài)天氣、實(shí)時(shí)路況等功能。
2.1.2 系統(tǒng)設(shè)計(jì)
圖5 系統(tǒng)設(shè)計(jì)流程
車(chē)輛定位系統(tǒng)采用C/S架構(gòu),選取微信開(kāi)發(fā)者平臺(tái)作為系統(tǒng)開(kāi)發(fā)平臺(tái),選取EMQ X Broker作為中間消息件服務(wù)器,選取騰訊云服務(wù)器作為后臺(tái)服務(wù)器,開(kāi)發(fā)支持北斗導(dǎo)航的安信可A9g開(kāi)發(fā)板作為IoT設(shè)備。系統(tǒng)基于MQTT over WebSocket進(jìn)行消息數(shù)據(jù)傳輸,最終在微信平臺(tái)上發(fā)布程序,設(shè)計(jì)流程如圖5所示。
2.1.3 系統(tǒng)關(guān)鍵技術(shù)
系統(tǒng)以MQTT over WebSocket為核心方法進(jìn)行數(shù)據(jù)傳輸,分別針對(duì)IoT設(shè)備、服務(wù)器進(jìn)行開(kāi)發(fā),以滿(mǎn)足使用身份標(biāo)識(shí)去重算法和數(shù)據(jù)格式匹配算法的需要。
(1)IoT設(shè)備開(kāi)發(fā)
系統(tǒng)需要對(duì)IoT設(shè)備如A9g模塊、螢石云攝像頭等進(jìn)行開(kāi)發(fā)。以A9g模塊為例,在對(duì)硬件設(shè)備完成焊接等處理后,執(zhí)行代碼燒錄,將工程項(xiàng)目代碼燒錄到開(kāi)發(fā)板當(dāng)中,實(shí)現(xiàn)模塊自身定位、獲取經(jīng)緯度數(shù)據(jù)信息等功能,以便融合身份標(biāo)識(shí)信息。其中,通過(guò)循環(huán)邏輯來(lái)判斷是否成功開(kāi)啟開(kāi)發(fā)板的定位功能。
if(isGpsOn){//判斷定位狀態(tài)
uint8_tisFixed=gpsInfo->gsa[0].fix_type >gpsInfo->gsa[1].fix_type ?gpsInfo->gsa[0].fix_type:gpsInfo->gsa[1].fix_type;
char* isFixedStr; if(isFixed == 2)isFixedStr = "2D fix";else if(isFixed == 3){if(gpsInfo->gga.fix_quality == 1)
isFixedStr = "3D fix";
else if(gpsInfo->gga.fix_quality == 2)isFixedStr = "3D/DGPS fix";}
else{
isFixedStr = "no fix";
snprintf(buffer,sizeof(buffer),"GPS fix mode:%d, BDS fix mode:%d, fix quality:%d, satellites tracked:%d, gps sates total:%d, is fixed:%s,coordinate:WGS84,Latitude:%f,Longitude:%f,unit:degree,altitude:%f",gpsInfo->gsa[0].fix_type,gpsInfo->gsa[1].fix_type,gpsInfo->gga.fix_quality,gpsInfo->gga.satellites_tracked,gpsInfo->gsv[0].total_sats,isFixedStr,latitude,longitude,gpsInfo->gga.altitude);}
通過(guò)可視化管理工具,當(dāng)回彈打印出“is fixed”時(shí),便代表獲取到了開(kāi)發(fā)板自身的經(jīng)緯度數(shù)據(jù)信息(即需要輸入到身份標(biāo)識(shí)去重算法中的設(shè)備數(shù)據(jù)信息),表明模塊通過(guò)北斗導(dǎo)航成功實(shí)現(xiàn)了定位。
(2)服務(wù)器開(kāi)發(fā)
EMQ X Broker是一款高并發(fā)低時(shí)延、支持分布式集群架構(gòu)的開(kāi)源物聯(lián)網(wǎng)MQTT服務(wù)器,支持多種物聯(lián)網(wǎng)協(xié)議,如完整支持MQTT第五代協(xié)議規(guī)范,適合用于構(gòu)建從邊緣到云端的各種5G、物聯(lián)網(wǎng)、車(chē)聯(lián)網(wǎng)平臺(tái)與應(yīng)用。
因?yàn)橄到y(tǒng)最終發(fā)布在微信程序,而微信程序的架構(gòu)是用基本前端代碼實(shí)現(xiàn),與MQTT服務(wù)器無(wú)法進(jìn)行直接消息傳輸,需要對(duì)服務(wù)器進(jìn)行開(kāi)發(fā)以滿(mǎn)足代理,從而獲取輸入到數(shù)據(jù)格式匹配算法中的端口號(hào)信息,開(kāi)發(fā)邏輯如圖6所示。
圖6 服務(wù)器開(kāi)發(fā)邏輯
(3)訂閱與發(fā)布
完成IoT設(shè)備和服務(wù)器的開(kāi)發(fā)后,利用MQTT over WebSocket數(shù)據(jù)傳輸模型實(shí)現(xiàn)所封裝數(shù)據(jù)信息的訂閱與發(fā)布,比如經(jīng)緯度數(shù)據(jù)信息以及轉(zhuǎn)化格式的視頻數(shù)據(jù)信息,最終在微信程序端完成對(duì)數(shù)據(jù)信息的調(diào)用,實(shí)現(xiàn)對(duì)車(chē)輛信息的管理。數(shù)據(jù)信息訂閱與發(fā)布如圖7所示。
圖7 數(shù)據(jù)信息訂閱與發(fā)布
基于MQTT over WebSocket的車(chē)輛信息管理系統(tǒng)主要包含車(chē)輛位置信息管理、開(kāi)行方案信息管理、車(chē)輛座位信息管理、圖像信息管理等功能模塊,并且已經(jīng)在石家莊鐵道大學(xué)校車(chē)上進(jìn)行了實(shí)際應(yīng)用。模塊封裝設(shè)備如圖8所示,校車(chē)如圖9所示。
圖8 模塊封裝設(shè)備
圖9 校車(chē)整體
2.2.1 車(chē)輛位置信息管理
對(duì)于車(chē)輛位置信息的管理,是系統(tǒng)的核心功能。以2號(hào)車(chē)為例,點(diǎn)擊“2號(hào)車(chē)”按鈕,如果車(chē)輛運(yùn)行正常,會(huì)出現(xiàn)“定位成功”的字樣,并且車(chē)輛圖標(biāo)會(huì)顯示在頁(yè)面中央;如果車(chē)輛上IoT設(shè)備正在定位或者車(chē)輛未啟動(dòng),會(huì)出現(xiàn)“車(chē)輛未運(yùn)行或定位中”字樣。
2.2.2 開(kāi)行方案信息管理
在實(shí)際應(yīng)用中,老師分散居住在城市各地,所以車(chē)輛存在多條運(yùn)營(yíng)線(xiàn)路,由于站點(diǎn)眾多,導(dǎo)致部分師生無(wú)法了解車(chē)輛的準(zhǔn)確??康攸c(diǎn)、開(kāi)行時(shí)間。同時(shí),管理人員需要針對(duì)路況信息和日程安排進(jìn)行開(kāi)行方案調(diào)整,因此系統(tǒng)設(shè)置開(kāi)行方案信息管理模塊解決此問(wèn)題。
2.2.3 車(chē)輛座位信息管理
如何讓師生知道具體車(chē)輛的座位信息,具體車(chē)站的車(chē)輛信息,如何讓管理者能夠知道校車(chē)空間內(nèi)部信息等等也是在校車(chē)運(yùn)行中存在的問(wèn)題,為了解決這些問(wèn)題,系統(tǒng)設(shè)計(jì)了車(chē)輛選座功能,在頁(yè)面右上角有選座按鈕,點(diǎn)擊按鈕,可以進(jìn)行分車(chē)輛分車(chē)站的選座預(yù)約,方便校車(chē)管理以及師生乘車(chē)。
2.2.4 視頻信息管理模塊
為了防止車(chē)輛意外,保證運(yùn)行過(guò)程中校車(chē)管理人員對(duì)車(chē)廂的信息獲取以及進(jìn)行更好的安全管理,每輛車(chē)放置了一個(gè)攝像頭,同時(shí)通過(guò)螢石云平臺(tái)與微信程序進(jìn)行了網(wǎng)絡(luò)關(guān)聯(lián),管理人員可以通過(guò)點(diǎn)擊按鈕進(jìn)行視頻信息的獲取和儲(chǔ)存。
2.2.5 其它信息管理模塊
其它信息管理模塊主要包含道路、天氣等其它信息。為了讓師生更好地了解出行情況,系統(tǒng)設(shè)有天氣、道路擁堵、空氣質(zhì)量等信息展示功能。
各個(gè)系統(tǒng)功能模塊應(yīng)用截圖如圖10所示。
圖10 系統(tǒng)各功能模塊
為了驗(yàn)證MQTT over WebSocket進(jìn)行數(shù)據(jù)傳輸?shù)膫鬏斝阅?,在系統(tǒng)程序使用過(guò)程中,將3個(gè)IoT設(shè)備分別放到3輛車(chē)輛當(dāng)中,并以0.5 s、1 s作為發(fā)布時(shí)間間隔,運(yùn)行30 min進(jìn)行測(cè)試,統(tǒng)計(jì)消息傳輸數(shù)量和流量消耗,測(cè)試結(jié)果見(jiàn)表1。
表1 數(shù)據(jù)傳輸測(cè)試結(jié)果
數(shù)據(jù)傳輸測(cè)試表結(jié)果顯示,IoT設(shè)備使用該方法進(jìn)行數(shù)據(jù)傳輸時(shí),相同時(shí)間間隔下,多節(jié)點(diǎn)傳輸準(zhǔn)確率非常高,驗(yàn)證了以多節(jié)點(diǎn)通道進(jìn)行數(shù)據(jù)傳輸時(shí),沒(méi)有產(chǎn)生消息重復(fù)冗雜的情況,同時(shí)由于服務(wù)器主動(dòng)向客戶(hù)端推送消息,即使以非常短的時(shí)間間隔進(jìn)行消息循環(huán),使得車(chē)輛時(shí)刻處于定位中,但消耗的流量極低,沒(méi)有給內(nèi)存緩沖區(qū)造成儲(chǔ)存壓力,同時(shí)傳輸也非常精準(zhǔn),驗(yàn)證了節(jié)點(diǎn)傳輸通道的穩(wěn)定性。
為了解系統(tǒng)在車(chē)輛上的應(yīng)用效果,從而進(jìn)一步實(shí)現(xiàn)對(duì)系統(tǒng)和傳輸方法的改進(jìn),通過(guò)招募石家莊鐵道大學(xué)25名乘坐車(chē)輛的師生,包括10名老師、10名學(xué)生以及5名車(chē)輛車(chē)隊(duì)管理人員,對(duì)乘坐車(chē)輛時(shí)使用系統(tǒng)的滿(mǎn)意度進(jìn)行調(diào)查,并以問(wèn)卷形式對(duì)使用結(jié)果進(jìn)行記錄,測(cè)試結(jié)果見(jiàn)表2。
表2 系統(tǒng)應(yīng)用測(cè)試結(jié)果
本文提出了一種基于MQTT over WebSoccket的數(shù)據(jù)傳輸方法,通過(guò)身份標(biāo)識(shí)去重算法,設(shè)置Client_ID,生成了獨(dú)立的身份數(shù)據(jù)信息,保證了傳輸?shù)臏?zhǔn)確性;通過(guò)數(shù)據(jù)格式匹配算法,將身份信息數(shù)據(jù)封裝成需求信息數(shù)據(jù),并完成格式轉(zhuǎn)化,滿(mǎn)足了使用WebSocket協(xié)議的傳輸要求,使得服務(wù)器可以主動(dòng)向應(yīng)用終端推送封裝的消息,避免單節(jié)點(diǎn)傳輸通道與服務(wù)器連接不穩(wěn)定的問(wèn)題。并且以經(jīng)緯度等車(chē)輛信息數(shù)據(jù)為例,選取微信開(kāi)發(fā)者平臺(tái)作為系統(tǒng)開(kāi)發(fā)平臺(tái),騰訊云服務(wù)器作為后臺(tái)支撐,基于支持北斗導(dǎo)航的A9g開(kāi)發(fā)板作為IoT設(shè)備,通過(guò)對(duì)其開(kāi)發(fā),使用身份標(biāo)識(shí)去重算法和數(shù)據(jù)格式匹配算法,構(gòu)建了MQTT over WebSocket數(shù)據(jù)傳輸模型,完成了基于MQTT over WebSocket的數(shù)據(jù)傳輸,開(kāi)發(fā)了車(chē)輛信息管理系統(tǒng),最終在微信平臺(tái)上發(fā)布程序。
數(shù)據(jù)測(cè)試表明,該方法成功地實(shí)現(xiàn)了聯(lián)合兩種通信協(xié)議進(jìn)行低耗高效的數(shù)據(jù)傳輸。應(yīng)用測(cè)試結(jié)果表明,師生通過(guò)使用該方法開(kāi)發(fā)的系統(tǒng)乘坐車(chē)輛,降低了時(shí)間成本,減少了溝通成本,系統(tǒng)應(yīng)用效果較佳,達(dá)到了預(yù)期的設(shè)計(jì)效果。兩種測(cè)試結(jié)果驗(yàn)證了本文提出的基于MQTT over WebSocket進(jìn)行數(shù)據(jù)傳輸?shù)姆椒ㄓ行А⒖煽俊?/p>
未來(lái)計(jì)劃從物聯(lián)網(wǎng)通信協(xié)議的數(shù)據(jù)傳輸信息以及設(shè)備種類(lèi)出發(fā),對(duì)語(yǔ)音數(shù)據(jù)、圖像數(shù)據(jù)開(kāi)展研究,對(duì)數(shù)據(jù)格式匹配算法進(jìn)行優(yōu)化,使其具備更好的普適性,以實(shí)現(xiàn)更廣泛、高效的應(yīng)用。