发布一个C#实现的Asterisk的管理系统
协议:Apache License Version 2.0
svn:https://smark.svn.codeplex.com/svn/Smark/Smark.Asterisk.Services
l 主要功能
通过AMI和AGI来接管Asterisk的拔打控制,实现多台asterisk网内拔打可配置、对接电信移动可配置、回拔和预约回拔、拔打记录和费用结算等功能。
进行程序测试的asterisk版本是:1.6.2
AMI的主要实现是监控用户登陆所在的服务器并登记处理和向asterisk发起回拔功能。
AGI的主要实现是接管用户拔打规则,根据配置来处理用户当拔打的号码是网内拔打还是对接到电信或移动的落地接口服务器、登记用户拔打信息和费用计算等功能。
l 配置AMI服务
AMI服务主要是连接Asterisk后接读取Asterisk的处理信息或执行对Asterisk的管理操作。程序会根据AMINet表的记录来连接相关服务器。
IPAddress |
Asterisk IP地址 |
Port |
服务端口 |
UserName |
登陆用户 |
UserPWD |
登陆密码 |
Asterisk的管理服务配置在:/etc/asterisk/manager.conf
l 配置AGI服务
AGI是程序本地监听的服务,主要是接管Asterisk的拔号处理。程序根据AGINet表的记录来启动AGI服务。
IPAddress |
监听的IP地址 |
Port |
监听的端口 |
l 拔号规则流程
当AGI直接收用户拔号后先查询号码是否本网号码,根据号码登陆的IP来查找对接的AsteriskIP地址,当找不到的情况下就去查找号码对应描述的电信或移动对接服务器,如果以上都不能找到的情况返回本网内对接。
配置/etc/asterisk/extensions.conf把特定的号码规则转发到AGI来处理。
l 配置asterisk网内对接描述
用于存在多台Asterisk的时候描述相关对接的用户,可以在AsteriskTRUNK中添加相关信息。
IPAddress |
AsteriskIP地址 |
TRUNK |
转接用户 |
Format |
号码格式化描述;如:0-1就是把开头0用1代替后再对接过去 |
DialTimeOut |
对接等待超时时间 |
DialMusic |
对接等待时所播放的彩铃 |
注意:asterisk必须存在对应TRUNK用户
l 配置电信或移动对接描述
配置和外网对接的用户信息,可以在PhoneTRUNK中添加相关信息。
Prefix |
号码前缀 |
Enabled |
是否有效 |
Format |
号码格式化 |
TRUNK |
转接用户 |
DialTimeOut |
对接等待超时时间 |
DialMusic |
对接等待时所播放的彩铃 |
注意:asterisk必须存在对应TRUNK用户
l 用户信息
用户费用信息表Accounts,只是实现简单的费用所以表结构非常简单。
AccountID |
帐号名 |
Amount |
金额 |
可以根据自己需要添加一些字段;如果用户无效,当用户使用该帐号拔的时候根据有效性来提示用户。
l 费用
Fee是用来描述拔打费用单价的。
Prefix |
计费前缀 |
Price |
单价 |
Second |
单位时间(秒为单位) |
l 发起回拔
只需要向表CallBack添加相关记录,系统就自动发起回拔。
ID |
|
Account |
计费帐号 |
Callerid |
|
FromPhone |
主叫号 |
ToPhone |
被叫号 |
Context |
拔号规则类别 |
Priority |
拔号规则类别的第X的规则 |
Codes |
编码:ulaw,alaw,g729等,具体情况 |
State |
记录状态 |
CreateTime |
创建时间 |
|
|
l 语音回拔服务的IVR
由asterisk发起回拔给主叫用户,主叫用户接听后进行语音提示用户输出需要拔打的号码,输入#后进行转呼。
[smark]
exten => 99999999,1,Goto(CallBack,s,1)
exten => _.,1,AGI(agi://192.168.1.128:9001,${EXTEN},"HENRY")
[CallBack]
exten => s,1,Answer()
exten => s,2,Set(TRY=0)
exten => s,3,set(CALLPHONE=)
exten => s,4,Background(InputCalled)
exten => s,5,Set(TRY=$[${TRY}+1])
exten => s,6,GotoIf($[${TRY}<3]?8)
exten => s,7,Goto(smark,cberror,1)
exten => s,8,Noop()
exten => s,9,WaitExten(10)
exten => s,10,Goto(3)
exten => #,1,Goto(smark,${CALLPHONE},1)
exten => *,1,Goto(s,3)
exten => i,1,Set(CALLPHONE=${CALLPHONE}${INVALID_EXTEN})
exten => i,2,NoOp(${CALLPHONE})
exten => i,3,Goto(s,8)
exten => h,1,Goto(smark,cberror,1)