JsSIP 解析

简介

SIP协议

SIP(Session Initiation Protocol),RFC3261,建议阅读第四节快速了解SIP协议如何进行运作的。

这里还有一些中文资料可以帮助到你。

SIP协议第一版草案于2000年提出,在2002正式落地,后续又有诸多升级,你可以查看datatracker里查看更多信息。

使用

 

 

JsSip目录结构

│ Config.js # 配置对象

│ Constants.d.ts │ Constants.js #常量定义:错误码、状态码、方法名等
│ Dialog.js #sip dialog可见RFC3261 12.1,中文资料SIP中的dialog、call、session、transaction
│ DigestAuthentication.js #数字签名
│ Exceptions.d.ts
│ Exceptions.js # 异常处理
│ Grammar.d.ts
│ Grammar.js # 语法转换器,用于转换SIP报文。该转换器基于peg.js生成的 peg.js基础使用 peg.js官网
│ Grammar.pegjs # 转换器规则
│ JsSIP.d.ts
│ JsSIP.js # 入口
│ Logger.js # 日志输出
│ Message.d.ts │ Message.js # 消息类,多用于IM消息
│ NameAddrHeader.d.ts │ NameAddrHeader.js #
│ Options.js # 操作类,有接听、拒接等方法
│ Parser.js # 工具方法,将消息头转换为对象
│ Registrator.d.ts
│ Registrator.js # 注册类
│ RequestSender.js # 请求发送类
│ RTCSession.d.ts
│ RTCSession.js # * RTC会话类,通话中的 answer、hold、mute等方法都在此。核心模块。
│ sanityCheck.js
│ SIPMessage.d.ts
│ SIPMessage.js # 包含四个类OutgoingRequest,InitialOutgoingInviteRequest,IncomingRequest, IncomingResponse
│ Socket.js
│ Timers.js
│ Transactions.js # SIP事务,相关解释见上方dialog中文资料
│ Transport.d.ts
│ Transport.js # webscoket 传输对象
│ UA.d.ts
│ UA.js # * 用户注册、连接服务器等功能。核心模块
│ URI.d.ts
│ URI.js # SIP URI
│ Utils.d.ts
│ Utils.js
│ WebSocketInterface.d.ts
│ WebSocketInterface.js # 提供webscoket 连接、发送消息等方法,此类会暴露给外部程序

├─Dialog
│ RequestSender.js

└─RTCSession
DTMF.js
Info.js
ReferNotifier.js # refer 方法使用
ReferSubscriber.js # refer 方法使用

UA & RTCSession

本节将从UA实例化过程,呼出,呼入三个方面剖析JsSIP,代码基于3.9.0。

ps:下文中的链接会跳转到代码中具体行位置。

跳转到git仓库后可以将github改为github1s,快速进入网页编辑器模式。如:

https://github.com/versatica/JsSIP/blob/3.9.0/lib/UA.js 改为 https://github1s.com/versatica/JsSIP/blob/3.9.0/lib/UA.js

Created with Raphaël 2.2.0UA.jsUA.jsRTCSession.jsRTCSession.jsRTCPeerConnectionRTCPeerConnectionRequestSender.jsRequestSender.jsUA调用call(),实例化RTCSession调用_createRTCConnection()实例化发布peerconnection事件调用_newRTCSession()调用newRTCSession()发布newRTCSession事件调用_sendInitialRequest()实例化,订阅onReceiveResponse等事件调用_connecting(),发布connecting事件调用_createLocalDescription()发布sending事件收到对端响应onReceiveResponse发布,_receiveInviteResponse调用tryingring...
Created with Raphaël 2.2.0UA.jsUA.jsRTCSession.jsRTCSession.jsRTCPeerConnectionRTCPeerConnection收到消息,调用onTransportData()onTransportData()调用receiveRequest()实例化RTCSession调用RTCSession的init_incoming()实例化调用UA的_newRTCSession()发布newRTCSession事件

如何拓展JsSIP

https://github.com/versatica/JsSIP/issues/708 这个issue中提出JsSIP中没有实现rfc6665中的SUBSCRIBE/NOTIFY方法,于是问题提出者自己在JsSIP基础上实现了它。

下面跟随他的代码和JsSIP作者José在这个issue中提到的拓展JsSIP应遵循的代码规范了解如何拓展一个模块。

仓库地址:https://github.com/ikq/JsSIP/tree/subscribe_support

José提出的要求总结如下:

代码实现,在与UA.js同级的目录下可以找到Subscriber.js和Notifier.js。

在UA中新增两个方法subscribenotify,分别实例化Subscribe和Notifer对象,代码如下:

注意,这两个方法会将实例化后的Subcriber和Notify对象return,需要外部程序接收,实例不会挂载到UA上(当然你也可以自行改造),代码示例如下:

小技巧,通过.d.ts文件可以快速了解这Subcriber和Notify对外暴露的方法有哪些,代码如下:

Subcriber和Notify使用方法可以参考https://github1s.com/ikq/subscribe_notify_test/blob/HEAD/test.js