SIP定義
關於SIP中的UAC和UAS的關系,UAC為 User Agent Client, 它負責發起呼叫;而UAS為User Agent Server, 它接收一個呼叫。UA為User Agent可以是UAC或者UAS。
當然在現實環境中,如果簡單的呼叫的話,用戶不一定需要UAS,兩個UAS 之間也可以直接通過IP進行呼叫。
解釋一個簡單的UAC/UAS雙方之間的通話流程。SIP UAC 發起一個INVITE 消息,UAS回復一個 200 OK,UAC 發送一個ACK 消息確認,然后開始正式的語音呼叫,雙方發送媒體流,
UAS 或者UAC掛機,UAS發送一個Bye消息,最后UAC 發送一個200 OK,正式確認雙方通話結束。
我們現在看看基本的SIP架構實現方式:
- UAC,包括各種用戶終端,電腦,手機app,物理SIP電話或者軟電話等等接入終端。
- Proxy負責終端的會話管理。
- Registrar 服務器負責用戶注冊管理。
- Location 服務器負責用戶的定位管理。
- Gateway負責用戶通過落地接入PSTN網絡的能力處理。
很多時候,因為,我們用戶更多的應用場景是在一個內網呼叫,關注的也是一個單台企業PBX功能,所以簡單的定位或者注冊實際上都在同一台服務器完成。
SIP格式和URL的格式相同,用戶通過SIP@domain的方式來定義用戶的唯一性。
java操作sip
集成網絡 Java API (JAIN) 是一個管理電信標准的 JCP 工作組。會話發起協議 (SIP) 是一種標准通信協議,之前的文章中已對其進行了討論。將 Java 與 SIP 結合起來就得到了 JAIN SIP API,這是一種強大的標准電信 API
此 API 通常用於客戶端應用程序開發。其他基於容器的技術,如 SIP Servlet API更適合於服務器端開發。
-
JAIN SIP 標准化了SIP 協議定義的通用事務模型 接口,提供了從事務接口訪問dialogue功能的方法。它采用Listener/Provider事件驅動 模型 ,定義了很多factory類,用於創建Request和Response消息和SIP 頭。它為每個支持的頭定義了通用接口,可添加到Request 和Response中。SIP 消息通過一個事務被傳到Sip Provider,Sip Listener用於監聽到來的事件。此外,JAIN SIP 被設計為可擴展的,定義了通用的擴展頭接口。
-
jain sip的書籍:https://max.book118.com/html/2018/0201/151460916.shtm
api地址:http://dpnm.postech.ac.kr/mcs/api/jain/javax/sip/package-summary.html
jain-sip 一些類
1.javax.sip.ClientTransaction :用戶代理客戶端應用程序使用客戶端事務向用戶代理服務器應用程序發送請求消息。
ClientTransaction 應 用可以理解 為發 送 INVITE 信息到 UAS 。 ClientTransaction 也用從 SipListener 接收到的回 應進 行匹配。和 ServiceTransaction 相 對應 。
方法:
ClientTransaction 的方法:
Request createAck()通 過 ClientTransaction 創 造一個 關 於當前的 請 求的正確 應 答。
void sendRequest() 用於 發 送 創 建的 請 求消息。
這 個 類 的 調 用意味着上 層 的 應 用是 UAC 。
2.javax.sip.Dialog :一個會話用來響應 2 個點對點的用戶之間的聯系,並保持聯系一段周期。
3.javax.sip.DialogState : 這個類定義了會話的 3 種狀態, Early, Confirmed, Terminated。
4.javax.sip.DialogTerminatedEvent : 當一個會話事務到達了 terminated 狀態,這個會話事務事件被傳送到listen監聽處去。
5.javax.sip.ListeningPoint : 這個接口描述了一個唯一的網絡監聽地址,由傳輸的 IP 和端口組成。
6.javax.sip.RequestEvent : 這個類描述了一個從 SipProvider傳送到SipListener的請求事件,是一種事件模式。一個應用 (sipListener)被注冊到SIP protocol stack(SipProvider),監聽SipProvider傳來的請求事件。
7.javax.sip.ResponseEvent :這個類描述了一個從 SipProvider 到他自己的 SipListener 的一個響應事件。
8.javax.sip.ServerTransaction :
ServerTransaction 可以通常被理解 為 一個會 話 狀 態 機 ,SipProvider 用來 處 理接收 SIP 事件和消息序列,將接收到消息 發 送到 SipListener( 偵 聽方法 ) 的 processRequest 或者 processResponse 回 調 ,通 過 用 戶 代理服 務 器 發 送回 應 信息 給應 用程序。 這 個 類讓應 用程序能 發 送一個回 應對應 SipListener 收到的 請 求。
方法:
ServerTransaction 中的方法:
sendResponse應 用希望 發 送一個響 應時 候,它 創 立一個來自 MessageFactory 創 造的回 應 ,然后回 應傳 送到 ServerTransaction 的 sendResponse 方法。
9.javax.sip.SipFactory:
SIPFactory 是一個 單類 ,用 單 一方式得到 這 個 SipStack 應 用的 執 行 權 。 SIPFactory 單 一的 實 例能 用得到 實 例的方法(或者 Singleton )而被得到。通 過 在 SIPFactory 里 調 用合適構造方法,一個代表被叫端的 對 象能從 SIPFactory 得到。 創 造一個被叫的 SipStack , 這樣應 用將可以 調 用 SipStack 中的方法。
10.javax.sip.SipListener:這個類代表SIP協議的負責偵聽的應用程序端,這個接口定義了一個偵聽端,接收處理從SipProvider提交的SIP事件消息,是一個抽象的偵聽線程。
結構:
每個SIPStack或每個IP地址對應一個的Siplistener,而Siplistener與SipProvider的關系是一對多的關系。
11. javax.sip.SipProvider : : 這個接口描述了 SIP stack的消息實體。
12.javax.sip.SipStack : 提供了方法創建和刪除 SipProvider 和 ListeningPoint ,以便 SipProvider能發送和接收消息。
13.javax.sip.Transaction : Transaction 是一個基礎的 sip 組件,這個接口描述了客戶端到服務器的一個通用接口和普遍的方法。
14.javax.sip.TransactionTerminatedEvent : TransactionTerminatedEvent 被傳到 Listener當事務轉變到 terminated狀態。
15.javax.sip.address.Address :這個接口描述了用戶的 display名字和URI地址。
16.javax.sip.address.AddressFactory :這個接口提供了方法,允許程序創建地址對象,例如: URI, SipURI and TelURL。
17.javax.sip.header.ContactHeader : 一個 ContactHeader 頭變量提供了包含請求或是響應的 URI 。
18. javax.sip.header.HeaderFactory : 這個接口提供了一組方法允許從一個 JAIN SIP實例中創建Header object。
19.javax.sip.header.ToHeader : To header是最初被請求的需要者所描述,Requests and Responses必須包括一個ToHeader .
20.javax.sip.message.MessageFactory : 這個接口提供了一組方法允許應用程序從一個 JAIN SIP實例中創建Request 和 Response消息。
21.javax.sip.message.Request : 一個 SIP Request是一個從客戶端到服務器的請求。
22.javax.sip.message.Response : 一旦請求地接受者收到一個請求,一個 Response 消息就被發送。
****************************************************************************
我將整個架構切割成 SipStack, SipProvider, SipListener 等三個 class 或 interface 。
* SipStack 將底層 network protocol 封裝起來,供 SipProvider 使用。
* SipProvider 則提供基本的 SIP message 傳遞及分送。並將收到訊息後的對應動作委託給SipListener 處理。
* SipListener 是一個 interface ,用來傾聽 SipProvider 送來的 event ,並處理。
此外, SipHeader 被設計來剖析 SIP message 的 header。