李鵬程,張文勝+,郭 棟,郝孜奇
(1.石家莊鐵道大學 交通運輸學院,河北 石家莊 050043;2.中鐵十四局集團公司遂道工程有限公司, 山東 濟南 250000;3.山東省交通規劃設計院集團有限公司 科技研發中心,山東 濟南 250101)
MQTT、WebScoket運行在傳輸控制協議/網際協議之上[1],用于物聯網[2](Internet of things,IoT)設備的消息傳遞。前者通過發布/訂閱模式實現[3,4],憑借耗電慢、吞吐量小等優點[5],常用于智能家居[6]等領域。但是受限于傳輸能力和消息質量等級,有數據重復、傳輸節點通道不穩定等問題。后者傳輸時僅需一次握手,便可實現雙向數據推送[7],常用于服務器數據交互領域[8],比如疫情軌跡追蹤等。在用于物聯網領域時,由于數據格式的不同,需對其進行封裝處理。
針對兩種協議的特點,國內外學者進行了研究。馬鑫龍等針對數據傳輸,提出了基于MQTT協議的傳輸方法[9]。呂閆等設計了WebSocket實時數據推送方法[10]。Mileva Aleksandra等研究了MQTT所選數據隱藏技術[11]。Linh Manh Pham等開發了基于MQTT協議的消息件工具[12]。Mauro A.A等提出了物聯網傳輸中中間件的重要性[13]。
以上對兩種通信協議的研究工作都是單邊展開,未實質解決兩類協議在傳輸數據時的問題。因此本文將對基于MQTT over WebSocket數據傳輸進行研究。通過設身份標識去重算法生成ID數據,保證數據傳輸的唯一性,解決多節點傳輸通道數據重復問題。然后對生成的ID數據進行數據格式封裝匹配,使服務器可以主動向應用端推送封裝消息,避免單節點傳輸通道與服務器連接不穩定的問題。最終結合實例,開發一套車輛信息管理系統,用于驗證方法的可行性和傳輸性能。
受限于MQTT協議的消息交付質量等級,IoT設備使用MQTT協議進行消息傳輸時容易出現數據重復、冗雜等問題。因此需要對消息進行去重處理,身份標識去重算法流程如圖1所示。根據自身的設備號,在消息數據里設置一個身份標識符(Client_ID),輔以獲取的數據信息,如經緯度數據、溫度數據等。如果Client_ID不唯一,則進行重新生成,如果唯一,訂閱端保存已經收到的Client_ID。每當接收到新消息,通過Client_ID判斷消息的獨立性,如果與儲存信息相同,則舍棄;如果沒有不同則更新Client_ID并存生成ID數據信息,如此可以保證數據傳輸的獨立性。算法核心代碼如下:
sprintf(postDate, “{“IsFix”:“%s”, “Lat”:%lf, “Lon”:%lf}”
isFixedStr, latitude, longitude);//這里獲取設備數據信息
INFO_GetIMEI(imei);//這里獲取IMEI
sprintf(tClient, “{“Imei”:“%s”, “PostDatet”:%lf}”//融合信息
if (NULL == pJsonRoot){Trace(1, "tClient data pJsonRoot == NULL"); goto __tClient_Delete; }/執行判斷
tClient *pJsonRoot = tClient_Parse(data)
MQTT_tClient* client = MQTT_tClientNew();
if (tClient_IsString(pCMD) && (tClient->valuestring != NULL))
_tClient_Delete:tClient_Delete(pJsonRoot);}

圖1 身份標識去重算法流程
使用去重算法后進行MQTT傳輸,保證了數據的準確性,但是因為MQTT協議特點,應用終端只能單方面接受IoT設備消息,由于網絡環境波動和內存緩沖區儲存的壓力,容易造成傳輸節點通道不穩定,從而對數據傳輸速度產生影響。而使用WebSocket協議可以允許服務器端主動向客戶端推送消息,可以通過握手建立的穩定通道連接持久傳輸數據信息,來避免IoT設備通過節點通道直接向應用終端傳輸消息,減少對數據傳輸速度的影響。但經過去重算法后的MQTT傳輸的消息格式不符合WebSocket的格式要求,因此需要通過對端口信息、ID信息的數據格式進行匹配,對消息進行封裝,最終生成滿足WebSocket協議,包含ID數據以及設備數據的需求信息數據。數據格式匹配算法流程如圖2所示,算法核心代碼如下:

圖2 數據格式匹配算法流程
cJSON *pJsonRoot = cJSON_Parse(data);{//判斷是否為Json格式的數據
if (NULL == pJsonRoot){Trace(1, "MQTT data pJsonRoot == NULL"); goto __cJSON_Delete; }/執行判斷
cJSON *pCMD = cJSON_GetObjectItemCaseSensitive(pJsonRoot, "cmd");
if (cJSON_IsString(pCMD) && (pCMD->valuestring != NULL))
_cJSON_Delete:cJSON_Delete(pJsonRoot);}
基于MQTT over WebSocket進行數據傳輸,本質上是為了綜合兩種通信協議的優點,彌補各自的不足,MQTT over Websocket傳輸數據的總體模型實現過程如圖3所示。首先以IoT設備作為MQTT客戶端,在獲取設備數據消息的同時,通過身份標識去重算法生成ID消息數據,可以確保節點傳輸通道中的消息唯一性。此外,PC作為WebSocket服務器,對ID消息數據進行格式匹配與封裝,有助于保證消息傳輸節點通道的穩定性。最終在中間件消息服務器實現需求信息數據的訂閱與發布,使得消息數據能夠由服務器主動向應用終端推送,完成高效率、低流量、高穩定性的數據傳輸。

圖3 MQTT over WebSocket數據傳輸模型
隨著我國高等教育快速發展,高校多校區建設成為常態,往返校區間的校車成為師生通勤的重要選擇。隨著校車投放的增多,工作人員如何通過信息化手段管理校車,師生如何實時了解校車運行狀態成為了亟待解決的問題。為了解決這些問題,同時驗證MQTT over WebSocket進行數據傳輸的可行性,開發了車輛信息管理系統。
2.1.1 系統架構
根據MQTT over WebScoket數據傳輸模型,車輛信息管理系統開發采用三層軟件架構體系,分別為硬件層、服務器層和軟件層,圖4為系統平臺架構。

圖4 系統平臺架構
其中硬件層位于整個系統最底層,主要完成硬件模塊的物理熔接、燒錄開發、MQTT配置。并且在此層級使用身份標識去重算法完成信息數據獲??;服務器層是連接硬件層和軟件層的樞紐,需進行環境搭建、服務器開發以及MQTT服務器配置等工作。并且在此層級使用數據格式匹配算法完成信息數據封裝;軟件端是程序功能實現的平臺,主要通過編寫JS腳本以及相應組件的掛載,實現車輛定位、車輛預約、信息管理、動態天氣、實時路況等功能。
2.1.2 系統設計

圖5 系統設計流程
車輛定位系統采用C/S架構,選取微信開發者平臺作為系統開發平臺,選取EMQ X Broker作為中間消息件服務器,選取騰訊云服務器作為后臺服務器,開發支持北斗導航的安信可A9g開發板作為IoT設備。系統基于MQTT over WebSocket進行消息數據傳輸,最終在微信平臺上發布程序,設計流程如圖5所示。
2.1.3 系統關鍵技術
系統以MQTT over WebSocket為核心方法進行數據傳輸,分別針對IoT設備、服務器進行開發,以滿足使用身份標識去重算法和數據格式匹配算法的需要。
(1)IoT設備開發
系統需要對IoT設備如A9g模塊、螢石云攝像頭等進行開發。以A9g模塊為例,在對硬件設備完成焊接等處理后,執行代碼燒錄,將工程項目代碼燒錄到開發板當中,實現模塊自身定位、獲取經緯度數據信息等功能,以便融合身份標識信息。其中,通過循環邏輯來判斷是否成功開啟開發板的定位功能。
if(isGpsOn){//判斷定位狀態
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);}
通過可視化管理工具,當回彈打印出“is fixed”時,便代表獲取到了開發板自身的經緯度數據信息(即需要輸入到身份標識去重算法中的設備數據信息),表明模塊通過北斗導航成功實現了定位。
(2)服務器開發
EMQ X Broker是一款高并發低時延、支持分布式集群架構的開源物聯網MQTT服務器,支持多種物聯網協議,如完整支持MQTT第五代協議規范,適合用于構建從邊緣到云端的各種5G、物聯網、車聯網平臺與應用。
因為系統最終發布在微信程序,而微信程序的架構是用基本前端代碼實現,與MQTT服務器無法進行直接消息傳輸,需要對服務器進行開發以滿足代理,從而獲取輸入到數據格式匹配算法中的端口號信息,開發邏輯如圖6所示。

圖6 服務器開發邏輯
(3)訂閱與發布
完成IoT設備和服務器的開發后,利用MQTT over WebSocket數據傳輸模型實現所封裝數據信息的訂閱與發布,比如經緯度數據信息以及轉化格式的視頻數據信息,最終在微信程序端完成對數據信息的調用,實現對車輛信息的管理。數據信息訂閱與發布如圖7所示。

圖7 數據信息訂閱與發布
基于MQTT over WebSocket的車輛信息管理系統主要包含車輛位置信息管理、開行方案信息管理、車輛座位信息管理、圖像信息管理等功能模塊,并且已經在石家莊鐵道大學校車上進行了實際應用。模塊封裝設備如圖8所示,校車如圖9所示。

圖8 模塊封裝設備

圖9 校車整體
2.2.1 車輛位置信息管理
對于車輛位置信息的管理,是系統的核心功能。以2號車為例,點擊“2號車”按鈕,如果車輛運行正常,會出現“定位成功”的字樣,并且車輛圖標會顯示在頁面中央;如果車輛上IoT設備正在定位或者車輛未啟動,會出現“車輛未運行或定位中”字樣。
2.2.2 開行方案信息管理
在實際應用中,老師分散居住在城市各地,所以車輛存在多條運營線路,由于站點眾多,導致部分師生無法了解車輛的準確??康攸c、開行時間。同時,管理人員需要針對路況信息和日程安排進行開行方案調整,因此系統設置開行方案信息管理模塊解決此問題。
2.2.3 車輛座位信息管理
如何讓師生知道具體車輛的座位信息,具體車站的車輛信息,如何讓管理者能夠知道校車空間內部信息等等也是在校車運行中存在的問題,為了解決這些問題,系統設計了車輛選座功能,在頁面右上角有選座按鈕,點擊按鈕,可以進行分車輛分車站的選座預約,方便校車管理以及師生乘車。
2.2.4 視頻信息管理模塊
為了防止車輛意外,保證運行過程中校車管理人員對車廂的信息獲取以及進行更好的安全管理,每輛車放置了一個攝像頭,同時通過螢石云平臺與微信程序進行了網絡關聯,管理人員可以通過點擊按鈕進行視頻信息的獲取和儲存。
2.2.5 其它信息管理模塊
其它信息管理模塊主要包含道路、天氣等其它信息。為了讓師生更好地了解出行情況,系統設有天氣、道路擁堵、空氣質量等信息展示功能。
各個系統功能模塊應用截圖如圖10所示。

圖10 系統各功能模塊
為了驗證MQTT over WebSocket進行數據傳輸的傳輸性能,在系統程序使用過程中,將3個IoT設備分別放到3輛車輛當中,并以0.5 s、1 s作為發布時間間隔,運行30 min進行測試,統計消息傳輸數量和流量消耗,測試結果見表1。

表1 數據傳輸測試結果
數據傳輸測試表結果顯示,IoT設備使用該方法進行數據傳輸時,相同時間間隔下,多節點傳輸準確率非常高,驗證了以多節點通道進行數據傳輸時,沒有產生消息重復冗雜的情況,同時由于服務器主動向客戶端推送消息,即使以非常短的時間間隔進行消息循環,使得車輛時刻處于定位中,但消耗的流量極低,沒有給內存緩沖區造成儲存壓力,同時傳輸也非常精準,驗證了節點傳輸通道的穩定性。
為了解系統在車輛上的應用效果,從而進一步實現對系統和傳輸方法的改進,通過招募石家莊鐵道大學25名乘坐車輛的師生,包括10名老師、10名學生以及5名車輛車隊管理人員,對乘坐車輛時使用系統的滿意度進行調查,并以問卷形式對使用結果進行記錄,測試結果見表2。

表2 系統應用測試結果
本文提出了一種基于MQTT over WebSoccket的數據傳輸方法,通過身份標識去重算法,設置Client_ID,生成了獨立的身份數據信息,保證了傳輸的準確性;通過數據格式匹配算法,將身份信息數據封裝成需求信息數據,并完成格式轉化,滿足了使用WebSocket協議的傳輸要求,使得服務器可以主動向應用終端推送封裝的消息,避免單節點傳輸通道與服務器連接不穩定的問題。并且以經緯度等車輛信息數據為例,選取微信開發者平臺作為系統開發平臺,騰訊云服務器作為后臺支撐,基于支持北斗導航的A9g開發板作為IoT設備,通過對其開發,使用身份標識去重算法和數據格式匹配算法,構建了MQTT over WebSocket數據傳輸模型,完成了基于MQTT over WebSocket的數據傳輸,開發了車輛信息管理系統,最終在微信平臺上發布程序。
數據測試表明,該方法成功地實現了聯合兩種通信協議進行低耗高效的數據傳輸。應用測試結果表明,師生通過使用該方法開發的系統乘坐車輛,降低了時間成本,減少了溝通成本,系統應用效果較佳,達到了預期的設計效果。兩種測試結果驗證了本文提出的基于MQTT over WebSocket進行數據傳輸的方法有效、可靠。
未來計劃從物聯網通信協議的數據傳輸信息以及設備種類出發,對語音數據、圖像數據開展研究,對數據格式匹配算法進行優化,使其具備更好的普適性,以實現更廣泛、高效的應用。