По итогу голосования в группе начинаю цикл статей «Asterisk realtime» и первая статья будет посвящена func_odbc или как упростить свою жизнь.
Статья рассчитана на людей которые уже пользуются asterisk и имеют «базовые» навыки.
Func_odbc зачем он?
И так зачем же мне использовать Function_ODBC если я могу сделать такой же запрос в ael?
- в extensions.ael это выглядит «опрятней» если ваш запрос повторяется несколько десятков раз в конфигурации
- удобнее работать с нескольким базами
В остальном если же вас устраивает хаус в конфигурации, а также написание или копирования одного запроса по несколько раз, то это статья не для вас. Для остальных приступим:
Func_odbc.conf
Будем рассматривать самый простой пример asterisk + mysql.
Итак у нас есть sipuser (много sipusers) и у них есть внешний номер cid, который по независимым от нас причинам постоянно меняется, и нам необходимо его каждый раз спрашивать.
Второй пример нам нужна пере адресация
пропускаем настройку odbc.ini и res_odbc.conf так как вы это и так умееете.
Приступаем к пункту 1:
Прописываем в func_odbc.conf следующее
[cid]
dsn=asterisk
readsql=SELECT cid FROM sipusers WHERE username = ${ARG1}
И разбираем по частям
dsn=asterisk — Параметр DSN отвечает за подключение Asterisk к базе данных, указанной в файле /etc/odbc.ini.
readsql=SELECT cid FROM sipusers WHERE username = ${ARG1} — нужный вам запрос sql, но с переменной.
Теперь смотрим, что же у нас получилось в ael:
_89. => {
Set(cid=${ODBC_cid(${CALLERID(num)})});
SET(CALLERID(num)=${cid});
SET(CALLERID(name)=${cid});
......
}
Set(cid=${ODBC_cid(${CALLERID(num)})}); - собственно это SELECT cid FROM sipusers WHERE username = ${CALLERID(num)})} , думаю пояснения излишни.
SET(CALLERID(num)=${cid}) - устанавливаем CALLERID(num)
SET(CALLERID(name)=${cid}) - CALLERID(name)
Собственно далее ваша фантазия в запросах и переменных.
Приступаем к пункту 2:
Добавляем func_odbc.conf
[forward]
dsn=asterisk
readsql=SELECT numforward, `type` FROM call_forwarding WHERE number = ${ARG1}
Следует заметить, что в данном ответе мы получим массив.
Теперь смотрим, что же у нас получилось в ael:
macro redirect(number, from){
Set(ARRAY(forward,type)=${ODBC_forward(${number})});
}
if (${EXISTS(${forward})}) {
switch(${type}) {
case all:
....
case noanswer:
....
case noanswer-worktime:
....
break;
default:
break;
}
hangup;
}
return;
};
Здесь для пере адресации я решил, что удобнее использовать макросы
Set(ARRAY(forward,type)=${ODBC_forward(${number})}); — мы получаем от запроса два параметра, следовательно нам нужно использовать массив.
if (${EXISTS(${forward})}) — если существует номер пере адресации то действуем дальше…
switch(${type}) — определяем тип пере адресации и в зависимости от нужно типа, делаем условия пере адресации.
Я намеренно упустил конфигурации пере адресаций, так как у всех она может быть разная.
P.S. Это конечно не realtime. Но суть в том, что часть параметров вы получаете в нужный момент при конкретном обращении, и вам для изменения cid нет необходимости лезти в конфиг менять его и делать reload.
P.S.S кроме readsql существует writesql, который работает по тому же приниципу.
Автор: призывник