CentOS & Asterisk. Часть 3. Многоканальник, звонок на приёмную.
26.11.2018
Всем привет. В предыдущих статьях мы добились простых звонков с одного номера на другой, немного поговорили о плане набора (он же «dial plan», он же «extensions.conf»). Чего в общем то достаточно для того чтобы люди в организации звонили друг другу. Но это конечно далеко не всё что требуется в работе телефонии современной организации. В этой статье поговорим как настроить многоканальный телефон с меню выбора направления звонков и реализуем в нашем плане набора.
И так начнём с того что для многоканального автоответчика нам нужно сделать свою запись голосом, и я конечно не буду описывать как это делается, тут у каждого свой подход. Предположим файл уже готов – допустим имеем vmenu.mp3 – что дальше? Дальше нам надо перекодировать этот файл в формат *.wav – и при этом с такими параметрами:
частота: 8 кГцканалы: моно
формат wav: 16 bit WAVE (PCM)
В такой вид можно привести с помощью программы Ease Audio Converter. Но лично мне больше нравится редактор Adobe Audition 3.0. – ниже приведу несколько скринов:
Для начала скопируем весь аудио файл – либо только участок – затем File – New – и выставляем наши параметры:Теперь полученный файл нам нужно как-то перенести на виртуалку в CentOS. Но для начала создадим нужный каталог:
mkdir /var/lib/asterisk/moh/vmenu
Что мы сделали этой командой – у астериска уже был каталог «/var/lib/asterisk/moh», который содержал файлы музыки, которые мы слышим при наборе номера, если в плане указана буква «m» (см статью №2). «moh» - music on hold – что дословно переводится как музыка на удержании. Далее нашей командой мы создали свой каталог «vmenu», для собственных файлов, чтобы не мешать их с оригинальными в корне папки «moh». И теперь нам остаётся скопировать в эту папку наш полученный файл vmenu.wav. Поможет нам в этом программа «WinSCP». Скачать можнотут. После запуска «WinSCP» нам нужно создать новое соединение, точно также как в PuTTY. После чего нам откроется двух панельный менеджер в жанре «Total commander» - и всё чудесно копируется из дисков Windows на любые каталоги CentOS – потому что соединение проходит от супер пользователя «root»!
Но это ещё не всё. Теперь нам нужно сделать перекодирование файла средствами asterisk:
asterisk -r
file convert /var/lib/asterisk/moh/vmenu/vmenu.wav vmenu.ulaw
exit
И так у нас есть запись автоответчика в нужном месте, теперь нам нужно обозначить номер автоответчика – предположим у нас это будет «104». Редактируем «sip.conf» командой «nano /etc/asterisk/sip.conf» и добавляем номер «104»:
[104]type=friend
host=dynamic
insecure=invite
username=104
secret=104
context=localcalls
disallow=all
allow=alaw
Сохранили и вышли. По предыдущим статьям наш «extensions.conf» в конце выглядит вот так:
;;;;;;;;;;;;;;;;;;;
[localcalls]
exten => _XXX,1,Dial(SIP/${EXTEN},,m)
exten => _XXXXXXXXXXX,1,Dial(SIP/zadarma/${EXTEN})
[vneshka]
exten => _X.,1,Dial(SIP/100&SIP/101&SIP/102&SIP/103,60,m,tT)
;;;;;;;;;;;;;;;;;;;
Редактируем «extensions.conf» командой «nano /etc/asterisk/extensions.conf» и приводим к вот такому виду:
;;;;;;;;;;;;;;;;;;;
[localcalls]
exten => _XXXXXXXXXXX,1,Dial(SIP/zadarma/${EXTEN})
exten => _XXX,1,Dial(SIP/${EXTEN},,m)
exten => 104,1,Goto(menu,start,1)
[menu]
exten => start,1,Answer()
same => n,Background(/var/lib/asterisk/moh/vmenu/vmenu)
same => n,WaitExten(5)
exten => start,n,Dial(SIP/103,30,)
exten => 1,1,Dial(SIP/101,30,) ;если звонящий нажал цифру 1, то звоним 101
same => n,Goto(menu,start,1)
exten => 2,1,Dial(SIP/102,30,) ;если звонящий нажал цифру 2, то звоним 102
same => n,Goto(menu,start,1)
exten => 3,1,Dial(SIP/103,30,) ;если звонящий нажал цифру 3, то звоним 103
same => n,Goto(menu,start,1)
[vneshka]
exten => _X.,1,Answer()
same => n,Goto(menu,start,1)
;;;;;;;;;;;;;;;;;;;
Сохранили и вышли. Выполним перезагрузку ядра и проверяем звонки:
asterisk -r
core reload
exit
Всё работает! А что именно то? А давайте очень подробно разберём что делает этот диал план:
Данный план набора подразумевает – когда нам звонят на номер приёмной «104» - первым делом у нас поднимается трубка:
exten => start,1,Answer()
Затем включается запись автоответчика:
same => n,Background(/var/lib/asterisk/moh/vmenu/vmenu)
Система ждёт 5секунд ПОСЛЕ проигрывания записи:
same => n,WaitExten(5)
И если человек ничего не набрал, звонок переходит на номер 103:
exten => start,n,Dial(SIP/103,30,)
Но если человек набрал цифру 1, то звоним на 101:
exten => 1,1,Dial(SIP/101,30,) ;если звонящий нажал цифру 1, то звоним 101
И если 101 не берёт трубку 30 секунд, то уходим назад на старт меню «start» и слушаем снова автоответчик:
same => n,Goto(menu,start,1)
Обратите внимание что я не использовал параметр «m», чтобы после выбора цифры человек слышал именно гудки – но это в данном примере, вы же можете использовать и музыку - тогда диал план был бы такой:
;;;;;;;;;;;;;;;;;;;
[localcalls]
exten => _XXXXXXXXXXX,1,Dial(SIP/zadarma/${EXTEN})
exten => _XXX,1,Dial(SIP/${EXTEN},,m)
exten => 104,1,Goto(menu,start,1)
[menu]
exten => start,1,Answer()
same => n,Background(/var/lib/asterisk/moh/vmenu/vmenu)
same => n,WaitExten(5)
exten => start,n,Dial(SIP/103,30,m)
exten => 1,1,Dial(SIP/101,30,m) ;если звонящий нажал цифру 1, то звоним 101
same => n,Goto(menu,start,1)
exten => 2,1,Dial(SIP/102,30,m) ;если звонящий нажал цифру 2, то звоним 102
same => n,Goto(menu,start,1)
exten => 3,1,Dial(SIP/103,30,m) ;если звонящий нажал цифру 3, то звоним 103
same => n,Goto(menu,start,1)
[vneshka]
exten => _X.,1,Answer()
same => n,Goto(menu,start,1)
;;;;;;;;;;;;;;;;;;;
Кстати в контексте «vneshka» как вы могли заметить теперь стоит исключительно переброс на меню. То есть если раньше были выставлены конкретные номера (exten => _X.,1,Dial(SIP/100&SIP/101&SIP/102&SIP/103,60,m,tT)) то теперь звонящий сам выбирает внутреннего абонента. Что более правильно конечно.
Хорошо, теперь определим, что номер приёмной у нас «105» - обозначим его в наших конфигурационных файлах:
Редактируем «sip.conf» командой «nano /etc/asterisk/sip.conf» и добавляем номер «105»[105]
type=friend
host=dynamic
insecure=invite
username=105
secret=105
context=localcalls
disallow=all
allow=alaw
Редактируем в конце «extensions.conf» командой «nano /etc/asterisk/extensions.conf»:
;;;;;;;;;;;;;;;;;;;
[localcalls]
exten => _XXXXXXXXXXX,1,Dial(SIP/zadarma/${EXTEN})
exten => _XXX,1,Dial(SIP/${EXTEN},30,t&m)
exten => 104,1,Goto(menu,start,1)
[menu]
exten => start,1,Answer()
same => n,Background(/var/lib/asterisk/moh/vmenu/vmenu)
same => n,WaitExten(5)
exten => start,n,Dial(SIP/105,30)
exten => 1,1,Dial(SIP/101,30) ;если звонящий нажал цифру 1, то звоним 101
same => n,Goto(menu,start,1)
exten => 2,1,Dial(SIP/102,30) ;если звонящий нажал цифру 2, то звоним 102
same => n,Goto(menu,start,1)
exten => 3,1,Dial(SIP/103,30) ;если звонящий нажал цифру 3, то звоним 103
same => n,Goto(menu,start,1)
[vneshka]
exten => _X.,1,Answer()
same => n,Goto(menu,start,1)
;;;;;;;;;;;;;;;;;;;
Что изменилось? Мы добавили «t&m» в строке «exten => _XXX,1,Dial(SIP/${EXTEN},30,t&m)». Далее мы поменяли «SIP/103» на «SIP/105» в строке «exten => start,n,Dial(SIP/105,30)» - то есть теперь, если человек прослушав автоответчик ничего не выбрал, звонок уходит на приёмную! И теперь кстати перевод звонков уже работает благодаря значению «t» в конструкции «t&m» - проверить можно так: Звоним на номер 101 – тот берёт трубку – жмёт решетку – звучит голосом сообщение «transfer» - и далее 101 абонент набираем на кого переводит. Как только там взяли трубку у 101го звонок обрывается. Это самый простейший трансфер. Но нам этого конечно мало для приёмной – нам надо чтобы у секретаря была возможность сказать звонящему что там не берут трубку. Для этого редактируем вот такой конфиг астериска:
Редактируем «features.conf» командой «nano /etc/asterisk/features.conf»:Нужно раскомментировать эти значения:
;atxfernoanswertimeout = 15
;atxferdropcall = no
;atxferloopdelay = 10
;atxfercallbackretries = 2
;atxfer => *2
Что каждое обозначает:
atxfernoanswertimeout = 15 - при переводе через 15 секунд соединение обрывается. Тут лучше выставить побольше.
atxferdropcall = no - Если секретарь положит трубку до того как получатель трансфера возьмёт трубку, то система снова позвонит на секретаря – то есть звонящий не пропадёт а просто звонок на приёмную повторится для того чтобы секретарь мог сказать что специалиста нет на месте. Но если в этом значении выставить «yes» - то в случае если секретарь положит трубку до того, как получатель трансфера возьмёт трубку, то звонок сразу пойдет на получателя трансфера.
atxferloopdelay = 10 - количество секунд между попытками дозвона на получателя трансфера.
atxfercallbackretries = 2 - А это количество попыток вернуть звонок секретарю.
atxfer => *2 - способ трансфера – секретарь набирает *2 и затем номер получателя трансфера.
Все ссылки для данного проекта:
Пакет русских сервисных сообщений (asterisk-core-sounds-ru-alaw-current) asterisk-core-sounds-ru-alaw-current drive.google.comAsterisk CDR Viewer https://github.com/g613/asterisk-cdr-viewer drive.google.com
Ease Audio Converter http://audiotool.net/EaseAudioConverter/index.htm
Adobe Audition https://www.adobe.com/ru/products/audition.html
WinSCP https://winscp.net/eng/download.php
CentOS-7-x86_64-Minimal-1804.iso https://www.centos.org/download drive.google.com
Исходник asterisk-15.6.2 https://downloads.asterisk.org/pub/telephony/asterisk/asterisk-15.6.2.tar.gz drive.google.com
Исходник dahdi-linux: https://downloads.asterisk.org/pub/telephony/dahdi-linux/dahdi-linux-current.tar.gz drive.google.com
Исходник libpri-current: https://downloads.asterisk.org/pub/telephony/libpri/libpri-current.tar.gz drive.google.com
X-lite: https://www.counterpath.com/x-lite-download/ drive.google.com
Официальная wiki https://wiki.asterisk.org/wiki/display/AST/Home