asterisk postgresql callFWD

转 利用Asterisk实现SIP CallFWD

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

你可能感兴趣的:(asterisk postgresql callFWD)