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 文件。
复制代码
|
注 意,在上面把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文件可以设置:
复制代码
|
res_odbc.conf文件的DSN指的是‘/etc/odbc.ini’里的MSN,以指向驱动文件odbcinst.ini。在Asterisk CLI下面可以看到DSN信息:
复制代码
|
第4步: 配置func_odbc.conf
func_odbc.conf是我们定义SQL语句的地方。可以执行数据插入或读写。我们可以定义特别的变量,让Asterisk能够访问动态数据,而不用去调用外部AGI脚本。在很多场合这个很有用,比如应急呼叫,信用卡处理等。
我可以举例,设置Asterisk PBX实现保险业务坐席获取来电号码。Asteirsk能够match 遵从TAPI的CRM。当保险经纪人拿起电话的时候,就能看到客户的信息。/etc/asterisk/func_odbc.conf:
复制代码
|
这 段文字定义了我们可以在dialplan里面调用的变量名称。‘dsn=asterisk’ 引用的是 res_odbc.conf 的上下文 ‘asterisk’。‘readsql=’ 是有趣的部分,“rub”,设定了我们在asterisk调用的变量名称。当我们调用这个变量,将被命名为 ‘${account_info()}’。$ARG1是在extensions.conf的拨号号码。
第5步: extensions.conf 配置文件
extensions.conf里面增加下面的内容:
复制代码
|
本文演示了如何从SQL数据库调用变量。这样节约了需要写AGI和PHP的大量时间。我们可以使用这个办法创建电话卡应用。SQL数据库不需要蜗居在Asterisk机器上,这让很多应用变得简单。