ВидеоКонф(ВКС)  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

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

Новичком считается только что прочитавший «Астериск - будущее телефонии»
http://asterisk.ru/knowledgebase/books
и пытающийся сделать большее

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

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

Сообщение Abzyi » 28 мар 2024, 17:12

Добрый день. На работе в наследство осталось АТС 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

Не понимаю куда копать, подскажите пожалуйста, может кто сталкивался.
Abzyi
 
Сообщений: 6
Зарегистрирован: 28 мар 2024, 14:11

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

Сообщение ded » 28 мар 2024, 18:05

Считаете что этот пост как раз в раздел Вопросы новичков?

: 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'))
ded
 
Сообщений: 15830
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение Abzyi » 28 мар 2024, 18:12

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

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

Сообщение ded » 28 мар 2024, 18:16

Время, затраченное на копание методом тыка, обратно пропорционально объёму знаний, полученных в результате копания.
ded
 
Сообщений: 15830
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение Abzyi » 28 мар 2024, 19:08

Благодарю за замечания) Как дойду до компьютера - отпишусь по резльтатам
Abzyi
 
Сообщений: 6
Зарегистрирован: 28 мар 2024, 14:11

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

Сообщение Zavr2008 » 28 мар 2024, 21:38

Не знаю, я лично всегда опасался прямого юзания - много писали про утечки памяти итп. Обычно через внешние скрипты делал.
Российские E1 шлюзы Alvis. Модернизация УПАТС с E1,Подключение к ИС "Антифрод" E1 PRI/SS#7 УВР Телестор, Грифин и др..
Аватар пользователя
Zavr2008
 
Сообщений: 2172
Зарегистрирован: 27 янв 2011, 01:35

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

Сообщение Abzyi » 29 мар 2024, 17:52

Добрый день. В итоге, переделал функцию с учетом замечаний. И ошибок не выдает) НО, теперь пишет пустые значения)
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
Abzyi
 
Сообщений: 6
Зарегистрирован: 28 мар 2024, 14:11

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

Сообщение ded » 29 мар 2024, 20:24

К моменту события 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});
ded
 
Сообщений: 15830
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение Abzyi » 01 апр 2024, 09:20

Насчет первого замечания понял - буду разбираться. Насчет второго замечания - в CDR если звонок поступил в очередь где звонят несколько телефонов, то в одном телефоне будет "ANSWER", а на всех остальных "NOANSWER". Мне надо исключить этот момент. Поэтому, изобретая велосипед приведенный выше, хотел как-то попытаться уйти от этого.
Abzyi
 
Сообщений: 6
Зарегистрирован: 28 мар 2024, 14:11

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

Сообщение ded » 01 апр 2024, 11:48

Abzyi писал(а):Насчет второго замечания - в CDR если звонок поступил в очередь

Вы не сможете быть пионером в проблематике Астериск, всё это уже было. И эта проблема решена более конструктивно - Call Event Logger (CEL). Выборки из CDR не отражают статистику работы очередей, поэтому Создатели придумали другой механизм, другую таблицу, в той же базе данных.
# mysql -D asteriskcdrdb - попадаете в базу данных и видите две таблицы:
> show tables;
cdr
cel
ded
 
Сообщений: 15830
Зарегистрирован: 26 авг 2010, 19:00

След.

Вернуться в Вопросы новичков

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH