Астериск быстро развивается и устаревают все руководства по его настройке. Сегодня мы расскажем как сконфигурировать ASTERISK для использования механизма REALTIME с помощью MARIADB.
После исчерпывающего исследования в интернете и множества поисковых запросов в Google мы обнаружили, что информация о
Asterisk RealTime слишком стара. Большинство из нее датируется примерно 2005 или, в лучшем случае, 2015 годом.
По-видимому, никого не интересовало распространение знаний об этом интересном способе программирования Asterisk.
Рекомендации
Мы не рекомендуем использовать
Dial Plan
в режиме реального времени.
Если у нас есть Dial Plan, который слишком велик, то каждый раз, когда мы совершаем вызов, запросы к базе данных могут перегрузить систему.
В этом руководстве мы используем
Debian 12
, однако вы можете использовать
Ubuntu
, если хотите.
Имейте в виду следующие приложения:
meetme
, с нескольких версий назад был заменен на
confbridge
,
который в настоящее время не поддерживает DB.
SIP
, c версии
19 Asterisk SIP устарел
, однако в этом руководстве мы рассмотрим этот тип устройств.
Никогда не выполняйте эту реализацию на рабочем сервере.
Протестируйте сначала и убедитесь, что все работает.
Если у вас не установлен ASTERISK, установите его по нашему руководству.
apt install -y unixodbc odbcinst mariadb-client mariadb-server odbc-mariadb
systemctl enable mariadb
systemctl start mariadb
Установим Python 3
apt install python3-pip -y
Запустим виртуальную среду:
python3 -m venv asterisk
Перейдем в нее:
source asterisk/bin/activate
Установим необходимые пакеты:
pip install mysql-connector-python
pip install alembic
pip install mysqlclient
pip install "importlib_metadata==1.5.2"
pip install "zipp==1.2.0"
pip install "configparser==3.8.1"
Деактивируем среду
deactivate
cd /usr/src/asterisk-19.4.1/contrib/ast-db-manage/
mv config.ini.sample config.ini
Внесем изменения:
nano config.ini
Заменим эту строчку:
sqlalchemy.url = mysql://user:pass@localhost/asterisk
на:
sqlalchemy.url = mysql://root:@localhost/asterisk
Создадим БД:
mysql -u root
create database asterisk;
exit;
Импортируем:
alembic -c config.ini upgrade head
Создадим пользователя, зададим привелегии:
mysql -u root
use asterisk;
grant all privileges on asterisk.* to 'asterisk'@'localhost' identified by 'asterisk';
FLUSH Privileges;
exit;
Отразим это в конфигурационных файлах:
nano /etc/odbc.ini
[asterisk]
Description = MySQL Asterisk
Driver = MariaDB Unicode
Database = asterisk
Server = localhost
User = asterisk
Password = asterisk
Port = 3306
Socket = /var/run/mysqld/mysqld.sock
nano /etc/odbcinst.ini
[MariaDB Unicode]
Driver=libmaodbc.so
Description=MariaDB Connector/ODBC(Unicode)
Threading=0
UsageCount=1
Проверим:
odbcinst -j
isql asterisk asterisk asterisk
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
quit;
nano /etc/asterisk/res_odbc.conf
[asterisk]
enabled => yes
dsn => asterisk
username => asterisk
password => asterisk
pre-connect => yes
sanitysql => select 1
max_connections => 20
connect_timeout => 5
negative_connection_cache => 600
nano /etc/asterisk/extconfig.conf
;
; Static and realtime external configuration
; engine configuration
;
; See https://wiki.asterisk.org/wiki/display/AST/Realtime+Database+Configuration
; for basic table formatting information.
;
[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
voicemail => odbc,asterisk
queues => odbc,asterisk
queue_members => odbc,asterisk
sipusers => odbc,asterisk
sippeers => odbc,asterisk
extensions => odbc,asterisk
nano /etc/asterisk/pjsip.conf
[system]
type=system
timer_t1=500
timer_b=32000
disable_tcp_switch=yes
[transport-tcp]
type=transport
protocol=tcp
bind=0.0.0.0:5060
allow_reload=yes
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0:5060
allow_reload=yes
[transport-tls]
type=transport
protocol=tls
bind=0.0.0.0:5061
allow_reload=yes
verify_client=no
verify_server=no
method=tlsv1
[transport-ws]
type=transport
protocol=ws
bind=0.0.0.0:5060
allow_reload=yes
[transport-wss]
type=transport
protocol=wss
bind=0.0.0.0:5061
allow_reload=yes
nano /etc/asterisk/sorcery.conf
[res_pjsip]
endpoint=realtime,ps_endpoints
auth=realtime,ps_auths
aor=realtime,ps_aors
domain_alias=realtime,ps_domain_aliases
[res_pjsip_endpoint_identifier_ip]
identify=realtime,ps_endpoint_id_ips
nano /etc/asterisk/modules.conf
;
; Asterisk configuration file
;
; Module Loader configuration file
;
[modules]
autoload=yes
preload => res_odbc.so
preload => res_config_odbc.so
load => func_realtime.so
load => pbx_realtime.so
systemctl restart asterisk
asterisk -rvvvvvvvvvvvv
localhost*CLI>
odbc show
ODBC DSN Settings
-----------------
Name: asterisk
DSN: asterisk
Number of active connections: 1 (out of 20)
Logging: Disabled
localhost*CLI>
mysql -u root
use asterisk;
insert into ps_aors (id, max_contacts, qualify_frequency) values (100, 2, 30);
insert into ps_auths (id, auth_type, password, username) values (100, 'userpass', 100, 100);
insert into ps_endpoints (id, transport, aors, auth, context, disallow, allow, direct_media, deny, permit, mailboxes) values (100, 'transport-udp', '100', '100', 'testing', 'all', 'ulaw,alaw,gsm', 'no', '0.0.0.0/0', '0.0.0.0/0', '100@default');
insert into ps_aors (id, max_contacts, qualify_frequency) values (101, 2, 30);
insert into ps_auths (id, auth_type, password, username) values (101, 'userpass', 101, 101);
insert into ps_endpoints (id, transport, aors, auth, context, disallow, allow, direct_media, deny, permit, mailboxes) values (101, 'transport-udp', '101', '101', 'testing', 'all', 'ulaw,alaw,gsm', 'no', '0.0.0.0/0', '0.0.0.0/0', '101@default');
exit;
asterisk -rvvvvvvvvvvvvvvvvvv
pjsip show endpoints
nano /etc/asterisk/extensions.conf
[general]
[testing]
exten => _1XX,1,NoOp()
same => n,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})})
same => n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
same => n(unavail),Voicemail(${EXTEN}@default,u)
same => n,Hangup()
same => n(busy),VoiceMail(${EXTEN}@default,b)
same => n,Hangup()
;Retrieve Voicemail message
exten => *97,1,NoOp(Retrieve VM from Extension ${CALLERID(number)})
same => n,Answer()
same => n,VoiceMailMain(${CALLERID(num)}@default)
asterisk -rvvvvvvvvvvvvvvvvvvvv
dialplan reload
Голосовая почта
mysql -u root
use asterisk;
insert into voicemail (context, mailbox, password, attach, saycid, envelope) values ('default', '100', '100', 'yes', 'yes', 'yes');
insert into voicemail (context, mailbox, password, attach, saycid, envelope) values ('default', '101', '101', 'yes', 'yes', 'yes');
exit;
Очереди
mysql -u root
use asterisk;
insert into queues (name, musiconhold, timeout, ringinuse, queue_holdtime, retry, wrapuptime, strategy) values ('Q500', 'default', '15', 'no', '30', '5', '5', 'ringall');
insert into queue_members (queue_name, interface, membername, penalty, wrapuptime) values ('Q500', 'Local/101@testing/n', '101', '0', '5');
exit;
asterisk -rvvvvvvvvvvvvvvvvvvvvvvv
localhost*CLI>
queue show Q500
Q500 has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0%, SL2:0.0% within 0s
Members:
101 (Local/101@testing/n) (ringinuse disabled) (realtime) (Not in use) has taken no calls yet
No Callers
localhost*CLI>
exit
nano /etc/asterisk/extensions.conf
;Call Queue Q500
exten => 500,1,NoOp(Queue: Testing 500)
same => n,Playback(queue-youarenext)
same => n(qconnect),NoOp(Connecting to Queue)
same => n,Queue(Q500,c,,,30)
same => n,Hangup()
;Agent Login & Logout
exten => *5001,1,NoOp(Queue: Add Agent ${CALLERID(number)} in Queue 500)
same => n,AddQueueMember(Q500,Local/${CALLERID(number)}@testing/n,0,,${CALLERID(number)},)
same => n,Playback(agent-loginok)
exten => *5002,1,NoOp(Queue: Remove Agent ${CALLERID(number} in Queue 500)
same => n,RemoveQueueMember(Q500,Local/${CALLERID(number)}@testing/n)
same => n,Playback(agent-loggedoff)
asterisk -rvvvvvvvvvvvvvvvvvvvv
dialplan reload