Сперва собираем максимум информации, как работает запись звонков в Asterisk 16 чтобы выработать набор шагов для решения задачи. Это во FreePBX все просто поставил галочку и не задумываешься, а вот в консольном использовании Asterisk все ложится на Ваши плечи — но так интереснее, плюс есть над чем подумать и доработать. Что будет в этой заметке: Через макрос будут записываться все звонки, конвертироваться из wav в mp3, посредством Asterisk CDR Viewer Mod будет визуализированный просмотр, прослушивание, удаление.

Предварительные действия дабы данная заметка заработала:

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

Добавляем в Asterisk 16 модуль работы с макросами

у меня данный модуль был не отмечен, перехожу на него 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-интерфейс:

Звонок записан и фиксируется в 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

Структура таблицы cel

Проверяю, что совершаемые звонки пишутся и выше действия не оказали какого-либо влияния на Web-интерфейс:

После всех действий, звонки фиксируются в Web-интерфейсе

Все отлично. Работает и ошибок не замечено. Если будет что-то то это будет обязательно отражено в заметках. На этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.