whx3086 发表于 2007-04-11 09:36

转 利用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
   
   Description   = ODBC for PostgreSQL
   Driver          = /usr/lib/libodbcpsql.so
   Setup         = /usr/lib/libodbcpsqlS.so
   FileUsage       = 1
   ReadOnly      = 0
   //odbc.ini
   
   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
   
   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,
   commentedint 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_valcharacter 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
      
       port=5060
       bindaddr=0.0.0.0
       srvlookup=yes   (参见附录1)
       context=default
   extensions.conf
      
       switch => RealTime/teltel.com@realtime_ext
2. asterisk配置文件(/etc/extconfig.conf)
   
   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@126.com@teltel.com/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/sun.xianwei_AT_21vianet.com@teltel.com
         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

servasyy 发表于 2007-04-17 20:17

....一头雾水,好像这个都在讲数据库
页: [1]
查看完整版本: 转 利用Asterisk实现SIP CallFWD