Страница 1 из 1

Подскажите по DIAL() и M(macro)

Добавлено: 26 фев 2020, 19:38
Volosko
Ковырял использование ${DIALEDPEERNUMBER}: Номер вызываемого абонента.
Хочу с помощью этого параметра ловить того кто снял трубку.
И дальше столкнулся со следующим:

Сначала я попытался ловить нужное мне прям в макросе (чтобы не переписывать много, все равно в DIAL уже есть макрос) и это не работает:

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

[some-context]
exten => t,1,NoOp
exten => t,n,Dial(SIP/1111&SIP/2222&SIP/3333,90,tTgmM(myscript1))

[macro-myscript1]
exten => s,1,NoOp
same => n,Set(in-number=${CALLERID(all)})
same => n,Set(op-number=${DIALEDPEERNUMBER})
same => n,Set(rtn=${CURL(http://test.local/test.php,post-data)})
same => n,Answer()
Получаю:

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

    -- Executing [s@macro-mysrcipt1:3] Set("SIP/2222-00008d05", "in-number="XXX" <2222>") in new stack
    -- Executing [s@macro-myscript1:4] Set("SIP/2222-00008d05", "op-number=2222") in new stack

ОК! Ладно подумал я. Видимо в макросе ловить параметры не хорошо. ОК, буду передавать макросу прямо в DIAL. Читаю про DIAL() и вижу:
M(x): Заставляет выполнить macro (x) в момент ответа на вызов.
Отлично же! то что надо. Буду передавать макросу параметры прямо из DIAL и ловить их там в ARG1 и ARG2

Делаю так:
:? НЕ работает!

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

[some-context]
exten => t,1,NoOp
exten => t,n,Set(WHOCALL=${CALLERID(all)})
exten => t,n,Dial(SIP/1111&SIP/2222&SIP/3333,90,tTgmM(myscript1,${WHOCALL},${DIALEDPEERNUMBER}))

[macro-myscript1]
exten => s,1,NoOp
same => n,Set(in-number=${ARG1})
same => n,Set(op-number=${ARG2})
same => n,Set(rtn=${CURL(http://test.local/test.php,post-data)})
same => n,Answer()
на выходе получаю:

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

    -- Executing [s@macro-mysrcipt1:3] Set("SIP/3333-00008d41", "in-number=8121234567") in new stack
    -- Executing [s@macro-mysrcipt1:4] Set("SIP/3333-00008d41", "op-number=") in new stack
АГААААА! то есть тут просто не пришел DIALEDPEERNUMBER. Видимо в момент вызова макроса, DIAL() еще не отдает это значение, хотя странно это как-то.

ОК Значит возьмем лучшее из двух вариантов!
Хотя я вот совсем не понял почему так, где читать !?
Но сделаю: CALLERID буду передавать через скрипт, а DIALEDPEERNUMBER буду ловить внутри макроса, это странно но вдруг!? :D

Работает?!?!

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

[some-context]
exten => t,1,NoOp
exten => t,n,Set(WHOCALL=${CALLERID(all)})
exten => t,n,Dial(SIP/1111&SIP/2222&SIP/3333,90,tTgmM(myscript1,${WHOCALL}))

[macro-myscript1]
exten => s,1,NoOp
same => n,Set(in-number=${ARG1})
same => n,Set(op-number=${DIALEDPEERNUMBER})
same => n,Set(rtn=${CURL(http://test.local/test.php,post-data)})
same => n,Answer()
На выходе:

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

    -- Executing [s@macro-mysrcipt1:3] Set("SIP/2222-00008d67", "in-number=8121234567") in new stack
    -- Executing [s@macro-mysrcipt1:4] Set("SIP/2222-00008d67", "op-number=2222") in new stack


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

Re: Подскажите по DIAL() и M(macro)

Добавлено: 26 фев 2020, 20:27
Volosko
Volosko писал(а):exten => t,n,Dial(SIP/1111&SIP/2222&SIP/3333,90,tTgmM(myscript1,${WHOCALL},${DIALEDPEERNUMBER}))
простите, конечно же
exten => t,n,Dial(SIP/1111&SIP/2222&SIP/3333,90,tTgmM(myscript1^${WHOCALL}^${DIALEDPEERNUMBER}))


Но это не решает проблему того что DIALEDPEERNUMBER не передается в этом случае.

Re: Подскажите по DIAL() и M(macro)

Добавлено: 27 фев 2020, 11:43
Zavr2008
чтобы в макрос переменные уходили, можно их даже и параметрами не передавать - сделать через наследование.
Достаточно книжку одну веселую почитать и понять для чего добавляют префикс __ перед переменными - для наследования переменных канала
[TestInherit]
exten => 100,1,Set( __ FOO=5)
exten => 100,2,Dial(Local/test@CheckInherit)
exten => test,1,NoOp(${FOO})

Как результат, переменная FOO будет унаследована. Без символов подчеркивания, в новом канале типа local эта переменная будет не определена.
http://asterisk.ru/knowledgebase/Asterisk+variables

В Вашем случае в макрос естественно, а не через chan Local.

и почему callerid(all), а не callerid(num)?

ded, там ошибка в статье кстати, не @CheckInherit, а @TestInherit :)

Re: Подскажите по DIAL() и M(macro)

Добавлено: 27 фев 2020, 12:31
ded
А так?

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

[TestInherit]
exten => 100,1,Set( __ FOO=5)
exten => 100,2,Dial(Local/test@CheckInherit)

[CheckInherit]
exten => test,1,NoOp(${FOO})

Re: Подскажите по DIAL() и M(macro)

Добавлено: 27 фев 2020, 13:25
Zavr2008
Так даже более новичкам понятно, согласен.

Re: Подскажите по DIAL() и M(macro)

Добавлено: 27 фев 2020, 17:09
Volosko
Спасибо, то что вы написали я понял.
но речь не о наследовании, если я не туплю.

Речь о поведении ${DIALEDPEERNUMBER}

Вариант1 :

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

[some-context]
exten => t,1,NoOp
exten => t,n,Dial(SIP/1111,,M(myscript1^${DIALEDPEERNUMBER}))

[macro-myscript1]
exten => s,1,NoOp
same => n,Set(operator-number=${ARG1})
same => n,NoOp(${operator-number})
Вариант2:

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

[some-context]
exten => t,1,NoOp
exten => t,n,Dial(SIP/1111,,M(myscript1))

[macro-myscript1]
exten => s,1,NoOp
same => n,Set(operator-number=${DIALEDPEERNUMBER})
same => n,NoOp(${operator-number})
Читаю: M( macro^arg ) - Execute the specified macro for the called channel before connecting to the calling channel
"Выполняет указанный макрос для вызываемого канала перед подключением к вызывающему каналу"

И вот тут теряюсь.

Значит макрос выполняется после того как DIAL куда-то дозвонился, но при этом переменная ${DIALEDPEERNUMBER} не передаётся в этот момент как параметр тк она еще пустая. Но почему она пустая на этот момент? Если появился вызываемый канал и DIAL выполняет макрос то она не должна быть пустая.

Вот тут затык.

То что она в макросе уже имеет значение это понятно, DIAL() отработал переход к макросу выполнился.

Re: Подскажите по DIAL() и M(macro)

Добавлено: 27 фев 2020, 20:06
Zavr2008
Можно вызвать в макросе DumpChan() и посмотреть все переменные канала.

Re: Подскажите по DIAL() и M(macro)

Добавлено: 28 фев 2020, 07:42
virus_net
DIALEDPEERNUMBER это служебная глобальная переменная и передавать её аргументом точно не надо.
При вызове dial, когда и исполняется ваша строка dialplan, она действительно пуста.

Re: Подскажите по DIAL() и M(macro)

Добавлено: 28 фев 2020, 20:52
Zavr2008
Почему бы в макросе, что срабатывает послек поднятия трубки на одном из телефонов, не почитать содержимое SIP-заголовка To, например

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

${CUT(CUT(SIP_HEADER(To),@,1),:,2)}