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