Есть задача по интеграции CRM и Asteriska. Для реализации этого был выбран путь GET-POST запросов. Логика следующая: 1.Пришел звонок 2.Запрос на сервере с номером звонящего 3.Определение новый или существующий клиент 4.Отправка звонка в соответствующий правилу подпункт.
Вот код Extension_Custom
[20003-incoming] exten => s,1,Set(CALLERID(name)=${CURL(http://trulala/call?tel={CALLERID(num)})})
exten => s,2,Set(managernumber=${CUT(CALLERID(name),>,3)})
exten => s,3,Set(managernumber=${CUT(managernumber,\",6)})
exten => s,4,Set(managerID=${CUT(CALLERID(name),>,3)})
exten => s,5,Set(managerID=${CUT(managerID,\",4)})
exten => s,6,Set(__Clientnum=${CALLERID(num)})
exten => s,7,Set(CALLERID(name)=${CUT(CALLERID(name),>,3)})
exten => s,8,Set(CALLERID(name)=${CUT(CALLERID(name),\",2)})
exten => s,n,ExecIf($[ "${managernumber}" = "null" ] ?Gosub(new-client,s,1))
exten => s,n,ExecIf($[ "${CALLERID(name)}" = "null" ] ?Gosub(new-client,s,1))
exten => s,n,Dial(Local/${managernumber},,mM(manager-answered,))
exten => s,n,Goto(s-${DIALSTATUS},1)
exten => s-NOANSWER,1,Gosub(manager-busy,s,1)
exten => s-BUSY,1,Gosub(manager-busy,s,1)
exten => s-UNKNOWN,1,Gosub(manager-busy,s,1)
exten => s-CONGESTION,1,Gosub(manager-busy,s,1)
exten => s-CHANUNAVAIL,1,Gosub(manager-busy,s,1)
exten => h,1,Set(rtn=${CURL(http://trulala/ecall,Status=${CDR(disposition)} exten1=${CDR(dstchannel)} exten=${CDR(dst)} & cidnum=${CALLERID(num)}&AllCallTime=${CDR(duration)}&CallTime=${CDR(billsec)})})
exten => h,2,Wait(5)
exten => h,3,NoOp(CURL-RESPONSE: ${rtn})
exten => s,n,Hangup()
[new-client]
exten => s,1,Dial(local/603@from-internal,,)
exten => h,1,Set(rtn=${CURL(http://trulala/ecall,Status=${CDR(disposition)} exten1=${CDR(dstchannel)} exten=${CDR(dst)} & cidnum=${CALLERID(num)}&AllCallTime=${CDR(duration)}&CallTime=${CDR(billsec)})})
exten => h,2,Wait(5)
exten => h,3,NoOp(CURL-RESPONSE: ${rtn})
[manager-busy]
exten => s,1,Dial(local/603@from-internal,,)
exten => h,1,Set(rtn=${CURL(http://trulala/ecall,Status=${CDR(disposition)} exten1=${CDR(dstchannel)} exten=${CDR(dst)} & cidnum=${CALLERID(num)}&AllCallTime=${CDR(duration)}&CallTime=${CDR(billsec)})})
exten => h,2,Wait(5)
exten => h,3,NoOp(CURL-RESPONSE: ${rtn}))
Код работает. Стала проблема в том что POST запросом нужно передать информацию о завершенном звонке. Длительность, кто поднял трубку, стсатус звонка и тд и тп... У меня не получается получить информацию о том кто поднял трубку... Я ее получаю и пишет мне что трубку взял "s" или группа 603. В CDR информация аналогична. Голова уже квадратная. Не знаю куда копать.
Смог победить немного другим способом, а именно:
[new-call]
exten => s,1,Set(DIALGROUP(test,add)=Local/203)
exten => s,n,Set(DIALGROUP(test,add)=Local/200)
exten => s,n,Set(DIALGROUP(test,add)=Local/201)
exten => s,n,Dial(${DIALGROUP(test)})
exten => h,1,Set(rtn=${CURL(http://trulala/ecall,Status=${CDR(disposition)} AnswerPeer=${DIALEDPEERNUMBER} CallerNum=${CALLERID(num)} CallTime=${CDR(duration)} TellTime=${CDR(billsec)})})
exten => h,2,Wait(1)
exten => h,3,NoOp(CURL-RESPONSE: ${rtn})
Сначала я добавил номера в группу, а потом позвонил на группу.
С Макросом вопрос и не смотрел, а вот по поводу ${DIALEDPEERNUMBER} я получал всю туже группу 603. ${DIALEDPEERNUMBER} в h / после звонка ловите
Используйте опцию M команды dial
M(macro[^arg[^...]]):
macro - Name of the macro that should be executed.
arg - Macro arguments
Execute the specified <macro> for the *called* channel before connecting
to the calling channel. Arguments can be specified to the Macro using '^'
as a delimiter. The macro can set the variable ${MACRO_RESULT} to specify
the following actions after the macro is finished executing:
${MACRO_RESULT}: If set, this action will be taken after
the macro finished executing.
ABORT: Hangup both legs of the call
CONGESTION: Behave as if line congestion was
encountered
BUSY: Behave as if a busy signal was encountered
CONTINUE: Hangup the called party and allow the
calling party to continue dialplan execution at the next priority
GOTO:[[<context>^]<exten>^]<priority>: Transfer the
call to the specified destination.
NOTE: You cannot use any additional action post answer options in
conjunction with this option. Also, pbx services are run on the peer
(called) channel, so you will not be able to set timeouts via the TIMEOUT()
function in this macro.
Задан: Jan 16 '17
Просмотрен: 791 раз
Обновлен: Jan 17 '17
Проект компании "АТС Дизайн"
Asterisk® и Digium® являются зарегистрированными торговыми марками компании
Digium, Inc., США.
IP АТС Asterisk распространяется под лицензией
GNU GPL.
..............
symon (Jan 17 '17)edit