Asterisk 配置 PJSIP ODBC 实时存入数据库
Asterisk 如何将 PJSIP 通道驱动程序与实时数据库存储后端相连接。实时接口允许将 PJSIP 的大部分配置(如端点、auth、aor 等)存储在数据库中,而不仅是 pjsip.conf 配置文件中。
我们假设 Asterisk 安装在 Linux 服务器上,并希望 Asterisk 通过 odbc 连接器连接到 Mysql 数据库。我们还需要安装如下依赖包:
- unixodbc 和 unixodbc-dev
- odbc 及其开发包
- libmyodbc
- odbc 到 mysql 接口包
- python-dev 和 python-pip
- python-mysqldb
如果在 Ubuntu 服务器,可以直接通过如下命令安装:
# apt-get install unixodbc unixodbc-dev libmyodbc python-dev python-pip python-mysqldb
一旦安装了这些包,你需要使用 make menuconfig 工具检查 res_config_odbc 和 res_odbc 和 res_pjsip_xxx 资源模块被安装。然后执行
./configure;make;make install
创建数据库,使用 mysqladmin 工具创建一个数据库,用来存储配置信息。
# mysqladmin -u root -p create asterisk
安装 Alembic,可以用来创建配置信息表结构。Alembic 是一个完整的数据库迁移工具,支持升级现有数据库的模式、模式版本控制、创建新表和数据库等等。
# pip install alembic
切换到 Asterisk 源码目录 contrib/ast-db-manage/,它包含 Alembic 脚本。
# cd contrib/ast-db-manage/
下一步,编辑配置文件 config.ini.sample,将 sqlalchemy.url 选项改成如下:
sqlalchemy.url = mysql://root:password@localhost/asterisk
用户名和密码填写为你的真实数据库用户名和密码。然后将 config.ini.sample 重命名为 config.ini。
最后,使用 Alembic 设置数据库表。
# alembic -c config.ini upgrade head
你可以通过连接到数据库验证表是否已经创建?
当创建了数据库表后,我们还需要配置 Asterisk,首先,我们要配置 ODBC 连接到 Mysql。我们配置/etc/odbcinst.ini 配置文件,你的文件看起来像这样
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
UsageCount = 2
下一步,在/etc/odbc.ini 配置文件中,创建一个 asterisk 数据库连接器。
[asterisk]
Driver = MySQL
Description = MySQL connection to ‘asterisk’ database
Server = localhost
Port = 3306
Database = asterisk
UserName = root
Password = password
Socket = /var/run/mysqld/mysqld.sock
下一步,我们在/etc/asterisk/res_odbc.conf 配置文件中,配置 res_odbc 可以连接到 asterisk 数据库连接器。
[asterisk]
enabled => yes
dsn => asterisk
username => root
password => password
pre-connect => yes
配置正确后,我们可以在 asterisk 的 cli 中,使用odbc show
查看配置信息。
将 PJSIP Sorcery 连接到数据库
PJSIP 堆栈在 Asterisk 使用了一个数据抽象层叫 sorcery。它允许用户为 Asterisk 狗叫一个分层数据源,以便在检索、更新、创建或销毁数据时交互使用。
PJSIP 的配置基于对象类型。在 Sorcery 中配置总共有 5 个对象:
- endpoint
- auth
- aor
- domain
- identify
我们还可以配置联系人对象,尽管本例子中不需要它。这些配置文件在/etc/asterisk/sorcery.conf。
text[res_pjsip] ; Realtime PJSIP configuration wizard
endpoint=realtime,ps_endpoints
auth=realtime,ps_auths
aor=realtime,ps_aors
domain_alias=realtime,ps_domain_aliases
contact=realtime,ps_contacts
[res_pjsip_endpoint_identifier_ip]
identify=realtime,ps_endpoint_id_ips
其中,realtime 是关键字,表示实时,ps_endpoints 是可以连接到数据库的表。如果不想实时,可以使用关键字 config。
最后,我们需要再配置 /etc/asterisk/extconfig.conf,这个配置文件是告诉 Asterisk 使用实时数据库。
text[settings]
ps_endpoints => odbc,asterisk
ps_auths => odbc,asterisk
ps_aors => odbc,asterisk
ps_domain_aliases => odbc,asterisk
ps_endpoint_id_ips => odbc,asterisk
ps_contacts => odbc,asterisk
我们还需要配置 Asterisk 在启动之前加载 ODBC 驱动,这样其它模块才能获取到正确的配置信息。
在/etc/asterisk/modules.conf 配置文件中,添加如下内容:
preload => res_odbc.so
preload => res_config_odbc.so
noload => chan_sip.so
我们配置 PJSIP,先创建一个传输。在/etc/asterisk/pjsip.conf 文件中:
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0
我们在 Mysql 数据库中维护端点和用户,也就是在数据库中插入 ps_endpoints 记录,ps_aors 记录,ps_auths 记录。
此时,你应该能够在 asterisk cli 中使用pjsip show endpoints
命令检索出记录。
最后的拨号计划不变,现在就可以使用了,赶快尝试一下吧。