AF
Asterisk Forum
обсуждения телефонии, VoIP и IP-PBX
12разделов
5 423тем
34 385сообщений
← К списку тем

Уведомлением о режиме CallWaiting+SIP аппараты

Asterisk GUI 21 сообщений 22.05.2013 18:21 - 02.05.2017 08:54
#1 22.05.2013 18:21

Уведомлением о режиме CallWaiting+SIP аппараты

Используется связка Asterisk 11.3.0+FreePBX 2.11+DialPlan Injection

Кто-то в свое время посоветовал для каждого телефона у которого используется CallWaiting применить связку DialPlanInjection
и присвоить вот такое значение для каждого номера в отдельности:

Код: Выделить всё

Macro(checkCW,${EXTEN}) GotoIf($[{GROUP_COUNT(${EXTEN})} > 1]?:Dial) Playback(abonent-razgovarivaet) Playback(zhdite-soedineniya) Set(DIAL_OPTIONS=Ttm) (Dial),Macro(exten-vm,novm,${EXTEN},${EXTEN},0,0,0)
в extensions_custom прописать:

Код: Выделить всё

[macro-checkCW] exten => s,1,Set(GROUP(tocall)=${CALLERID(number)}) exten => s,n,Set(GROUP(fromcall)=${ARG1})
конечно-же это работает, работает почти так как надо, НО, это работает только в случае применения однокональных телефонов подключенных к VOIP шлюзам, весело издавая посторонние писки в трубку оповещая о втором звонке ..
и совершенно не подходит в случае использования SIP аппаратов, так как они в режиме разговора уходят в статус InUSE&Ringing. Ну как водится руководство поставило именно такую задачу, чтобы был CallWaiting+Предупреждение.
да и вообще в случае SIP аппаратов и не видать обращения к данному Macro.

Помогите плиз решить задачку.


З.Ы. Вопрос даже не в том, чтобы ждать пока абонент наговорится, а в том, что когда приходит второй вызов по CallWait на экране остается информация о пропущенном вызове с номером звонившего.. это так удобно на самом деле, именно поэтому постановка звока в очередь не годится.
#2 18.06.2013 16:48
Люююди, помогитеже плииз, оч надо решить задачку :(
#3 18.06.2013 19:19
Опишите понятнее, чего вы хотите, как это должно выглядеть :)
#4 19.06.2013 15:47
хммм.

все с виду очень просто, необходимо чтобы в момент разоговора между абонетами A(X) (где X любой состояшийся звонок)
чтобы при попытке позвонить любого другого абонента на номер абоента "A" выдавалось госовое оповещение "Абонент разговаривает по другой линии" в прочем как у мобильных операторов. при этом у абонета "A" должен отрабатывать именно режим CallWaiting - т.е. абонент "А" должен во время разговора видеть на экране и соответсвенно слышать пик в трубке, что кто-то пытается дозвониться


Та схема которую я выложил актуально работает только для аналоговых абонентов подключенных через шлюз и совершенно не работает в случае использования многоканальных SIP аппаратов. надо решить именно для SIP аппаратов.
#5 19.06.2013 20:39
DEVICE_STATE проверяйте перед звонком, и воспроизводите файл
#6 20.06.2013 08:45
хмм, а можно по подробнее с этого момента?
да, я естесственно забыл добавить что у меня несколько Asterisk связанные по IAX
#7 20.06.2013 09:42

Код: Выделить всё

core show function DEVICE_STATE
Посмотрите на статусы пира когда он занят и когда свободен.
#8 20.06.2013 11:59
как псмотреть понятно, а как обработать этот параметр?
#9 20.06.2013 14:22
Книжку по Asterisk прочитайте.
#11 16.09.2013 14:47
Тут тема про Asterisk GUI, зачем же отсылать на книжку в которой про этот GUI практически ничего нету.

Мне кстати, тоже такой функционал интересен.
Если кто знает как такое сделать в FreePBX - напишите пожалуйста.
#12 20.09.2013 02:52
в /var/www/admin/modules/core/functions.inc.php
меняем строку в контексте $mcontext = 'macro-dial-one';

Код: Выделить всё

$ext->add($mcontext,$exten,'godial', new ext_dial('${DSTRING}', '${ARG1},${D_OPTIONS}'));
на

Код: Выделить всё

 $ext->add($mcontext,$exten,'godial', new ext_execif('$["${QAGENT}"=""]', 'Macro', 'CHECK_DEVICE_STATE,')); $ext->add($mcontext,$exten,'', new ext_dial('${DSTRING}', '${ARG1},${D_OPTIONS}'));

в extensions_custom.conf

Код: Выделить всё

[macro-CHECK_DEVICE_STATE] exten => s,1,Noop(DEVICE STATE - ${DEVICE_STATE(${DSTRING})}) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Playback(abonent-govorit-po-drugoi-linii)) 
#13 19.11.2013 16:58
Походу заработало, спасибо.

Для решения проигрывания музыки необходимо забить в переменную D_OPTIONS=Ttm

Код: Выделить всё

[macro-CHECK_DEVICE_STATE] exten => s,1,Noop(DEVICE STATE - ${DEVICE_STATE(${DSTRING})}) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Playback(abonent-razgovarivaet&zhdite-soedineniya)) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Set(D_OPTIONS=Ttm)) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "RINGINUSE"]?Playback(abonent-razgovarivaet&zhdite-soedineniya)) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "RINGINUSE"]?Set(D_OPTIONS=Ttm)) 
СЛАВА и ХВАЛА: bayadr

ЗЫ. Конечно всплыла маленькая засада, а может и фича, iPECS-MG (1.7Di). Засада с Mobile Extension, если iPECS получил Playback от Asterisk, iPECS тутже включает DN Busy и начинает гнать трафик через себя, вместо того, чтобы продолжить спокойно звонить по аппарату.

Вообще конечно прикрепить бы решение, потому что дейстительно многие спрашивают как это сделать.
#14 20.11.2013 12:40
Всплыла еще одна засада, с этой функцией теперь если
CW включен, а также имеется включенный Follow Me, то проверка статуса не происходит просто звонок уходит на FollowMe

есть мнение, что это сваязано с

Код: Выделить всё

 -- Executing [332@from-trunk:18] GotoIf("IAX2/05020-2042", "1 ?skipsimple") in new stack
т.е. необходиомо использовать проверку в модуле findmefollow в блоке group dial

Код: Выделить всё

// group dial $ext->add($contextname, $grpnum, 'skipsimple', new ext_setvar('RingGroupMethod',$strategy)); $ext->add($contextname, $grpnum, '', new ext_setvar('_FMGRP',$grpnum)); 
#15 15.12.2014 16:53
Помогите плиз научиться брать состояние PJSIP абонентов (Asterisk 13 + FreePBX 12)
[off]и теперь явно стало сложнее изменять сами файлы php, теперь FreePBX во всю орет что у него нарушение Security, ну как бы это правильно на самом деле, но надо как-то подумать теперь как обойти изменение именно PHP.[/off]

В общем теперь изменять PHP не требуется, теперь разработчики FreePBX предусмотрели и этот вариант, воткнув обращение к недостающему от базы контексту "dialout-one-predial-hook"
т.е. в 12 FreePBX достаточно сразу воткнуть в файл extensions_custom.conf (актуально для SIP абонентов)

Код: Выделить всё

[macro-dialout-one-predial-hook] exten => s,1,Noop(DEVICE STATE - ${DEVICE_STATE(${DSTRING})}) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Playback(abonent-razgovarivaet&zhdite-soedineniya)) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Set(D_OPTIONS=Ttm)) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "RINGINUSE"]?Playback(abonent-razgovarivaet&zhdite-soedineniya)) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "RINGINUSE"]?Set(D_OPTIONS=Ttm))
Неожиданно порадовали!

Осталось теперь научиться выяснять состояние PJSIP абонентов, ибо теперь для PJSIP абонентов идет ответ:

Код: Выделить всё

-- Executing [s@macro-dialout-one-predial-hook:1] NoOp("SIP/011002-000000a4", "DEVICE STATE - INVALID") in new stack
хотя собственно core show hints показывает:

Код: Выделить всё

1704@ext-local : PJSIP/1704&Custom:DN State:Ringing Presence: Watchers 0
P.S. эдак теперь можно много чего в predial обработать... :)
#16 28.07.2015 10:25
Всем добрый день .
Подыму данную тему , все отлично работает как описано в решении Alexey_Astashov , но вот только до тех пор пока не включен Follow Me , как и писал ТС . Вопрос , как собственно заставить это работать и с включенным Follow Me .
Система FreePBX 2.11 .
#17 20.01.2016 05:37
Alexey_Astashov, написал как сделать, но у меня не работает. куда копать?
#18 16.02.2016 10:42
Для правильной работы, данной опции при включенной FollowMe - необходимо использовать тип стратегии вызова ringallv2, просто ringall (v1) - не подходит, совсем, инъекция отрабатывать не будет, так как "v1" пользуется другим набором макро.
если стоит ringallv2-prim - то Asterisk получит ошибку и не обработает макрос.

Для удобства можно выставить
Default Follow Me Ring Strategy - ringallv2

Но в целом можно поиграться с данными параметрами, так как у меня есть еще одна проблема, которую я никак решить не могу - это циклический вызов через FMC.

Сорре, что не мог написать раньше.

Added after 23 minutes:


> Alexey_Astashov, написал как сделать, но у меня не работает. куда копать?

Что у вас не работает?
какая версия FBPX?
#19 27.06.2016 05:58
спасибо вам добрые люди, проверил на 12 freepbx работает. есть вопросы

Код: Выделить всё

[macro-dialout-one-predial-hook] exten => s,1,Noop(DEVICE STATE - ${DEVICE_STATE(${DSTRING})}) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Playback(abonent-razgovarivaet&zhdite-soedineniya)) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "INUSE"]?Set(D_OPTIONS=Ttm)) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "RINGINUSE"]?Playback(abonent-razgovarivaet&zhdite-soedineniya)) exten => s,n,ExecIf($["${DEVICE_STATE(${DSTRING})}" = "RINGINUSE"]?Set(D_OPTIONS=Ttm))
INUSE и RINGINUSE чем отличаются? я так понял что возможно на них делать разные кголосовые сообщения, но чем они отличаются не понятно.
Предположу что INUSE это уже поднятая трубка, а RINGINUSE это еще кто-то звонит. Так?

И почему-то после проигрывания приветствия идет музыка, но в этом коде я не вижу где эта музыка, видимо moh, прописана. Хотя из вербоса видно, что вызывается followme ringallv2 и без разницы включен он или нет. странно. можете пояснить по подробнее?
#20 27.06.2016 10:21
INUSE - когда разговаривает абонент, RINGINUSE - когда мало того, что абонент разговаривает, так к нему еще кто-то стучится, кроме вас всмысле, т.е. когда вы придёте третьим, четвертым итд, так как это на самом деле совсем другой статус.
В этом случае не требуется как правило делать другое оповещение, но конечно это возможно.

Музыка потому что стоит Ttm (где "T" - dtmf в один конец, "t" - dtmf в другой конец, "m" - moh, а "r" соответственно будет - ring), можно также прописать источник музыки или звуковых файлов с рекламой.
#21 02.05.2017 08:54
Большое спасибо. Всё работает. Не могли бы вы подсказать, как сделать, что бы этот макро (инклюд) не выполнялся для определённых экстеншенов.