我正在研究实现一个基于浏览器的 VOIP 解决方案,该解决方案使用 SIP 和 WebRTC 并连接到 PTSN。基本上,用户给我他们的 SIP 凭证,我使用 WebRTC 访问他们的麦克风和扬声器。在页面上,我计划运行一个 SIP 客户端。
如何实现来自 PTSN 的来电?我是否需要某种连接到用户的 SIP 服务器的侦听器?
我知道这是一个广泛的问题,但是在网上做了一些研究之后,我仍然对传入呼叫的 SIP 实现有些困惑。
也许为此刷新是值得的。
WebRTC现在在 Firefox 和 Chrome 中实现(在 IE、Edge 和 Safari 中缺失)。
对于旧版 SIP 到 WebRTC,需要进行一些转换。使用 WebRTC,您可以使用任何通常通过 WebSocket 发送信号的东西。您可以实现您的专有协议,但是如果您正在寻找 SIP 兼容性,那么最自然的选择是WebSocket 到 SIP 协议。
WebRTC 以 DTLS/SRTP 对媒体进行编码,因此您也必须以清晰的 RTP 对其进行解码。这意味着在服务器端,您将使用内置 WebRTC 支持的软交换机或 WebRTC 到 SIP 网关。确保选择具有完整媒体转码支持的软交换机/网关。WebRTC 目前支持 G.711、G.722 和 Opus。对于旧版 SIP 网络,您的服务器通常只选择 G.711,一切都很完美。在某些情况下,您可能需要将媒体转换为其他流行的编解码器,例如 G.729、G.723 或 GSM。
通常你有以下协议覆盖:
支持 WebRTC 的软交换:
WebRTC 到 SIP 网关:
支持 SIP (RFC 7118) 的 WebRTC 客户端:
你也应该部署和使用你自己的 STUN 和 TURN 服务器(一些服务器/网关有这些内置的,否则使用coturn rfc5766-turn-server)。
服务器端启动并运行后,您可以基于上述 webrtc 客户端轻松创建自定义客户端解决方案,因为它们每个都有一个简单易用的 JavaScript API。
理论上,您可以使用开源软交换(FreeSWITCH、Asterisk)项目部署 SIP 服务器,并购买“SIP 中继”服务来获取电话号码并路由到/来自 PSTN 的呼叫。然后,您可以配置 WebRTC SIP 客户端以使用您的服务器。有开源 JavaScript 库(SIP.js、JsSIP、sipML5)。
如果您在小规模工作并且非常习惯于运行电信基础设施和购买中继,这可能是您的最佳选择。在实践中,运行 PSTN 到 WebRTC 呼叫可能很困难——很多质量问题。我也不知道您希望构建应用程序的规模,但超过 100 个同时连接到您的 SIP 服务器,您需要处理扩展问题。如果您想要一个托管解决方案来减少电信麻烦,您可以使用 SIP.js 并注册 OnSIP(支持SIP.js的公司),这是一种即用即付服务,可让您购买电话数字,只需对您的客户进行编码。SIP.js 用户代理结构如下所示:
var userAgent = new SIP.UA({
uri: 'bob@example.onsip.com',
wsServers: ['wss://sip-ws.example.com'],
authorizationUser: sipUsername,
password: sipPassword
});
如果您选择 OnSIP(托管),则这些凭据由服务提供并在 OnSIP 中注册。如果您选择部署自己的 SIP 服务器,您将相应地进行更改。
您需要一个实现 SIP-WebRTC 网关的服务器。网关将能够通过 SIP 接收来自 SIP 提供商(其本身将通过转换 ISDN-SIP、SS7-SIP 等充当 SIP-PSTN 网关)的来电,然后使用 WebRTC 将呼叫转发到基于浏览器的客户端.
换句话说,您的服务器需要是 SIP 服务器和 HTTP 服务器的组合,并且 HTTP 服务器需要支持 Web 套接字和 WebRTC API。
如果您还没有看过Phono SDK,这是一个很好的起点。
更新:
自从我上次查看 WebRTC 以来,事情发生了一些变化。现在似乎在 javascript 实现中确实存在一些 SIP,它们利用新的 WebRTC API 来处理媒体方面的事情。使用 SIP-javascript 堆栈的浏览器应用程序不需要任何额外的服务器,并且可以直接连接到现有的 SIP 服务器。我发现的一个例子是sip-js,但我相信周围还有其他的。
您的问题的解决方案是: