周民軍,劉金根
(武漢理工大學(xué)信息工程學(xué)院,武漢 430070)
車載通信系統(tǒng)是指裝載到汽車上的通信系統(tǒng),其特點是以車為載體,隨著汽車的移動能進(jìn)行無線信號的傳輸[1]。車載機設(shè)備位于移動公司子網(wǎng)內(nèi),監(jiān)控中心無法主動找到車載機,必須由設(shè)備主動向監(jiān)控中心服務(wù)器發(fā)起TCP連接。整個車載機系統(tǒng)如圖1所示,包括協(xié)議模塊、智能公交接口模塊、報站處理模塊、LED顯示模塊、按鍵處理模塊等。本文介紹整個系統(tǒng)中的一部分,針對系統(tǒng)設(shè)備軟件與中心服務(wù)器通信協(xié)議層,提出了基于車載機系統(tǒng)的通信協(xié)議實現(xiàn)框架及少量功能代碼。
本協(xié)議設(shè)計思想與車載機系統(tǒng)設(shè)備底層軟件接口相對獨立,僅作為底層與中心服務(wù)器通信的1個接口,與服務(wù)器進(jìn)行無線通信。車載機設(shè)備通過TCP連接的方式(包括各種無線、有線網(wǎng)絡(luò))與總控制中心的中心服務(wù)器通信并交換數(shù)據(jù)。設(shè)備是連接的發(fā)起方,這意味著中心一方必須有固定的IP或域名。所有客戶端軟件啟動,車載機設(shè)備開機后均需上報到中心服務(wù)器,以便中心服務(wù)器進(jìn)行統(tǒng)一控制管理??蛻舳塑浖梢酝ㄟ^中心間接給車載機設(shè)備下發(fā)業(yè)務(wù)指令,車載機設(shè)備收到指令后,進(jìn)行相應(yīng)的動作,響應(yīng)客戶端的業(yè)務(wù)指令。
圖1 智能公交網(wǎng)絡(luò)架構(gòu)圖
開機后,車載機首先檢查設(shè)置的監(jiān)控中心IP地址。若IP地址無效(IP地址為全0或值域超出范圍)則保持在離線狀態(tài),否則開始GPRS撥號,進(jìn)入在線狀態(tài)后主動向監(jiān)控中心發(fā)起TCP連接。
TCP連接建立后由移動公司路由器維持一段時間,若TCP傳輸間隔太長則不再保留連接,車載機只能重新向中心發(fā)起連接。為了避免鏈路在無數(shù)據(jù)傳輸?shù)那闆r下被移動公司路由器斷開,中心和設(shè)備在空閑時(即無數(shù)據(jù)可發(fā)送時)定時地發(fā)送1個特殊的心跳包(無線通信中用來維持通信鏈路的一種形式)來產(chǎn)生流量,維持鏈路[2]。心跳包的另一個用處是能快速有效地檢測對方是否還是“活躍”的。眾所周知,移動公司的無線網(wǎng)絡(luò)有個特點,TCP鏈路容易異常斷開,而異常斷開無論是設(shè)備還是中心都是無法即時檢測到的。解決辦法就是檢測對方的心跳包:如果中心在規(guī)定的時間范圍內(nèi)既沒有收到設(shè)備的正常數(shù)據(jù)也沒有收到設(shè)備心跳包,則認(rèn)為鏈路異常斷開了,中心要主動關(guān)閉socket;同樣,如果設(shè)備在規(guī)定的時間范圍內(nèi)既沒有收到中心的正常數(shù)據(jù)也沒有收到中心心跳包,則認(rèn)為鏈路異常斷開了,設(shè)備要主動關(guān)閉 socket并重新發(fā)起連接。通過檢測心跳包能準(zhǔn)實時地偵測設(shè)備是否掉線,最大限度地避免“假在線”現(xiàn)象。
信令鏈路注冊流程如圖2所示。連接建立成功后立即發(fā)送1條注冊指令,中心收到后通過判斷序列號來判斷設(shè)備合法性:如果序列號在中心車輛數(shù)據(jù)庫里存在,則返回1條應(yīng)答指令,應(yīng)答內(nèi)容為通過注冊;如果序列號在中心車輛數(shù)據(jù)庫里不存在,或者指令的格式根本就是錯的,也返回1條應(yīng)答指令,應(yīng)答內(nèi)容為注冊失敗及其原因,并主動關(guān)閉socket。如果設(shè)備收到應(yīng)答,判斷是否注冊通過。如果通過則正常收發(fā)數(shù)據(jù),否則應(yīng)斷開socket;如果設(shè)備在規(guī)定時間內(nèi)還沒有收到應(yīng)答,重新發(fā)送注冊包。設(shè)備還可在外圍設(shè)備(如顯示屏)上醒目顯示登陸是否成功及失敗原因等診斷信息。
設(shè)備復(fù)位后,或連接斷開重新發(fā)起,也是重復(fù)這一流程。也就是說,只要設(shè)備處于開機狀態(tài),就會自動嘗試與中心建立連接,直到登錄成功。
圖2 信令鏈路注冊流程
中心下發(fā)的數(shù)據(jù)分為控制指令、媒體數(shù)據(jù)指令以及心跳包,但是目前通過媒體鏈路進(jìn)行數(shù)據(jù)傳輸?shù)挠袑崟r音視頻流、下載文件塊、回放視頻流、升級包、配置文件、抓拍圖片、日志下載等。數(shù)據(jù)類型不同時格式也有所不同。
H.264設(shè)備則相對復(fù)雜,同一時刻與中心之間可能有多條TCP通道:1個信令通道和多個媒體通道。流數(shù)據(jù)或大塊數(shù)據(jù)都是通過媒體通道傳輸。對在媒體通道傳輸?shù)臄?shù)據(jù)定義3種屬性:
①獨立性。此類數(shù)據(jù)必須單獨建立通道傳輸,不能與其他類型媒體數(shù)據(jù)混合在同一個通道傳輸。
②互斥性。當(dāng)需要建立通道傳輸A類型數(shù)據(jù)時,如果有通道在傳輸與A互斥的其他類型數(shù)據(jù),則設(shè)備會先斷開這些通道(前提是這些通道可被中斷;如果不可中斷則A類型數(shù)據(jù)不能傳輸,直接返回失敗)。
③可中斷性。某些類型數(shù)據(jù)在傳輸中不允許被中斷,否則可能引起嚴(yán)重后果。例如遠(yuǎn)程升級,當(dāng)升級包在傳輸中時中心又請求傳輸其他互斥的類型數(shù)據(jù),設(shè)備只能拒絕請求。
車載機設(shè)備在建立媒體通道后必須先發(fā)送1條媒體通道注冊指令,表明即將傳輸?shù)臄?shù)據(jù)類型及其參數(shù)。數(shù)據(jù)傳輸完畢后要即時關(guān)閉,否則服務(wù)器可能會不堪重荷。另外,理論上來說,控制指令應(yīng)該全部走信令通道,媒體數(shù)據(jù)應(yīng)該全部走媒體通道[3]。
絕大多數(shù)中心下發(fā)的指令都需要設(shè)備給出應(yīng)答,中心根據(jù)應(yīng)答來確認(rèn)指令是否被設(shè)備收到,對于設(shè)置指令可以判斷設(shè)置是否成功,對于讀取指令可以讀取到內(nèi)容。少數(shù)設(shè)備上傳的指令也需要中心給出應(yīng)答。
媒體通道的注冊登陸流程與信令通道有差異。當(dāng)設(shè)備需要傳輸媒體數(shù)據(jù)時就發(fā)起連接,如果連接建立失敗,則通過信令通道發(fā)送1條鏈路建立失敗通知指令,間隔20 s后重新發(fā)起連接。本步驟最多重復(fù)3次,3次后如果依然無法連接,則再通過信令通道發(fā)送1條會話結(jié)束通知指令,會話流程就此結(jié)束。否則,連接建立成功后立即發(fā)送1條帶有會話ID的注冊指令(注意此注冊指令和對其的應(yīng)答是通過新建立的媒體通道傳輸,而不是信令通道),中心收到后通過判斷序列號來判斷設(shè)備合法性:如果序列號在中心車輛數(shù)據(jù)庫里存在,則保存會話ID為有效的會話ID并返回1條應(yīng)答指令,應(yīng)答內(nèi)容為通過注冊;如果序列號在中心車輛數(shù)據(jù)庫里不存在,或者指令的格式根本就是錯的,也返回1條應(yīng)答指令,應(yīng)答內(nèi)容為注冊失敗及其原因,發(fā)送成功后主動關(guān)閉 socket,發(fā)送不成功則嘗試重發(fā),最多3次,然后主動關(guān)閉socket。
如果設(shè)備收到應(yīng)答,判斷是否注冊通過。如果通過則通過信令通道發(fā)送1條會話開始通知指令,否則應(yīng)斷開socket,并通過信令通道發(fā)送 1條會話結(jié)束通知指令;如果設(shè)備在10 s內(nèi)還沒有收到應(yīng)答,重新發(fā)送注冊包。本步驟最多重復(fù)3次,3次后如果依然沒收到中心應(yīng)答,則通過信令通道發(fā)送1條會話結(jié)束通知指令。設(shè)備還可在外圍設(shè)備(如顯示屏)上醒目顯示登陸是否成功、失敗原因等診斷信息。
會話開始后數(shù)據(jù)開始傳輸(單向的上傳、下載或者雙向傳輸都可以)。此過程中,中心和設(shè)備收發(fā)的指令,凡是與此會話有關(guān)的,其會話ID字段都必須與中心和設(shè)備保存的此會話ID一致,直到會話結(jié)束[4]。會話結(jié)束后,中心和設(shè)備都要拋棄或清除此會話ID,即此會話 ID無效,如果再收到帶有此會話ID字段的指令都要應(yīng)答失敗或忽略。
在NetStart()函數(shù)中進(jìn)行網(wǎng)絡(luò)撥號連接,直到RegisterProc()向服務(wù)器發(fā)送注冊包及收到中心的注冊應(yīng)答包,信令鏈路注冊成功。GetCMSMsgFromWireless()函數(shù)處理來自中心的指令,并給出應(yīng)答。比如:中心下發(fā)1條開始實時預(yù)覽指令,此函數(shù)收到指令后進(jìn)行解析,開始媒體鏈路的連接,注冊媒體通道,并開始視頻線程的動作。CMS_CommandHandle()處理收到的相關(guān)指令,對不同的指令進(jìn)行相應(yīng)的處理動作。SendCmdM sgToNet()將設(shè)備給中心的應(yīng)答數(shù)據(jù)包或設(shè)備主動上報的數(shù)據(jù)包發(fā)送出去。
整套協(xié)議中,服務(wù)管理類及派生類大體框架如圖3所示,其中,粗箭頭指的方向為派生類,細(xì)箭頭所指方向為類中指向該類的數(shù)據(jù)成員。
圖3 協(xié)議類管理架構(gòu)圖
本通信協(xié)議利用3G無線傳輸模塊實現(xiàn)車內(nèi)實時視頻上傳的車載項目,在C/S架構(gòu)的車載機移動視頻監(jiān)控系統(tǒng)中得到應(yīng)用。其優(yōu)點主要體現(xiàn)在控制指令數(shù)據(jù)與媒體數(shù)據(jù)分開,媒體業(yè)務(wù)數(shù)據(jù)在車載機設(shè)備與客戶端之間直接進(jìn)行傳輸,無需中心服務(wù)器進(jìn)行媒體數(shù)據(jù)中轉(zhuǎn)服務(wù),極大降低服務(wù)器的負(fù)荷,在3G無線網(wǎng)絡(luò)通信中能滿足對網(wǎng)絡(luò)通信實時性和同步性的苛刻要求。
[1]羅佳.基于Yahalom協(xié)議終端間視頻通信實現(xiàn)[J].通信技術(shù),2009(2).
[2]梅創(chuàng)社.基于GSM手機模塊在車載防盜系統(tǒng)中的應(yīng)用研究[J].計算機應(yīng)用與軟件,2007(5).
[3]孫天澤,袁文菊.嵌入式設(shè)計及 Linux驅(qū)動開發(fā)指南[M].北京:電子工業(yè)出版社,2005.
[4]劉淼.嵌入式系統(tǒng)接口設(shè)計與 Linux驅(qū)動程序開發(fā)[M].北京:北京航空航天大學(xué)出版社,2006.