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

Запись данных о звонке в БД (MariaDB)

Добавлено: 28 мар 2024, 16:12
Abzyi
Добрый день. На работе в наследство осталось АТС Asterisk (Elastix 4.0.0-8).
Настроено IVR:
3 --> Custom Destinations --> priority-one
2 --> Custom Destinations --> priority-two
1 --> Custom Destinations --> priority-1c
t --> Custom Destinations --> priority-duty

extensions_custom.conf:

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

[priority-1c]
exten => 1,1,Set(DEXTEN=${ODBC_CALL_GET_PRIORITY_1C(${CALLERID(num)})});
exten => 1,2,Set(PRIOR_OTHER=${ODBC_CALL_GET_PRIORITY_OTHER(${CALLERID(num)})});
exten => 1,3,ExecIf($["${DEXTEN}" = ""]?Set(DEXTEN=${PRIOR_OTHER});
exten => 1,n,set(timeoutd=20);
exten => 1,n,dial(Local/${DEXTEN}@from-internal,${timeoutd});
exten => 1,5,Gotoif($["${DIALSTATUS}" = "ANSWER"]?Goto(from-trunk,303,1));
exten => 1,4,ExecIf($["${DEXTEN}" = "${DEXTEN}"]?Goto(from-trunk,${DEXTEN},1);
exten => 1,6,Goto(from-trunk,303,1);
func_odbc.conf: (Для понимания указываю только одну из функций)

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

[CALL_GET_PRIORITY_1C] ; Название функции
dsn=asterisk ; DSN имя которое мы указали в файле res_odbc.conf
;Запрос внутреннего номера менеджера по направлению 1С
readsql=SELECT IF ((SELECT num FROM duty limit 1) > 0, (SELECT num FROM duty limit 1), (SELECT 1c FROM trail WHERE number='${ARG1}' OR number=CONCAT("+7",RIGHT('${ARG1}',10))))
Запросы в БД указанные выше выполняются и все работает.
Захотел записать данные о завершенных звонках в отдельную таблицу MissedCalls в БД. Таблица создана. Поля определены.

Прописал:
extensions_custom.conf:

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

[priority-1c]
exten => 1,1,Set(DEXTEN=${ODBC_CALL_GET_PRIORITY_1C(${CALLERID(num)})});
exten => 1,2,Set(PRIOR_OTHER=${ODBC_CALL_GET_PRIORITY_OTHER(${CALLERID(num)})});
exten => 1,3,ExecIf($["${DEXTEN}" = ""]?Set(DEXTEN=${PRIOR_OTHER});
exten => 1,n,set(timeoutd=20);
exten => 1,n,dial(Local/${DEXTEN}@from-internal,${timeoutd});
exten => 1,5,Gotoif($["${DIALSTATUS}" = "ANSWER"]?Goto(from-trunk,303,1));
exten => 1,4,ExecIf($["${DEXTEN}" = "${DEXTEN}"]?Goto(from-trunk,${DEXTEN},1);
exten => 1,6,Goto(from-trunk,303,1);
exten => h,1, ODBC_CALL_MISSED_WRITE() ='2024-03-27 21:27:44',${CALLERID(num)},'KtoZvonil','KudaZvonil';
same => n,Hangup();
func_odbc.conf:

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

[CALL_MISSED_WRITE]
dsn=asterisk;
writesql=INSERT INTO MissedCalls (Date, Number, Name, KudaZvonil) VALUES ('${SQL_ESC(${VAL1})}','${SQL_ESC(${VAL2})}','${SQL_ESC(${VAL3})}','${SQL_ESC(${VAL4})}')
Перечитал конфиги. Даже перезагрузил сервер полностью. После того как кладут трубку, не записываются данные в БД.
Смотрел логи через -rvvvvvvvvvv пишет:
[2024-03-28 08:49:24] WARNING[5510][C-00000021]: pbx.c:4924 pbx_extension_helper: No application 'ODBC_CALL_MISSED_WRITE' for extension (priority-1c, h, 1)

Если выполнить core show function ODBC_CALL_MISSED_WRITE
ответ:

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

 -= Info about function 'ODBC_CALL_MISSED_WRITE' =-

[Synopsis]
Runs the referenced query with the specified arguments

[Description]
Runs the following query, as defined in func_odbc.conf, performing
substitution of the arguments into the query as specified by ${ARG1},
${ARG2}, ... ${ARGn}.  The values are provided either in whole as
${VALUE} or parsed as ${VAL1}, ${VAL2}, ... ${VALn}.
This function may only be set.

SQL:
INSERT INTO MissedCalls (Date, Number, Name, KudaZvonil) VALUES ('${SQL_ESC(${VAL1})}','${SQL_ESC(${VAL2})}','${SQL_ESC(${VAL3})}','${SQL_ESC(${VAL4})}')

[Syntax]
ODBC_CALL_MISSED_WRITE(<arg1>[...[,<argN>]])

[Arguments]
Not available

[See Also]
Not available
Не понимаю куда копать, подскажите пожалуйста, может кто сталкивался.

Re: Запись данных о звонке в БД (MariaDB)

Добавлено: 28 мар 2024, 17:05
ded
Считаете что этот пост как раз в раздел Вопросы новичков?

: No application 'ODBC_CALL_MISSED_WRITE' for extension (priority-1c, h, 1) потому что ODBC_CALL_MISSED_WRITE это не апликация, а функция -
-= Info about function 'ODBC_CALL_MISSED_WRITE' =-

Будет что-то типа

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

exten => h,1, Set(ODBC_CALL_MISSED_WRITE('2024-03-27 21:27:44',${CALLERID(num)},'KtoZvonil','KudaZvonil')) 

Re: Запись данных о звонке в БД (MariaDB)

Добавлено: 28 мар 2024, 17:12
Abzyi
Ну я новичок на форуме))
А если без шуток, не так силен в Астериске. Недавно только книгу прочитал "Астериск телефония будущего". До этого все копался наугад и методом тыка)

Re: Запись данных о звонке в БД (MariaDB)

Добавлено: 28 мар 2024, 17:16
ded
Время, затраченное на копание методом тыка, обратно пропорционально объёму знаний, полученных в результате копания.

Re: Запись данных о звонке в БД (MariaDB)

Добавлено: 28 мар 2024, 18:08
Abzyi
Благодарю за замечания) Как дойду до компьютера - отпишусь по резльтатам

Re: Запись данных о звонке в БД (MariaDB)

Добавлено: 28 мар 2024, 20:38
Zavr2008
Не знаю, я лично всегда опасался прямого юзания - много писали про утечки памяти итп. Обычно через внешние скрипты делал.

Re: Запись данных о звонке в БД (MariaDB)

Добавлено: 29 мар 2024, 16:52
Abzyi
Добрый день. В итоге, переделал функцию с учетом замечаний. И ошибок не выдает) НО, теперь пишет пустые значения)
id Date Number Name KudaZvonil
1 0000-00-00 00:00:00
2 0000-00-00 00:00:00
3 0000-00-00 00:00:00
4 0000-00-00 00:00:00


extensions_custom.conf:

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

exten => h,1, Set(ODBC_CALL_MISSED_WRITE()=(${STRFTIME(${EPOCH},,%Y.%m.%d-%H:%M:%S)},${CALLERID(num)},'KtoZvonil','KudaZvonil'));
func_odbc.conf:

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

[CALL_MISSED_WRITE]
prefix=ODBC;
dsn=asterisk;
writesql=INSERT INTO MissedCalls (Date, Number, Name, KudaZvonil) VALUES ('${SQL_ESC(${VAL1})}','${SQL_ESC(${VAL2})}','${SQL_ESC(${VAL3})}','${SQL_ESC(${VAL4})}')
Поля БД такие:
id int
Date datetime
Number char
Name varchar
KudaZvonil char

Re: Запись данных о звонке в БД (MariaDB)

Добавлено: 29 мар 2024, 19:24
ded
К моменту события exten => h,1 транзакция (совершаемый звонок) ещё не закончена, поэтому в переменной
${STRFTIME(${EPOCH},,%Y.%m.%d-%H:%M:%S) будет пусто.

Можно проверить это например вот так
exten => h,1,NoOp(=== ${STRFTIME(${EPOCH},,%Y.%m.%d-%H:%M:%S) ===)
exten => h,2,Set(ODBC_CALL_MISSED_WRITE

Вообще к этой процедуре много вопросов:
1) Зачем для таких вызовов создавать отдельную таблицу? Все эти данные уже находятся в стандартной таблице CDR (asteriskcdrdb),

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

mysql> show tables;
+-------------------------+
| Tables_in_asteriskcdrdb |
+-------------------------+
| cdr                     |
| cel                     |
+-------------------------+
2 rows in set (0.00 sec)
и, чтобы их оттуда получить, необходимо просто выполнить SQL запрос, по полям calldate, clid, dst, где disposition будет No ANSWER

2) Непонятно с каким приоритетом и в каком случае будут выполняться шаги
exten => 1,n,set(timeoutd=20);
exten => 1,n,dial(Local/${DEXTEN}@from-internal,${timeoutd});

Re: Запись данных о звонке в БД (MariaDB)

Добавлено: 01 апр 2024, 08:20
Abzyi
Насчет первого замечания понял - буду разбираться. Насчет второго замечания - в CDR если звонок поступил в очередь где звонят несколько телефонов, то в одном телефоне будет "ANSWER", а на всех остальных "NOANSWER". Мне надо исключить этот момент. Поэтому, изобретая велосипед приведенный выше, хотел как-то попытаться уйти от этого.

Re: Запись данных о звонке в БД (MariaDB)

Добавлено: 01 апр 2024, 10:48
ded
Abzyi писал(а):Насчет второго замечания - в CDR если звонок поступил в очередь
Вы не сможете быть пионером в проблематике Астериск, всё это уже было. И эта проблема решена более конструктивно - Call Event Logger (CEL). Выборки из CDR не отражают статистику работы очередей, поэтому Создатели придумали другой механизм, другую таблицу, в той же базе данных.
# mysql -D asteriskcdrdb - попадаете в базу данных и видите две таблицы:
> show tables;
cdr
cel