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

Назад

  • asterisk/cmd/chanisavail.txt
  • Последние изменения: 2010/01/13