为什么做这个?
今年初接到一个我的项目工作,客户要求在本人的音视频平台零碎中集成webrtc性能(原零碎是基于SIP协定开发的,曾经稳固运行多年,有很多客户)。在比对了多家RTC产品的成果后,。他们对声网音视频DEMO成果后十分称心,指定要求用声网的SD-RTN传输网络,全面革新客户端软件。据客户实测,在某些国家和地区,同样网络环境下比微信要好很多,比方在东非和中国之间语音通话,提早很小、声音也更清晰。
话不多说,先列下客户要求和以后产品的问题:
1、要求全面革新Android、IOS、Windows、MacOS、Web版5个平台的客户端软件,原来的客户端别离是基于Pjsip、Linphone、Sipjs开发的;
2、要求在网络环境差的中央,也能满足清晰语音通话的要求(声网专为此而生);
3、最小侵入性,尽量不扭转服务器端的零碎性能,实现客户无感降级;
4、解决SIP协定常常碰到丢包、被过滤UDP等无奈呼叫,或者呼叫听不清的问题;
5、解决SIP服务器常常被尝试攻打呼叫、歹意扫描注册攻打等行为,进步零碎稳定性;
6、实现WebRTC协定和SIP协定的双向互通,既要兼容SIP呼叫,反对RTC客户端送呼叫到SIP Server,也要反对SIP Server呼入到客户端软件(在声网的音视频实时传输网传输)。.
其实刚接到需要的时候,大家一起探讨剖析过,感觉这种我的项目看着有不少估算,然而要做的是全平台的客户端,开发工作沉重,要思考的细节也比拟多,没准是个坑,能不能达到客户冀望难说,少数共事不倡议做。而后在领导和客户一起去happy一晚后,这活儿不晓得怎么就接了下来。
老板理由很简略,这也不做那也不做,那咱们能够做什么?如果谁都能做,客户还会找咱们吗?那就干吧,马上口头,各种查资料,翻阅声网的技术开发文档,并征询声网的技术同学。2天后拿出初步计划。
零碎架构图
解决思路:
1、本人写信令模块,放弃灵活性,简略实现:开发TCP Server承当信令服务器;
2、外围是开发一个SIP2WebRTC/WebRTC2SIP协定转换网关,保护一个状态机;
3、开发音视频编解码处理器,解决声网语音和SIP语音编码互通;
4、开发一个状态治理模块,SessionManger,以保护客户端的状态IP+端口;
5、联合声网的音视频SDK,集成本人的信令模块,实现和WebRTC2SIP 模块通信;
6、自定义常见的SIP呼叫信令,供各平台客户端保持一致。
罕用的SIP 信令有:1注册、2呼叫、3接听、4挂断、5拒接、6勾销、7Hold、8DTMF、9用户未反映、10用户离线、11Transfer、12会议(我简略介绍后面的6个)
咱们暂且把这个零碎命名为 WebRTC2SIP Connector 或者SIP2WebRTC Connector吧。至于为什么这么叫,我也不晓得,可能叫XX Gateway的太多了,不这么叫显不出声网的SD-RTN有多牛X,我是他爹,想叫什么都能够。
理清思路后,咱们须要确认几个外围问题:
1、以哪个平台的SDK为根底开发这个WebRTC2SIP Connector 外围模块?
2、Agora SDK是否反对多并发呼叫?
3、声网的语音编码格局和视频编码格局是什么?采样率多少?
4、SIP客户测有没有什么具体的编码要求?客户可承受固定一个语音编码,我抉择PCMA
这里特别感谢一下声网,对咱们这种小众需要做出了疾速响应,也感激声网技术支持同学Nemo,专门来到公司交换了几个小时,并分享了一些技术信息。
他倡议咱们:
1、用Agora Windows SDK 或者 Linux SDK 开发协定转换模块;
2、2个SDK都反对多并发呼叫;
3、语音是pcm格局,视频是yuv格局;采样率是48khz
到这里心里有数了,简要文字描述下大略流程就是:
1、各客户端SDK启动的时候,发动TCP连贯,登录TCP Server信令服务器, WebRTC2SIP转接模块初始化也发动TCP连贯登录TCP Server ,由TCP Server记录大家的UID,IP和端口等信息。
2、呼叫的时候,申请一个房间号,并依据自定义信令格局发动calling 报文,TCP Server收到后,转发给转接模块WebRTC2SIP ,WebRTC2SIP收到后创立1个线程,解析报文,并启动声网的SDK,退出指定房间号,开始读取音频流程,同时启动线程,封装SIP规范报文,发动sip invite申请给电话服务器SIP Server; SIP Server收到呼叫申请就去呼叫被叫电话号码,并返回ring振铃信号;WebRTC2SIP收到振铃信号,封装自定义的振铃信息给客户端SDK,被叫接听后,WebRTC2SIP,启动Media Coder开始解析媒体流,并resample 后,写入到声网的房间外面。实现语音通话。形容个大略,置信能看明确。
3、从SIP呼入到声网的SDK,大同小异,反过来。
这里要留神:
1、每个终端都要自定义编号;
2、每个呼叫都要退出声网的房间channel 实现音视频互通;
3、因为编码不一样,所以须要resample 这个很重要,不要接通了没有声音,单方不匹配。
4、WebRTC2SIP 模块要多线程形式解决,以实现并发呼叫;
5、WebRTC2SIP 模块要保护一个残缺的状态机,给每个通话加惟一编号,不至于出错。
到当初咱们讲清楚了大略的解决方案和技术思路,看到这里,各位客官应该明确了,其实这个做起来没啥难度,至多当初看来是这样的。
基于声网的音视频SDK和FreeSWITCH开发WebRTC2SIP Gateway 报文设计 (二)
上一篇咱们提到,罕用的SIP 信令有:1注册、2振铃、3呼叫、4接听、5挂断、6勾销
有了这几个报文,电话的呼入和呼出就能够根本实现,其余拒接、DTMF等相似。
如图所示:
约定:
1、客户端和服务器端JSON格局交互;
必传参数:
msgtag 是音讯惟一标记,
userid是谁触发的,
appid 作为一个利用的标记。
sign 签名加密 (看状况)
2、服务器返回的报文必须包含msgtag \appid\errcode
errcode=1 阐明有谬误 errmsg就会有值 ;如果errcode=0 阐明返回后果正确
个别是返回的msgtag 是申请的msgtag+”_res”做为辨别
3、roomID 是房间号对应声网的渠道号,每个通话报文必须包含roomID 用处是什么本人想。
4、callType 是video audio 前者代表视频呼叫,后者代表语音呼叫
5、direction 呼叫方向
in 呼入 (SIP Server 把呼叫送到声网的SDK)
out 呼出(SDK把呼叫送到SIP Server)
6、isSIP yes no 代表这通呼叫是外部呼叫(声网客户端实现) 还是SIP呼叫(走落地)
这篇文章我只是简略列出外围的报文DEMO格局。
信令1:注册报文
响应报文:
信令2:呼叫报文
响应报文:
信令3:振铃报文
响应报文:
信令4:接听报文
响应报文:
信令5:挂断报文
响应报文:
信令6:勾销报文
响应报文:
如图下面设计的报文非常简单,置信大家都看得明确。不须要过多语言阐明,供大家参考吧。
不管客户端还是WebRTC2SIP connector 实质上都是声网的音视频SDK客户端,而后集成了自定义的报文,所以他们初始化的时候,须要调用一个专门的的接口临时叫做initSIP,调用这个接口的时候传递type 类型参数;如果是手机端或者电脑端、网页端调用,返回TCP Server地址和端口,供他们建设连贯; 如果是connector转接服务器申请的话,除了返回TCP Server 地址和端口外,还要返回SIP Server地址及端口,以及呼叫送号前缀。不然SDK发动电话呼叫的时候,connector 不晓得电话要转送到哪里。这个开发一个http接口就能够实现。
APP初始化,调用initSIP接口,建设TCP连贯,或者呼叫的时候在建设TCP连贯;
TCP Server维持所有终端的状态及网络地位做Session Manager 角色
主叫输出的号码编辑封装calling报文,通过tcp socket 发给服务器,同时UI出现拨号期待页面;
被叫收到calling报文,就封装ringing报文,通过tcp socket 发给服务器,服务器查问Session Manager 查问主被叫的IP和端口,实现音讯的路由转发,主叫收到就显示振铃页面,同时 WebRTC2SIP connector 启动media coder线程去解析和resample 读取到的音频流。就这样一个个的报文交互串起来,就能够实现整个SIP呼叫逻辑。
有趣味的同学,快去试试吧。
基于声网的音视频SDK和FreeSWITCH开发WebRTC2SIP Gateway 遇到的坑(三)
前两篇文章我简略介绍了开发WebRTC2SIP的设计架构图和报文逻辑,看着简简单单,做起来还是有很多事件要思考的。咱们在开发的过程中,也是磕磕绊绊,一步一个脚印(坑)走过去的。碰到的很多问题都是兼容的问题。
咱们碰到过哪些问题呢?咱们总结下来,开发时遇到了这些问题:
1 怎么解决早起媒体?
2 怎么解决加密不被过滤?
3 怎么避免SIP注册攻打和匿名呼叫攻打?
4 怎么反对音讯扩大,扩大反对更多服务?
5 正在通话呼叫(calling ringing )过程中,主叫或者被叫断线了,怎么探测?怎么recover,主动重连话务?
6 通话单方任一方忽然杀死SDK过程 怎么告诉对方?
7 SIP呼入的时候,如果被叫不在线?怎么个解决逻辑?
8 客户要求实现同一个账户同振怎么实现?
9 客户要求反对新版本的的SDK呼入呼出的同时,让同一套账户体系反对SIP的呼入和呼出;如果有人呼入,要求SIP客户端和声网客户端,都要响铃,即要兼容原来的客户固定资产(SIP话机等)能够持续被应用。
除了这些还有在测试阶段发现很多诡异的问题
1、比方电话接通后,说着说着就没声音了,
2、谈话会卡断,有时候接通就会卡有的时候通话几分钟后会卡
3、常常碰到被叫挂机,声网的SDK还在写日志,一天50个电话写日志几十G
4、单通,一方听不到声音
5、编码问题,码率不统一
6、各种莫名解体:启动解体,接通解体,挂机解体,神经病似得说崩就解体。
一路走来,几个共事常常剖析代码到中午。终于在测试4个月后稳定下来。其实当初回头看,就是因为没有吃透声网的API文档,没有好好利用社区的性能。如果你碰到的坑是上述的问题,那么花点工夫认真撸几遍API文档就能够搞定了。
零碎运行了几个月没出过问题,公司要求总结下开发中碰到的问题,声网的小伙伴说,要学会回馈社区,欠缺一下学习交换的气氛。有感于这一段时间的开发工作,于是就写下这几篇文章,心愿能对大家有所帮忙。我会敲代码,不太会表白,如果大家在实现这个模块的过程中也碰到问题,想理解一些细节。欢送分割交换。