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

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

Добавлено: 25 фев 2020, 14:58
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 поднявшего корректно ? То есть именно тот который взял разговор.
Полагаю что последующим возникнет сложность как передать дальше при переводе или при перехвате, но думаю что пока это вопрос будущего.
Извините если вопрос очень глупый, я не претендую на звание опытного :(

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

Добавлено: 25 фев 2020, 15:11
ded
В вашем контексте на шаге исполнения
exten => t,n,Macro(1c-post,${CALLERID(number)},${EXTEN})
состояние переменной ${EXTEN}) будет равно t

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

Добавлено: 26 фев 2020, 15:05
Volosko
Вот на этом месте я и туплю.
Как сообразить такую строку которая бы при ответе передавала в $EXTEN или хоть в $PARAM значение того кто поднял.
Чтобы потом crul отправил это "наружу"

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

Добавлено: 26 фев 2020, 15:48
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})

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

Добавлено: 26 фев 2020, 17:44
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]

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

Добавлено: 27 фев 2020, 12:32
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';
?>

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

Добавлено: 27 фев 2020, 12:53
Vlad1983
example
вызовы Agi заменить на curl

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

Добавлено: 27 фев 2020, 16:49
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, но в целом еще одна вариация велосипеда из чего-то и палок собрана и работает :)