VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

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

Новичком считается только что прочитавший «Астериск - будущее телефонии»
http://asterisk.ru/knowledgebase/books
и пытающийся сделать большее

Модераторы: april22, Zavr2008

Ответить
Volosko
Сообщения: 26
Зарегистрирован: 03 апр 2018, 14:46

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

Сообщение 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, задача вроде бы решена.
Но остался осадок и ощущение что как-то это неэлегантно.
Подскажите почему один и тот же процесс передачи значений ведет себя по-разному.
Volosko
Сообщения: 26
Зарегистрирован: 03 апр 2018, 14:46

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

Сообщение 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 не передается в этом случае.
Аватара пользователя
Zavr2008
Сообщения: 2211
Зарегистрирован: 27 янв 2011, 00:35
Контактная информация:

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

Сообщение 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 :)
Российские E1 шлюзы Alvis. Модернизация УПАТС с E1,Подключение к ИС "Антифрод" E1 PRI/SS#7 УВР Телестор, Грифин и др..
ded
Сообщения: 15626
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение ded »

А так?

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

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

[CheckInherit]
exten => test,1,NoOp(${FOO})
Аватара пользователя
Zavr2008
Сообщения: 2211
Зарегистрирован: 27 янв 2011, 00:35
Контактная информация:

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

Сообщение Zavr2008 »

Так даже более новичкам понятно, согласен.
Российские E1 шлюзы Alvis. Модернизация УПАТС с E1,Подключение к ИС "Антифрод" E1 PRI/SS#7 УВР Телестор, Грифин и др..
Volosko
Сообщения: 26
Зарегистрирован: 03 апр 2018, 14:46

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

Сообщение 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() отработал переход к макросу выполнился.
Аватара пользователя
Zavr2008
Сообщения: 2211
Зарегистрирован: 27 янв 2011, 00:35
Контактная информация:

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

Сообщение Zavr2008 »

Можно вызвать в макросе DumpChan() и посмотреть все переменные канала.
Российские E1 шлюзы Alvis. Модернизация УПАТС с E1,Подключение к ИС "Антифрод" E1 PRI/SS#7 УВР Телестор, Грифин и др..
virus_net
Сообщения: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

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

Сообщение virus_net »

DIALEDPEERNUMBER это служебная глобальная переменная и передавать её аргументом точно не надо.
При вызове dial, когда и исполняется ваша строка dialplan, она действительно пуста.
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
Аватара пользователя
Zavr2008
Сообщения: 2211
Зарегистрирован: 27 янв 2011, 00:35
Контактная информация:

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

Сообщение Zavr2008 »

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

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

${CUT(CUT(SIP_HEADER(To),@,1),:,2)}
Российские E1 шлюзы Alvis. Модернизация УПАТС с E1,Подключение к ИС "Антифрод" E1 PRI/SS#7 УВР Телестор, Грифин и др..
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH