[投稿]我与FreeSWITCH的故事[Seven Du]

Seven Du 投稿。

故事还得从几年前说起。

很久以前,我在电信(后来叫网通)做过程控交换机的维护,机型主要是上海贝尔的S1240和华为的CC08,也了解西门子EWSD、朗迅5ESS等机型以及各种接入网设备等。由于喜欢写些小程序,所以在工作中也写过一些与交换机交互的程序,但大都是一些执行命令创建和删除用户,收集和分析日志等的操作,从来没有涉及呼叫控制方面的。

有一年去北京,一次偶然的机会认识了Jonathan Palley。他正在做英语在线教学的项目,从他那里我了解到了Asterisk。当时,Asterisk都已经七八岁的样子了,我却是第一次听说,可见处于体制内的我是多么的坐井观天。

在运营商工作的好处就是能接触到各种程控交换机、大型的服务器以及各种UNIX和各种数据库,虽然我的工作主要是维护,但我还是利用工作和业余时间开发了许多程序,开发语言主要是C和PHP,把跟我工作相关的交换机和OA等系统全部融合起来。我的很多理念和想法以及具体实现都是比较超前的,系统也是很好用的。但是,在支撑系统全市统一、全省统一、全国统一的大环境下,我写的东西很显然推广不开。而且,后来,公司内部越来越轻运维,重市场,搞起了全员营销。说白了就是你必须发展多少小灵通用户,办多少宽带等。我越来越不喜欢那种工作状态,就准备去北京投奔Jonathan Palley。

在去北京之前,我研究了一阵Asterisk,在淘宝上买了一个单口的语音卡,接上我的办公电话,有人打进来就先放IVR,然后通过逃生口接上话机,我再跟他们通话,感觉很神奇。我甚至配置了路由,可以在家里用软电话通过网络利用办公室的电话线往外打“免费”的电话。

后来Jonathan说Asterisk有问题,他准备换FreeSWITCH,问我有什么意见。我对FreeSWITCH其实没有什么研究,便赶紧上FreeSWITCH的官方网站看了看,下载、编译都很顺利,简单测试了一下,有些功能用起来竟然比Asterisk还方便。我便跟Jonathan说:值得换。那时候,FreeSWITCH还没有出1.0版。

后来到了北京,我的职位是系统管理员,主要是搞定教学平台的各种安装和部署。我很欣慰,像我这种自学成才的Linux菜鸟在整个团队中却成了Linux专家。而且,更让我喜欢的是,我可以完全使用Linux桌面工作了,以前的各种Windows上专用的软件都见鬼去了(后来有了钱,电脑换成了Mac)。在工作中,我学会了Ruby、Ruby on Rails、SVN以及后来的Erlang等技术。我很勤奋,分内的分外的事情我都做,以至于后来整个系统从最底层到最上层我都懂。

FreeSWITCH在我们的系统里是一个重要的部分,在使用和维护过程中,我也会发现一些系统的Bug,并渐渐跟FreeSWITCH社区有了交流。

其实,FreeSWITCH最初相关的开发都是由Jonathan负责的,公司也一直想招一个专门做VoIP开发的人员,但就是一直没招到。后来Jonathan公务越来越忙,我又什么都会,FreeSWITCH相关的开发任务也落在了我身上。当然,我后来也忙不过来,就又招了一名系统管理员给我打下手。这样,我的工作重点就转到了研发,以及系统架构。

外企的工作环境还是很宽松的。虽然工作不少,但我勤奋啊,在北京只有我一个人,因此,除了公司以及团队自发组织的各种业余活动,不管是晚上还是周末,我都抱着电脑。当然,有一件比较悲催的事情是,我跟公司几个客服(其它他们销售和客服什么都干)人员住在一起,因此,系统一有问题,便总能找到我。所以其实我大部分的业余时间是为公司奉献了。当他们不找我的时候,我就自己优化系统。

我也跟Jonathan开玩笑说,我其实大部分时间都是在修他写的Bug。

Jonathan是个天才,他学东西非常快,想做的东西也很快就实现了。但如上面所说,他没有时间做精细的调试和打磨,因此,我正好是一个很好的补充。所以,我最初的FreeSWITCH技术全都是跟他学的,包括混进FreeSWITCH社区。

我们是属于使用FreeSWITCH比较早的一批用户。在我们基于FreeSWITCH的系统上线后的几天内,FreeSWITCH发布了1.0.0凤凰版。

当然,在使用开源软件的同时我们也有所贡献。最初主要是报Bug和写Wiki,后来,就开始提交补丁了。那时候,FreeSWITCH的开发人员都很专注,因此,Bug修得很快,基本上都是我们今天报上去,第二天上班一看就修好了(美国人在我们睡觉的时候工作)。有一阵,我接连不断的提交新特性的建议和补丁,在打完最后一个补丁后Anthony跟我说,我可以休息一下了吗?我说,可以了。

我基于一个G729库写了FreeSWITCH中最初的G729转码模块,后来网上流传的很多版本都是基于我的版本修改的(头文件里还有我的名字呢)。不过,写这个模块其实是一个错误。我后来才了解到,原来FreeSWITCH内部早就实现了G729的转码,只是,由于专利原因,无法对外发布。对此专利细节我不了解,但是,据我所知,在世界上绝大多数国家,即使你自己实现了G729的编码,也要交专利费。由于我的错误,FreeSWITCH关闭了Wiki上G729页面的修改权限,也禁止在邮件列表里讨论G729转码。后来,FreeSWITCH官方在Linux上实现了G729的Licence机制,10美元买一个编码器和一个解码器,FreeSWITCH最终才有了G729的解决方案。当然,那都是后话了。

当然,我们(外企)是很重视专利和版权问题的。所以,后来,我写的模块仅用于试验,但没用于生产。用于生产的,是我写的另外一个模块,叫mod_recpld,是Record Payload的缩写。实现想法是,不经过转码,而把G729的内容直接录下来,后面,再用其它程序将G729转成mp3文件。而我们有这个“其它程序”的G729许可证。其实这种录音方法后来在FreeSWITCH核心中也实现了。另外,我们也后来也发现G729编码在互联网上的声音质量不如iLBC,因此,在我们决定不再使用一个仅提供G729编码的PSTN落地提供商的线路后,我们也不再使用G729了。

通过写上面两个模块,我深入了解到了FreeSWITCH内部的机理。以后再改代码,就容易得多了。

除了在线教育平台外,我们的销售和客服团队也逐渐壮大,因此,需要一个呼叫中心系统了。最初的呼叫中心是用Trixbox搭的,Trixbox是一个集成CentOS和Asterisk的一个发行套件,使用起来很简单。我们使用很老的只有700多M内存的奔腾机器跑这个应用,竟也能带十来个座席。当时,使用的是“淘”来的Asterisk兼容卡连接模拟外线。我们甚至还用了OSLEC做回声消除。后来,随着需求越来越多,我们将它换成了FreeSWITCH,我们自己实现了CRM,跟我们的系统紧密集成。多紧密呢?我们用Erlang实现了IVR功能,当有电话打进来时,它便播放欢迎词,同时,根据主叫号码,异步的到美国的服务器上去查询这个是谁的客户,进而分配座席和弹屏。去美国的服务器查询比较费时,但是我们用Erlang很优雅地通过异步操作实现了该功能。

另外,我们也购买了一个Global IP Sound的库,实现了自己的SIP客户端。没想到,后来Global IP Sound变成了Global IP Solutions,后来又卖给了Google,Google又把那些代码开源了。

再回到我们的教学平台上。由于我们在美国的老师都是Work-At-Home(在家工作)类型的,他们分布在全美各地,因此,实际上我们的教学平台就是一个分布式的呼叫中心系统。有一套很复杂的算法,根据老师上课的数量和质量给他们发钱。我们的平台用到了Ruby on Rails,Erlang,Lua 和FreeSWITCH,每个技术都有它们最擅长的地方。

同时,我们也在不断的招聘老师。我们做了一个自动面试程序,面试者在Web页面上注册,根据提示,输入自己的电话号码,我们呼叫他们的电话,阅读我们指定的文字并录音。这一切都是自动的,电话跟页面也是同步的。通过几轮自动面试之后,我们才会有相关的人员人工联系他们进行更深入的面试。这些,也都是用FreeSWITCH做的。

当然,这么多“分布式”的老师要开会啊,因而,我们又用FreeSWITCH实现了会议系统。

还有一个有意思的事情。当时,由于国内的网络条件和对VoIP的限制,我们在国内是直接使用PSTN电话跟学生连线的。有些学生反应他们的手机处于漫游状态(如到北京上新东方培训班),接电话很贵。因此我们又实现了FreeSWITCH跟Skype和Google Talk的互通。这样,我们就可以在FreeSWITCH中打电话到学生的Skype或Google Talk客户端上。

当然,事情也不是永远一帆风顺,最初跟Skype和GTalk互通,FreeSWITCH总是崩溃,我们报了一些Bug,打了一些补丁才解决。这也决定了我们的基础架构——我们专门起了几个FreeSWITCH进程,用于跟Skype或GTalk连,即使其中一个崩溃了,我们也可以迅速切换到另一个(为此,我们也注册了很多Skype账号 :) )。

总之,正是由于不断的“折腾”,我们的FreeSWITCH技术才不断进步。

花开两朵,各表一枝。再倒回去说说FreeSWITCH社区的事情。

一来二去,我在FreeSWITCH社区里混得熟了,便萌生了一个做FreeSWITCH中文社区的想法。我对开源很热爱的,我曾在Linux Focus上翻译文章,翻译SQLite的文档等。中国人也都很厉害,几乎任何东西都有了中文版,有了中文社区,但当时,FreeSWITCH还没有。

我很快注册了域名,FreeSWITCH-CN开张了。

在任何圈子里,总会找到志同道合的人,我发现了大熊。我发现他几乎在同一时间建立了FreeSWITCH QQ群,我甚至不记得我是怎么发现他的了。大熊人非常好,把我升级成了QQ群的管理员。他从来都很低调,不知道的还以为我是QQ群的群主呢。

对于QQ,我以前不大用。最早注册的QQ号都忘记了,后来工作后一个同事让给我一个QQ号我使用至今。我前些年折腾Linux,而Linux上的QQ总是各种不好用。后来在外企大家都用MSN和Skype,而我的工作平台也由Linux换成了Mac。离开外企之后,没有人用MSN了,而Mac版的QQ也开始争气了(比Windows上老是弹出垃圾广告好多了),所以我QQ就用得多了。

我很快取得了FreeSWITCH SVN Contrib 代码库的提交权限。Contrib 就是FreeSWITCH外围的一些代码库,FreeSWITCH屌丝们可以把自己实现的一些好玩的东西提交上去,全世界共享。我提交了一些我写的代码,后来,发现我在代码中“发明”的方法被大家广泛使用。甚至,有一次,在ClueCon上,一个保加利亚的哥们不非常不流利的英文跟我说那几个脚本真是太好用了,帮了他大忙。

再后来,由于我在FreeSWITCH社区表现突出,提交的补丁也得到了社区的认可,就取得了FreeSWITCH核心代码的提交权限。而这时,FreeSWITCH的代码库也早已从SVN迁移到了Git。

我最初建立社区的想法很简单,中文网站只是一个网站,用Google Groups做邮件列表,进行讨论,用QQ群做即时的讨论(我甚至也想过IRC)。关于邮件列表,英文社区里也有很多讨论,到底邮件列表好还是一个BBS好?社区的管理人员认为邮件列表好,因为你可以用任何你喜欢的邮件客户端参与讨论。而有不服气的人去建了BBS,结果就是没有人气。我受他们的影响很大,因此,从来没有建BBS的想法。但很遗憾,Google Groups很快就无法访问了。我好像是受了诅咒一样,我注册了Twitter,Twitter不好用了,我注册了Facebook,用了几天不好用了,我用DropBox,隔几天就连不上了,我建立了FreeSWITCH-CN Google Groups中文讨论区,也无法访问了。到今天,我偶尔还会在Google Groups里发邮件,但是,无论如何都没大有人气。

而关于建立BBS,在国内也是很困难的。你必须备案,必须有人监管,必须……。总之,有很多人提出我们该有个BBS,但我总是没有精力去做这件事,我也说过有人愿意捐赠服务器并搞定一切事情的话,我们也可以建立个BBS,但到今天还是没有结果。

我想,也许,大家有问题的话还是到专业的社区上去讨论吧,因此,我开了知乎专栏(zhuanlan.zhihu.com/freeswitch),并鼓励大家到那里去提问FreeSWITCH有关的问题。

QQ群里的成员倒不少,目前也是最主要的交流平台了,群里风气很好,也没大有广告,我很高兴看到大家都在讨论技术。

最初,我在群里回答问题是很积极的,但是大家好像不怎么配合,总问些没法回答的问题。我便写了一系列的文章告诉大家应该怎么把问题描述清楚,也就是如何问到点子上,如何收集日志并贴到Pastebin上。后来,的确起到了一些效果,有些人已经学会了如何先把日志贴到Pastebin上再提问题了。

不可避免的,你需要一遍一遍的回答各种问题。因此,我想写一本书,给大家讲一些基础的知识。我的想法就是,再有人提问时,告诉他看书的第几页。但写一本书谈何容易,因此,最初我把写的东西以博客的形式发布出来,供大家免费阅读和挑刺。但我很讨厌把我的文章转载到自己的博客里去掉作者姓名当自己原创的人,也很讨厌那些把文档制成Word版上传到各种文档分享网站换积分的人。为此,我还专门跟百度干了一架。但得到的后果是在百度上搜FreeSWITCH,再也到不了我们的网站了。

因此,后来,我的写作就不积极了,有时候写了也不愿意发。两年前,在我们国内FreeSWITCH-CN第一届沙龙前夕,我把书印了出来,大家竟然非常喜欢。也有读者告诉我,越看越爱看,每看都有收获,甚至在草原上放羊的时候也看。

但无论如何,小册子还是属于“非法出版物“的范围,因此,能够出版,一直是我的一个夙愿。值得欣慰的是,经过四年多的积累,在华章公司的支持下,这本书《FreeSWITCH权威指南》终于跟读者见面了。这是我的第一本书,也是国内第一本讲FreeSWITCH的书,但就在第一本书上出现了“权威”二字,我还是有点心虚的。我确实想把我所知道的都写进书里,但是,既使每个主题都没有深入进去,这本书也已经很厚了。无论取舍是否得当,总之,这是我真心想送给广大FreeSWITCH爱好者的一个礼物。同时,也欢迎各种批评。

2011年,我第一次参加在美国芝加哥举办的ClueCon,我不想错过任何机会,便找了个空子上台讲了几句。第一次用不流利的英文在200多个纯老外面前演讲,真的很紧张,不过,坚持下来了,反应还不错。

2012年,我就有备上台了,英文也稍微好了一点点。我用了几个性感美女图片轰动全场。

2013年,FreeSWITCH三剑客(Anthony、Brian、Mike)都在下面认真听我的演讲(以前他们基本都在外面跟别人聊天),让我在台上小激动了一把。

当年,还有一个好玩的事情。一个加拿大的哥们跟我说,我写得东西真好,他有问题了就到我的网站上找答案,看不懂中文就用Google Translate翻译。还把他做的系统演示给我看(他确实做得很好)。

2014年的ClueCon马上就要到了,我还去。

2012年开始,我们FreeSWITCH-CN中文社区也学着ClueCon的样子在国内搞活动,为避免版权问题,我们不叫ClueCon,叫FreeSWITCH开发者沙龙。随着大家对FreeSWITCH的关注的提高,我们的活动竟也有模有样。

2013年开始,我开始做公开的FreeSWITCH培训班,每批都有二、三十名学员,感觉也还不错。

花开两朵,再表一枝。大约就在我第一次参加ClueCon的时候,我们原先的公司因为各种原因,部分解散了,其中也包括我。

在老的没人要的时候,只能去创业了。

创业的过程是艰苦的,我们也学到了很多东西。在这些年里,我潜心研究FreeSWITCH,实现了MSRP、实现了类似IMS的架构、实现了RTMP基于Flash的视频(有大熊的支持)、实现了RTSP、VLC视频、实现了视频转发、视频转码、视频会议、视频录像、做了N个版本的指挥调度系统。这些系统有的是实验性地,有的还不很完善,也大部分没有开源,不过,我一直惦记着开源这回事呢。

关于做开源与赚钱的问题,我也一直在思考。但我想,我会一直做FreeSWITCH的培训与咨询,支持大家在FreeSWITCH上面做呼叫中心、做运营、做指挥调度等各种应用,而不是去做上层五花八门的应用,应该算是一种思路吧?

关于我的创业的故事,现在写还为时尚早,也不符合今天的主题,就到这里结束吧。

与诸君共勉。

p.s. 我知道大家都很忙,而且征文活动也结束了。但是,如果你觉得我的文章或者书对你有帮助,也还是抽时间写一写吧,我喜欢看到你们使用FreeSWITCH成功的故事。我也很忙,但是,我今天早上还是抽了两个小时写了这篇文章。来而不往非礼也,也满足一下我的好奇心不是?




本文是我们爱开源,我们爱分享——华章杯《FreeSWITCH权威指南》书评暨我与FreeSWITCH的故事有奖征文活动的来稿。文章版权归原作者所有。谢谢投稿。



FreeSWITCH权威指南
FreeSWITCH权威指南

FreeSWITCH-CN微信公众账号
微信公众账号
FreeSWITCH-CN