ВидеоКонф(ВКС)  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

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

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

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

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

Сообщение Volosko » 26 фев 2020, 20:38

Ковырял использование ${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, 15:46

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

Сообщение Volosko » 26 фев 2020, 21:27

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 не передается в этом случае.
Volosko
 
Сообщений: 26
Зарегистрирован: 03 апр 2018, 15:46

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

Сообщение Zavr2008 » 27 фев 2020, 12:43

чтобы в макрос переменные уходили, можно их даже и параметрами не передавать - сделать через наследование.
Достаточно книжку одну веселую почитать и понять для чего добавляют префикс __ перед переменными - для наследования переменных канала

[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-GW. Модернизация УПАТС с E1, Установка FreePBX, Системы антифрод "в разрыв" потоков E1 PRI / SS#7 ISUP.
Аватар пользователя
Zavr2008
 
Сообщений: 2161
Зарегистрирован: 27 янв 2011, 01:35

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

Сообщение ded » 27 фев 2020, 13:31

А так?
Код: выделить все
[TestInherit]
exten => 100,1,Set( __ FOO=5)
exten => 100,2,Dial(Local/test@CheckInherit)

[CheckInherit]
exten => test,1,NoOp(${FOO})
ded
 
Сообщений: 15803
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение Zavr2008 » 27 фев 2020, 14:25

Так даже более новичкам понятно, согласен.
Российские шлюзы E1 Alvis-GW. Модернизация УПАТС с E1, Установка FreePBX, Системы антифрод "в разрыв" потоков E1 PRI / SS#7 ISUP.
Аватар пользователя
Zavr2008
 
Сообщений: 2161
Зарегистрирован: 27 янв 2011, 01:35

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

Сообщение Volosko » 27 фев 2020, 18:09

Спасибо, то что вы написали я понял.
но речь не о наследовании, если я не туплю.

Речь о поведении ${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() отработал переход к макросу выполнился.
Volosko
 
Сообщений: 26
Зарегистрирован: 03 апр 2018, 15:46

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

Сообщение Zavr2008 » 27 фев 2020, 21:06

Можно вызвать в макросе DumpChan() и посмотреть все переменные канала.
Российские шлюзы E1 Alvis-GW. Модернизация УПАТС с E1, Установка FreePBX, Системы антифрод "в разрыв" потоков E1 PRI / SS#7 ISUP.
Аватар пользователя
Zavr2008
 
Сообщений: 2161
Зарегистрирован: 27 янв 2011, 01:35

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

Сообщение virus_net » 28 фев 2020, 08:42

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

ENUMER - звони бесплатно и напрямую.
virus_net
 
Сообщений: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

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

Сообщение Zavr2008 » 28 фев 2020, 21:52

Почему бы в макросе, что срабатывает послек поднятия трубки на одном из телефонов, не почитать содержимое SIP-заголовка To, например
Код: выделить все
${CUT(CUT(SIP_HEADER(To),@,1),:,2)}
Российские шлюзы E1 Alvis-GW. Модернизация УПАТС с E1, Установка FreePBX, Системы антифрод "в разрыв" потоков E1 PRI / SS#7 ISUP.
Аватар пользователя
Zavr2008
 
Сообщений: 2161
Зарегистрирован: 27 янв 2011, 01:35


Вернуться в Вопросы новичков

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 30

© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH