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

asterisk -> curl -> 1c передача exten поднявшего разговор.

Проблемы Asterisk без вэб-оболочек и их решения

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

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

asterisk -> curl -> 1c передача exten поднявшего разговор.

Сообщение Volosko »

Добрый день!

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

Логичнее всего для меня показалось использовать CURL для этого, так как это убирает необходимость в использовании промежуточных решений.

Для прикидки что-то такое:

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

[sample-context]
exten => t,1,NoOp
exten => t,n,Macro(recording,${CALLERID(num)},${EXTEN})
exten => t,n,Dial(SIP/1111&SIP/2222&SIP/3333,90,tTgmM(myscript1))
####СЛОЖНОСТИ### :(
exten => t,n,Macro(1c-post,${CALLERID(number)},${EXTEN})

[macro-1c-post]
exten => s,1,NoOp(***postdata***)
same => n,set(date=${STRFTIME(,,%Y-%m-%d %H:%M:%s)})
same => n,set(in-number=${ARG1})
same => n,set(op-number=${ARG2})
same => n,curl(http://blabla.domain/1c-data.php,queuedatatoken=1234&date=${date}&${in-number}&${op-number})

Подскажите пожалуйста как ловить EXTEN поднявшего корректно ? То есть именно тот который взял разговор.
Полагаю что последующим возникнет сложность как передать дальше при переводе или при перехвате, но думаю что пока это вопрос будущего.
Извините если вопрос очень глупый, я не претендую на звание опытного :(
ded
Сообщения: 15622
Зарегистрирован: 26 авг 2010, 19:00

Re: asterisk -> curl -> 1c передача exten поднявшего разгово

Сообщение ded »

В вашем контексте на шаге исполнения
exten => t,n,Macro(1c-post,${CALLERID(number)},${EXTEN})
состояние переменной ${EXTEN}) будет равно t
Volosko
Сообщения: 26
Зарегистрирован: 03 апр 2018, 14:46

Re: asterisk -> curl -> 1c передача exten поднявшего разгово

Сообщение Volosko »

Вот на этом месте я и туплю.
Как сообразить такую строку которая бы при ответе передавала в $EXTEN или хоть в $PARAM значение того кто поднял.
Чтобы потом crul отправил это "наружу"
Volosko
Сообщения: 26
Зарегистрирован: 03 апр 2018, 14:46

Re: asterisk -> curl -> 1c передача exten поднявшего разгово

Сообщение Volosko »

Кажется дошло :) медленно...
И не факт что верно.
Но вырисовывается что-то вроде такой конструкции.
Если правильно понимаю то ${DIALEDPEERNUMBER}: Number of the called party - то есть искомое.

Но почему-то встречается упоминание в сети что это не работает.

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

[some-exten]
exten => t,1,NoOp
exten => t,n,Macro(recording,${CALLERID(num)},${EXTEN})
exten => t,n,Dial(SIP/1111&SIP/2222&SIP/3333,90,tTgmM(MyScript))


[macro-MyScript]
exten => s,1,noop(***postdata***)
same => n,set(date=${STRFTIME(,,%Y-%m-%d %H:%M:%s)})
same => n,set(in-number=${CALLERID(num)})
same => n,set(op-number=${DIALEDPEERNUMBER})
same => n,curl(http://blabla.domain/1c-data.php,queuedatatoken=1234&date=${date}&${in-number}&${op-number})
Volosko
Сообщения: 26
Зарегистрирован: 03 апр 2018, 14:46

Re: asterisk -> curl -> 1c передача exten поднявшего разгово

Сообщение Volosko »

То что выше неверно.
Оказалось верным следующее:

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

[some-context]
exten => t,1,NoOp
exten => t,n,Macro(recording,${CALLERID(num)},${EXTEN})
Далее использую избыточное присвоение, так как не уверен полностью, что передача прямо в парамертах макроса функции CALLERID(all) будет корректным.

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

exten => t,n,Set(WHOCALL=${CALLERID(all)})
А потом странно для меня, но рабочим оказалось именно так.

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

exten => t,n,Dial(SIP/1111&SIP/2222&SIP/3333,90,tTgmM(myscript1,${WHOCALL}))
Если написать exten => t,n,Dial(SIP/1111&SIP/2222&SIP/3333,90,tTgmM(myscript1,${WHOCALL},${DIALEDPEERNUMBER})) то почему то в макросе переменные in- & op- совпадают.

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

[macro-myscript1]
exten => s,1,CELGenUserEvent("Otvetil")    ;Генерирую событие в CEL для того чтобы потом кое-чего отловить
same => n,Set(date=${STRFTIME(,,%Y-%m-%d %H:%M:%s)}) 
same => n,Set(in-number=${ARG1})               ; принимаю параметр1 из вызова макроса

same => n,Set(op-number=${DIALEDPEERNUMBER})       ; если принимать это значение из параметр2, то не работает.

same => n,Set(rtn=${CURL(http://test.local/test.php,somefield=astertest&date=${date}&in-number=${in-number}&op-number=${op-number})})
same => n,Answer()

Я просто прям чувствую что ерунда получилась. Оно работает конечно. Но вопрос:
почему если передавать DIALEDPEERNUMBER из вызова макроса и принимать это в ARG2 то на выходе получается

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

 -- Executing [s@macro-myscript1:3] Set("SIP/2222-00008bcc", "in-number=2222") in new stack
 -- Executing [s@macro-myscript1:4] Set("SIP/2222-00008bcc", "op-number=2222") in new stack
[/i]
Аватара пользователя
dimondack
Сообщения: 62
Зарегистрирован: 16 сен 2019, 02:40

Re: asterisk -> curl -> 1c передача exten поднявшего разгово

Сообщение dimondack »

Эх, я тут попробовал тоже

[some-context]
exten =>_X.,1,Noop(++++++++++++${CHANNEL}++++++++++++++++)
exten =>_X.,n,Set(_fname=${STRFTIME(${EPOCH},,%Y%m%d%H%M%S)}-${CALLERID(number)})
exten => _X.,n,MixMonitor(/var/spool/asterisk/monitor/${fname}.wav)
exten => _X.,n,Set(CDR(recfile)=/var/spool/asterisk/monitor/${fname}.wav)
exten => _X.,n,Dial(SIP/${EXTEN},90,tTgmM(m1))
exten => _X.,n,Hangup()

[macro-m1]
exten => s,1,Noop(====DPN=======${DIALEDPEERNUMBER}==========)
;а если remote_host недоступен, то ..... надо бы обойти чтоб не тормозить процесс
exten => s,n,Set(CURL_REQ=${CURL(http://remote_host/1.php?param=${fname}_${CHANNEL})})
exten => s,n,Answer()



====а в это время======на стороне remote_host=====
1.php
---------------------------------
<?php
$p=($_REQUEST['param']);
echo $p;
.............

https://www.google.com/search?q=asteris ... e&ie=UTF-8

http://asterisk.ru/store/files/Asterisk ... de_4th.pdf
............
//echo 'hello';
?>
Vlad1983
Сообщения: 4251
Зарегистрирован: 09 авг 2011, 11:51

Re: asterisk -> curl -> 1c передача exten поднявшего разгово

Сообщение Vlad1983 »

example
вызовы Agi заменить на curl
ЛС: @rostel
Volosko
Сообщения: 26
Зарегистрирован: 03 апр 2018, 14:46

Re: asterisk -> curl -> 1c передача exten поднявшего разгово

Сообщение Volosko »

Спасибо что откликнулись!!!

Наиболее рабочим вариантом оказался:

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

[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}))
На самом деле в DIAL() с вызовом макроса через M(x) аргументы необходимо передавать через ^ то есть DIAL(SIP/1111,,M(macroname^$PARAM1^$PARAM2)
тогда как при просто вызове макроса они передаются через запятую.
Внимательное чтение мануалов упрощает жизнь однако!!! (это я сам себе)

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

[macro-myscript1]
exten => s,1,NoOp
same => n,Set(date=${STRFTIME(,,%Y-%m-%d %H:%M:%S)})
same => n,Set(in-number=${ARG1})
same => n,Set(op-number=${DIALEDPEERNUMBER})
same => n,Set(rtn=${CURL(http://test.local/test.php,queuedatatoken=astertest&date=${date}&in-number=${in-number}&op-number=${op-number})})
same => n,Answer()
и вот здесь все хорошо , а на выходе получаю:

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

{                                                                                                                                                                                                                      
"queuedatatoken": "astertest",
 "date": "2020-02-27 16:15:09",
 "in-number": "8121234567",
 "op-number": "2222"
 }
То есть корректно CURL будет отдавать в 1ску искомое.

ПС Правда мне сказали что я дурак и для этого существует AMI, но в целом еще одна вариация велосипеда из чего-то и палок собрана и работает :)
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH