做这个开发需要一定的网络编程基础,没有基础的人理解起来有些困难。把这些分享给大家的主要目的有两个:一个是让大家知道如何封装AMI接口,另一个是让大家对这次创业有全方位的体验。

AMI的封装结构如下:
封装Asterisk的AMI接口_第1张图片

说明:

  • 用Socket跟Asterisk的manager接口建立连接,一般是5038端口

  • 连接建立后,开两个线程分别用于网络的读和写:Reader、Writer

    • Reader从AMI获取的信息有两种:Event和Response

    • Event是Asterisk中的对象发生变化时往外推送的事件信息,比如电话接通、挂断等。根据这些事件我们可以知道系统中各个对象的状态。

    • Response是我们通过Writer发送的Action(操作)的返回结果,告诉我们这次操作的结果。因为发送Action和收到Response是分两个线程来组,是异步的。但有的时候我们发送完需要等待结果再返回,这个时候就多了一个Syn来做同步。

    • 同步Syn。这个Syn非常简单,发送完Action之后,把Action放到一个map里面,用ActionID作为key;用Action对象Wait,然后处理Response,一旦Response的ActionID在map中能找到,就从map中获取这个Action并notify。

  • Listener是对外封装的一个接口类,用于事件的提醒,包括Event和Response

  • AMIClient是最外层的封装类,别的模块初始化这个类,并利用它和AMI通讯


代码就不贴了,很简单的。有一个小技巧,和AMI建立长连接时,经常会遇到连接断开。这时可以开一个线程,每20秒发送一个PING请求,一方面能保持连接活跃,另一方面也可以用来做检测和自动重连。