1 常见Extern App实现
1.1 回拨AGI实现。
Asterisk本身提供回拨功能,但是有两个Bug
1) 没有回铃音
2) 回拨显示的号码都是中断号
如果要解决这两个问题必须自己实现Origin。
实现思路:
首先拨打主叫号码,当主叫号码接通后拨打被叫号码。设置两个变量,分别储存主叫号码和被叫号码。
从APIManager里面主动发起呼叫使用 OriginateAction 命令,首先必须是通道的选择.
Trixbox提供了默认的local通道。选择Local通道要注意
1) chan_local 需要加载
2) Local格式是
Local通道或对当前已经有的通道进行迭代。直至选择到能够通的通道
还可以选择中继通道。
中继通道格式:TrunkName/extension
增加一个变量oricaller放入主叫号码。设置callerid为被叫号码。等待主叫号码接通。当主叫号码接通后。再在以有通道的情况下发送Dial命令。从而实现回拨接口。
修改脚本文件,当拨通第一个号码时设置callerID为主叫号,拨通第二个号码时,设置callerID为被叫号。
拨放回铃音:Dial||r。发送回铃信号
详细实现见AsteriskClient 的MakeCall2方法和脚本配置文件
1.2 彩铃业务实现
彩铃业务实现。彩铃必须要有播放的音乐文件,文件格式为wav或mp3格式。但在测试过程中发现mp3格式变不起作用,可能是有bug。使用wav文件没有发现问题。
wav文件必须采用以下格式:音频格式PCM,音频采样级别8kHZ,采样大小,16位。位速128kbps
上传wav文件。使用freepbx来上传wav文件会有bug。它会自动修改wav文件格式,但是wav文件在修改后却不能播放。手动上传wav文件。
上传wav文件/var/lib/asterisk/mohmp3/qqtech/。wav文件重命名为fpm-world-mix.wav
修改musiconhold_additional.conf文件,增加
[qqtech]
mode=files
directory=/var/lib/asterisk/mohmp3/qqtech/
这样如果选择qqtech的MusicOnHold,就会选择上刚刚上传的文件
可以使用Playback来播放回铃音,但是在AGI中却不能如此实现。彩铃音的回拨需求可以分为以下步骤。
1:拨号
2:对方响铃
3:向对方播放彩铃
4:对方接通,停止播放彩铃
使用AGI发送命令Dial后,直到对方接通或挂断才会有返回结果。2和3的步骤通过AGI无法实现。
最终实现方式:发送Dial|m(musiconholdclass)来实现,具体代码见app_dial.c
1.3 ACD队列实现
ACD的主要作用是实现呼叫队列选择号码由第三方实现。ACD队列必须有以下流程:
1:拨入呼入号
2:从呼入号选择列队。并从队列中选择号码
3:转接至选择号码
4:如果未接通则跳至2
向第三方应用申请GetNumber请求。传入呼叫队列号。第三方应用经过处理返回号码,拨打该号码,并拨放回铃音,如果未接通则继续发送GetNumber请求。直至到达发送Number的最大次数。
1.3.1 脚本伪代码实现
接入号接通后,接通并接入AGI
exten=>99999,1,Answer
exten=>99999,2,Ringing
exten=>99999,3,Wait(2)
exten=>99999,4,agi(agi://192.168.1.6/queue.agi?extern=644552&timeout=10&retry=3)
1.3.2 AGI伪代码
String extern = agiRequest.getParameter("extern");//队列接入号
String number = GetNumber(extern);
agiChannel.Dial(number);
1.4 其他用户提出的需求
1.4.1 语音会议
对语音会议有一些补充。主要有两个需求:
1:外线(pstn)可以打入加入电话会议
2:在客户端邀请外线(pstn)直接发起电话会议,使pstn不用接入
需求1的实现思路:
1:pstn电话输入呼叫接入号。
2:提示输入当前活动的电话会议号
3:输入呼叫接入号。Pstn电话进入语音会议
需求2的实现思路:
1:选择合适的电话会议号
2:使用该电话会议号发起回拨,一个一个地拨打外线号码