Asterisk与ODBC配置

        Asterisk 和 ODBC 提供了通过定义SQL语句作为能被dialplan调用的特殊变量,来轻松更新和检索数据。例如,我可以对长途计费,接受信用卡,让Asterisk访问其他类型的消息。在本教程里将介绍配置Asterisk来拨号到一个SQL语句代表的变量。这个当然可以通过AGI脚本实现,可是为什么要多此一举呢? 
        这里主要讲MS-SQL连接。当然,一旦你配置好ODBC,你可以使用任何你想要的SQL服务器。这就是我下一步想要说的,当你开始之前,一定要确保正确设置了ODBC。   
第1步: 为MS-SQL设置Linux ODBC 
        明智的选择是UNIX ODBC驱动。ODBC代表Open Database Connectivity,开放的数据库联接。ODBC被证明是适合大多数平台的API。然而,实施细节各有区别,应用层协议也不同。换句话说,ODBC在通过网络调用数据库的时候是经过封装的。比如这里用的就是TDS协议。 
        下面先安装必要的包。(Fedora/Unbuntu软件仓库) 

引用
# yum list unixodbc*  
Loaded plugins: refresh-packagekit  
Installed Packages  
unixODBC.i386                         2.2.12-9.fc10                    installed  
unixODBC-devel.i386                   2.2.12-9.fc10                    installed 
# yum list freetds*  
Loaded plugins: refresh-packagekit  
Installed Packages  
freetds.i386                                0.82-4.fc10                           installed  
freetds-devel.i386                          0.82-4.fc10                           installed  
freetds-doc.i386                            0.82-4.fc10                           installed

 
        安 装完毕之后,我们能够使用freetds来测试MS SQL server的网络授权情况。如果网络没授权,配置ODBC就会出问题。如果报错,检查一下Windows服务器上的MS SQL日志。缺省状态下远程终端是关闭的,记得把MS SQL server设成 ‘mixed mode’,重起SQLServer。现在TDS应该可以正常工作了。 

引用
# tsql -S your.server.com -p 1433 -U WINDOWS-SQL-USERNAME -P PASSWORD  
locale is “en_US.UTF-8″  
locale charset is “UTF-8″  
1> 

 
        如果你能够看到这些信息,很好,离成功不远了。下一步任务就是配置freetds.conf, odbc.ini 和 odbcinst.ini 。 
        首先打开 /etc/odbc.ini 文件。 

复制代码
  1. [asterisk-connector]
  2. Description = Voip Today - Asterisk Connector
  3. Driver = ms-sql
  4. Servername = ms-sql
  5. UID = VIPS
  6. Port = 1433

 
        注 意,在上面把Driver的值设为 ‘/etc/odbcinst.ini’ 里的环境名‘[ms-sql]‘非常重要。驱动信息是从那个文件拉过来的。‘Servername’的值设为‘/etc/freeItds.conf’里 的环境名‘[ms-mysql]‘。很多博客在介绍ODBC的时候都没有强调这两点,让我走了两天弯路。如果这两个参数不配,将会看到下面的错误信息: 

引用
# isql -v odbc-test Your-Username Your-Password  
[IM002][unixODBC][Driver Manager]Data source name not found, and no default driver specified  
[ISQL]ERROR: Could not SQLConnect  
#

 
        现 在要在 ‘/etc/odbcinst.ini’ 文件里定义ODBC驱动的位置了。不同Linux发行版的odbc/tds驱动路径不一样。‘odbcinst.ini’ 文件简单直接地odbc.ini 文件到合适驱动。上述你可以看到我有Postgre 和MS SQL的入口。 
        下面最后一步是配置 freetds.conf 文件。 
        Freetds是Tabular Data System协议的开源版本。TDS是通过网络连接ODBC的应用层协议。不同的SQL服务器可能需要不同版本的freetds协议。这些版本并不是不同的文件,而是在 ‘/etc/freetds.conf’ 里面来指定版本。通常设为‘tds version = 7.0′ 。 
        然后我们使用isql命令来连接到远端的MS SQL server: 

引用
[root@voiptoday~]# isql -v odbc-test VIPS P@ssword1234 
| Connected!                            | 
|                                       | 
| sql-statement                         | 
| help [tablename]                      | 
| quit                                  | 
|                                       | 
+—————————————+ 
SQL> 

 
        运气不错,可以看到MS SQL CLI。提醒一下。isql的‘odbc-test’是在 ‘odbc.ini’ 文件里定义的。‘isql’可以加入到任何脚本里(PHP, BASH等等)。 
第2步: 创建MySQL表和例子数据  
        我们尽可能简单一些。现在可以把Asterisk连接到任何SQL数据表了。我们的例子是一个账号表,包括ID和余额两个字段。  

引用
mysql> select * from accounts;  
+————–+——+  
| AccountID | Balance |  
+————–+——+  
|  10001 | 5011.00 |  
|  10002 | 4021.00 |  
|  10003 | 2102.00 |  
+————–+——+  
3 rows in set (0.00 sec) 

 
第3步: 配置res_odbc.conf  
必须为Asterisk定义DSN,在 ‘/etc/asterisk’ 目录下的res_odbc.conf文件可以设置: 

复制代码
  1. [asterisk]
  2. enabled => yes
  3. dsn => asterisk-connector
  4. pre-connect => yes

 
        res_odbc.conf文件的DSN指的是‘/etc/odbc.ini’里的MSN,以指向驱动文件odbcinst.ini。在Asterisk CLI下面可以看到DSN信息: 

复制代码
  1. CLI> odbc show
  2. ODBC DSN Settings
  3. —————–
  4. Name:   asterisk
  5. DSN:    asterisk-connector
  6. *CLI>

 
第4步: 配置func_odbc.conf  
        func_odbc.conf是我们定义SQL语句的地方。可以执行数据插入或读写。我们可以定义特别的变量,让Asterisk能够访问动态数据,而不用去调用外部AGI脚本。在很多场合这个很有用,比如应急呼叫,信用卡处理等。 
        我可以举例,设置Asterisk PBX实现保险业务坐席获取来电号码。Asteirsk能够match 遵从TAPI的CRM。当保险经纪人拿起电话的时候,就能看到客户的信息。/etc/asterisk/func_odbc.conf: 

复制代码
  1. [info]
  2. perfix=account
  3. dsn=asterisk
  4. readsql=SELECT Balance from accounts WHERE AccountID = ‘${ARG1}’

 
        这 段文字定义了我们可以在dialplan里面调用的变量名称。‘dsn=asterisk’ 引用的是 res_odbc.conf 的上下文 ‘asterisk’。‘readsql=’ 是有趣的部分,“rub”,设定了我们在asterisk调用的变量名称。当我们调用这个变量,将被命名为 ‘${account_info()}’。$ARG1是在extensions.conf的拨号号码。 
第5步: extensions.conf 配置文件 
        extensions.conf里面增加下面的内容: 

复制代码
  1. [macro-say-balance]
  2. exten => s,1,wait(2)
  3. exten => s,n,SayNumber(${account_info(${AcountID})})
  4. exten => s,n,hangup
  5. [from-internal]
  6. exten => 101,1,Read(AcountID,pls-enter-your-account-id)
  7. exten => 101,n,Macro(say-balance,${AcountID})

 
        本文演示了如何从SQL数据库调用变量。这样节约了需要写AGI和PHP的大量时间。我们可以使用这个办法创建电话卡应用。SQL数据库不需要蜗居在Asterisk机器上,这让很多应用变得简单。

你可能感兴趣的:(odbc)