基於 WebRTC 構建 Web SIP Phone

0 閱前須知

  • 本文並非教程,只是實現方案
  • 我只是從WEB端考慮這個問題,實際還須要後端sip服務器的配合
  • jsSIP有個很是不錯的在線demo, 能夠去哪裏玩耍,很好玩呢 try jssip

圖片描述

1. 技術簡介

  • WebRTC: WebRTC,名稱源自網頁即時通訊(英語:Web Real-Time Communication)的縮寫,是一個支持網頁瀏覽器進行實時語音對話或視頻對話的API。它於2011年6月1日開源並在Google、Mozilla、Opera支持下被歸入萬維網聯盟的W3C推薦標準
  • SIP: 會話發起協議(Session Initiation Protocol,縮寫SIP)是一個由IETF MMUSIC工做組開發的協議,做爲標準被提議用於建立,修改和終止包括視頻,語音,即時通訊,在線遊戲和虛擬現實等多種多媒體元素在內的交互式用戶會話。2000年11月,SIP被正式批准成爲3GPP信號協議之一,併成爲IMS體系結構的一個永久單元。SIP與H.323同樣,是用於VoIP最主要的信令協議之一。

圖片描述

通常來講,要麼使用實體話機,要麼在系統上安裝基於sip的客戶端程序。實體話機硬件成本高,基於sip的客戶端每每兼容性差,沒法跨平臺,易被殺毒軟件查殺。前端

WebRTC或許是更好的解決方案,只要一個瀏覽器就能夠實時語音視頻通話,這是很不錯的解決方案。WebSocket能夠用來傳遞sip信令,而WebRTC用來實時傳輸語音視頻流。linux

2. 前端WebRTC實現方案

其實咱們不須要去本身處理WebRTC的相關方法,或者去處理視頻或者媒體流。市面上已經有不錯的模塊可供選擇。web

2.1 jsSIP

jsSIP是JavaScript SIP 庫chrome

圖片描述

功能特色以下:segmentfault

  • 能夠在瀏覽器或者Nodejs中運行
  • 使用WebSocket傳遞SIP協議
  • 視頻音頻實時消息使用WebRTC
  • 很是輕量
  • 100%純JavaScript
  • 使用簡單而且具備強大的Api
  • 服務端支持 OverSIP, Kamailio, Asterisk, OfficeSIP,reSIProcate,Frafos ABC SBC,TekSIP
  • 是RFC 7118 and OverSIP的做者寫的

下面是使用JsSIP打電話的例子,很是簡單吧後端

// Create our JsSIP instance and run it:

var socket = new JsSIP.WebSocketInterface('wss://sip.myhost.com');
var configuration = {
  sockets  : [ socket ],
  uri      : 'sip:alice@example.com',
  password : 'superpassword'
};

var ua = new JsSIP.UA(configuration);

ua.start();

// Register callbacks to desired call events
var eventHandlers = {
  'progress': function(e) {
    console.log('call is in progress');
  },
  'failed': function(e) {
    console.log('call failed with cause: '+ e.data.cause);
  },
  'ended': function(e) {
    console.log('call ended with cause: '+ e.data.cause);
  },
  'confirmed': function(e) {
    console.log('call confirmed');
  }
};

var options = {
  'eventHandlers'    : eventHandlers,
  'mediaConstraints' : { 'audio': true, 'video': true }
};

var session = ua.call('sip:bob@example.com', options);

2.2 SIP.js

sip.js項目實際是fork自jsSIP的,這裏主要介紹它的服務端支持狀況。其餘接口本身自行查閱瀏覽器

圖片描述

  • FreeSWITCH
  • Asterisk
  • OnSIP
  • FreeSWITCH Legacy

3. 平臺考量

圖片描述

因爲WebRTC對瀏覽器有較高的要求,你能夠看看下圖,哪些瀏覽器支持WebRTC, 全部IE瀏覽器都不行,chrome系支持狀況不錯。服務器

3.1 考量標準

  • 跨平臺
  • 兼容性
  • 體積
  • 集成性
  • 硬件要求
  • 開發成本

3.2 考量表格

種類 適用平臺 優勢 缺點
基於electron開發的桌面客戶端 window, mac, linux 跨平臺,兼容好 要下載安裝,體積大(壓縮後至少48MB),對電腦性能有要求
開發js sdk 現代瀏覽器 體積小,容易第三方集成 兼容差(由於涉及到webRTC, IE11以及以都不行,對宿主環境要求高),客戶集成須要開發量
開發谷歌瀏覽器擴展 谷歌瀏覽器 體積小 兼容差(僅限類chrome瀏覽器)

4 參考文檔 and 延伸閱讀 and 動手實踐

5 常見問題

422: "Session Interval Too Small"

jsSIP默認攜帶Session-Expires: 90的頭部信息,若是這個超時字段小於服務端的設定值,那麼就會獲得以下422的響應。參見SIP協議狀態碼:, 能夠在call請求中設置sessionTimersExpires, 使其超過服務端的設定值便可session

call(targer, options
)
option.sessionTimersExpires
Number (in seconds) for the default Session Timers interval (default value is 90, do not set a lower value).

6 最後,你我共勉

clipboard.png

相關文章
相關標籤/搜索