Asterisk启动后,缺省条件下,只支持ODBC数据库,在官方的 Asterisk-addons包中,添加了MySQL的数据库引擎。在本系统实现中,选用Postgres数据库,使用ODBC方式。
第一步 Postgres数据库安装
postgresql-contrib-7.4.5-2PGDG.i686.rpm
postgresql-devel-7.4.5-2PGDG.i686.rpm
postgresql-libs-7.4.5-2PGDG.i686.rpm
postgresql-odbc-7.4.5-13.i586.rpm
第二步 Unixodbc安装
unixODBC-2.2.11-1.i386.rpm
unixODBC-devel-2.2.11-1.i386.rpm
第三步 Postgres配置
//odbc连接准备
astrealtime:~# su - postgres
astrealtime:~$ psql -d template1 </usr/share/psqlodbc/odbc.sql
astrealtime:~$ psql -d template1
template1=# CREATE DOMAIN lo AS int4;
//创建用户和数据库
astrealtime:~$ createuser -P -N -d -D asterisk
astrealtime:~$ createdb asterisk
astrealtime:~$ psql -d asterisk
//权限(创建一张表的时候补上这一句就行了)
asterisk=> GRANT ALL ON TABLE × TO asterisk;
//pg_hba.conf文件中添加连接许可
local asterisk asterisk password
host asterisk asterisk 127.0.0.1 255.255.255.255 password
第四步 Odbc配置文件
//odbcinst.ini
[PostgreSQL]
Description = ODBC for PostgreSQL
Driver = /usr/lib/libodbcpsql.so
Setup = /usr/lib/libodbcpsqlS.so
FileUsage = 1
ReadOnly = 0
//odbc.ini
[asterisk]
Description = PSQL Asterisk database
Trace = Off
TraceFile = stderr
driver = PostgreSQL
Servername = 127.0.0.1
USER =
PASSWORD =
port = 5432
database = asterisk
配置前,使用odbcinst -j可以查询当前使用的配置文件的位置。
配置后,使用odbcinst -q -d 和odbs -q -s检测配置。
第五步 asterisk odbc数据源配置
//etc/asterisk/res_odbc.conf
[asterisk]
dsn => asterisk
username => asterisk
password => asterisk
pre-connect => yes
第六步 asterisk realtime static配置文件
1. asterisk数据库
CREATE TABLE sip_config (
id serial NOT NULL,
cat_metric int default 0 NOT NULL,
var_metric int default 0 NOT NULL,
commented int default 0 NOT NULL,
filename character varying(128) default'' NOT NULL,
category character varying(128) default'default' NOT NULL,
var_name character varying(128) default'' NOT NULL,
var_val character varying(128) default'' NOT NULL
);
/*
对应的MySQL数据表
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 '0',
`filename` varchar(128) NOT NULL default '',
`category` varchar(128) NOT NULL default 'default',
`var_name` varchar(128) NOT NULL default '',
`var_val` varchar(128) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `filename_comment` (`filename`,`commented`)
) TYPE=MyISAM;
*/
id | cat_metric | var_metric | commented | filename | category | var_name | var_val
----+------------+------------+-----------+-----------------+----------+-----------+-----------------------
43 | 0 | 0 | 0 | sip.conf | general | port | 5060
44 | 0 | 0 | 0 | sip.conf | general | bindaddr | 0.0.0.0
45 | 0 | 0 | 0 | sip.conf | general | srvlookup | yes
50 | 0 | 0 | 0 | extensions.conf | default | switch | RealTime/teltel.com@realtime_ext
69 | 0 | 0 | 0 | sip.conf | general | context | default
asterisk从表中读出的配置文件格式为
sip.conf
[general]
port=5060
bindaddr=0.0.0.0
srvlookup=yes (参见附录1)
context=default
extensions.conf
[default]
switch => RealTime/teltel.com@realtime_ext
2. asterisk配置文件(/etc/extconfig.conf)
[settings]
sip.conf => odbc,asterisk,sip_config
extensions.conf => odbc,asterisk,sip_config
realtime_ext => odbc,asterisk,extensions_conf
第七步 asterisk realtime dynamic配置文件
1 asterisk配置
asterisk realtime dynamic可以动态配置sip用户和sip extensions。
这里只用到sip extensions配置。
在sip extensions静态配置部分
switch => RealTime/teltel.com@realtime_ext
teltel.com 是extensions context
realtime_ext 是context的数据库来源
由此实现Asterisk在呼叫进入时,动态加载Context
2 asterisk数据库
CREATE TABLE extensions_conf (
id serial NOT NULL,
context character varying(20) DEFAULT '' NOT NULL,
exten character varying(128) DEFAULT '' NOT NULL,
priority smallint DEFAULT 0 NOT NULL,
app character varying(20) DEFAULT '' NOT NULL,
appdata character varying(128)
);
第八步 使用
在sip_config表中,添加
84 | 0 | 0 | 0 | sip.conf | general | register | radision_AT_126.com:password:authname@[email][email protected][/email]/123
register 说明Asterisk将作为UA想proxy注册,参数为
username[:password[:authname]]@domain/contact
由于sip_config是静态配置文件,添加用户后需要reload才能生效
在extensions_conf表中,添加
id | context | exten | priority | app | appdata
----+------------+--------------------------------+----------+--------+-----------------------------------------------
91 | teltel.com | 123 | 1 | Wait | 5
92 | teltel.com | 123 | 2 | Dial | SIP/[email protected]
93 | teltel.com | 123 | 3 | Hangup |
当呼叫进入Asterisk后,首先等待5秒,然后呼叫Dial中的参数,最后挂机
extensions_conf是动态表,改变其中的配置后不需要加载就可以生效:)
附录1 srvlookup
rfc3263 Locating SIP Servers
例如域名为 example.com。首先取example.com的NAPTR SIP服务(IN为网络类型,order为优先级)通常应使用优先级数值小的服务,然后按照服务取服务对应的ip地址和端口,取得的结果集中使用优先值小 的地址使用协议中建议如果同一个域的几台服务器配置了相同的优先值,则区别权重(Weight)。
Asterisk-1.0.6中,没有NAPTR过程。直接使用res_search函数查询_sip._udp.domainde的ip地址。
在终端里面可以使用host -t srv _sip._udp.domain命令查询
rfc2915 NAPTR DNS RR
order pref flags service regexp replacement
IN NAPTR 50 50 "s" "SIPS+D2T" "" _sips._tcp.example.com.
IN NAPTR 90 50 "s" "SIP+D2T" "" _sip._tcp.example.com
IN NAPTR 100 50 "s" "SIP+D2U" "" _sip._udp.example.com.
rfc2782 DNS SRV RR
Priority Weight Port Target
IN SRV 0 1 5060 server1.example.com
IN SRV 0 2 5060 server2.example.com