做这个开发需要一定的网络编程基础,没有基础的人理解起来有些困难。把这些分享给大家的主要目的有两个:一个是让大家知道如何封装AMI接口,另一个是让大家对这次创业有全方位的体验。
AMI的封装结构如下:
说明:
用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请求,一方面能保持连接活跃,另一方面也可以用来做检测和自动重连。
转载于:https://blog.51cto.com/7moor/1340799