- 论坛徽章:
- 0
|
1.1 Asterisk配置数据库化
修改/etc/asterisk/module.conf启用Realtime:
preload => res_config_mysql.so
修改/etc/asterisk/extconfig.conf启用常用配置的数据库化:
sip.conf => mysql,general,ast_config
extensions.conf => mysql,general,ast_config
*注意,此处的general是指在res_mysql中数据库连接配置段名,它描述了一个数据库的连接;
启用cdr和mysql的realtime连接:
/etc/asterisk/res_mysql.conf :
[general]
dbhost = localhost
dbname = ser
dbuser = ipxsby meineson 09.09 【原创文章,如需转载请保留出处:mbstudio.cn】
dbpass = ipxs
dbport = 3306
sock=/var/lib/mysql/mysql.sock
/etc/asterisk/cdr_mysql.conf:
[global]
hostname=localhost
dbname=ser
table=cdr
password=ipxs
user=ipxs
port=3306
sock=/var/lib/mysql/mysql.sock
静态配置数据表,结构一样,可以放在同一数据表中,以filename即原配置文件名作为区别:
CREATE TABLE `ast_config` (
`id` int(11) NOT NULL auto_increment,
`cat_metric` int(11) NOT NULL default '0',
`var_metric` int(11) NOT NULL default '0',
`commented` int(11) NOT NULL default '1',
注意,可能是Asterisk Bug,文档描述该值为0时启用,但实际试验发现为1时启用,0为注释掉;
`filename` varchar(12 NOT NULL default '',
`category` varchar(12 NOT NULL default 'default',
`var_name` varchar(12 NOT NULL default '',
`var_val` varchar(12 NOT NULL default '',
PRIMARY KEY (`id`),
KEY `filename_comment` (`filename`,`commented`)
)
计费数据表:
CREATE TABLE `cdr` (
`accountcode` varchar(20) NOT NULL default '',
`src` varchar(80) NOT NULL default '',by meineson 09.09 【原创文章,如需转载请保留出处:mbstudio.cn】
`dst` varchar(80) NOT NULL default '',
`dcontext` varchar(80) NOT NULL default '',
`clid` varchar(80) NOT NULL default '',
`channel` varchar(80) NOT NULL default '',
`dstchannel` varchar(80) NOT NULL default '',
`lastapp` varchar(80) NOT NULL default '',
`lastdata` varchar(80) NOT NULL default '',
`calldate` datetime NOT NULL default '0000-00-00 00:00:00',
`duration` int(11) NOT NULL default '0',
`billsec` int(11) NOT NULL default '0',
`disposition` varchar(45) NOT NULL default '',
`amaflags` int(11) NOT NULL default '0',
`userfield` varchar(255) NOT NULL default '',
`sflag` tinyint(1) default '0',
KEY `dst` (`dst`),by meineson 09.09 【原创文章,如需转载请保留出处:mbstudio.cn】
KEY `accountcode` (`accountcode`)
)
ARA realtime sip数据表:
CREATE TABLE `ast_sip` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(80) NOT NULL default '',
`host` varchar(31) NOT NULL default '',
`type` enum('user','peer','friend') NOT NULL default 'friend',
`busylevel` smallint(5) unsigned default NULL,
`context` varchar(80) default NULL,
`fromuser` varchar(80) default NULL,
`insecure` varchar(15) default NULL,
`md5secret` varchar(80) default NULL,
`secret` varchar(80) default NULL, by meineson 09.09 【原创文章,如需转载请保留出处:mbstudio.cn】
`port` smallint(5) unsigned NOT NULL default '0',
`defaultuser` varchar(80) NOT NULL default '',
`crypto` smallint(1) unsigned default 0,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`),
KEY `name_2` (`name`)
)
呼叫计划动态数据表:
CREATE TABLE `ast_ext` (
`id` int(11) NOT NULL auto_increment,
`context` varchar(20) NOT NULL default '',
`exten` varchar(20) NOT NULL default '',
`priority` tinyint(4) NOT NULL default '0',
`app` varchar(20) NOT NULL default '',
`appdata` varchar(12 NOT NULL default '', by meineson 09.09 【原创文章,如需转载请保留出处:mbstudio.cn】
PRIMARY KEY (`context`,`exten`,`priority`),
KEY `id` (`id`)
)
SIP.conf静态初始化数据:
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','0','sip.conf', 'general', 'context', 'default');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','1','sip.conf', 'general', 'allowoverlap', 'no');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','2','sip.conf', 'general', 'udpbindaddr', '0.0.0.0:6060');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','3','sip.conf', 'general', 'srvlookup', 'no');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','4','sip.conf', 'general', 'useragent', 'SIMTON-IPXS-2.0'); by meineson 09.09 【原创文章,如需转载请保留出处:mbstudio.cn】
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','5','sip.conf', 'general', 'sdpsession', 'SIMTON-IPXS-2.0');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','6','sip.conf', 'general', 'disallow', 'all');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','7','sip.conf', 'general', 'allow', 'g729');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','8','sip.conf', 'general', 'allow', 'ulaw');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','9','sip.conf', 'general', 'allow', 'alaw');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','10','sip.conf', 'general', 'dtmfmode', 'auto');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','11','sip.conf', 'general', 'canreinvite', 'no');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','12','sip.conf', 'general', 'nat', 'yes');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','13','sip.conf', 'general', 'usereqphone', 'yes');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','14','sip.conf', 'general', 'realm', 'localhost');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','15','sip.conf', 'general', 'rtcachefriends', 'yes');
注意:上述条目启用sip show peers的realtime缓存,但有延时,可以手动加载sip show peer PEERNAME load即可看到数据库中数据是否正确配置;
以上为sip.conf常用参数配置,如需增加voip账号,除下文的在ast_config表中增加extension.conf的呼叫上下文配置段外,还需在sip.conf中增加注册账号逻辑,如:by meineson 09.09 【原创文章,如需转载请保留出处:mbstudio.cn】
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name`, `var_val` ) VALUES('0', '16', 'sip.conf', 'general', 'register', '4002:4002:4002@172.21.33.133/4002');
Extension.conf静态配置数据:
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('1','0','extensionsconf', 'localser', 'switch', 'Realtime');
表示为IPXS组网来源呼叫上下文localser启用Realtime模式,如此操作之后,只需在ast_ext表中动态添加呼叫计划,则可实时应用到呼叫计划中;
但由于我们暂时使用AGI,呼叫计划是固定的,可暂时仅使用Static模式即可;
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('0','0','extensions.conf', 'default', 'include', 'CALL_IN');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('1','0','extensions.conf', 'localser', 'include', 'CALL_IN');
其中,CALL_IN是启用AGI的入口,也是固定在ast_config中静态配置:
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('2','0','extensions.conf', 'CALL_IN', 'exten', '_X.,1,agi(call_route.php)');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('2','1','extensions.conf', 'CALL_IN', 'exten', '_X,1,agi(call_route.php)');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('2','2','extensions.conf', 'CALL_IN', 'exten', '_#.,1,agi(call_route.php)');by meineson 09.09 【原创文章,如需转载请保留出处:mbstudio.cn】
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('2','3','extensions.conf', 'CALL_IN', 'exten', '_*.,1,agi(call_route.php)');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('2','4','extensions.conf', 'CALL_IN', 'exten', '_S.,1,agi(call_route.php)');
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('2','5','extensions.conf', 'CALL_IN', 'exten', 'h,1,Hangup()');
当增加VOIP账号或VOIP Trunk时,为接受呼入 ,也需要增加呼叫上下文,只需更改其中的category字段,注意cat_metric字段值需与其它配置段不同,可简单查询本filename下cat_metric最大值递增即可,var_metric表示配置参数在配置段中的顺序,一般需递增添加,如无冲突或优先关系,使用相同值也可,例如:
INSERT INTO `ast_config` (`cat_metric` , `var_metric` , `filename` , `category` , `var_name` , `var_val` ) VALUES ('3','0','extensions.conf', 'IP_172.21.55.55', 'include', 'CALL_IN');
注意:上述操作均是ARA的Static模式,需要重载配置,此处可用dialplan reload或直接reload全部;
可使用dialplan show查看当前的活动呼叫计划数据;
VOIP账号或Trunk动态数据:by meineson 09.09 【原创文章,如需转载请保留出处:mbstudio.cn】
注意:新增或删除VOIP账号或Trunk时,需同步在ast_config中增加呼叫计划extension.conf相关的上下文(需检查该VOIP_XXX.XXX.XXX.XXX或IP_XXX.XXX.XXX.XX是否已经存在,删除时需检查是否仍有使用该地址作为呼叫上下文的SIPPEER存在于ast_sip表中);
INSERT INTO `ast_sip` (`name`, `host`, `type`, `context`, `insecure`) VALUES('ser', '172.21.33.166', 'peer', 'localser', 'port'); **注意在本机IP地址更改时也需更新本数据,否则本地星型组网来源Trunk呼叫不能正常路由;
该记录是用于本地SER星型组网来源的特殊VOIP Trunk地址,其它VOIP账号或IP Trunk配置规范详细描述见设计文档,以下分别为VOIP账号和IP Trunk的配置数据;
INSERT INTO `ast_sip` (`name`, `host`, `type`, `port`, `defaultuser`, `fromuser`, `secret`, `busylevel`, `insecure`, `context`) VALUES('SRV_1001_172.21.33.166', '172.21.33.166', 'friend', '5060', '1002', '1002', '1002', 'no', invite', 'VOIP_172.21.33.166'); 本记录用于VOIP账号的呼入和呼出时使用;
INSERT INTO `ast_sip` (`name`, `host`, `type`, `port`, `context`, `busylevel`, `crypto`) VALUES('IPTRNK_172.21.55.55', '172.21.55.55', 'peer', '8060', 'IP_172.21.55.55', 'no', '1'); 本记录用于IP Trunk的呼入和呼出使用;
AGI 路由呼叫本地时,呼叫格式为:
dial(SIP/1000@ser) ,故更改IP地址和SER端口时,需更新ast_config中本地特殊trunk的端口和地址;
通过IP Trunk呼出时,格式为1190@IPTRNK_172.21.55.55,其中IPTRNK_172.21.55.55表示一个地址为172.21.55.55的IP Trunk;
呼入时,呼叫计划上下文为IP_172.21.55.55 ;
通过VOIP账号呼出时,格式为dial(SIP/4000@VOIP_4002_172.21.33.133),其中VOIP_4002_172.21.33.133分别表示使用172.21.33.133上的4002账号呼出;by meineson 09.09 【原创文章,如需转载请保留出处:mbstudio.cn】
呼入时,呼叫计划上下文为VOIP_172.21.33.133 ;
注意:修改ast_sip即定义VOIP账号或IP Trunk是实时生效的,而如果是添加或删除操作,则需同步更新ast_config中呼叫上下文(注意同一呼叫上下文被多个VOIP账号使用时的情况),且需执行dialplan reload重载呼叫计划;
IP Trunk呼入,通过VOIP账号,IP Trunk或本地IPXS账号出,测试通过;
VOIP账号呼入,通过IP Trunk,另一VOIP账号或本地IPXS账号出,测试通过;
本地IPXS账号通过特殊Trunk呼入,通过IP Trunk或VOIP账号呼出测试通过;
E1暂无测试环境,未测试;
** 由于新版本路由时实现方式及匹配字段查询数据方式有变,原有路由数据的配置页面及数据结构已不适用,且原AGI开发库已停止开发与新版本asterisk 1.6也存在兼容性问题,故需根据新的路由实现方式重新规划路由数据结构定义并对AGI开发库作补丁更新;
且数据库中本地特殊Trunk由于必须包含本机的IP地址(IPXS的账号呼叫时始终使用其WAN口IP,故传入Asterisk时不可能使用localhost进行匹配),对于使用MySQL进行多台设备进行热备份同步数据时,可能会造成困扰,需进一步研究解决方法,例如,将其与匿名特殊Trunk呼入一并归入同一处理逻辑,但通过其它只有本地Trunk来源呼叫时才带有的特殊字段参数进行区分;
全部测试用数据表如下
mysql> select * from ast_sip;
+----+-------------------------+---------------+--------+-----------+--------------------+----------+----------+-----------+--------+------+-------------+--------+
| id | name | host | type | busylevel | context | fromuser | insecure | md5secret | secret | port | defaultuser | crypto |
+----+-------------------------+---------------+--------+-----------+--------------------+----------+----------+-----------+--------+------+-------------+--------+
| 1 | VOIP_4002_172.21.33.133 | 172.21.33.133 | friend | NULL | VOIP_172.21.33.133 | 4002 | invite | NULL | simton | 8060 | 4002 | 0 |
| 3 | ser | 172.21.33.166 | peer | 0 | localser | NULL | port | NULL | NULL | 5060 | | 0 |
| 4 | IPTRNK_172.21.55.55 | 172.21.55.55 | peer | 0 | IP_172.21.55.55 | NULL | NULL | NULL | NULL | 8060 | | 1 |
+----+-------------------------+---------------+--------+-----------+--------------------+----------+----------+-----------+--------+------+-------------+--------+
mysql> select * from ast_config;
+----+------------+------------+-----------+-----------------+--------------------+----------------+----------------------------------------------+
| id | cat_metric | var_metric | commented | filename | category | var_name | var_val |
+----+------------+------------+-----------+-----------------+--------------------+----------------+----------------------------------------------+
| 1 | 0 | 0 | 1 | sip.conf | general | context | default |
| 2 | 0 | 1 | 1 | sip.conf | general | allowoverlap | no |
| 3 | 0 | 2 | 1 | sip.conf | general | udpbindaddr | 0.0.0.0:6060 |
| 4 | 0 | 3 | 1 | sip.conf | general | srvlookup | no |
| 5 | 0 | 4 | 1 | sip.conf | general | useragent | SIMTON-IPXS-2.0 |
| 6 | 0 | 5 | 1 | sip.conf | general | sdpsession | SIMTON-IPXS-2.0 |
| 7 | 0 | 6 | 1 | sip.conf | general | disallow | all |
| 8 | 0 | 7 | 1 | sip.conf | general | allow | g729 |
| 9 | 0 | 8 | 1 | sip.conf | general | allow | ulaw |
| 10 | 0 | 9 | 1 | sip.conf | general | allow | alaw |
| 11 | 0 | 10 | 1 | sip.conf | general | dtmfmode | auto |
| 12 | 0 | 11 | 1 | sip.conf | general | canreinvite | no |
| 13 | 0 | 12 | 1 | sip.conf | general | nat | yes |
| 14 | 0 | 13 | 1 | sip.conf | general | usereqphone | yes |
| 15 | 0 | 14 | 1 | sip.conf | general | realm | localhost |
| 26 | 0 | 0 | 1 | extensions.conf | default | include | CALL_IN |
| 27 | 1 | 0 | 1 | extensions.conf | localser | exten | _X.,1,dial(SIP/4000@VOIP_4002_172.21.33.133) |
| 28 | 2 | 0 | 1 | extensions.conf | CALL_IN | exten | _X.,1,agi(call_route.php) |
| 31 | 2 | 0 | 1 | extensions.conf | CALL_IN | exten | _*.,1,agi(call_route.php) |
| 30 | 2 | 0 | 1 | extensions.conf | CALL_IN | exten | _#.,1,agi(call_route.php) |
| 29 | 2 | 0 | 1 | extensions.conf | CALL_IN | exten | _X,1,agi(call_route.php) |
| 32 | 2 | 0 | 1 | extensions.conf | CALL_IN | exten | _S.,1,agi(call_route.php) |
| 33 | 2 | 0 | 1 | extensions.conf | CALL_IN | exten | h,1,Hangup() |
| 34 | 0 | 16 | 1 | sip.conf | general | register | 4002:simton:4002@172.21.33.133:8060/4002 |
| 35 | 0 | 15 | 1 | sip.conf | general | rtcachefriends | yes |
| 36 | 2 | 0 | 1 | extensions.conf | VOIP_172.21.33.133 | exten | _X.,1,dial(SIP/1190@IPTRNK_172.21.55.55) |
| 37 | 3 | 0 | 1 | extensions.conf | IP_172.21.55.55 | exten | _X.,1,dial(SIP/1000@ser) |
+----+------------+------------+-----------+-----------------+--------------------+----------------+----------------------------------------------+
1.2 Asterisk AMI接口
tar zxvf asterisk-gui-2.0.4.tar.gz
./configure
make; make install
修改/etc/asterisk/http.conf:by meineson 09.09 【原创文章,如需转载请保留出处:mbstudio.cn】
[general]
enabled = yesby meineson 09.09 【原创文章,如需转载请保留出处:mbstudio.cn】
bindaddr=127.0.0.1 #只允许本地Apache的PHP管理系统调用Asterisk的Http管理接口进行管理,测试时屏蔽即可;
enablestatic = yes #启用static管理界面,内置的很容易管理界面,可以修改HTML源码扩展或美化功能,代码在 /var/lib/asterisk/static-http/config下
访问http://172.21.33.166:8088/static/index.html即进入内置管理界面,其它http根据应用环境不同,使用不同入口进入,如manager,httpstatus,rawman,mxml,static等;
通过http://172.21.33.166:8088/manage ... in&secret=admin 可以试验各种管理命令,而rawman则是以纯文本方式返回,mxml是以xml结构返回,其输入输出值与manager接口一致;
另有AJAM管理接口,主要是用于基于Web的呼叫实时管理时使用,可以实时刷新当前Asterisk系统中活动的呼叫Channel并进行Tranfer或挂断等操作,其Demo程序在http://172.21.33.166:8088/static/ajamdemo.html;
修改/etc/asterisk/manager.conf:
[general]
enabled = yes
webenabled = yes
bindaddr = 127.0.0.1 #只允许本地web管理服务使用AMI接口
[admin] #表示创建admin账号
secret = simtonpwd #密码
;deny=0.0.0.0/0.0.0.0 #表示管理来源,IPXS只需要本地管理,试验时需要远程管理
;permit=209.16.236.73/255.255.255.0by meineson 09.09 【原创文章,如需转载请保留出处:mbstudio.cn】
read = system,call,log,verbose,command,agent,config
write = system,call,log,verbose,command,agent,config
#在Asterisk控制台执行localhost*CLI> manager show commands 可以查看可用的命令;
应用举例:
功能描述
Action
Username
Secret
登录管理
login
admin
admin
功能描述
Action
Command
控制台管理命令:
能在后台执行的命令均可通过本方式执行;by meineson 09.09 【原创文章,如需转载请保留出处:mbstudio.cn】
可以通过在界面接受命令执行并返回实现一个基于Web的Asterisk管理控制 台;
command
dialplan reload :
重载呼叫计划
module reload chan_sip.so:
重载sip模块
…………
功能描述
Action
channel
context
exten
Callerid
Priority
主动接通本地IPXS组网分机后呼叫出网
Originate
SIP/1000@ser
localser
94000
1000
1
主动接通外部终端后呼叫本地IPXS组网分机
Originate
SIP/1190@IPTRNK_172.21.55.55
IP_172.21.55.55
1000
1190
1
功能描述
Action
peer
查看外部SIP账号注册状态;
SIPshowregistry
查看SIP终端,如IP Trunk;
SIPpeers
查看具体SIP终端的参数;
SIPshowpeer
peername,例如ser
功能描述
Action
Filename
获取某配置文件数据
GetConfig
Sip.conf,extensions.conf,……
支持realtimeby meineson 09.09 【原创文章,如需转载请保留出处:mbstudio.cn】
注意:当某AMI命令返回不是Success或Failure而是Follow时,表示命令已提交但未执行完,需在稍候发磅action:waitevent来查询事件,判断是否已执行完成及执行结果,在呼叫过程中,AGI程序或Dialplan也可在特定条件下发送自定义Event,该特性的使用,一般需结合Ajax应用异步应用实现时才有意义,可参考Asterisk自带的AJAM demo程序,使用astman.js开发库进行自定义应用的开发; |
|