Сперва собираем максимум информации, как работает запись звонков в Asterisk 16
чтобы выработать набор шагов для решения задачи. Это во FreePBX
все просто поставил галочку и не задумываешься, а вот в консольном использовании Asterisk
все ложится на Ваши плечи — но так интереснее, плюс есть над чем подумать и доработать. Что будет в этой заметке: Через макрос будут записываться все звонки, конвертироваться из wav
в mp3
, посредством Asterisk CDR Viewer Mod
будет визуализированный просмотр, прослушивание, удаление.
Предварительные действия дабы данная заметка заработала:
- tips_ubuntu_18_04_asterisk_16_v1.odt
- tips_ubuntu_18_04_odbc_v1.odt
- tips_ubuntu_18_04_asterisk_16_mysql_odbc_v1.odt
- tips_ubuntu_18_04_asterisk_16_cdr_viewer_v1.odt
tips_ubuntu_18_04_asterisk_16_record_call_v1.odt — это текущая.
Можно для решения задачи использовать встроенные функции:
Функция Monitor - пишет раздельно голос кто звонит и голос кому звонит в разные файлы. Не удобно.
Функция MixMonitor - объединяет оба направления разговора в один файл. Удобно.
Я хочу разобрать наиболее интересное опубликованное на блогах и доработать чем придумывать с нуля — в этом и заключается OpenSource
: правь, вноси, пользуйся. Это как в песне: Свободы, Хлеба, Зрелищ, Денег. Видел как один автор доработал схему записи разговоров для консольного Asterisk
(а) с сохранением информации о звонках в mysql чтобы их можно было прослушивать через Web
-панель просмотра.
Я же то же внес свою лепту опробовав на Asterisk 16
и дополнив свои заметки наработками.
Шаг №1: Хранить записи будем в mp3
, потому нам понадобится утилита lame
, для конвертации файлов из формата wav
в mp3
. Скачаем ее и установим.
ekzorchik@srv-asterisk:~$ cd /usr/src ekzorchik@srv-asterisk:/usr/src$ sudo wget http://sourceforge.net/projects/lame/files/lame/3.100/lame-3.100.tar.gz ekzorchik@srv-asterisk:/usr/src$ sudo tar zxf lame-3.* ekzorchik@srv-asterisk:/usr/src$ cd lame-3.*/ ekzorchik@srv-asterisk:/usr/src/lame-*$ sudo ./configure ekzorchik@srv-asterisk:/usr/src/lame-*$ sudo make -j$((`nproc`+1)) ekzorchik@srv-asterisk:/usr/src/lame-*$ sudo make install ekzorchik@srv-asterisk:/usr/src/lame-*$ cd ~ ekzorchik@srv-asterisk:~$ whereis lame lame: /usr/local/bin/lame /usr/src/lame-3.100/lame.spec /usr/src/lame-3.100/lame.bat ekzorchik@srv-asterisk:~$
Шаг №2: Т.к. я уже использую Web
-панель Asterisk CDR Viewer
то ее и буду задействовать. Нужно добавить дополнительное поле в таблицу cdr
для хранения имени файлов.
ekzorchik@srv-asterisk:~$ sudo mysql -u root -p712mbddr@ mysql> use asteriskcdrdb mysql> alter table `cdr` add column `filename` varchar(120) DEFAULT 'none' after `userfield`; Query OK, 0 rows affected (0.11 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> mysql> quit Bye ekzorchik@srv-asterisk:~$ sudo nano /etc/asterisk/cdr_mysql.conf alias realdst => realdst alias filename => filename
добавляем в секцию globals
переменную, соответствующую папке,
ekzorchik@srv-asterisk:~$ sudo mkdir /mnt/calls ekzorchik@srv-asterisk:~$ sudo chown -R asterisk:asterisk /mnt/calls
где будут храниться записи разговоров.
ekzorchik@srv-asterisk:~$ sudo nano /etc/asterisk/extensions.conf [globals] DIR_RECORDS=/mnt/calls/
После не забываем сохранить внесенные изменения.
Шаг №3: Чтобы Asterisk 16
мог работать с макросами, нужно подгрузить соответствующий модуль (вот почему-то в различных руководствах этот момент опущен):
ekzorchik@srv-asterisk:~$ cd /usr/src/asterisk-*/ ekzorchik@srv-asterisk:/usr/src/asterisk-*$ sudo make menuselect
у меня данный модуль был не отмечен, перехожу на него Applications - app_macro
и клавишей <ENTER
> отмечаю (в квадратных скобках он помечается символом звездочки «*
«) и нажимаю Save & Exit
, затем инсталлирую его в Asterisk
:
ekzorchik@srv-asterisk:/usr/src/asterisk-*$ sudo make install ekzorchik@srv-asterisk:/usr/src/asterisk-*$ cd ~ ekzorchik@srv-asterisk:~$
Проверяю, что Asterisk
видит модуль (app_macro
):
ekzorchik@srv-asterisk:~$ sudo asterisk -rx "module show like app_macro" Module Description Use Count Status Support Level 0 modules loaded ekzorchik@srv-asterisk:~$ sudo asterisk -rx "module load app_macro" Loaded app_macro ekzorchik@srv-asterisk:~$ ekzorchik@srv-asterisk:~$ sudo asterisk -rx "module show like app_macro" Module Description Use Count Status Support Level app_macro.so Extension Macros 0 Running deprecated 1 modules loaded
На заметку: Если же вы не добавите модуль app_macro
то при вызове макроса из dialplan
столкнетесь с ошибкой, как было у меня
Connected to Asterisk 16.6.2 currently running on srv-asterisk (pid = 7096) == Using SIP RTP CoS mark 5 [Dec 5 22:28:58] WARNING[7494][C-0000000b]: pbx.c:2922 pbx_extension_helper: No application 'Macro' for extension (phones, 2002, 1) == Spawn extension (phones, 2002, 1) exited non-zero on 'SIP/2003-0000000a' srv-asterisk*CLI>
и только спустя некое количество времени по розыску того почему у меня нет приложения ‘Macro
‘ я вспомнил, что когда устанавливал Asterisk
видел различные модули (Приложения) которые как отмечены на установку так и нет.
Шаг №4: Добавляем макрос для записи перед контекстами звонков:
ekzorchik@srv-asterisk:~$ sudo nano /etc/asterisk/extensions.conf [general] [globals] DIR_RECORDS=/mnt/calls/ [default] [handup-sip] exten => _X!,1,HangUp() include => handup-sip [local] exten => _2XXX,1,Macro(recording,${CALLERID(num)},${EXTEN}) exten => _2XXX,n,Dial(SIP/${EXTEN}) [info] exten = 1000,1,Answer() same = n,Goto(informer_1000,s,1)
После не забываем сохранить внесенные изменения.
Шаг №5: Создаем макрос в extensions.conf:
ekzorchik@srv-asterisk:~$ sudo nano /etc/asterisk/extensions.conf [general] [globals] DIR_RECORDS=/mnt/calls/ [default] [handup-sip] exten => _X!,1,HangUp() include => handup-sip [macro-recording] exten => s,1,Set(fname=${UNIQUEID}-${STRFTIME(${EPOCH},,%Y-%m-%d-%H_%M)}-${ARG1}-${ARG2}); exten => s,n,Set(monopt=nice -n 19 /usr/local/bin/lame -b 32 --silent "${DIR_RECORDS}${fname}.wav" "${DIR_RECORDS}${fname}.mp3" && rm -f "${DIR_RECORDS}${fname}.wav" && chmod o+r "${DIR_RECORDS}${fname}.mp3"); exten => s,n,Set(CDR(filename)=${fname}.mp3); exten => s,n,Set(CDR(realdst)=${ARG2}); exten => s,n,MixMonitor(${DIR_RECORDS}${fname}.wav,b,${monopt}); exten => s,n(no),Verbose(Exit record); [local] exten => _2XXX,1,Macro(recording,${CALLERID(num)},${EXTEN}) exten => _2XXX,n,Dial(SIP/${EXTEN}) [info] exten = 1000,1,Answer() same = n,Goto(informer_1000,s,1)
И после не забываем сохранить внесенные изменения.
параметр [macro-recording]
описываем однотипное выражение которое можно применить снова и снова, здесь recording
— это именование макроса. А вызывается он Macro(recordings,$ARG1,$ARG2)
Шаг №6: Перезапускаем астериск для применения всех настроек:
ekzorchik@srv-asterisk:~$ sudo asterisk -rx "dialplan reload" Dialplan reloaded.
Шаг №7: Осталось только указать настройки подключения к базе данных cdr viewer
. Эти настройки находятся в файле inc/config.inc.php
. Задаем там следующие параметры:
ekzorchik@srv-asterisk:~$ sudo nano /var/www/html/acdrviewer/inc/config/config.php 'monitor_dir' => '/mnt/calls', 'storage_format' => 5, ekzorchik@srv-asterisk:~$ sudo reboot
Шаг №8: Инициализирую звонок с одного номера на другой (с 2002
на 2003
) и при открытой консоли Asterisk
вижу запуск Макроса, конвертирование wav
файла в mp3
После позвонил и
ekzorchik@srv-asterisk:~$ sudo asterisk -rvvv Running as user 'asterisk' Running under group 'asterisk' Connected to Asterisk 16.6.2 currently running on srv-asterisk (pid = 7096) == Using SIP RTP CoS mark 5 -- Executing [s@macro-recording:1] Set("SIP/2002-00000000", "fname=1575712928.0-2019-12-07-13_02-2002-2003") in new stack -- Executing [s@macro-recording:2] Set("SIP/2002-00000000", "monopt=nice -n 19 /usr/local/bin/lame -b 32 --silent "/mnt/calls/1575712928.0-2019-12-07-13_02-2002-2003.wav" "/mnt/calls/1575712928.0-2019-12-07-13_02-2002-2003.mp3" && rm -f "/mnt/calls/1575712928.0-2019-12-07-13_02-2002-2003.wav" && chmod o+r "/mnt/calls/1575712928.0-2019-12-07-13_02-2002-2003.mp3"") in new stack -- Executing [s@macro-recording:3] Set("SIP/2002-00000000", "CDR(filename)=1575712928.0-2019-12-07-13_02-2002-2003.mp3") in new stack -- Executing [s@macro-recording:4] Set("SIP/2002-00000000", "CDR(realdst)=2003") in new stack -- Executing [s@macro-recording:5] MixMonitor("SIP/2002-00000000", "/mnt/calls/1575712928.0-2019-12-07-13_02-2002-2003.wav,b,nice -n 19 /usr/local/bin/lame -b 32 --silent "/mnt/calls/1575712928.0-2019-12-07-13_02-2002-2003.wav" "/mnt/calls/1575712928.0-2019-12-07-13_02-2002-2003.mp3" && rm -f "/mnt/calls/1575712928.0-2019-12-07-13_02-2002-2003.wav" && chmod o+r "/mnt/calls/1575712928.0-2019-12-07-13_02-2002-2003.mp3"") in new stack -- Executing [s@macro-recording:6] Verbose("SIP/2002-00000000", "Exit record") in new stack Exit record -- Executing [2003@phones:2] Dial("SIP/2002-00000000", "SIP/2003") in new stack ekzorchik@srv-asterisk:~$ ls /mnt/calls/ -lh total 32K -rw-r--r-- 1 asterisk asterisk 30K Dec 5 22:50 1575575396.20-2019-12-05-22_49-2002-2003.mp3 ekzorchik@srv-asterisk:~$
Открываю Web
-интерфейс:
и прослушиваю звонок:
Вот только мне кажется качество как-то не очень на слух звонка, либо я бухтел когда тестировал звонок.
Шаг №9: После еще раз обратил внимание на логи:
[Dec 7 13:02:17] WARNING[643]: res_odbc.c:433 ast_odbc_prepare_and_execute: SQL Execute error -1! [Dec 7 13:02:17] WARNING[643]: cel_odbc.c:788 odbc_log: Insert failed on 'asteriskcdrdb:cel'. CEL failed: INSERT INTO cel (eventtype, eventtime, cid_name, cid_num, cid_ani, cid_rdnis, cid_dnid, exten, context, channame, appname, appdata, amaflags, accountcode, uniqueid, linkedid, peer, userdeftype, userfield) VALUES ('CHAN_END', {ts '2019-12-07 13:02:17.511718'}, 'Number 2002', '2002', '2002', '', '2003', '2003', 'phones', 'SIP/2002-00000000', '', '', 3, '', '1575712928.0', '1575712928.0', '', '', '') [Dec 7 13:02:17] WARNING[643]: res_odbc.c:538 ast_odbc_print_errors: SQL Execute returned an error: HY000: [MySQL][ODBC 8.0(w) Driver][mysqld-5.7.28-0ubuntu0.18.04.4]Field 'src' doesn't have a default value
А почему?
Я попробовал удалить строки параметров и выделил те которые не нужны для записи в таблицу cel
и на что жаловался Asterisk
при совершении звонка между абонентами:
ekzorchik@srv-asterisk:~$ sudo mysql -u root -p712mbddr@; mysql> use asteriskcdrdb; mysql> select * from cel; Empty set (0.01 sec) mysql> mysql> alter table cel drop column src; mysql> alter table cel drop column dst; mysql> alter table cel drop column channel; mysql> alter table cel drop column dstchannel; mysql> alter table cel drop column eventextra; mysql> quit Bye ekzorchik@srv-asterisk:~$ sudo service asterisk restart
и после ошибок на консоль что не возможно записать в таблицу cel
не было.
Проверяю, что таблица cel
наполняется данными:
mysql> select * from cel;
итого данные есть.
Структура таблицы cel
Проверяю, что совершаемые звонки пишутся и выше действия не оказали какого-либо влияния на Web
-интерфейс:
Все отлично. Работает и ошибок не замечено. Если будет что-то то это будет обязательно отражено в заметках. На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.