JSSIP源碼簡介-關於SIP協議使用的一個JavaScript庫/JS在通訊中的應用


一 SIP協議是什么?

首先來說一下SIP協議,下面是百度百科的一些選的片段:SIP是類似於HTTP的基於文本的協議。SIP可以減少應用特別是高級應用的開發時間。由於基於IP協議的SIP利用了IP網絡,固定網運營商也會逐漸認識到SIP技術對於他們的深遠意義。SIP(Session Initiation Protocol)是一個應用層的信令控制協議。用於創建、修改和釋放一個或多個參與者的會話。這些會話可以是Internet多媒體會議[1]、IP電話或多媒體分發。會話的參與者可以通過組播(multicast)、網狀單播(unicast)或兩者的混合體進行通信。SIP它既不是會話描述協議,也不提供會議控制功能。SIP 獨立於傳輸層。SIP 會話使用多達四個主要組件:SIP 用戶代理、SIP 注冊服務器、SIP 代理服務器和 SIP 重定向服務器。這些系統通過傳輸包括了 SDP 協議(用於定義消息的內容和特點)的消息來完成 SIP 會話。下面概括性地介紹各個 SIP 組件及其在此過程中的作用。

簡要來說,SIP協議用於IP電話等,不負責會話的具體描述,一般用來控制管理,如身份認證,控制連接等。在SIP協議中,使用用戶代理UA進行對話,每個UA都是完全獨立和平等的,合一進行直接的對話。在會話中,發送請求的一方成為UAC,即我們認為的客戶端,接受的成為UAS,我們認為的服務器端。(是我們認為上的,實際應用以及在SIP協議中並未有什么區別,只是便於理解)。也可以通過中間的代理來進行通話。直接的一對一的通話是UAC--UAS。通過代理的話就是UAC--(UAS-UAC)--UAS中間的(UAS-UAC)即為中間的代理服務器,這種方式成為背靠背。關於更多此方面的和具體的東西,可以從下面的資料里看,說的挺明白清楚的,還有一些sip協議的具體格式,也都有。

 http://www.freeswitch.org.cn/2010/05/08/di-si-zhang-sip.html

二 SIP協議棧

關於SIP的使用,有GOOGLE的一個JS的協議棧,還有一個JSSIP的協議棧。都是基於JS的。基於其他語言的,我暫時沒有了解。兩個都是開源的,可以直接使用或者修改。最近在看JSSIP的,所以就主要說一說JSSIP。

三 JSSIP的結構

JSSIP的資料在www.jssip.net上有,文檔API,源代碼,還有快速入門用法,還有單元測試用例都是有的。下面是一個簡單的用法:

//Creating a JsSIP User Agent
var configuration = {
  'outbound_proxy_set': 'ws://sip-ws.example.com',
  'uri':                'sip:alice@example.com',
 'password':           'superpassword'
};
var coolPhone = new JsSIP.UA(configuration);
//Starting the User Agent
coolPhone.start();
//Making outbound calls
var useAudio = true;
var useVideo = true;
var views = {
  'selfView':   document.getElementById('my-video'),
  'remoteView': document.getElementById('peer-video')
};
var eventHandlers = {
  'connecting': function(e){ // Your code here },
  'progress':   function(e){ // Your code here },
  'failed':     function(e){ // Your code here },
  'started':    function(e){ // Your code here },
  'ended':      function(e){ // Your code here }
};
coolPhone.call('sip:bob@example.com', useAudio, useVideo, eventHandlers, views);
//Sending instant messaging
var contentType = "text/plain";
var text = 'Hello Bob!';
var eventHandlers = {
  'succeeded': function(e){ // Your code here },
  'failed':    function(e){ // Your code here };
};
coolPhone.sendMessage('sip:bob@example.com', text, contentType, eventHandlers);

 

API和快速用法的程序,上面給的網址很清楚,就不再贅述。如果想要修改源代碼供自己使用,可能就需要弄懂內部的結構了。只是單純使用的話就不必了。

源碼還是挺多的,2萬行左右。里面的一些邏輯稍顯復雜,我現在也沒有每一行都看的很清楚,核心的部分大概懂了一些。以一些簡單的圖來說明吧:

框架圖:

類圖:

時序圖:

有興趣的可以一同探討~圖片可能不是很清楚,因為沒辦法放太大,相冊里有原圖,能夠看的比較清楚。

類圖還有一些周邊的類我沒有畫出來(屏幕放不太不想滾動才能看全,所以就把類圖縮減了一點),主要是比較核心的一些類。

代碼從UA入手,其中SIPMessage,Parser等類比較重要。Grammar有一萬多行,進行語法解析,看了個大概就沒再仔細研究。

這個庫底層是基於WebSocket進行傳輸,在transport文件中可以看到。

根據SIP協議的結構,有session,transaction,Dialog類,表示會話,事務,和對話。插一句話,這三個概念也是需要進行區別的,當然啦,這是比較基礎的概念。

Parser類對收到的信息進行解析,(String型),轉換為自己定義的信息格式(SIPMessage的兩個子類之一,分別表示response和request)。

然后對要發出去的信息進行包裝,變成String型的data發送出去。要發出去的信息用一個類表示,我們向這個類中填充數值,由程序進行轉換。

對這些信息的操作,都由UA進行流程控制。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM