Asterisk PJSIP Realtime

pjsip-realtime Настройка ODBC реалтайм хранилища для объектов PJSIP - AORs, AUTHs, ENDPOINTs.

Требуемые пакеты

 yum install mysql-connector-odbc unixODBC unixODBC-devel libmyodbc

Создадим базу данных MySQL

 mysqladmin -u root -p create realtimedb

Создайте пользователя и задайте права на БД:

 mysql -u root -p -e "grant all privileges on realtimedb.* to db_user@localhost identified by 'db_password';"
 mysql -u root -p -e "flush privileges;"

Импортируем схему базы данных

 wget https://asterisk-pbx.ru/downloads/schema/realtime.sql
 mysql -u root -p realtimedb < realtime.sql

Получим следующие таблицы:

Получим следующие таблицы:

MariaDB [(none)]> use realtimedb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [realtimedb]> show tables;
+-----------------------------+
| Tables_in_realtimedb        |
+-----------------------------+
| extensions                  |
| iaxfriends                  |
| meetme                      |
| musiconhold                 |
| ps_aors                     |
| ps_auths                    |
| ps_contacts                 |
| ps_domain_aliases           |
| ps_endpoint_id_ips          |
| ps_endpoints                |
| ps_globals                  |
| ps_registrations            |
| ps_subscription_persistence |
| ps_systems                  |
| ps_transports               |
| queue_members               |
| queue_rules                 |
| queues                      |
| sippeers                    |
| voicemail                   |
+-----------------------------+
20 rows in set (0.00 sec)

Настроим unixODBC

Файл odbcinst.ini создается при установке unixodbc и, как правило, не требует изменений:

# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL]
Description     = ODBC for MySQL
Driver          = /usr/lib/libmyodbc5.so
Setup           = /usr/lib/libodbcmyS.so
Driver64        = /usr/lib64/libmyodbc5.so
Setup64         = /usr/lib64/libodbcmyS.so
FileUsage       = 1

В файле odbc.ini настроим dsn:

nano /etc/odbc.ini

(файл odbc.ini по умолчанию не создан)

[asterisk]
Driver = MySQL
Description = MySQL connection to ‘asterisk’ database
Server = localhost
Port = 3306
Database = realtimedb
UserName = db_user
Password = db_password

Проверим подключение:

Проверим подключение:

 echo "select 1" | isql -v asterisk db_user  db_password
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select 1
+---------------------+
| 1                   |
+---------------------+
| 1                   |
+---------------------+
SQLRowCount returns 1
1 rows fetched

Настроим Asterisk res_odbc

/etc/asterisk/res_odbc.conf

[asterisk]
enabled => yes
dsn => asterisk
username => db_user
password => db_password
pre-connect => yes

В файле /etc/asterisk/modules.conf включите загрузку модулей odbc:

[modules]
preload => res_odbc.so
preload => res_config_odbc.so

Проверим подключение в Asterisk:

 asterisk -rx 'core reload' && asterisk -rx 'odbc show'
ODBC DSN Settings
-----------------

  Name:   asterisk
  DSN:    asterisk
    Number of active connections: 1 (out of 1)

Asterisk sorcery.conf

Sorcery определяет иерархию использования данных в Asterisk.
В данном случае мы укажем, что модуль res_pjsip хранит данные перечисленных объектов (aors, auths, endpoints, domain_alias и contact) в реалтайм хранилище:

/etc/asterisk/sorcery.conf
[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

формат:
object type [/options] = wizard name, wizard configuration data

где, в данном примере wizard name - realtime, а wizard configuration data - имя объекта из /etc/asterisk/extconfig.conf.

Для использования смешанной конфигурации (реалтайм и статической), используется следующая схема:

endpoint=realtime,ps_endpoints
endpoint=config,pjsip.conf,criteria=type=endpoint

Asterisk Realtime extconfig.conf

Свяжем объекты pjsip с реалтайм коннектором res_odbc (asterisk) .
/etc/asterisk/extconfig.conf

[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 Realtime: extconfig.conf

Asterisk конфигурация PJSIP

Транспорт PJSIP лучше определить в текстовой конфигурации:

/etc/asterisk/pjsip.conf

[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0:5060
local_net = 192.168.0.0/24
external_media_address = extern ip address
external_signaling_address = extern ip address
allow_reload=true

Заполнение базы данных PJSIP

Для создания внутренних номеров, достаточно заполнить минимальными параметрами три ключевых таблицы:

  • ps_aors
 insert into ps_aors (id, max_contacts) values (1001, 1);
  • ps_auths
 insert into ps_auths (id, auth_type, password, username) values (1001, 'userpass', 'Pass', 1001);
  • ps_endpoints
 insert into ps_endpoints (id, transport, aors, auth, context, disallow, allow, direct_media) values (1001, 'transport-udp', '1001', '1001', 'testing', 'all', 'alaw,ulaw,opus', 'no');

tips&tricks: Импорт из csv файла

Для автоматизации наполнения таблиц MySQL удобно использовать csv файлы.
Создайте следующий csv файл, например при помощи приложения OpenOffice Calc:

1000,transport-udp,1000,1000,from-internal,all,"alaw,ulaw,opus","no",
1001,transport-udp,1001,1001,from-internal,all,"alaw,ulaw,opus","no",

где в каждой новой строке данные уникального номера.

Импортируйте данные в таблицу MySQL:

LOAD DATA INFILE '/usr/src/ps_endpoints.csv' 
INTO TABLE ps_endpoints 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

где /usr/src/ps_endpoints.csv путь к csv файлу.

import csv to mysql

import csv to mysql

MariaDB [testalembic]> LOAD DATA INFILE '/usr/src/ps_endpoints.csv'
    -> INTO TABLE ps_endpoints
    -> FIELDS TERMINATED BY ','
    -> ENCLOSED BY '"'
    -> LINES TERMINATED BY '\n';
Query OK, 1 row affected, 99 warnings (0.01 sec)
Records: 1  Deleted: 0  Skipped: 0  Warnings: 99
MariaDB [realtimedb]> select id,transport,aors,auth,context,allow,disallow,direct_media  from ps_endpoints;
+------+---------------+------+------+---------------+----------------+----------+--------------+
| id   | transport     | aors | auth | context       | allow          | disallow | direct_media |
+------+---------------+------+------+---------------+----------------+----------+--------------+
| 1000 | transport-udp | 1000 | 1000 | from-internal | alaw,ulaw,opus | all      | no           |
+------+---------------+------+------+---------------+----------------+----------+--------------+
1 row in set (0.00 sec)

Обновление данных

Для обновления уже существуюших строк, используйте команду UPDATE. Например добавим значение в колонку remove_existing:

  update ps_aors set remove_existing = 'yes';
MariaDB [realtimedb]> select id,max_contacts,remove_existing from ps_aors;
+------+--------------+-----------------+
| id   | max_contacts | remove_existing |
+------+--------------+-----------------+
| 1000 |            1 | yes             |
| 1001 |            1 | yes             |
+------+--------------+-----------------+
Только авторизованные участники могут оставлять комментарии.

Войти через: Google Facebook