Foreword
推荐序二
收到杜总让我写推荐序的邀请后,我一口气看完了杜总发过来的手稿,感到既惶恐又激动。感到惶恐是因为我平时除了写代码之外,很少在其他的“写”上下功夫。一是因为“懒”,二是因为文采实在有限——我的老板经常对我写的材料感到无可奈何(在此,感谢我的老板的宽容,并给我大块的自由时间)。我担心我这写作水平把杜总这么好的书写坏。至于激动,是因为杜总不仅技术水平过硬,而且性格好,交际广。他认识那么多技术专家,却还能想起我,让我觉得荣幸之至。
既然要写推荐序,那么我就按部就班地写两方面的东西。一方面是Kamailio本身,另一方面是杜总。
关于Kamailio,我是在2012年开始使用的。在那之前,我们几个人开发了一套完整的VoIP产品,并于2009年卖给了美国一家公司。两年之后,我厌倦了安逸,萌生了再开发一套VoIP产品的念头。重起炉灶,从零开始是不现实的,那也是对全球源码贡献者的不尊重。当时在我们面前有几个优秀的开源栈:Resiprocate、Yate、FreeSWITCH、OpenSIPS、BellSIP、Kamailio、Sofia等。由于当时我们还有大量的客户使用E1/T1中继,所以还要考虑IMS、SIGTRAN、SS7相关模块的开发。经过将近半年的摸索、压测、比对,我们在系统方面选择了FreeSWITCH+Kamailio+Yate的组合,以求在终端方面提供基于IMS架构的SIP软电话和WebRTC网页软电话。
在这里,我简单说一下我对产品的理解。相对来说,我觉得FreeSWITCH、Kamailio等都不算是一个完整的产品。一个产品是需要从整体用户需求、稳定性、可靠性、可兼容性、可维护性等方面来综合设计的(先声明,我不是产品经理),比如负载均衡、路由分发、资源重组、信令媒体分离、信令协议栈适配、音视频媒体分离、传输和编解码算法分离……所以,很多国内精通FreeSWITCH或者Kamailio的程序员,不一定能做出一个很好的产品。
Kamailio和OpenSIPS都是OpenSER的分支,为什么我们选择了Kamailio呢?这和我们当时的产品思想有关。这主要体现在如下几方面。
第一方面,我们使用FreeSWITCH做媒体,并通过dialplan的Lua接口,使用Lua语言开发了一套B2BUA模块。这个B2BUA模块可以在不使用Socket的情况下,直接在应用层对接Kamailio的Lua模块并进行进程间的交互,从而形成SIPServer(Kamailio)+B2BUA+MediaServer(FreeSWITCH)的标准VoIP分布式架构。
第二方面,Kamailio能够很好地支持WebSocket交互,从而支持WebRTC通信。
第三方面,Kamailio能够方便对接Yate的SIGTRAN模块,进而驱动M3K、M5K等外部SIGTRAN设备。这样Kamailio就成了一个功能比较齐全的网关模块(支持SIP、SIGTRAN、WSS等)。
第四方面,Kamailio能够很完美地支持IMS架构中的P-CSCF和S-CSCF(虽然还是修改了一些代码)对接。现在随着5G的全面部署,4G中的IMS模块也变成了v-IMS模块,Kamailio能完美实现对新网元的功能对接。
当然,其他的开源栈并非不优秀,只是基于我们的产品设计,我们选择了Kamailio,并且它也确实很好用!
关于杜总,我们年纪相同,相识于2017年。当时,他正为声网的RTC四处奔波。实际上,我和杜总身上有一些共同的标签,比如技术控,所以,几次交流后就变成了好朋友。但杜总身上有很多我不具备的优秀品质,比如勤奋、热爱分享。
杜总出版了多本书,最有名的是《FreeSWITCH权威指南》。书很好,我看了好几遍。其实,我要比杜总更早接触FreeSWITCH和Kamailio。但我总是宁愿看晦涩的英文文档,也从没动过把自己踩的坑好好整理成中文书的念头。2019年,我和杜总曾计划联合写一本书,书名和目录都定下来了,但我却一直停工到现在。看到杜总又一本新书即将出版,我愈加觉得自己的“懒癌症”有点严重了!
杜总通过出书、讲课、建社区,极大地拉低了VoIP开发的技术门槛,培训出了无数优秀的技术人员,他为RTC行业发展做出了有目共睹的贡献。
最后,对于这本书,我希望从事RTC开发的伙伴能够人手一本,因为它会帮大家降低时间成本,提高开发效率。
王文敏
中移在线高级技术专家