周民軍,劉金根
(武漢理工大學信息工程學院,武漢 430070)
車載通信系統是指裝載到汽車上的通信系統,其特點是以車為載體,隨著汽車的移動能進行無線信號的傳輸[1]。車載機設備位于移動公司子網內,監控中心無法主動找到車載機,必須由設備主動向監控中心服務器發起TCP連接。整個車載機系統如圖1所示,包括協議模塊、智能公交接口模塊、報站處理模塊、LED顯示模塊、按鍵處理模塊等。本文介紹整個系統中的一部分,針對系統設備軟件與中心服務器通信協議層,提出了基于車載機系統的通信協議實現框架及少量功能代碼。
本協議設計思想與車載機系統設備底層軟件接口相對獨立,僅作為底層與中心服務器通信的1個接口,與服務器進行無線通信。車載機設備通過TCP連接的方式(包括各種無線、有線網絡)與總控制中心的中心服務器通信并交換數據。設備是連接的發起方,這意味著中心一方必須有固定的IP或域名。所有客戶端軟件啟動,車載機設備開機后均需上報到中心服務器,以便中心服務器進行統一控制管理。客戶端軟件可以通過中心間接給車載機設備下發業務指令,車載機設備收到指令后,進行相應的動作,響應客戶端的業務指令。

圖1 智能公交網絡架構圖
開機后,車載機首先檢查設置的監控中心IP地址。若IP地址無效(IP地址為全0或值域超出范圍)則保持在離線狀態,否則開始GPRS撥號,進入在線狀態后主動向監控中心發起TCP連接。
TCP連接建立后由移動公司路由器維持一段時間,若TCP傳輸間隔太長則不再保留連接,車載機只能重新向中心發起連接。為了避免鏈路在無數據傳輸的情況下被移動公司路由器斷開,中心和設備在空閑時(即無數據可發送時)定時地發送1個特殊的心跳包(無線通信中用來維持通信鏈路的一種形式)來產生流量,維持鏈路[2]。心跳包的另一個用處是能快速有效地檢測對方是否還是“活躍”的。眾所周知,移動公司的無線網絡有個特點,TCP鏈路容易異常斷開,而異常斷開無論是設備還是中心都是無法即時檢測到的。解決辦法就是檢測對方的心跳包:如果中心在規定的時間范圍內既沒有收到設備的正常數據也沒有收到設備心跳包,則認為鏈路異常斷開了,中心要主動關閉socket;同樣,如果設備在規定的時間范圍內既沒有收到中心的正常數據也沒有收到中心心跳包,則認為鏈路異常斷開了,設備要主動關閉 socket并重新發起連接。通過檢測心跳包能準實時地偵測設備是否掉線,最大限度地避免“假在線”現象。
信令鏈路注冊流程如圖2所示。連接建立成功后立即發送1條注冊指令,中心收到后通過判斷序列號來判斷設備合法性:如果序列號在中心車輛數據庫里存在,則返回1條應答指令,應答內容為通過注冊;如果序列號在中心車輛數據庫里不存在,或者指令的格式根本就是錯的,也返回1條應答指令,應答內容為注冊失敗及其原因,并主動關閉socket。如果設備收到應答,判斷是否注冊通過。如果通過則正常收發數據,否則應斷開socket;如果設備在規定時間內還沒有收到應答,重新發送注冊包。設備還可在外圍設備(如顯示屏)上醒目顯示登陸是否成功及失敗原因等診斷信息。
設備復位后,或連接斷開重新發起,也是重復這一流程。也就是說,只要設備處于開機狀態,就會自動嘗試與中心建立連接,直到登錄成功。

圖2 信令鏈路注冊流程
中心下發的數據分為控制指令、媒體數據指令以及心跳包,但是目前通過媒體鏈路進行數據傳輸的有實時音視頻流、下載文件塊、回放視頻流、升級包、配置文件、抓拍圖片、日志下載等。數據類型不同時格式也有所不同。
H.264設備則相對復雜,同一時刻與中心之間可能有多條TCP通道:1個信令通道和多個媒體通道。流數據或大塊數據都是通過媒體通道傳輸。對在媒體通道傳輸的數據定義3種屬性:
①獨立性。此類數據必須單獨建立通道傳輸,不能與其他類型媒體數據混合在同一個通道傳輸。
②互斥性。當需要建立通道傳輸A類型數據時,如果有通道在傳輸與A互斥的其他類型數據,則設備會先斷開這些通道(前提是這些通道可被中斷;如果不可中斷則A類型數據不能傳輸,直接返回失敗)。
③可中斷性。某些類型數據在傳輸中不允許被中斷,否則可能引起嚴重后果。例如遠程升級,當升級包在傳輸中時中心又請求傳輸其他互斥的類型數據,設備只能拒絕請求。
車載機設備在建立媒體通道后必須先發送1條媒體通道注冊指令,表明即將傳輸的數據類型及其參數。數據傳輸完畢后要即時關閉,否則服務器可能會不堪重荷。另外,理論上來說,控制指令應該全部走信令通道,媒體數據應該全部走媒體通道[3]。
絕大多數中心下發的指令都需要設備給出應答,中心根據應答來確認指令是否被設備收到,對于設置指令可以判斷設置是否成功,對于讀取指令可以讀取到內容。少數設備上傳的指令也需要中心給出應答。
媒體通道的注冊登陸流程與信令通道有差異。當設備需要傳輸媒體數據時就發起連接,如果連接建立失敗,則通過信令通道發送1條鏈路建立失敗通知指令,間隔20 s后重新發起連接。本步驟最多重復3次,3次后如果依然無法連接,則再通過信令通道發送1條會話結束通知指令,會話流程就此結束。否則,連接建立成功后立即發送1條帶有會話ID的注冊指令(注意此注冊指令和對其的應答是通過新建立的媒體通道傳輸,而不是信令通道),中心收到后通過判斷序列號來判斷設備合法性:如果序列號在中心車輛數據庫里存在,則保存會話ID為有效的會話ID并返回1條應答指令,應答內容為通過注冊;如果序列號在中心車輛數據庫里不存在,或者指令的格式根本就是錯的,也返回1條應答指令,應答內容為注冊失敗及其原因,發送成功后主動關閉 socket,發送不成功則嘗試重發,最多3次,然后主動關閉socket。
如果設備收到應答,判斷是否注冊通過。如果通過則通過信令通道發送1條會話開始通知指令,否則應斷開socket,并通過信令通道發送 1條會話結束通知指令;如果設備在10 s內還沒有收到應答,重新發送注冊包。本步驟最多重復3次,3次后如果依然沒收到中心應答,則通過信令通道發送1條會話結束通知指令。設備還可在外圍設備(如顯示屏)上醒目顯示登陸是否成功、失敗原因等診斷信息。
會話開始后數據開始傳輸(單向的上傳、下載或者雙向傳輸都可以)。此過程中,中心和設備收發的指令,凡是與此會話有關的,其會話ID字段都必須與中心和設備保存的此會話ID一致,直到會話結束[4]。會話結束后,中心和設備都要拋棄或清除此會話ID,即此會話 ID無效,如果再收到帶有此會話ID字段的指令都要應答失敗或忽略。
在NetStart()函數中進行網絡撥號連接,直到RegisterProc()向服務器發送注冊包及收到中心的注冊應答包,信令鏈路注冊成功。GetCMSMsgFromWireless()函數處理來自中心的指令,并給出應答。比如:中心下發1條開始實時預覽指令,此函數收到指令后進行解析,開始媒體鏈路的連接,注冊媒體通道,并開始視頻線程的動作。CMS_CommandHandle()處理收到的相關指令,對不同的指令進行相應的處理動作。SendCmdM sgToNet()將設備給中心的應答數據包或設備主動上報的數據包發送出去。

整套協議中,服務管理類及派生類大體框架如圖3所示,其中,粗箭頭指的方向為派生類,細箭頭所指方向為類中指向該類的數據成員。

圖3 協議類管理架構圖
本通信協議利用3G無線傳輸模塊實現車內實時視頻上傳的車載項目,在C/S架構的車載機移動視頻監控系統中得到應用。其優點主要體現在控制指令數據與媒體數據分開,媒體業務數據在車載機設備與客戶端之間直接進行傳輸,無需中心服務器進行媒體數據中轉服務,極大降低服務器的負荷,在3G無線網絡通信中能滿足對網絡通信實時性和同步性的苛刻要求。
[1]羅佳.基于Yahalom協議終端間視頻通信實現[J].通信技術,2009(2).
[2]梅創社.基于GSM手機模塊在車載防盜系統中的應用研究[J].計算機應用與軟件,2007(5).
[3]孫天澤,袁文菊.嵌入式設計及 Linux驅動開發指南[M].北京:電子工業出版社,2005.
[4]劉淼.嵌入式系統接口設計與 Linux驅動程序開發[M].北京:北京航空航天大學出版社,2006.