康進(jìn)赟
乘客信息系統(tǒng) (PIS)是融合了多媒體網(wǎng)絡(luò)和計(jì)算機(jī)信息技術(shù),通過(guò)地面站臺(tái)和車(chē)載媒體終端向乘客提供媒體信息服務(wù)的系統(tǒng)。目前,北京、上海、廣州、深圳、香港和天津地鐵都已開(kāi)通了乘客信息系統(tǒng),且在北京、廣州和深圳等已開(kāi)通車(chē)載實(shí)時(shí)傳輸乘客信息服務(wù)系統(tǒng)。國(guó)內(nèi)地鐵PIS系統(tǒng)普遍采用 “中心-地面-車(chē)輛”的媒體信息管理方式。車(chē)載PIS的終端直接面向乘客,對(duì)其播放的實(shí)時(shí)性和連續(xù)性有較高的用戶體驗(yàn)要求。車(chē)載PIS服務(wù)器是車(chē)載PIS系統(tǒng)的媒體來(lái)源,通過(guò)轉(zhuǎn)發(fā)車(chē)站子系統(tǒng)下發(fā)的媒體信息,向車(chē)載子系統(tǒng)的播放終端提供媒體資源和消息服務(wù),為車(chē)-地媒體的統(tǒng)一管理提供了有效的途徑。本文提出一種車(chē)載PIS服務(wù)器的設(shè)計(jì)方案,根據(jù)地面PIS系統(tǒng)提供的接口協(xié)議,設(shè)計(jì)服務(wù)器軟件的整體架構(gòu)。
PIS系統(tǒng)從網(wǎng)絡(luò)結(jié)構(gòu)上可分為3個(gè)子系統(tǒng):控制中心子系統(tǒng)、地面車(chē)站子系統(tǒng)和車(chē)載子系統(tǒng)。地面PIS系統(tǒng)通過(guò)車(chē)載子系統(tǒng)向地鐵車(chē)輛內(nèi)提供媒體服務(wù),實(shí)現(xiàn)車(chē)-地信息統(tǒng)一發(fā)布管理。車(chē)載PIS服務(wù)器接收和管理地面PIS下發(fā)的媒體信息,通過(guò)車(chē)載交換機(jī)組傳給車(chē)載媒體終端在LCD顯示屏上播放,向乘客提供信息服務(wù)。地面PIS子系統(tǒng)通過(guò)車(chē)-地?zé)o線網(wǎng)絡(luò)向車(chē)載PIS子系統(tǒng)傳輸媒體信息,包括直播流媒體、墊播計(jì)劃、墊播媒體文件、滾動(dòng)消息和緊急消息等。由車(chē)載PIS服務(wù)器負(fù)責(zé)接收并進(jìn)行數(shù)據(jù)緩存和轉(zhuǎn)發(fā)。車(chē)載PIS的列車(chē)視頻監(jiān)控(CCTV)上載也通過(guò)同一路徑傳輸至地面PIS子系統(tǒng),地面CCTV在控制中心進(jìn)行解碼播放。車(chē)-地PIS系統(tǒng)通信如圖1所示。
圖1 車(chē)-地PIS系統(tǒng)通信示意圖
車(chē)載PIS服務(wù)器需要實(shí)現(xiàn)以下功能。
1.直播模式。列車(chē)運(yùn)行中,車(chē)載設(shè)備要實(shí)時(shí)接收來(lái)自地面運(yùn)營(yíng)中心的節(jié)目,包括媒體新聞、賽事直播和廣告等實(shí)時(shí)動(dòng)態(tài)的多媒體信息,并在列車(chē)車(chē)廂的車(chē)載媒體終端上播出。地面PIS通過(guò)TS流下發(fā)直播流媒體,車(chē)載PIS服務(wù)器接收地面PIS下發(fā)的視頻流,以組播的方式實(shí)時(shí)轉(zhuǎn)發(fā)給車(chē)輛PIS系統(tǒng)。
2.墊播模式。根據(jù)系統(tǒng)提出的播放冗余控制需求,為防止客室顯示屏出現(xiàn)黑屏,需要在直播的基礎(chǔ)上加入墊播模式。若視頻源或車(chē)-地?zé)o線網(wǎng)絡(luò)出現(xiàn)故障,導(dǎo)致車(chē)載PIS系統(tǒng)接收不到直播視頻,車(chē)載PIS服務(wù)器將服務(wù)器硬盤(pán)中存儲(chǔ)的墊播視頻文件下發(fā)到列車(chē)以太網(wǎng)中,供客室服務(wù)器進(jìn)行播放。
3.消息轉(zhuǎn)發(fā)。正常情況下,地面PIS系統(tǒng)向車(chē)輛提供乘車(chē)須知、服務(wù)時(shí)間、列車(chē)到發(fā)時(shí)間、列車(chē)時(shí)刻表、管理者公告、政府公告等滾動(dòng)消息;在火災(zāi)、阻塞及恐怖襲擊等非正常情況下,提供動(dòng)態(tài)緊急消息提示。車(chē)載PIS服務(wù)器周期輪詢地面PIS的發(fā)送滾動(dòng)消息和緊急消息,并將消息通過(guò)組播方式轉(zhuǎn)發(fā)到車(chē)輛PIS系統(tǒng)中。
4.列車(chē)視頻監(jiān)控 (CCTV)上傳。視頻流通過(guò)列車(chē)以太網(wǎng)絡(luò)發(fā)送至車(chē)載PIS服務(wù)器;車(chē)載PIS服務(wù)器接收到錄像視頻流通過(guò)車(chē)載CCTV處理模塊將錄像視頻存儲(chǔ)到本地硬盤(pán)中,經(jīng)轉(zhuǎn)發(fā)模塊將錄像視頻通過(guò)車(chē)-地?zé)o線網(wǎng)絡(luò)轉(zhuǎn)發(fā)至地面控制中心。
由于車(chē)載服務(wù)器各功能之間相對(duì)獨(dú)立,因此參考地面PIS系統(tǒng)提供的接口通信協(xié)議,按照功能分塊的模式,建立多個(gè)執(zhí)行線程,完成數(shù)據(jù)轉(zhuǎn)發(fā)和文件存儲(chǔ)的任務(wù)。以下主要對(duì)直播模塊、墊播模塊和消息轉(zhuǎn)發(fā)模塊的設(shè)計(jì)進(jìn)行介紹。軟件整體設(shè)計(jì)架構(gòu)如圖2所示。
地面PIS系統(tǒng)向車(chē)載PIS系統(tǒng)以UDP組播的方式發(fā)送實(shí)時(shí)TS流,并通過(guò)補(bǔ)包機(jī)制盡量保證視頻流穩(wěn)定可靠到達(dá)車(chē)載PIS服務(wù)器。當(dāng)車(chē)輛系統(tǒng)由于網(wǎng)絡(luò)不穩(wěn)定造成直播流數(shù)據(jù)丟包時(shí),車(chē)載PIS服務(wù)器通過(guò)單播方式向地面PIS系統(tǒng)進(jìn)行單播補(bǔ)包請(qǐng)求。確保數(shù)據(jù)包無(wú)誤后,車(chē)載PIS服務(wù)器再通過(guò)UDP組播方式下發(fā)視頻流到客室內(nèi)的車(chē)載播放控制器。
圖2 車(chē)載服務(wù)器軟件架構(gòu)示意圖
墊播模塊的工作機(jī)制是根據(jù)地面PIS系統(tǒng)下發(fā)的墊播播放計(jì)劃文件,通過(guò)FTP網(wǎng)絡(luò)協(xié)議從地面PIS服務(wù)器下載計(jì)劃文件中包含的墊播媒體文件。為了達(dá)到媒體文件周期更新的效果,每N分鐘從地面PIS服務(wù)器獲取新的計(jì)劃文件。計(jì)劃文件采用XML格式編碼,在本地服務(wù)器經(jīng)過(guò)解析版本號(hào)等有效信息之后,比較本地新舊計(jì)劃文件,判斷是否需要更新計(jì)劃。若計(jì)劃更新,則從地面服務(wù)器下載新的媒體文件。
直播模塊實(shí)現(xiàn)了客室媒體播放的實(shí)時(shí)性和穩(wěn)定性,采用補(bǔ)包機(jī)制確保了視頻流播放的連續(xù)性。墊播模塊是在直播服務(wù)中斷或車(chē)-地網(wǎng)絡(luò)故障的情況下提供的冗余服務(wù),由客室媒體播放器自行切換,避免了在終端媒體播放器出現(xiàn)黑屏的情況,優(yōu)化乘客的媒體信息服務(wù)體驗(yàn)。
地面PIS系統(tǒng)提供數(shù)據(jù)訪問(wèn)Web服務(wù),車(chē)載PIS服務(wù)器通過(guò)http協(xié)議,以GET方式獲取地面PIS下發(fā)的滾動(dòng)消息和緊急消息。對(duì)消息簡(jiǎn)單解析和數(shù)據(jù)包分片操作之后,以組播的形式發(fā)送至各客室的播放控制服務(wù)器。
在車(chē)-地PIS系統(tǒng)通信的過(guò)程中,地面TS流的下發(fā)和車(chē)載PIS服務(wù)器發(fā)往客室的實(shí)時(shí)消息都是通過(guò)UDP組播方式完成的。UDP組播采用的是無(wú)連接、數(shù)據(jù)報(bào)的連接方式,相比TCP協(xié)議,UDP是不可靠的連接,數(shù)據(jù)到達(dá)接收端的順序都不能保證。但是,在UDP傳輸過(guò)程中,所有數(shù)據(jù)的傳送速度很快,保證了在局域網(wǎng)條件下視頻和消息傳輸?shù)膶?shí)時(shí)性。
車(chē)載PIS服務(wù)器位于車(chē)輛司機(jī)控制室,采用雙網(wǎng)卡的物理結(jié)構(gòu),實(shí)現(xiàn)車(chē)載網(wǎng)絡(luò)與地面網(wǎng)絡(luò)隔離,避免網(wǎng)絡(luò)風(fēng)暴等故障發(fā)生。外網(wǎng)網(wǎng)卡通過(guò)無(wú)線AP接入車(chē)-地?zé)o線網(wǎng)絡(luò);內(nèi)網(wǎng)網(wǎng)卡與車(chē)載交換機(jī)相連,接入車(chē)載PIS局域網(wǎng)。故在創(chuàng)建UDP連接后,需綁定要接收或發(fā)送數(shù)據(jù)的網(wǎng)卡。具體流程如下。
1.創(chuàng)建數(shù)據(jù)報(bào)式 (SOCK_DGRAM)套接字,提供UDP服務(wù)。
2.通過(guò)setsockopt()函數(shù)的SO_BINDTO-DEVICE選項(xiàng)綁定網(wǎng)卡。
3.加入?yún)f(xié)議規(guī)定的UDP組播地址。
4.通過(guò)sendto或recvfrom進(jìn)行數(shù)據(jù)的收發(fā)。
5.關(guān)閉套接字。
地面PIS系統(tǒng)與車(chē)輛PIS之間通過(guò)WLAN網(wǎng)絡(luò)連接。PIS系統(tǒng)向車(chē)輛系統(tǒng)以UDP組播方式發(fā)送實(shí)時(shí)H.264/TS流。數(shù)據(jù)以分包的方式傳輸?shù)杰?chē)載PIS服務(wù)器,到達(dá)的數(shù)據(jù)包需要根據(jù)其序號(hào)檢測(cè)該段數(shù)據(jù)的完整性。當(dāng)車(chē)載PIS系統(tǒng)由于網(wǎng)絡(luò)不穩(wěn)定造成直播流數(shù)據(jù)丟包時(shí),通過(guò)單播方式向地面PIS系統(tǒng)進(jìn)行單播補(bǔ)包請(qǐng)求,地面PIS系統(tǒng)將H.264/TS流以UDP單播方式對(duì)車(chē)載PIS系統(tǒng)進(jìn)行數(shù)據(jù)包重傳。
地面PIS系統(tǒng)向車(chē)載PIS系統(tǒng)發(fā)送的報(bào)文格式如圖3所示。一個(gè)報(bào)文分為包頭部分和數(shù)據(jù)部分。包頭部分包括序號(hào)、時(shí)間戳和數(shù)據(jù)校驗(yàn)三個(gè)字段。
圖3 地面PIS發(fā)往車(chē)載PIS的報(bào)文結(jié)構(gòu)
用8字節(jié)整數(shù)標(biāo)識(shí)報(bào)文序號(hào),車(chē)載PIS系統(tǒng)可根據(jù)該序號(hào)檢測(cè)是否丟包。用4字節(jié)整數(shù)標(biāo)識(shí)地面PIS服務(wù)器從啟動(dòng)至發(fā)送該報(bào)文的毫秒數(shù)。包頭的校驗(yàn)部分采用CRC16CCITT方式對(duì) “數(shù)據(jù)”域做CRC校驗(yàn)。數(shù)據(jù)部分即為符合H.264/TS標(biāo)準(zhǔn)的流數(shù)據(jù)。
補(bǔ)包過(guò)程中,車(chē)載PIS系統(tǒng)向地面PIS系統(tǒng)發(fā)送UDP單播指令報(bào)文,請(qǐng)求需要重傳的數(shù)據(jù)包。發(fā)送的報(bào)文格式如圖4所示,它分為命令字段、最小包序號(hào)字段和最大包序號(hào)字段。
4 車(chē)載PIS向地面PIS發(fā)送的指令報(bào)文結(jié)構(gòu)
報(bào)文首個(gè)字節(jié)標(biāo)識(shí)車(chē)載PIS系統(tǒng)向地面PIS系統(tǒng)發(fā)送的命令請(qǐng)求。最小包序號(hào)表示申請(qǐng)重傳的最小包序號(hào),最大包序號(hào)表示申請(qǐng)重傳的最大包序號(hào)。命令字段取值說(shuō)明如表1所示。
表1 請(qǐng)求命令取值說(shuō)明
結(jié)合各項(xiàng)請(qǐng)求命令,簡(jiǎn)要分析在補(bǔ)包過(guò)程中的通信規(guī)則。地面PIS系統(tǒng)與車(chē)載PIS系統(tǒng)之間的補(bǔ)包通信過(guò)程如圖5所示。
圖5 補(bǔ)包通信過(guò)程
1.?dāng)?shù)據(jù)發(fā)送。地面PIS系統(tǒng)以UDP組播方式向網(wǎng)絡(luò)中不停地發(fā)送實(shí)時(shí)H.264/TS流。
2.開(kāi)始接收 (START)。當(dāng)某列車(chē)的車(chē)載PIS系統(tǒng)設(shè)備開(kāi)始接收實(shí)時(shí)視頻流時(shí),應(yīng)向地面PIS系統(tǒng)發(fā)送START命令。
3.?;?(KEEP_LIVE)。每列車(chē)的車(chē)載PIS系統(tǒng)設(shè)備固定時(shí)間間隔向地面PIS系統(tǒng)發(fā)送KEEP_LIVE命令,告知地面PIS系統(tǒng),車(chē)載設(shè)備處于在線狀態(tài)。
4.重傳 (RESEND)。當(dāng)某列車(chē)的車(chē)載PIS系統(tǒng)設(shè)備檢測(cè)到丟包時(shí),向地面PIS系統(tǒng)發(fā)送RESEND命令,地面PIS系統(tǒng)將向該車(chē)以UDP單播的方式重新發(fā)送最小包序號(hào) (含該包)至最大包序號(hào) (含該包)之間的所有包。如果列車(chē)的車(chē)載PIS系統(tǒng)設(shè)備在1s內(nèi)沒(méi)有收到中心重傳的包,則重發(fā)RESEND命令。
5.停止接收 (STOP)。當(dāng)某列車(chē)的車(chē)載PIS系統(tǒng)設(shè)備停止接收實(shí)時(shí)視頻流時(shí),應(yīng)向PIS系統(tǒng)發(fā)送STOP命令。
為了統(tǒng)一播放計(jì)劃的數(shù)據(jù)結(jié)構(gòu),采用XML格式編碼播放計(jì)劃文件。服務(wù)器軟件采用QT類(lèi)庫(kù)中的QDomDocument類(lèi),實(shí)現(xiàn)XML解析功能。QDomDocument類(lèi)代表整個(gè)的XML文件,是文檔樹(shù)的根節(jié)點(diǎn),并提供了文檔數(shù)據(jù)的基本訪問(wèn)方法。
計(jì)劃文件解析過(guò)程如圖6所示。首先通過(guò)QFile打開(kāi)文檔,新建QDomDocument對(duì)象,使用setContent方法設(shè)置文檔的全部?jī)?nèi)容,該函數(shù)解析傳入的XML文檔字符串并創(chuàng)建代表文檔的DOM樹(shù)。根節(jié)點(diǎn)可以使用documentElement()得到,方法childNodes將根節(jié)點(diǎn)下一級(jí)的所有子節(jié)點(diǎn)初始化為一個(gè)NodeList,即節(jié)點(diǎn)數(shù)組。通過(guò)遍歷所有子節(jié)點(diǎn),同時(shí)判斷節(jié)點(diǎn)標(biāo)簽是否符合約定的XML標(biāo)簽名稱(chēng)。
若合法的節(jié)點(diǎn)沒(méi)有有效的子節(jié)點(diǎn),則通過(guò)QDomNode將其實(shí)例化后,調(diào)用nodeName方法獲取其標(biāo)簽內(nèi)容,存入對(duì)應(yīng)的共享變量中。若節(jié)點(diǎn)下仍存在需要解析的子節(jié)點(diǎn),則再進(jìn)行同上所述的解析操作,直到整個(gè)文檔有效內(nèi)容提取結(jié)束為止。
圖6 計(jì)劃文件解析過(guò)程
車(chē)載PIS服務(wù)器搭建于基于ARM架構(gòu)的嵌入式主板上,操作系統(tǒng)采用嵌入式Linux??紤]到嵌入式主板資源有限,開(kāi)發(fā)任務(wù)在PC平臺(tái)完成。通過(guò)交叉編譯后將執(zhí)行文件部署至服務(wù)器。
程序功能主要由QT實(shí)現(xiàn),QT是具有跨平臺(tái)特性的C++開(kāi)發(fā)框架。在嵌入式環(huán)境下運(yùn)行程序,需配置相應(yīng)的QT依賴(lài)庫(kù)運(yùn)行環(huán)境。
官方提供的開(kāi)源運(yùn)行庫(kù)是面向各個(gè)平臺(tái)的,需將源代碼包通過(guò)編譯后得到arm-linux平臺(tái)下的QtEmbedded版本庫(kù)。將編譯好的lib目錄拷貝至目 標(biāo) 機(jī),即 ARM 主 板 的/opt/local/Trolltech/QtEmbedded-4.x.x/目錄下,即可運(yùn)行 PC工程目錄下交叉編譯好的執(zhí)行文件。
程序運(yùn)行流程如圖7所示。在程序啟動(dòng)之后,依次啟動(dòng)直播服務(wù)線程、消息服務(wù)線程和墊播服務(wù)線程。
圖7 程序運(yùn)行流程
直播線程開(kāi)啟之后,初始化UDP套接字,綁定接入車(chē)-地網(wǎng)絡(luò)的網(wǎng)卡、本地IP和端口,然后加入U(xiǎn)DP組播地址,開(kāi)始接收來(lái)自地面PIS系統(tǒng)的TS流數(shù)據(jù)包。檢查數(shù)據(jù)包及補(bǔ)包過(guò)程在此不再贅述。將數(shù)據(jù)包存入緩存區(qū)后,檢測(cè)向下組播的套接字是否打開(kāi),若未開(kāi)啟,則創(chuàng)建套接字,綁定到連接車(chē)載PIS網(wǎng)絡(luò)的網(wǎng)卡,加入組播地址后,向下發(fā)送直播數(shù)據(jù)包。
消息線程通過(guò)訪問(wèn)地面數(shù)據(jù)Web服務(wù),從地面服務(wù)器獲取消息。分析獲取之后的數(shù)據(jù)判斷類(lèi)型,滾動(dòng)和緊急消息經(jīng)過(guò)分片處理后通過(guò)UDP組播的方式下發(fā)到客室服務(wù)器。若收到消息為空則為異常,丟棄該數(shù)據(jù)不作處理,重新獲取消息。
墊播線程是通過(guò)FTP定期下載播放計(jì)劃的方式更新本地媒體文件。程序初始化后開(kāi)始定時(shí),當(dāng)更新定時(shí)到達(dá)時(shí),執(zhí)行FTP下載任務(wù)。下載的計(jì)劃文件經(jīng)過(guò)XML解析后,與本地的原有計(jì)劃進(jìn)行對(duì)比,若計(jì)劃沒(méi)有發(fā)生變化,則重新定時(shí),等待下次更新計(jì)劃。若新的計(jì)劃發(fā)生變化,根據(jù)計(jì)劃解析出媒體列表下載新的媒體文件。
車(chē)載PIS服務(wù)器是車(chē)載PIS系統(tǒng)面向地面PIS系統(tǒng)的通信接口,一方面實(shí)時(shí)轉(zhuǎn)發(fā)地面PIS系統(tǒng)下發(fā)的媒體流和文本信息,另一方面向客室播放器提供備用的墊播服務(wù)。在確保車(chē)載媒體終端的播放內(nèi)容具有實(shí)時(shí)性和連續(xù)性的同時(shí),讓乘客得到更豐富多彩的媒體信息服務(wù)體驗(yàn)。
[1] 汪曉臣,于鑫,闞庭明,孫同慶.基于數(shù)字媒體技術(shù)的乘客信息系統(tǒng)軟件框架設(shè)計(jì)[J].鐵 路 計(jì) 算 機(jī) 應(yīng)用,2012,21(4).
[2] 馬奇志.城市軌道交通乘客信息系統(tǒng)[J].電視 技 術(shù),2013,37(19).
[3] 曾金,毛燕琴,沈蘇彬.嵌入式流媒體服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2011,21(7).