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.com
Asterisk 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


Навигация: