..
Всем привет. Наткнулся на одну интересную возможность в Asterisk PBX ожидание освобождения исходящего канала для исходящих вызовов. Например, если в Asterisk PBX все исходящие линии заняты, то чтобы не набирать городской или мобильный номер снова можно поставить вызов в режим поиска канала и ожидать когда одна из линий освободится.
Также, если исходящие вызовы идут через IP сеть, то при кратковременных перегрузках или если перезагружается роутер это позволит скрыть такие ньансы и сделать видимость что вызов выполняется и проблем нет.
Asterisk PBX это современная безплатная программная телефонная станция с открытым исходным кодом малой и средней ёмкости, ориентированная на использование в офисе и в абонентском доступе на периферии. "Asterisk - будущее телефонии". Asterisk PBX устанавливается как служба в Linux в т.ч. Linux Ubuntu и при наличии соответствующего оборудования позволяет организовывать связь как внутри учреждения так и входящую-исходящую связь с "внешним миром", как посредством традиционных двухпроводных абонентских линий и цифровых ISDN линий так и через IP сеть т.е. через интернет.
..
СИГНАЛ ИНДИКАЦИИ "SEARCH"
..
Вначале добавим акустический сигнал индикации "search" (поиск) для того чтобы Asterisk PBX "знал" его и чтобы умел его воспроизводить, в том числе и при поиске свободного исходящего канала. Сигнал напоминает улюлюканье и похож на тот который раньше в сотовых сетях происходил также поиска канала, но его я придумал сам.
Для этого открываем файл "/etc/asterisk/indications.conf" и в самом верху в разделе "[general]" параметру "country" присваиваем значение "ru".
Далее ищем этот раздел с настройками акустической индикации для России "[ru]" и добавляем в конце сигнал индикации поиска канала:
search = 0/1000,400/70,540/70,470/70,590/70,0/1500
Должно получиться как на скриншоте ниже.
В двух словах этот сигнал состоит из набора последовательных одночастотных тональных сигналов разной частоты и продолжительности. Так сигнал контроля посылки вызова представляет собой следующее "ring = 425/1000,0/4000", состоит из 1 секунды тона 425 Гц и 4 секунды тона частотой 0 Гц, т.е. тишины.
..
ИСХОДЯЩИЙ ТРАНК "T1"
..
В одной из предыдущих публикаций Asterisk PBX. Подключаемся к SIPNET был создан SIP транк для подключения, в котором при исходящем вызове, если не подключен городской номер, отвечал автоответчик. В любом случае, для того чтобы симмитировать занятость этого исходящего транка укажем неверный пароль в параметре "secret" (я указал "123"), тогда SIPNET отклонит исходящий вызов не него в любом случае. Этот транк добавляем в файл "/etc/asterisk/sip.conf";
[T1]
type=peer
host=sipnet.ru
port=5060
defaultuser=<SIP ID>
fromuser=<SIP ID>
fromdomain=sipnet.ru
secret=123;<пароль от ЛК>
qualify=no
qualifyfreq=60
call-limit=2
nat=force_rport,comedia
directmedia=no
context=inc
disallow=all
allow=alaw,ulaw
В конфигурациях Asterisk PBX комментарии начинаются с точки с запятой, а не со знака решётки как принято в никсах, поэтому, я верный пароль просто закомментировал этим знаком ";" и перед комментом указал неверный.
По транку всё, остальные детали по настройке исходящего транка см. в вышеуказанной публикации.
..
ДИАЛПЛАН
..
В файле конфигурации "/etc/asterisk/extensions.conf" часть с конфигурацией исходящих вызовов на 8ку, что то вроде этого
exten => _8XXXXXXXXXX,1,Dial(SIP/T1/${EXTEN},60,L(1800000))
exten => _8XXXXXXXXXX,n,Hangup()
меняем на следующее.
exten => _8XXXXXXXXXX,1,Answer()
exten => _8XXXXXXXXXX,2(outr),PlayTones(search)
exten => _8XXXXXXXXXX,n,Wait(2)
exten => _8XXXXXXXXXX,n,StopPlayTones()
exten => _8XXXXXXXXXX,n,Dial(SIP/T1/${EXTEN},60,L(1800000))
exten => _8XXXXXXXXXX,n,Set(DS=${DIALSTATUS})
exten => _8XXXXXXXXXX,n,GotoIf($[${DS} = BUSY]?outr)
exten => _8XXXXXXXXXX,n,GotoIf($[${DS} = CONGESTION]?outr)
exten => _8XXXXXXXXXX,n,GotoIf($[${DS} = CHANUNAVAIL]?outr)
exten => _8XXXXXXXXXX,n,PlayTones(busy)
exten => _8XXXXXXXXXX,n,Wait(60)
exten => _8XXXXXXXXXX,n,Hangup()
После всех этих изменений не забываем сохранять все файлы конфигурации и перезагрузить конфигурацию Asterisk PBX следующей командой в командной строке.
$ sudo asterisk -rx "reload"
Проверил, работает, получился следующий лог в консоли Asterisk PBX
Что здесь происходит. Приложение "Dial" после окончания вызова в канальную переменную "DIALSTATUS" сохраняет результат вызова, дозвон, недозвон и прочее. После него проверяем этот статус и для неуспешных вызовов заворачиваем выполнение диалплана обратно почти на начало, на точку диалплана "outr", на повторное воспроизведение сигнала индикации "search" и на ещё одну попытку вызова после него. В моём данном случае Приложение "Dial" вернуло статус "CONGESTION" (перегрузка направления).
Также таким образом по занятости одного исходящего транка можно вызов переключать через другой, более дорогой например, но это уже выходит за рамки данной публикации.
..
Также в IP сетях бывают временные перегрузки сети или какие-то затыки, данное решение позволит скрыть такие ньюансы от пользователей или абонентов, пусть думают что вывоз выполняется. Плюс ко всему данное решение позволит сократить число исходящих городских линий почти без снижения риска отказов, например, из 3х аналоговых линий от Ростелекома убрать одну и оставить 2, а это уже экономия. Но тут ещё нужно смотреть число одновременных исходящих вызовов, если переусердствовать, то абоненты будут просто висеть в ожидании и долго дозваниваться.