Как стать автором
Обновить

Комментарии 8

Имхо не совсем корректно юзать ODBC и команду диалплана MYSQL, надо тогда все запросы и писать в рамках ODBC. А может и вообще вынести всю логику на сторону AGI, что крайне котирует уважаемый antirek :)

PS Ждем следующей статьи с кодом админки:)
Можно и через AGI обрабатывать. Как кому нравиться) Для меня это был первый опыт такого рода оптимизации, и я остался всем доволен. + ODBC вшит в дистрибутив, и проблем с ним нет. А про админку напишу на этой неделе)
MYSQL (приложение диалплана) не использует odbc настройки астериска, по идее должно работать и без настроек /etc/odbcinst.ini и res_odbc.conf.

И да, я бы сделал логику приложения на стороне AGI: )

А этот момент я проверял. Работает, но криво и через раз)
А потому MYSQL и не рекомендуют, посмотрите в сторону func_odbc.conf (у вас настройки есть, запросы есть, только настроить осталось) — диалплан станет чище.
Чтоб долго не мучаться, вот пример, я тут вытаскиваю имя из базы по CALLERID:

В файле /etc/odbcinst.ini прописываем пути для драйверов (это для убунты, для центоса разница в путях к библиотекам будет):
[MySQL]
Description = MySQL driver
Driver = /usr/lib/x86_64-linux-gnu/odbc/libmyodbc.so
Setup = /usr/lib/x86_64-linux-gnu/odbc/libodbcmyS.so
CPTimeout =
CPReuse =

;;Centos, разница в названии библиотек и путях
[MySQL]
Description = ODBC for MySQL
Driver = /usr/lib/libmyodbc3.so
Setup = /usr/lib/libodbcmyS.so
FileUsage = 1

В файле /etc/odbc.ini описываем параметры odbc-подключения:

[asterisk-barrier]
Driver = MySQL
Description = Connector/ODBC 3.51 Driver DSN
Server = localhost
Port = 3306
User = root
Password = VeryStrongPassword
Database = barrier
Socket = /var/run/mysqld/mysqld.sock
Charset = utf8

В файле /etc/asterisk/res_odbc.conf описываем параметры odbc-подключения:

[asterisk-barrier]
enabled => yes
dsn => asterisk-barrier
username => root
password => VeryStrongPassword
pooling => no
limit => 1
pre-connect => yes

В func_odbc.conf пишем функцию, которая будет искать в MySQL номер вызывающего абонента и возвращать нам его имя

[MOBILE]
dsn=asterisk-barrier
readsql=SELECT name FROM numbers WHERE phone = '${CALLER}'

и в диалплане что-то типа:

exten => s,1,Set(CALLER=${CALLERID(num)})
same => n,Set(result=${ODBC_MOBILE()}) ;;looking for phone number is mysql, return id
same => n,Set(foo=${ISNULL(${result})}) ;;isnull — is there a number in mysql? 1 or 0
same => n,GotoIf($["${foo}" = «0»]?true:false)
Можно было бы кинуть код хотя бы в комменты, раз не стали обещанный пост делать.
Спасибо.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории