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

Направление входящего вызова на последнего абонента

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

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

Ответить
andruhasms
Сообщения: 3
Зарегистрирован: 28 июн 2022, 17:58

Направление входящего вызова на последнего абонента

Сообщение andruhasms »

Добрый день. Задача. Направление входящего вызова на последнего абонента (сотрудника) , который общался с ним в течение дня.
взял за основу эту статью https://voxlink.ru/kb/asterisk-configur ... -abonenta/
добавил в /var/www/html/admin/modules/core/etc/extensions.conf
следующий код
;----------для направления входящего вызова на последнего абонента
[sub-dial-last-caller]
exten => s,1,GotoIf($[${LEN(${CALLERID(num)})} < 10]?end)
same => n,Set(LC_MYSQL_DATE_FROM=${STRFTIME(${EPOCH},,%Y-%m-%d)} 00:00:00)
same => n,Set(ARRAY(LC_LAST_CALL_SRC,LC_LAST_CALL_RESULT,LC_LAST_CALL_BILLSEC,LC_LAST_CALL_CHANNEL)=${ODBC_LAST_OUTBOUND_CALL_TO_NUMBER(${CALLERID(num)},${LC_MYSQL_DATE_FROM})})
same => n,GotoIf($[«${LC_LAST_CALL_SRC}» = «»]?end)
same => n,Set(LC_TARGET_DEVICE=${CUT(LC_LAST_CALL_CHANNEL,\-,1)})
same => n,GotoIf($[«${LC_TARGET_DEVICE}» = «»]?end)
same => n,GotoIf($[«${EXTENSION_STATE(${LC_LAST_CALL_SRC}@ext-local)}» != «NOT_INUSE»]?end)
same => n,GotoIf($[«${LC_LAST_CALL_RESULT}» = «ANSWERED» & ${LC_LAST_CALL_BILLSEC} > 4]?end)
same => n,Macro(user-callerid)
same => n,Gosub(sub-record-check,s,1(in,${LC_LAST_CALL_SRC},yes))
same => n,Set(DIALSTATUS=)
same => n,Dial(${LC_TARGET_DEVICE},15,t)
same => n,ExecIf($[«${DIALSTATUS}» = «ANSWER»]?Hangup)
same => n(end),Return
;-------------------------------------------------------------------------------
[sub-fix-cid]
exten => s,1,GotoIf($[${REGEX(«^[0-9]{3}$» ${CALLERID(num)})} = 0]?cont1)
same => n,Set(CALLERID(num)=3752${CALLERID(num)})
same => n,Set(CALLERID(ANI-num)=${CALLERID(num)})
same => n,Goto(end)
same => n(cont1),GotoIf(${REGEX(«^[78]?[2-9][0-9]{9}$» ${CALLERID(num)})}?fix_cid)same => n,GotoIf(${REGEX(«^\+?3[2-9][0-9]{9}$» ${CALLERID(num)})}?fix_cid)
same => n,Goto(end)
same => n(fix_cid),Set(CALLERID(num)=3${CALLERID(num):-10})
same => n,Set(CALLERID(ANI-num)=${CALLERID(num)})
same => n(end),Return
;----------самописный контекст для вызова функций "приведения номера к виду и поиск номера в базе"
[from-trunk-pre]
exten => _X.,1,Set(PRE_DID_NUM=${EXTEN})
same => n,Goto(process,1)
exten => _+X.,1,Set(PRE_DID_NUM=${EXTEN})
same => n,Goto(process,1)
exten => process,1,Gosub(sub-fix-cid,s,1)
same => n,Gosub(sub-dial-last-caller,s,1)
same => n,Goto(from-trunk,${PRE_DID_NUM},1)

в итоге при входящем вызове сразу получаю
[2022-06-28 16:50:09] VERBOSE[1252][C-00000020] pbx.c: Executing [999@from-trunk-pre:1] Set("PJSIP/TG400_MTS_37533XXXXX5-0000001f", "DID_NUM=999") in new stack
[2022-06-28 16:50:09] VERBOSE[1252][C-00000020] pbx.c: Executing [999@from-trunk-pre:2] Goto("PJSIP/TG400_MTS_37533XXXXX5-0000001f", "process,1") in new stack
[2022-06-28 16:50:09] VERBOSE[1252][C-00000020] pbx_builtins.c: Goto (from-trunk-pre,process,1)
[2022-06-28 16:50:09] WARNING[1252][C-00000020] pbx.c: Channel 'PJSIP/TG400_MTS_37533XXXXX5-0000001f' sent to invalid extension but no invalid handler: context,exten,priority=from-trunk-pre,process,1

подскажите знающие в чем прикол , вроде бы по логике все верно
контекст для транка указываю from-trunk-pre
ded
Сообщения: 15618
Зарегистрирован: 26 авг 2010, 19:00

Re: Направление входящего вызова на последнего абонента

Сообщение ded »

Нет, по логике не всё верно.
в контексте [from-trunk-pre] в котором номера должны приводится к единому виду у вас шаг обработки
exten => process,1,Gosub(sub-fix-cid,s,1) ; вызов субрутины sub-fix-cid, верно?

лог говорит, что исполняется
Goto("PJSIP/TG400_MTS_37533XXXXX5-0000001f", "process,1") in new stack
Goto (from-trunk-pre,process,1)
далее не видно вызова субрутины, в которую, по идее, надо бы какой то аргумент пересылать? Вы пересылаете туда так, как будто это макрос, на экстен s,1 первый шаг
exten => s,1,GotoIf($[${LEN(${CALLERID(num)})} < 10]?end)
Если поставите не Gosub а Macro, и там первым шагом
exten => s,1,NoOp(CALLERID(num) is ${CALLERID(num)} and lenght is ${LEN(${CALLERID(num)})} )
то увидите выполнение вычисления длины CALLERID(num) хотя бы.
andruhasms
Сообщения: 3
Зарегистрирован: 28 июн 2022, 17:58

Re: Направление входящего вызова на последнего абонента

Сообщение andruhasms »

Я решил немного упростить , убрал контекст приведение номера к виду . Оставил лишь
1)диалплан ,в котором происходит определение по номеру звонящего внутреннего номера сотрудника , с которого была попытка дозвона (абонент не ответил).
2)контекст из которого вызываю этот диалплан.

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

;----------диалплан для определения кто последний не смог дозвониться на номер абонента.
[sub-dial-last-caller]
exten => s,1,GotoIf($[${LEN(${CALLERID(num)})} < 10]?end)
same  => n,Set(LC_MYSQL_DATE_FROM=${STRFTIME(${EPOCH},,%Y-%m-%d)} 00:00:00)
same  => n,Set(ARRAY(LC_LAST_CALL_SRC,LC_LAST_CALL_RESULT,LC_LAST_CALL_BILLSEC,LC_LAST_CALL_CHANNEL)=${ODBC_LAST_OUTBOUND_CALL_TO_NUMBER(${CALLERID(num)},${LC_MYSQL_DATE_FROM})})
same  => n,GotoIf($[«${LC_LAST_CALL_SRC}» = «»]?end)
same => n,Set(LC_TARGET_DEVICE=${CUT(LC_LAST_CALL_CHANNEL,\-,1)})
same  => n,GotoIf($[«${LC_TARGET_DEVICE}» = «»]?end)
same  => n,GotoIf($[«${EXTENSION_STATE(${LC_LAST_CALL_SRC}@ext-local)}» != «NOT_INUSE»]?end)
same  => n,GotoIf($[«${LC_LAST_CALL_RESULT}» = «ANSWERED» & ${LC_LAST_CALL_BILLSEC} > 4]?end)
same  => n,Macro(user-callerid)
same  => n,Gosub(sub-record-check,s,1(in,${LC_LAST_CALL_SRC},yes))
same  => n,Set(DIALSTATUS=)
same  => n,Dial(${LC_TARGET_DEVICE},15,t)
same  => n,ExecIf($[«${DIALSTATUS}» = «ANSWER»]?Hangup)
same  => n(end),Return
;----------самописный контекст для вызова диалплана
[from-trunk-pre]
exten => _X.,1,Set(DID_NUM=${EXTEN})
same  => n,Goto(process,1)
exten => _+X.,n,Set(DID_NUM=${EXTEN})
same  => n,Goto(process,1)
exten => process,1,Gosub(sub-dial-last-caller,s,1)
same  => n,Goto(from-trunk,${DID_NUM},1)
по логу получаю это

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

[2022-06-29 12:56:47] VERBOSE[16857][C-0000002b] pbx.c: Executing [999@from-trunk-pre:1] Set("PJSIP/TG400_MTS_3753XXXXXX75-00000026", "DID_NUM=999") in new stack
[2022-06-29 12:56:47] VERBOSE[16857][C-0000002b] pbx.c: Executing [999@from-trunk-pre:2] Goto("PJSIP/TG400_MTS_3753XXXXXX75-00000026", "process,1") in new stack
[2022-06-29 12:56:47] VERBOSE[16857][C-0000002b] pbx_builtins.c: Goto (from-trunk-pre,process,1)
[2022-06-29 12:56:47] VERBOSE[16857][C-0000002b] pbx.c: Executing [process@from-trunk-pre:1] Gosub("PJSIP/TG400_MTS_3753XXXXXX75-00000026", "sub-dial-last-caller,s,1") in new stack
[2022-06-29 12:56:47] VERBOSE[16857][C-0000002b] pbx.c: Executing [s@sub-dial-last-caller:1] GotoIf("PJSIP/TG400_MTS_3753XXXXXX75-00000026", "0?end") in new stack
[2022-06-29 12:56:47] VERBOSE[16857][C-0000002b] pbx.c: Executing [s@sub-dial-last-caller:2] Set("PJSIP/TG400_MTS_3753XXXXXX75-00000026", "LC_MYSQL_DATE_FROM=2022-06-29 00:00:00") in new stack
[2022-06-29 12:56:47] WARNING[16857][C-0000002b] func_odbc.c: SQL Execute returned an error -1: 42000: [MySQL][ODBC 5.2(w) Driver][mysqld-5.5.65-MariaDB]You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '%+3752XXXXXX40’ AND calldate>=’2022-06-29 00:00:00’ ORDER BY c (269)
[2022-06-29 12:56:47] WARNING[16857][C-0000002b] func_odbc.c: SQL Exec Direct failed (-1)![SELECT src,disposition,billsec,channel FROM cdr WHERE dst LIKE ‘%+3752XXXXXX40’ AND calldate>=’2022-06-29 00:00:00’ ORDER BY calldate DESC LIMIT 1]
[2022-06-29 12:56:47] ERROR[16857][C-0000002b] func_odbc.c: Unable to execute query [SELECT src,disposition,billsec,channel FROM cdr WHERE dst LIKE ‘%+3752XXXXXX40’ AND calldate>=’2022-06-29 00:00:00’ ORDER BY calldate DESC LIMIT 1]
[2022-06-29 12:56:47] VERBOSE[16857][C-0000002b] pbx.c: Executing [s@sub-dial-last-caller:3] Set("PJSIP/TG400_MTS_3753XXXXXX75-00000026", "ARRAY(LC_LAST_CALL_SRC,LC_LAST_CALL_RESULT,LC_LAST_CALL_BILLSEC,LC_LAST_CALL_CHANNEL)=") in new stack
[2022-06-29 12:56:47] VERBOSE[16857][C-0000002b] pbx.c: Executing [s@sub-dial-last-caller:4] GotoIf("PJSIP/TG400_MTS_3753XXXXXX75-00000026", "1?end") in new stack
[2022-06-29 12:56:47] VERBOSE[16857][C-0000002b] pbx_builtins.c: Goto (sub-dial-last-caller,s,14)
[2022-06-29 12:56:47] VERBOSE[16857][C-0000002b] pbx.c: Executing [s@sub-dial-last-caller:14] Return("PJSIP/TG400_MTS_3753XXXXXX75-00000026", "") in new stack
[2022-06-29 12:56:47] VERBOSE[16857][C-0000002b] pbx.c: Executing [process@from-trunk-pre:2] Goto("PJSIP/TG400_MTS_3753XXXXXX75-00000026", "from-trunk,999,1") in new stack
[2022-06-29 12:56:47] VERBOSE[16857][C-0000002b] pbx_builtins.c: Goto (from-trunk,999,1)
что-то не так в sql запросах . кто-то может помочь подправить, чтобы сработало?
ded
Сообщения: 15618
Зарегистрирован: 26 авг 2010, 19:00

Re: Направление входящего вызова на последнего абонента

Сообщение ded »

На 4-м шаге выполняется условие GotoIf($[«${LC_LAST_CALL_SRC}» = «»]?end)
то есть в LC_LAST_CALL_SRC ничего нет.

Операция заполнения переменных
Set(ARRAY(LC_LAST_CALL_SRC,LC_LAST_CALL_RESULT,LC_LAST_CALL_BILLSEC,LC_LAST_CALL_CHANNEL)=${ODBC_LAST_OUTBOUND_CALL_TO_NUMBER(${CALLERID(num)},${LC_MYSQL_DATE_FROM})})
слишком сложна для разбора.
Попробуйте этот запрос выделить в отдельный РНР-скрипт, протестировать его без Астериск в командной строке, снабдить дебаг-вставками, и вызывать затем его как AGI.
andruhasms
Сообщения: 3
Зарегистрирован: 28 июн 2022, 17:58

Re: Направление входящего вызова на последнего абонента

Сообщение andruhasms »

Set(ARRAY(LC_LAST_CALL_SRC,LC_LAST_CALL_RESULT,LC_LAST_CALL_BILLSEC,LC_LAST_CALL_CHANNEL)=${ODBC_LAST_OUTBOUND_CALL_TO_NUMBER(${CALLERID(num)},${LC_MYSQL_DATE_FROM})})
слишком сложна для разбора.
что именно вызывает сложность? логика в целом ясна , дело в том , что больше системный администратор , чем программист , поэтому возможно где-то косяк по синтаксису. может ковычек каких-то не хватает или подобного.
есть собственная функция объявленная в /etc/asterisk/func_odbc.conf

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

[LAST_OUTBOUND_CALL_TO_NUMBER]

dsn=asteriskcdrdb

readsql=SELECT src,disposition,billsec,channel FROM cdr WHERE dst LIKE ‘%${SQL_ESC(${ARG1})}’ AND calldate>=’${SQL_ESC(${ARG2})}’ ORDER BY calldate DESC LIMIT 1
Если я верно понимаю логику , то входные параметры в эту функцию CALLERID(num) и LC_MYSQL_DATE_FROM . Судя по логу выше тут все ок номер звонящего передаётся и дата тоже. возможно проблема именно в синтаксисе в строке запроса sql .и эти параметры в функции не отрабатывают src,disposition,billsec,channel
P.S. чтобы составить скрипт в php , надо изучить php))
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH