Загружается...
 

ChanIsAvail


Назначение

Проверка на доступность канала

Описание

ChanIsAvail (Technology/resource[&Technology2/resource2...][|options])

Проверяет есть ли доступные каналы для совершения вызова.
Этой командой будут установлены значения следующих переменных:

${AVAILCHAN} - имя канала доступного для совершения вызова, если такой есть.
${AVAILORIGCHAN} - стандартное имя канала, которое было использовано при его создании
${AVAILSTATUS} - содержит код статуса доступного канала.

Опции (появились, начиная с Asterisk v1.2?):

s - Рассматривает канал как недоступный, если он всегда используется.
j - Включает поддержку перехода на команду с приоритетом n+101, если нет доступных каналов.

Некоторые моменты

На данный момент, ChanIsAvail работает только для каналов ZAP, IAX2, mISDN и SIP. Протокол MGCP - не поддерживается.

Если из запрашиваемых каналов нет ни одного доступного для совершения вызова, то будет совершен переход на приоритет n+101 (за исключением случаев, когда приоритета с таким значением не существует. В этом случае кодом возврата команды ChanIsAvail будет значение -1).

Если есть один или более доступных каналов, из запрашиваемых, то следующей командой будет та, что задана с приоритетом n+1, а в переменной канала ${AVAILCHAN} будет возвращено имя доступного канала, а код возврата команды ChanIsAvail будет значение 0.

Каналы проверяются на доступность в том порядке, в каком они перечислены в команде. В переменной ${AVAILCHAN} будет возвращено имя первого доступного канала из списка.

Обратите внимание, что команда ChanIsAvail() возвратит в переменной $AVAILCHAN не только имя канала, но еще и добавит к нему идентификатор сессии канала (channel session ID). Вам необходимо будет отделить этот идентификатор, например, как показано в нижеприведенном примере.

SIP, IAX

Команда ChanIsAvail - это не решение вопроса занят ли вызываемый абонент или нет, ее основная задача сообщить Вам имеется ли возможность совершить вызов заданного екстеншена. А решение о том будет ли Ваш вызов успешным или нет, полностью зависит от клиента, которого Вы вызываете, а он может просто отвергнуть Вашу попытку вызова, однако это совсем не значит, что абонент находится в состоянии "занятости" (busy).
Итак: Если Вы хотите использовать команду ChanIsAvail для определения того, что SIP клиент зарегистрирован или известен системе, то это будет работать прекрасно. Если же с ее помощью Вы хотите ограничить число одновременных вызовов абоненту, то с большой вероятностью эта команда Вам не поможет.

Пример


; Проверяем занятость линии 2. Если она занята, используем линию 1.
exten => s,1,ChanIsAvail(Zap/2&Zap/1)

; ${AVAILCHAN} может теперь содержать значение: Zap/2-1
; Нам необходимо отрезать идентификатор сессии.
exten => s,2,Cut(theChannel=AVAILCHAN,,1)

; переменная ${theChannel} должна теперь иметь значение: Zap/2
; Набираем через этот канал номер '12345678'
exten => s,3,Dial(${theChannel}/12345678)
exten => s,4,Hangup

; Если все линии заняты, проигрываем сообщение
exten => s,102,Playback(all-circuits-busy-now)
exten => s,103,Hangup


Комментарии пользователей

Канал SIP и команда ChanIsAvail (декабрь 2005)

Согласно: bug 4506, команда Chanisavail совсем не предназначена для определения занят ли вызываемый телефон или нет, она только проверяет, имеется ли возможность у asterisk совершить вызов указанного абонента.
Попытки использовать ограничение числа вызовов и команды Chanisavail для канала SIP не работают. Количество занятых каналов определяется только для вызываемых абонентов (peer), и когда он получает входящий вызов, на который нет ответа, то количество занятых каналов уменьшается и остается прежним, что, вроде как, ошибочное предположение.
Вместо этого способа, используйте группы.


Ссылки по теме:


--
Вернуться в Asterisk - documentation of application commands
Создано admin. Последнее изменение: четверг 15 / декабрь, 2005 09:09:25 MSK автор admin.