Канал 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:
Предостережения:
Если Вы используете chan_local в Ваших call-файлах и Вы хотите передать некоторые переменные канала в Ваш контекст, не забудьте добавить '/n', так как иначе chan_local сам себя 'оптимизирует' и вырежет себя из пути прохождения вызова, и как следствие значения переменных будут потеряны. Например:Local/00531234567@pbx описывайте как: Local/00531234567@pbx/n
Ссылки по теме:
Каналы в Asterisk