鐘 波,陶智勇
(武漢郵電科學研究院 湖北 武漢430065)
基于WebSocket的車輛GPS信息實時推送系統的實現
鐘 波,陶智勇
(武漢郵電科學研究院 湖北 武漢430065)
文中針對車輛管理系統中如何實時獲取車輛定位信息問題,采用緩存數據庫實現對終端實時反饋的GPS信息進行存儲,推送服務器利用Websocket將緩存數據庫中數據的變動情況進行處理并將處理結果推送至Web應用,從而實現車輛GPS信息在地圖上進行圖形展示,并進行實時追蹤。當然利用該系統也能實現實時報警信息的推送,從而實現監控人員的對此類情況的及時處理,從而避免產生嚴重的災難及后果。
WebSocket;實時定位;緩存數據庫;數據推送;Spring
隨著物聯網技術的發展及日趨成熟,人們與普通萬物聯系愈發緊密,對事物實時信息的需求也更加強烈,尤其是作為傳統運輸業,對車輛信息的準確把握已經不僅僅涉及到公司自身車輛安全、管理的范疇,更與用戶體驗聯系緊密。傳統C/S系統通常通過TCP協議進行通信[1],使用socket編程實現客戶端與服務器端的雙向通信非常容易,會導致長期占有連接資源的缺陷;而基于HTTP協議的Web應用實現這種C/S的雙向通信雖然理論上可以實現[2],但是有請求過多等弊端。
1.1 協議機制
WebSocket協議是Html5提供的一種在單個TCP連接基礎上進行全雙工通訊的協議[3],雖然WebSocket協議本質上基于TCP協議,由于HTTP協議的廣泛應用于B/S,因此該協議延續并從HTTP過度而來,利用HTTP的協議來完成一部分握手。它在HTTP協議中多了Upgrade、Connection兩項,這兩項是瀏覽器客戶端用來告訴服務器發出的請求是WebSocket握手請求報文;在服務器進行報文解析的過程中,會對Sec-WebSocket-Key處理并生成相應的Sec-WebSocket-Accept字段值,當服務器發送響應報文之后即表明服務器端已完成向WebSocket協議的升級;客戶端則會根據服務器端響應的報文首先對Sec-WebSocket-Accept字段進行驗證,并根據驗證結果來確定是否完成握手,從而建立相應的WebSocket協議連接;完成握手之后,也就完成了從HTTP協議向WebSocket協議的Upgrade,WebSocket協議發生作用,當服務器端有數據產生時就能夠實時地推送給客戶端[4]。
1.2 WebSocket協議優勢
常見的基于HTTP的服務器推送服務的實現是基于輪詢、長輪詢、長連接。輪詢是通過客戶端定時向客戶端發送HTTP請求,然后根據服務器響應來進行客戶端數據變化,一方面會帶來大量的HTTP請求[5],而且往往只有當服務器端準備好數據之后的一個請求是有價值的,大量的無效請求必然會帶來網絡擁塞,增加不必要的帶寬損耗;另外請求過多必然會造成服務器資源的不必要開銷。長輪詢為了減少HTTP請求對定時輪詢進行了改進,當server端沒有數據更新時HTTP連接會保持一段時間,直到數據變化或者過期,但其本質上還是基于HTTP請求[6]。長連接則是在客戶端與服務器之間建立一個長期有效的連接來保證服務器向客戶端推送數據,當有大量客戶端連接服務器時大量的連接必然會造成服務器端資源的緊張。WebSocket協議是將HTTP協議提升而來,每次只用發生一次HTTP請求,避免了不必要的帶寬浪費,同時也減少了服務器端資源的開銷[7]。
車輛GPS信息實時推送系統架構如圖1。該系統主要由終端處理、后臺推送、前臺顯示3個核心模塊來進行相關的業務數據處理,數據的存儲主要是根據是否是實時數據來進行區分存放,實時數據存入緩存數據庫(Redis),其他數據存入非緩存數據庫(Mysql、Oracle 等)中。

圖1 系統架構圖
GPS數據流向如圖2。車輛GPS信息根據部標JT/T808協議傳輸到終端交互服務器,進行解碼、數據分類,根據不同的需求將GPS信息分別存到Oracle數據庫、緩存數據庫;實時推送服務從緩存數據庫中讀取車輛GPS信息并實時推送到Web應用服務器;Web應用服務器將GPS信息進行界面展示給客戶端[9]。

圖2 數據流向圖
2.1 車輛終端
負責貨運任務的車輛GPS信息會發生頻繁變化,運輸公司對所屬運輸公司車輛GPS信息進行實時接收處理,能夠保證車輛按照既定運輸任務行駛,及時發現違規情況;同時能夠清楚了解運輸任務的完成進度,做好調度策略;當車輛遇到緊急情況時,能夠立即定位到車輛所在地信息,實施應急處理。
2.2 終端交互服務
終端交互服務負責與車輛終端進行交互,主要包括數據接收和信息下發。數據接收通過接收車輛終端發送的GPS封裝信息,進行協議解析將GPS信息從協議信息中剝離出來,根據不同的需要將GPS信息分別進行存儲[10]。信息下發則主要是將需要發送給終端的數據進行協議封裝,發送到終端。本文主要針對GPS信息進行實時推送,進行相應的交互處理。
2.3 數據庫
數據的存儲由于涉及到兩類不同的需求,因此產生的數據往往需要存在不同的數據庫中。Oracle關系數據庫主要是用來將GPS信息做長期持久化,存儲終端的任意時間段內的GPS信息,這些歷史GPS信息可用于對車輛歷史運行軌跡、線路、歷程等進行分析、處理并展示。緩存數據庫主要鑒于緩存數據庫的查詢I/O速度快、定時清理數據庫無效記錄的特點[11],因此僅僅用來保存車輛終端的實時GPS信息,推送至Web服務器進行前臺界面顯示。
2.4 GPS信息推送服務
GPS信息推送服務主要是基于WebSocket協議來完成。GPS信息推送服務端通過WebSocket協議API與Web應用客戶端建立連接;然后讀取緩存數據庫中存儲的車輛終端GPS信息,再將數據推送至Web應用服務器,從而實現車輛終端數據最低延遲地推送到Web應用服務器端進行數據的展示[12]。由于WebSocket協議最終建立的是是雙工的,因此同樣支持Web客戶端向信息推送服務端傳遞數據,從而實現數據流向的雙向封閉回環。
2.5 Web應用客戶端
Web應用客戶端主要作為車輛終端GPS信息的最終使用者。通過WebSocket協議接口接收信息,利用得到的GPS信息在ArcGIS地圖上進行車輛定位信息地實時標注,管理人員從而能夠對車輛進行實時監控,實時了解車輛動態信息,便于管理人員對公司車輛實時調度、應急處理等。Web應用客戶端實際是一個管理平臺系統還包括到司機信息、運單管理、應急處理、車輛調度、監管服務、數據分析、決策支持、指令下發等功能模塊,實現實時數據、非實時數據之間的交叉互動,為企業提供更便捷、更精準的運輸業務管理。
3.1 API接口介紹
3.1.1 Html5中WebSocket接口
WebSocket API提供了簡單的語法,能夠為服務器和客戶端可以在給定的時間范圍內的任意時刻,相互推送信息。WebSocket并不限于以Ajax(或XHR)方式通信,因為Ajax技術需要客戶端發起請求,而WebSocket服務器和客戶端可以彼此相互推送信息;XHR受到域的限制,而WebSocket允許跨域通信[13]。WebSocket為指定目標創建,用于雙向推送消息。
1)WebSocket實例創建初始化
Html5中建立WebSocket實例相當簡單直接調用new WebSocket(‘’);參數設置需要為連接的服務器端的地址,WebSocket協議的URL使用ws://開頭,另外安全的 WebSocket協議使用 wss://開頭[14]。
2)onmessage事件
客戶端與服務器建立連接之后,當服務器端需要向客戶端推送數據時,就會通過建立的WebSocket相應的API向客戶端發送數據,此時就會觸發WebSocket的onmessage事件,調用onmessage方法告訴客戶端有數據推送過來,需要處理。此時客戶端可以根據需求重寫onopen事件方法將推送來的數據進行處理。onmessage事件提供了一個data屬性,它可以包含消息的Body部分。
3)send方法
當客戶端需要向服務器端傳輸數據時,就可以調用send方法來完成。注意:send方法的調用必須在客戶端與服務器建立了WebSocket連接之后,因此,send方法調用一般會寫在onopen事件方法中來完成。
3.1.2 Spring中WebSocket接口
現在主流的web容器基本均已支持WebSocket,但各容器的WebSocket接口都不盡相同。為了統一WebSocket實現,便于今后在不同web容器間的移植,這里使用SpringWebSocket框架集成。
1)ServletWebSocketHandlerRegistry類
Spring中使用 ServletWebSocketHandlerRegistry類注冊WebSocket處理器,該類實現了WebSocketHandlerRegistry接口,主要使用核心方法addHandler,通過調用該方法建立WebSocketHandler與Servlet容器中使用的URLs的映射關系。
2)WebSocketHandlerRegistration接口
該接口主要用來為指定的WebSocketHandler提供相關的配置方法接口,主要方法addInterceptors,為handshake請求配置相應的攔截器。
3)HttpSessionHandshakeInterceptor類
該攔截器類特殊之處在于能夠將HTTP session中的屬性信息拷貝到自身的 handshake attributes中,可以通過getAttributes方法取出相關的狀態信息進行對應的處理。beforeHandshake方法會在建立連接握手前被觸發,此時可以根據handshake attributes屬性來進行確定是否建立連接,從而實現權限控制。afterHandshake方法則會在握手結束時被觸發,此時可以根據相應的response的狀態和頭信息來進行判斷此次handshake是否成功來進行相關的善后工作的處理,實現友好用戶界面提示。
4)WebSocketHandler接口
該接口實現WebSocket連接后進行實質性業務邏輯處理的接口,要求Websocket連接的處理類必須實現此接口。該接口的核心方法:after Connection Established、handleMessage。afterConnectionEstablished方法會在雙方通過WebSocket協議建立完整連接之后被觸發,該方法會傳入WebSocketSession參數,此時可以根據該參數中從對方傳入的數據進行相關的處理。handleMessage方法則是最為核心的方法,該方法會在每次有新的WebSocket信息從對方到達時被觸發,此時會傳入一個WebSocketMessage參數,該參數封裝了從對方來的數據信息,同時還有WebSocketSession參數來進行識別消息來自哪個客戶端。
3.2 系統實現
3.2.1 Web應用端界面實現
1)WebSocket初始化
在JSP頁面中,直接進行WebSocket實例建立,target設置為服務器的地址,同時傳入用戶的賬號、部門代號來作為連接建立WebSocket連接的驗證信息;同時根據用戶編碼、部門來確定所監控車輛,從Redis緩存數據庫中讀取車輛GPS信息[15]。具體實現如下:

2) WebSocket連接、數據傳輸
界面定義了一個監控列表ViewTable進行列表顯示車輛的GPS信息,該列表的表頭信息會根據所選擇的車輛信息發生改變,從而調用的changeSend方法。該方法會先調用定義的WebSocket的getWs()方法,獲取相應的連接;然后調用send方法將數據信息發送給推送服務服務器端。其中重寫了WebSocket相關的 onopen、onClose、onError方法進行連接、關閉、出錯信息的處理,實現友好用戶交互界面;重寫onMessage方法[16]。

3.2.2 GPS信息推送推送服務端接口實現
1) 注冊在 SpringServlet容器中利用WebSocketHandlerRegistry建立對應URL的攔截器和處理器攔截器。
2)攔截器
HandshakeInterceptor作為攔截器繼承HttpSession HandshakeInterceptor類,重寫了相關的beforeHandshake、afterHandshake方法。before Handshake方法對連接進行預處理,對發起的請求的session中的的usrname、departmentCode屬性進行封存至HandShake Attributes中。afterHandshake方法則主要是進行控制臺顯示提示,表明連接已經建了。
3)處理器
處理器實現類SystemWebSocketHandler主要實現了WebSocketHandler接口的after Connection Established 方法、handleMessage方法、after Connection Closed方法;此外,還有負責推送的私有方法:sendSingle方法、getJson方法、getVids方法。after ConnectionEstablished方法負責在連接建立之后根據userCode、departmentCode來設定緩存數據庫相應數據集,進而促使終端交互服務器開始從終端獲取對應車輛終端GPS信息并保存至redis數據庫;當真正有數據請求從客戶端發送過來時,會觸發相應的handleMessage方法,該方法會調用相應的getVids方法、sendSingle方法,來完成所請求的車輛的GPS信息的讀取、處理、發送。

通過利用緩存數據庫快速存取的特點,基于WebSocket協議將從終端交互服務器取得的車輛定位GPS信息通過推送服務推送到web應用客戶端;Web應用客戶端利用GPS信息將車輛以可視化的地圖、列表等形式將展現出來,實現客戶端對所屬車輛的位置信息的實時掌控,更加利于企業實現高效、便捷管理。由于系統中數據流向經過多個節點,必然導致數據的實時性降低[17]。因此,進行模塊集成,縮短數據流通環節,從而實現更低延遲,是未來此類系統研究的主要方向。
[1]劉犇,王猛.基于服務器推送技術的Web數據實時更新[J].電腦開發與應用,2011,24(6):1-2.
[2]張麗.服務器推送技術在Web中的應用研究[J].新鄉學院報,2010,27(4):1-3.
[3]龍奇.下一代Web通信技術HTML5 WebSocket的研究[J].科技信息,2011,11( 36):273.
[4]溫照松,易仁偉,姚寒冰.基于WebSocket的實時Web應用解決方案 [J].電腦知識技術,2012,8(16):3826-3828.
[5]李代立,陳榕.WebSocket在Web實時通信領域的研究[J].電腦知識與技術,2010,6(28):7923-7925,7935.
[6]鄭強.web服務器推送技術的設計與實現 [D].北京:北京郵電大學,2013.
[7]廖清平.基于Web的服務器的Push技術研究和應用[D].廣州:中山大學,2013.
[8]PeterLubbers.HTML5Programing—UsingtheHTML5 WebSocket API[M].Apress,2010.
[9]郭欣.基于HTML5的通用WebIM組件的前端設計與實現[D].西安:西北工業大學,2011:21.
[10]肖在昌,楊文暉,劉兵.基于WebSocket的實時技術[J].網絡與通信,2012(12):41.
[11]柯昌正,黃厚寬.AJax技術的原理與應用[J].鐵路計算機應用,2007,16(1):1-2.
[12]吳曉東,王鵬.Html5的通信機制及效率的研究[J].長春理工大學學報,2011,34(4):159-160.
[13]鄢金端,夏吉廣,張愛玉.服務器推送技術在智能倉儲物聯網中的應用[J].警察技術,2013(2):19-22.
[14]江連峰,趙佳寶.復雜事件處理技術及其應用綜述[J].軟件,2014(2):188-192.
[15]費日東,李定主.服務器推送技術研究[J].電腦知識與技術,2012(7):1516-1517.
[16]楊金玲,曲建光,曹先革,等.基于應用技術型大學戰略 轉型的GIS實踐教學體系構建[J].測繪工程,2015,24(2):78-80.
[17]姜毅,王兆青,曹麗.基于HTTP的實時信息傳輸方法[J].計算機工程與設計,2008,29(10):1-4.
Implementation for system of real-time pushing vehicle’s GPS information based on WebSocket
ZHONG Bo,TAO Zhi-yong
(Wuhan Research Institute of Post and Telecommunications,Wuhan 430065,China)
In order to solve the problem that how to get vehicle ‘s GPS information in vehicle management system in real-time,this paper use cache database to save the Real-time GPS information from the interactive terminal server;and then the pushing service pushes the newest GPS information to Web application client。The client utilizes the GPS information to mark the vehicle on the map or show on the datagrid,monitors the vehicle in Real-time.Of course,we can also take use of this system to push the alarming information to handle some emergencies in Real-time.In this way,some more serious disasters will be avoided.
WebSocket;real-time location;cache database;push data;Spring
TN919
:A
:1674-6236(2017)13-0048-05
2016-06-19稿件編號:201606128
鐘 波(1990—),男,湖北隨州人,碩士研究生。研究方向:互聯網技術。