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

Переадресация через ODBC, MySQL

Добавлено: 06 дек 2017, 19:19
konstantinsb
Приветствую всех присутствующих!!
Ребята, помогите с проблемой!
У нас на предприятии имеется много отделов.
Есть наш информационный отдел, в нем 4 человека.
За каждым закреплено несколько отделов.
У нас есть общая БД со списком всех номеров пользователей предприятия(около 2000)
Пытась сделать так:
Один общий номер ХХХХХХХ, на него будут звонить пользователи из списка , а попадать будут на того человека, за которым закреплено тот или иной отдел.
Пример:
У меня номер 3550, звонят с Юридического отдела( числится за мной) на общий номер ХХХХХХ. Астериск автоматически его переадресовывает на мой номер 3550, перед этим сверившись по CID с БД.
Делаю через драйвер ODBC к MySQL
Вот что сделано на данный момент:

odbc.ini

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

[connector]

Driver = MariaDB

Description = Connector/ODBC 3.51 Driver 
DSN
Server = 127.0.0.1
Port = 3306
User = root
Password = *****
Database =spisok
Socket = /var/run/mysqld/mysqld.sock
Charset = utf8



odbcinst.ini
[MariaDB]

Description = MySQL 
driver
Driver=/usr/lib/x86_64-linux-gnu/odbc/libmaodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so


asterisk*CLI> odbc show
ODBC DSN Settings
-----------------
  Name:   spisok
  DSN:    connector
    Last connection attempt: 1970-01-01 07:00:00
    Number of active connections: 1 (out of 1)


asterisk:~#  echo "SELECT 1" | isql -v connector          
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> SELECT 1
+---------------------+
| 1                   |
+---------------------+
| 1                   |
+---------------------+
SQLRowCount returns 1
1 rows fetched
func_odbc.conf

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

[MOBILE]
dsn=connector
readsql=SELECT COUNT(*)  FROM spisok_all WHERE number='${ARG1}'
extensions.conf

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

exten => _X.,1,Set(PRIOR=${ODBC_MOBILE(${CALLERID(num)})})
exten => _X.,n,GotoIf($["${PRIOR}" = "1"]?reject:allow) ;Для теста, хотя бы из одной таблицы взять данные.
exten =>_X.,n(allow),Dial(${SIP/3550})
exten =>_X.,n,Hungup()
exten =>_X.,n(reject), Playback(abandon-all-hope)
exten =>_X.,n,Hungup()
выводит ошибку unable to execute query SELECT COUNT(*) FROM spisok_all WHERE number='${ARG1}'

Re: Переадресация через ODBC, MySQL

Добавлено: 07 дек 2017, 07:28
virus_net

Re: Переадресация через ODBC, MySQL

Добавлено: 07 дек 2017, 11:21
konstantinsb
Спасибо большое за ответ! Прежде чем задать вопрос, я загуглил ошибку и видел все эти посты, но их решение проблемы мне не помогло :(

Re: Переадресация через ODBC, MySQL

Добавлено: 07 дек 2017, 12:31
april22
а из скуля . можете сделать такой запрос ?!

Re: Переадресация через ODBC, MySQL

Добавлено: 07 дек 2017, 12:47
konstantinsb
april22 писал(а):а из скуля . можете сделать такой запрос ?!

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

SQL> SELECT COUNT(*) FROM spisok_all WHERE number='${ARG1}'
+---------------------+
| COUNT(*)            |
+---------------------+
| 0                   |
+---------------------+
SQLRowCount returns 1
1 rows fetched
SQL> SELECT COUNT(*) FROM spisok_all WHERE number='1232'
+---------------------+
| COUNT(*)            |
+---------------------+
| 1                   |
+---------------------+
SQLRowCount returns 1
1 rows fetched
Первый запрос сделал как у меня в func_odbc.conf прописано, второй запрос уже конкретный входящий внутренний номер указал

Re: Переадресация через ODBC, MySQL

Добавлено: 07 дек 2017, 14:41
konstantinsb
может это поможет разобраться?

asterisk*CLI> odbc read ODBC_MOBILE "1232" exec
Failed to execute query. [SELECT COUNT(*) FROM spisok_all WHERE number='1232']

Re: Переадресация через ODBC, MySQL

Добавлено: 08 дек 2017, 08:42
virus_net
konstantinsb, я тоже сталкиваюсь с тем, что что-то не работает и когда результат гугления выдает тонну похожего с решениями это мне говорит о том, что это именно я что-то делаю не так. Ведь у других то работает. А раз так, то перечитываю снова и снова, пробую, изучаю логи и т.п.
konstantinsb писал(а):но их решение проблемы мне не помогло
О каком именно решении вы говорите ? В ваших сообщениях я пока не увидел ни тестов, ни логов. С таким подходом вам в раздел "Бизнес".
konstantinsb писал(а):Первый запрос сделал как у меня в func_odbc.conf прописано
А зачем ? Логично что он вернет пустоту, т.к. ${ARG1} это переменная.

И запрос бы поправить, чтобы соответствовал синтаксису mysql:

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

SELECT COUNT(*)  as `count` FROM `spisok_all` WHERE `number`='${ARG1}'
И подобный запрос я бы не делал в принципе, т.к. это грозит тормозами, когда таблица начнет наполняться данными.
Создать индекс на поле (если его нет), а запрос что-то типа такого:

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

SELECT `id`  FROM `spisok_all` WHERE `number`='${ARG1}' LIMIT 0,1
И я вообще не рекомендую использование MySQL из диалплана. В силу того, что нормального обработчика ошибок там не исполнить, а проблем с обработкой вызова это может доставить.