上一篇我們提到,常用的SIP 信令有:1注冊、2振鈴、3呼叫、4接聽、5挂斷、6取消
有了這幾個封包,電話的呼入和呼出就可以基本實作,其他拒接、DTMF等類似。
如圖所示:
約定:
1、 用戶端和伺服器端JSON格式互動;
- 必傳參數:
- msgtag 是消息唯一标志,
- userid是誰觸發的,
- appid 作為一個應用的标記。
- sign 簽名加密 (看情況)
2、 伺服器傳回的封包必須包括msgtag appiderrcode
- errcode=1 說明有錯誤 errmsg就會有值 ;
- 如果errcode=0 說明傳回結果正确;
- 一般是傳回的msgtag 是請求的msgtag+”_res”做為區分
3、 roomID 是房間号對應聲網的管道号,每個通話封包必須包括roomID 用途是什麼自己想。
4、 callType 是video audio 前者代表視訊呼叫,後者代表語音呼叫
5、 direction 呼叫方向
- in 呼入 (SIP Server 把呼叫送到聲網的SDK)
- out 呼出(SDK把呼叫送到SIP Server)
6、 isSIP yes no 代表這通呼叫是内部呼叫(聲網用戶端實作) 還是SIP呼叫(走落地)
這篇文章我隻是簡單列出核心的封包DEMO格式。
信令1:注冊封包:
響應封包:
信令2:呼叫封包:
信令3:振鈴封包:
信令4:接聽封包:
信令5:挂斷封包:
信令6:取消封包:
如圖上面設計的封包非常簡單,相信大家都看得明白。不需要過多言語說明,供大家參考吧。
不論用戶端還是WebRTC2SIP connector 本質上都是聲網的音視訊SDK用戶端,然後內建了自定義的封包,是以他們初始化的時候,需要調用一個專門的的接口暫時叫做initSIP,調用這個接口的時候傳遞type 類型參數;如果是手機端或者電腦端、網頁端調用,傳回TCP Server位址和端口,供他們建立連接配接; 如果是connector轉接伺服器請求的話,除了傳回TCP Server 位址和端口外,還要傳回SIP Server位址及端口,以及呼叫送号字首。不然SDK發起電話呼叫的時候,connector 不知道電話要轉送到哪裡。這個開發一個http接口就可以實作。
APP初始化,調用initSIP接口,建立TCP連接配接,或者呼叫的時候在建立TCP連接配接;
TCP Server維持所有終端的狀态及網絡位置做Session Manager 角色
主叫輸入的号碼編輯封裝calling封包,通過tcp socket 發給伺服器,同時UI呈現撥号等待頁面;
被叫收到calling封包,就封裝ringing封包,通過tcp socket 發給伺服器,伺服器查詢Session Manager 查詢主被叫的IP和端口,實作消息的路由轉發,主叫收到就顯示振鈴頁面,同時 WebRTC2SIP connector 啟動media coder線程去解析和resample 讀取到的音頻流。就這樣一個個的封包互動串起來,就可以實作整個SIP呼叫邏輯。
有興趣的同學,快去試試吧。