Что делать, если одноканальный шлюз занят



Что делать, если одноканальный шлюз занятИ снова привет!

Продолжая тему Asterisk, хотелось бы сразу отметить, что примеры конфигурации системы Asterisk, которые я описываю на данном ресурсе лучше всего подходят для небольших бюджетных АТС. Эта тема не исключение. Конфигурация, которая будет корректно выполнять функцию распределения нагрузки исходящих вызовов чере физический шлюзы выглядит немного по-другому с использованием других функций Asterisk.

Что же касается бюджетного решения, представим, что у нас есть PSTN шлюз и в него подключена домашняя телефонная линия. В этой статье мы не будем рассматривать о механизмах привязки его к нашему Астериску (мы еще об этом поговорим), а предположим, что он у нас уже успешно функционирует как на входящие, так и на исходящие вызовы. Теперь давайте попробуем ответить на вопрос, что услышит в трубке абонент №1, когда попробует набрать городской номер, который отправляется Астериском через наш домашний шлюз, если абонент №2 уже пользуется этой линией? За-ня-то. Все верно, как правило, наши домашние телефонные линнии одноканальные.
Давайте рассмотрим вариант решения, если нас не устраивает возможность наткнуться на потенциально занятую линию. Я для себя решил, что запасного одного канала мне хватит, нагрузка в моей АТС не большая. Т.е. первый канал — это домашняя городская линия, а второй канал будет страховать провайдер IP телефонии. В переом случае исходящий звонок практически ничего не будет стоить, а за второй прийдется расплатиться с провайдером, пусть это не большие деньги, но мы же стоим на пути оптимизации затрат, если мы заварили эту кашу с Астериском, верно? Итоговый сценарий исходящего звонка получился такой:
Абонент №1 набирает городской номер. По сути, стандартная ситуация.
1. Длинные гудки в линии — сигнал о дозвоне через шлюз.
2. Соединение.
3. Разговор.
Абонент №2 набирает городской номер,
1. В линии звучит заранее подготовленная и записанная голосовая подсказка (файл linebusy) о том, что «бесплатная линия занята, попробуйте повторить набор позже или оставайтесь на линии и ваш звонок отправится через платную линию».
2. Длинные гудки в линии — сигнал о дозвоне через провайдер IP телефонии.
3. Соединение.
4. Разговор.
Далее представлен код с подробным описанием команд, для понимания того, что мы делаем. Решаем мы это, без условно, через диалплан в extensions.conf.
Поехали.
; основная завись, которая отвечает за реакцию на входящий экстеншн, речь идет о 7-ми значном городском номере. Вызываем макрос safeline и фиксируем два ARG: логин_шлюза и запасной_канал
exten => _XXXXXXX,1,Macro(safeline,SIP/логин_шлюза,SIP/запасной_канал)
; название макроса
[macro-safeline]
; попытка отправки вызова через шлюз, если все ок, то звонок пройдет и макрос на команде Hangup завершиться.
exten => s,1,Dial(${ARG1}/${MACRO_EXTEN}},120,rtT)
; если звонок не проходит проверяем статус линии и в зависимости от результата отправляемся на необходимый экстеншн
exten => s,2,Goto(s1-${DIALSTATUS},1)
; абонент не отвечает — отправляем на экстеншн error,1
exten => s1-NOANSWER,1,GoTo(error,1)
; канал перегружен — отправляем на экстеншн error,1
exten => s1-CONGESTION,1,GoTo(error,1)
; абонент сбросил вызов — отправляем на экстеншн error,1
exten => s1-CANCEL,1,GoTo(error,1)
; абонент занят — отправляем на экстеншн error,1
exten => s1-BUSY,1,GoTo(error,1)
; сигнал о том, что наш шлюз уже занят — проигрываем информацию об этом в линию
exten => s1-CHANUNAVAIL,1,Playback(/music/linebusy)
; попытка отправить вызов через другой канал, указанный в ARG2
exten => s1-CHANUNAVAIL,2,Dial(${ARG2}/${MACRO_EXTEN},120,tT)
; выведем информацию в консоль о статусе линии есть канал занят
exten => s1-CHANUNAVAIL,n,NoOp(Dial Status: ${DIALSTATUS})
; проверяем статус линии и в зависимости от результата отправляемся на необходимый экстеншн
exten => s1-CHANUNAVAIL,n,Goto(s2-${DIALSTATUS},1)
; абонент не отвечает — отправляем на экстеншн error,1
exten => s2-NOANSWER,1,GoTo(error,1)
; канал перегружен — отправляем на экстеншн error,1
exten => s2-CONGESTION,1,GoTo(error,1)
; абонент сбросил вызов — отправляем на экстеншн error,1
exten => s2-CANCEL,1,GoTo(error,1)
; абонент занят — отправляем на экстеншн error,1
exten => s2-BUSY,1,GoTo(error,1)
; исходящий канал канал занят — отправляем на экстеншн error,1
exten => s2-CHANUNAVAIL,1,GoTo(error,1)
; описание действия при ошибке
exten => error,1,Playback(/music/error)
; сбрасываем после ошибки
exten => error,n,Hangup
; сбрасываем после успешного разговора
exten => s,n,Hangup()
Ну как-то так.


Понравилась статья? Поделитесь со своими друзьями:


Другие познавательные статьи из рубрики - Компьютеры и программирование IT:


Оставить комментарий

Google+