parking&paging

Еще одна рабочая неделя, в этот раз шестидневная и еще один забавный аспект настройки PBX.
Хочется сказать админам нашего заведения спасибо за интернет, такой проводной интернет у меня впервые с 2004 года, когда у меня была безлимитка 4на4:)

Паркинг — парковка вызова, мы можем взять трубу в одном месте, поговорить, запарковать и перейти в другое и продолжить разговор.
Есть и пейджинг(для обычного офиса не очень нужная вещь, заменяет громкоговоритель ну или стук в стену типа «Галя тоби дзвонять») как по мне проще перекинуть вызов сразу на номер Гали:))
За эти функции отвечает файл features.conf.
Многие функции работают с помощью DTMF и только из под Dial или Queue, опции K, k, H, h, T, t, W, w, X, x.
Сам телефон так же может делать трансфер в обход Asterisk.
Рассмотрим опции это файла подробнее:

[general]

Опция Значение Примечание
parkext 700 Номер для парковки вызова
parkpos 701-720 Номер куда будут запаркованы вызовы. Забрать с парковки можно, позвонив по соответствующему номеру
context parkedcalls Контекст в котором создаются парковочные лоты и находиться номер для парковки
parkinghints no Вкл/Выкл автосоздание хинтов для парковочного места, телефоны могут подписаться на состояние экстеншена, на парковке.
parkingtime 45 Время ожидания на парковке.
comebacktoorigin yes По истечению parkingtime отправляет вызов откуда его парковали
courtesytone beep Сигнал который звучит припаркованному при снятии его с парковки
parkedplay caller Кому играть courtesytone когда вызов снимается с парковки. Опции: callee, caller, both или no(по умолчанию).
parkedcalltransfers caller Кто может сделать трансфер припаркованного вызова с помощью DTMF. Опции: callee, caller, both или no(по умолчанию).
parkedcallreparking caller Кто может перепарковать, припаркованный вызов с помощью DTMF. Опции: callee, caller, both или no(по умолчанию).
parkedcallhangup caller Кто может убить, припаркованный вызов с помощью DTMF. Опции: callee, caller, both или no(по умолчанию).
parkedcallrecording caller Кто может инициировать запись, с помощью DTMF. Опции: callee, caller, both или no(по умолчанию).
parkeddynamic yes Позволяет создавать динамические парковочные слоты в диалплане. Должны быть установлены переменные канала PARKINGDYNAMIC, PARKINGDYNCONTEXT, PARKINGDYNPOS
adsipark yes Передает ADSI инфо о припаркованном вызове тому кто припарковал
findslot next логика выбора парковочного слота
parkedmusicclass default Класс музыки ожидания для припаркованного, класс установленный с помощью функции диалплана CHANNEL(musicclass) имеет больший приоритет
transferdigittimeout 3 К-во секунд ожидания каждой цифры от звонящего при переводе(трансфере)
xfersound beep Звук сигнализирующий о успешном завершении трансфера
xferfailsound beeperr Звук сигнализирующий о не успешной попытке трансфера
pickupexten *8 Номер для принятия звонка
pickupsound beep Сигнал о успешном снятии звонка с парковки
pickupfailsound beeperr Сигнал о не успешном снятии звонка с парковки
featuredigittimeout 1000 Таймаут в мс, между нажатиями клавиш, при наборе features(какой то фишки типа *8) во время bridged(через Астериск) вызова с помощью DTMF
atxfernoanswertimeout 15 Таймаут ожидания ответа при attended transfer(трансфере при котором вы сначала говорите с тем кому передаете
atxferdropcall no Поведение attended transfer, когда передающий положил трубку до завершения передачи. По умолчанию no, и будет попытка перезвонить передающему.
atxferloopdelay 10 Время между попытками обратного вызова если atxferdropcall=no.
atxfercallbackretries 2 К-во попыток обратного звонка если atxferdropcall=no.

Раздел
[featuremap]

Опция Значение Примечание Dial()/Queue() Флаги
blindxfer #1 Слепой трансфер T, t
disconnect *0 Бросить трубку H, h
automon *1 Начать/закончить запись разговора с помощью Monitor() W, w
atxfer *2 АвтоТрансфер T, t
parkcall #72 Парковка вызова K, k
automixmon *3 Начать/закончить запись разговора с помощью MixMonitor() X, x

Раздел
[applicationmap]

Позволяет привязать DTMF код к приложению диалплана, Звонящий на время выполнения приложения становится на ожидании
Синтаксис:

 => ,[/],([])[,MOH_Class]

1. Назначаем имя, сможем использовать в диалплане через переменную DYNAMIC_FEATURES.
2. Определяем DTMF код рекомендуется минимум 2 символа:)
3. Какой канал может использовать и какой канал может активировать(по умолчанию оба канала могут использовать/активировать «фишку»)
4. Указываем приложение и аргументы которые будут связаны с DTMF кодом.
5. Указываем класс music on hold (MOH), если не задать то будет тишина

agi_test => *6,self/callee,AGI(agi-test.agi),default

Как только начал выполняться код стороннего скрипта, мы больше не можем вызывать приложения которые переключают выполнение диалплана как Goto(), Macro(), Background(), итд.

Для того чтобы эта «штука» стала доступна из диалплана, ее нужно подключить установить значение DYNAMIC_FEATURES перед вызовом Dial.

exten => 101,n,Set(__DYNAMIC_FEATURES=agi_test)
exten => 101,n,Dial(SIP/0002)

Если хотим подключить более одной специальной возможности, то при обьявлении следует их указывать через #
Set(__DYNAMIC_FEATURES=agi_test#my_other_map)

Переменная канала ассоциируется с каналом и обычно не наследуется, но это можно исправить, при задании переменной нужно использовать
_ — разрешает один трансфер значения переменной
__ — трансфер переменной на протяжении всей жизни канала
Читать значение переданной переменной без нижних подчеркиваний

Примеры:

;одноразовая передача
exten => example,1,Set(_MyVariable=thisValue)
;передача на протяжении жизни канала
exten => example,1,Set(__MyVariable=thisValue)
Для чтения значения не использовать нижние подчеркивания:
exten => example,1,Verbose(1,Value of MyVariable is: ${MyVariable})

Также можно группировать различные функции в группы и подключать их целыми группами

[shifteight]
unpauseMonitor => *1 ; custom key mapping
pauseMonitor => *2 ; custom key mapping
agi_test => ; no custom key mapping

Вызов в диалплане

; использовать __ для того чтобы обе стороны вызова получили эти функции
Set(__DYNAMIC_FEATURES=shifteight)

О пейджинге я свое мнение высказал в начале)
Работает пейджинг и через SIP,DAHDI,Multicast.
Вызывается с помощью Page(), есть всякие вкусные опции
Пример:

[global]
MULTICAST=MulticastRTP/linksys/239.0.0.1:1234
;MULTICAST=MulticastRTP/linksys/239.0.0.1:1234/239.0.0.1:6061 
; для SPA (Linksys/Cisco)
BOGEN=SIP/777 ; 
PAGELIST=${MULTICAST}&${BOGEN} ; All of these variable names are arbitrary.
[page_context] 
exten => *724,1,Page(${PAGELIST},i,120) 

Если по честному, то я пользовался паркингом и пейджингом раза 2 в жизни, особо не пригодилось)

Комментарии: