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