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。