胡偉峰,孟利民
(浙江工業(yè)大學通信網(wǎng)應用技術研究重點實驗室,浙江杭州310023)
目前國內(nèi)視頻監(jiān)控業(yè)務主要應用于各種人口密集的場所,比如十字路口、銀行、學校、大型超市、小區(qū)等。視頻監(jiān)控的發(fā)展正處于高清初期,許多地方原有的標清視頻監(jiān)控系統(tǒng)正在漸漸地被高清取代?,F(xiàn)有的視頻監(jiān)控系統(tǒng)一般都采用RTP進行視頻數(shù)據(jù)的傳輸,而信令控制方面比較常用的有H.323、RTSP和SIP等。其中SIP是由IETF提出來的一個應用控制(信令)協(xié)議,用于發(fā)起會話,它可用來創(chuàng)建、修改以及終結多個參與者參加的多媒體會話進程[1]。SIP采用文本的編碼方式,具有靈活簡單、擴展性強、實現(xiàn)成本低等特點。正是由于這些優(yōu)勢,使得SIP得到了飛速的發(fā)展,并廣泛地被應用在各種多媒體業(yè)務中。網(wǎng)絡上的各類語言版本的SIP庫使得開發(fā)周期進一步縮短,本文采用的是當前非常流行的一個開源SIP庫——PJSIP,詳細介紹了設備端通過SIP與服務器之間進行的通信。
在本項目設計中,采用支持H.264編解碼的DM365開發(fā)板來進行二次開發(fā)。攝像頭捕獲的模擬視頻數(shù)據(jù)發(fā)送到開發(fā)板,并由各芯片處理成H.264視頻數(shù)據(jù),最后進行RTP封裝并發(fā)送給服務器,服務器將視頻數(shù)據(jù)包轉(zhuǎn)發(fā)給客戶端,客戶端的播放器對其進行解碼播放。整個過程,設備端、服務器與客戶端之間的信令控制使用SIP實現(xiàn)。系統(tǒng)的設計如圖1所示:
圖1 系統(tǒng)設計圖
按照邏輯功能區(qū)分,SIP系統(tǒng)由四種功能實體組成:用戶代理、代理服務器、注冊服務器和重定向服務器[2]。SIP 定義了 6 類請求方法:INVITE、ACK、BYE、CANCEL、REGISTER、OPTIONS[3]。本文采用PJSIP協(xié)議棧來實現(xiàn)系統(tǒng)中的SIP通信。
PJSIP是一個C語言編寫的基于SIP、SDP、RTP等協(xié)議的開源多媒體通信庫。C語言良好的可移植性和高性能保證了PJSIP這個庫具備很強的跨平臺性以及優(yōu)秀的性能,它的內(nèi)存占用率也非常低。由于PJSUA-LIB庫為開發(fā)者提供了簡單的函數(shù)接口用于SIP消息的收發(fā),使普通的開發(fā)人員不必過多地考慮PJSIP庫的內(nèi)部框架。
整個系統(tǒng)的協(xié)調(diào)管理者ENDPOINT是整個協(xié)議棧的核心,負責實現(xiàn)pool、time heap、傳輸層控制、事件調(diào)度執(zhí)行、module管理、接收派發(fā)消息等[4]。模塊管理使PJSIP具有很強的擴展性,協(xié)議棧中的所有功能都以模塊的形式進行設計,每個模塊在初始化過程中都要在ENDPOINT中進行注冊。收到SIP消息后,先調(diào)用PARSER模塊進行解析,然后按照優(yōu)先級將解析后的消息依次傳遞給所有注冊的模塊,若有模塊對消息進行處理則立即停止消息的傳遞。對于要發(fā)送的消息,ENDPOINT會將消息發(fā)送給所有的模塊并且允許各個模塊對消息進行修改[5]。SIP消息在PJSIP各模塊之間的來回傳遞如圖2所示。
圖2 PJSIP各模塊協(xié)作表
PJSUA-LIB庫中SIP消息的默認使用SDP協(xié)議來描述消息體,而本文中的系統(tǒng)由于實際情況需要采用XML協(xié)議。故參考PJSUA-LIB庫中的即時消息的處理模塊,自行設計一個模塊實現(xiàn)對XML消息體的SIP消息的處理。
新模塊在初始化過程中必須要先向ENDPOINT進行注冊,注冊完成后ENDPOINT在收到SIP消息后才會將消息交給新模塊處理。結合本系統(tǒng)的實際情況,新模塊設計時只需要實現(xiàn)其中的兩個回調(diào)函數(shù)on_rx_request()與on_rx_response()來對收到的SIP消息進行處理。當ENDPOINT收到SIP請求消息時將調(diào)用on_rx_request()函數(shù)進行處理,收到SIP應答消息時將調(diào)用on_rx_response()函數(shù)進行處理。ENDPOINT對SIP消息的傳遞是根據(jù)模塊的優(yōu)先級高低來依次傳遞的,所以新定義的消息解析模塊的優(yōu)先級應該盡量比其他同級模塊要高,這樣才可以對SIP消息進行優(yōu)先處理。
同樣,在新模塊中實現(xiàn)了對SIP消息的接收后,也要完成SIP消息的發(fā)送函數(shù)部分。SIP消息發(fā)送函數(shù)主要參考了PJSIP中即時消息的發(fā)送流程,另外在發(fā)送函數(shù)的參數(shù)中添加用于表示SIP請求方法的參數(shù),XML消息體內(nèi)容以字符串的形式進行傳遞。具體的SIP消息發(fā)送流程如圖3所示。
圖3 SIP消息發(fā)送流程圖
本系統(tǒng)選擇UDP對SIP消息進行發(fā)送。設備端的SIP應用程序主要需要實現(xiàn)設備注冊、視頻請求兩大功能。
注冊具體過程:設備開啟之后向注冊服務器發(fā)送請求方法為REGISTER并且不攜帶消息體的SIP消息;注冊服務器接收到上述消息回復狀態(tài)碼為200的應答消息,同時攜帶一個隨機碼作為消息體;設備接收到應答消息后獲得隨機碼,并將其與密碼組合進行MD5加密,然后將加密結果再次以REGISTER請求方法的SIP消息發(fā)送給注冊服務器;注冊服務器接收到消息中的密碼后對此進行解析,并在數(shù)據(jù)庫中查詢確認該設備是否為合法用戶,若是回復狀態(tài)碼為200的應答消息,并保留設備的位置信息,否則恢復狀態(tài)碼為4XX的應答消息,同時在應答消息的起始行的文本信息中添加錯誤原因;終端注冊成功后,每隔一定的時間給注冊服務器發(fā)送請求方法為REGISTER的SIP消息并攜帶特定的消息體以告知服務器當前設備仍在線,此SIP消息稱為心跳保護包。
視頻請求具體過程:當收到客戶端發(fā)來請求方法為INVITE的SIP消息后,服務器負責記錄客戶端的通信地址并將視頻請求消息轉(zhuǎn)發(fā)給設備,同時回復狀態(tài)碼為1XX的應答消息通知客戶端進行等待;設備接收到此消息后讀取其中的媒體參數(shù)并判斷是否有能力參與會話,若可以則發(fā)送狀態(tài)碼200的應答消息給服務器,記錄視頻轉(zhuǎn)發(fā)服務器的通信地址;服務器轉(zhuǎn)發(fā)應答消息給客戶端,客戶端發(fā)送ACK消息確認會話的建立,設備接收到經(jīng)服務器轉(zhuǎn)發(fā)的ACK消息后,完成多媒體會話的建立。SIP應用的具體流程圖如圖4所示。
圖4 SIP通信邏輯流程圖
DM365開發(fā)板運行SIP應用程序,從程序啟動到注冊成功只需5-8s,成功注冊登錄服務器時串口信息如圖5所示:
圖5 設備注冊成功時串口的部分輸出信息
本文設計的SIP通信系統(tǒng)可以實際應用到視頻監(jiān)控系統(tǒng)中,可以實現(xiàn)與服務器、客戶端之間良好的即時通信。SIP系統(tǒng)的重發(fā)機制很好地解決了UDP傳輸?shù)娜秉c,PJSIP模塊化的功能管理機制使系統(tǒng)具有較強的擴展性。該系統(tǒng)具有較高的實用價值,可以廣泛應用到網(wǎng)絡視頻會話中。
[1] 劉瑞祥,許立群,劉寶妹.基于SIP即時消息系統(tǒng)的客戶端設計[J].計算機科學,2010,37(9):104-106.
[2] 陳銀星,周利清.SIP協(xié)議在VOIP終端的設計和實現(xiàn)[J].現(xiàn)代電信科技,2006,(10):11-13.
[3] 張智江,張云勇,劉韻潔.SIP協(xié)議及其應用[M].北京:電子工業(yè)出版社,2005:14-15.
[4] Benny Prijono.PJSIP Developer's Guide[EB/OL].http://www.Pjsip.org,2006 -03 -07.
[5] 雷正雄,朱曉民,廖建新.SIP協(xié)議棧的設計與實現(xiàn)[J].現(xiàn)代電信科技,2004,(3):17-20.