本系列只做简单介绍, 抛砖引玉
联系我 email: [email protected]
已有SIP server 服务器以及 运营商的接入系统, 可以在内网中通过软电话或标准的SIP电话注册使用, 现有需求要在外网中通过web浏览器接入已有SIP server并且能与普通的sip电话或普通电话通话 我们需要类似SBC的功能。
研究结果: 由于各种原因在虚拟机上,在内网中 可以使用web端电话正常拨打和接听电话, 外网因为安全和成本原因未做检验,但通过大量学习和了解得出了解决方案,但未做实践,安全方面未做深入研究。
由于网上可以找到许多相关资料,我在此不赘述。重点阐述下我对媒体通信相关部分的粗浅理解。RTCPeerConnection使用需要协调本地机器以及远端机器的连接, 一般是是在两个实现了webrtc的两端,但在我们的需求背景下需要自己实现与webrtc能连接的方式。即类似webrtc网关,如webrtc2sip,该方案集合了sip代理和媒体网关。但由于它维护记录几乎停滞,再加上功能比较聚焦。最后选择使用opensips+rtpengine的方案,用kamailio + rtpengine也是应该是比较推荐的。由于opensips成熟,且功能齐全,如B2BUA,中间注册等功能,所以sip server选择了它;加之opensips有篇教程是使用的websocket和rtpengine,所以媒体自然而然选择了rtpengine,也由于它项目维护者很活跃,资料也相对较多。那么媒体引擎和webrtp结合的原理是怎样呢?
-
首先根据上篇文章中(一)提到的SIP中的INVITE消息,当web端通过websocket接收到INVITE的SIP消息,sip客户端假设使用的sip.js,会创建RTCPeerConnection,尝试调用pc.setRemoteDescription(new RTCSessionDescription(/包含重要的offer消息特别是SDP/)), 一但设置成功后, 客户端需要应答本次呼叫, 并生成自己的本地的媒体相关描述信息pc.setLocalDescription然后把该描述信息发送给另端。这里特别强调的是, webrtc支持的媒体相关传输协议一般是UDP/TLS/RTP/SAVPF, 代表使用UDP来传输RTP包,并使用TLS加密,SAVPF代表使用srtcp的反馈机制来控制通信过程。rtpengine可以做一些配置,就可以使用这样的协议进行媒体流的传输。
-
一旦协商成功后,就会按照协商的媒体格式等信息往SDP描述信息中给的对方的地址和端口上发送rtp包。 各方收到rtp包后按照协商的内容解包, 当rtpengine能正常接收到rtp包时,再作为媒体中继将其转码到发到另一端。 webRTC的方案是结合ICE的,所以在SDP中会有几个candidate(候选人),即可以使用的结点。主要为了NAT穿越。穿越做为单端一大块,我在后面的文章中会解释。
-
此时是web这边的SIP客户端Alice主动发INVITE消息给Bob,SIP客户端如sip.js有简单的调用API, invite()调用后会自己生成SIP的INVITE消息,并创建RTCPeerConnection然后获取本地音视频API将mediaStream 通过pc.addStream添加到RTCPeerConnection中,通过createOffer,再调用setLocalDescription生成本地的会话描述信息,并发给SIP服务器(按照我们的场景是先发给opensips代理然后opensips再发给真正的sip服务器),sip服务器通过INVITE消息中的contact字段找到要呼叫的账户Bob,查找该Bob注册在服务器上的地址,然后向这个地址转发该INVITE消息。
-
Bob此时收到INVITE消息,需要做出应答。传统的电话生成普通的应答消息,生成之前要看能不能解析对方的媒体格式等等。如果可以,生成相应的应答消息,将Bob这端媒体支持情况生成200 OK,并携带SDP消息应答。发送到opensips时 需要转发, 媒体也需要转发, 媒体引擎也要有ICE功能,rtpengine已有此功能。当200 OK 的消息能正常到达Alice这端,web端需要处理应答消息setRemoteDescription
上一篇使用opensips + rtpengine + webrtc 充当SBC(一)
下一篇使用opensips + rtpengine + webrtc 充当SBC(三)
有用就点个小星星鼓励下吧 o( ̄︶ ̄)o