教科书一般的内容博客里面就不介绍了,大家去找asterisk的文档看吧——《Asterisk The Future of Telephony》,已经出第二个版本了。这些文档是比较无聊,需要反复看才能明白,这是没有办法的事。如果精通一个专业跟玩个CF,lol一样简单而且有意思的话,那么世间的精英就不会像现在这么值钱了;精英嘛,一方面要自己吃点苦,百炼才能成精,另一方面也是需要大量的二货去衬托的。正好腾讯正用它的游戏在制造大量新鲜的二货,而精英就靠我们自己练就了。

首先我们得说一下什么是CTI。
CTI是指计算机和电话的整合,说直白一点,就是用电脑来控制电话。我们把电话看成是基本的通话服务,如接听、语音沟通、挂机。用电脑来控制它以实现更多更复杂的功能,如转接、排队、按键路由、三方等。

拿咨询转接来说,每个一个通话由两个通道构成:主叫和被叫,通话时这两个通道是连接的,用来交互语音;当要咨询时,先将两个通道拆开,让客户方的通道连接到一个等待音乐的服务中,这样客户就在听音乐了;然后将咨询方的电话去拨打被咨询的号码,接通之后咨询方和被咨询方就可以语音通话了;咨询结束之后,再掐断咨询方的通道(咨询放电话就挂机了),然后将客户方的通道从等待音乐的服务中拿出来,跟被咨询方的通道连在一起,他们两就开始通话了。这样的一个控制过程实现了A和B通话,然后在不挂断电话的情况下A去咨询C,然后将B转接给C,最后B和C通话。

基于Asterisk来开发CTI,就是将Asterisk作为一个基本的话务处理服务,自己来开发逻辑层应用,并将应用封装对外提供服务器。
143729596.jpg

关于底层Asterisk的封装,主要集中在三方面:AMI、AGI和Dialplan设计:

AMI:Asterisk的管理接口。通过这个接口,我们可以获取Asterisk中所有对象的状态,比如各种终端电话的状态、通话channel的状态、技能组状态;以及实时的状态数据推送,任何对象发生变化时,都能从这个接口获取到状态事件,将这些事件解析并维护起来就,然后结合自己的业务,就变成了CTI里面的状态。
AGI:Asterisk在通话过程中的交互接口。比如电话呼入时,如果脚本里面有AGI()函数的调用,那么就会访问这个接口,可以通过这个接口来为通话做实时交互。一般语音自助,智能语音交互都需要用到这个接口。
Dialplan:其实就是extensions.ael文件及其扩展,这是一个脚本文件,跟我们写的java、c、javascript类似。是个写代码的都能看懂,很简单。Asterisk在处理通话的时候,就是按这个脚本里面写的内容去处理的。比如按键菜单:用户电话呼入以后按1如何处理,按2如何处理。


我们创业做的平台是一个话务平台,底层使用的是Asterisk,其核心就是对它的封装。所以接下来几章会比较无趣,都是技术方面的介绍。