Канал Local


chan_local - это псевдоканал. Использование этого канала в плане набора позволяет Вам просто перенаправить уже поступивший вызов в другой контекст плана набора. Часто используется при рекурсивном поиске маршрута для поступившего вызова; В данном случае имеется возможность вернуться в исходную точку в плане набора после завершения вызова.

Синтаксис:

Local/extension@context[/n]

Добавление "/n" в конце строки, заставит локальный канал не производить нативный перевод вызова (native transfer) ("n" - сокращение для "n"o release) до того как вызываемый абонент не ответит на вызов. В этом содержиться скрытая, но важная особенность, когда от Локального канала вы ожидаете обработку вызова в точности такую же, как и при использовании обычного канала. Если у Вас не включена возможность "no release", тогда, как только вызываемый абонент (вызываемый через Локальный канал) отвечает на вызов, переменные и обрабатываемая точка в плане набора будет возвращены в исходное состояние на момент вызова по Локальному каналу, а Локальный канал переходит в зомбированное состояние и будет удален из списка активных каналов. Это может быть желанным результатом в некоторых ситуациях, но может привести к неожиданному поведению плана набора, если Вы производите какие-то дополнительные действия с переменными в Вашем обработчике вызовов.


Назначение:

Конструкции с использованием Локального канала могут быть использованы для отправки поступившего вызова в любую точку Вашего плана набора.

Предположим, что в вашей системе имеется карта TE410P. И Вы хотите сделать некие действия, при которых Вам понадобиться использовать команду Dial (например, когда вы помещаете файл для автоматического набора в /var/spool/outgoing), но еще хотите использовать в вашем плане набора процедуру поиска маршрута с минимальной стоимостью (least-cost-routes) или другие алгоритмы. То, что нам нужно сделать до набора номера, мы делаем до того, как chan_local создаст связь между двумя портами, один из которых - это E410P, а другой - это место, где используется команда Dial для совершения вызовов. При этом Вы можете полностью контролировать действия в том месте плана набора, где совершаются исходящие вызовы.

Конечно, это можно было сделать, применив некоторые уловки, но с использованием chan_local позволяет сделать этот процесс более понятным.

Драйвер канала "Local" позволяет вам конвертировать любой екстеншен в канал. Это используется в различных ситуациях, включая работу с агентами очереди вызовов и т.д.

Ниже приведены некоторые примеры (в основном при использовании конференций), где может быть использован локальный канал:
  • Допустим, что вы хотите сделать WEB интерфейс для билинга использования конференций... Вы можете создать Ваш скрипт, который будет спрашивать вызываемый номер, и использовать "Local/number@context" в качестве канала в Вашем .call файле, где вы определяете конференцию в качестве екстеншена для вызова.
  • Предположим, что вы хотите соединить две конференции между собой.
  • Предположим, что вы хотите добавить музыку ожидания (MusicOnHold) в конференцию (только вот зачем).
  • Вы хотите использовать .call файлы для автоматического набора номера, а так же хотите быть уверенными, что CDR записи и записи в логе будут созданы.

Это так же позволяет нам переходить из контекста в контекст, как при использовании команды Gosub; Смотри примеры ниже.

Примеры:


[ inbound ]
; Сюда поступают все входящие вызовы
exten => s,1,Answer
exten => s,2,Dial(local/200@internals,30,r)
exten => s,3,Playback(sorrynoanswer)
exten => s,4,Hangup

[ internals ]
; сюда наши телефоны попадают по умолчанию
exten => 200,1,Dial(sip/blah)
exten => 200,102,VoiceMail(${EXTEN}@default)

exten => 201,1,Dial(zap/1)
exten => 201,102,VoiceMail(${EXTEN}@default)

exten => _0.,1,Dial(Zap/g1/${EXTEN:1}) ; исходящие вызовы в виде 0+номер

so that let me to call a local (internal) extension, without:
  • duplicate the dial & voicemail statements
  • don't letting them to dial out, since in internal context I have the possibility to dialout.

Предостережения:

Если Вы используете chan_local в Ваших call-файлах и Вы хотите передать некоторые переменные канала в Ваш контекст, не забудьте добавить '/n', так как иначе chan_local сам себя 'оптимизирует' и вырежет себя из пути прохождения вызова, и как следствие значения переменных будут потеряны. Например:

Local/00531234567@pbx описывайте как: Local/00531234567@pbx/n

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



Каналы в Asterisk