Asterisk func_odbc или странный ael

в 16:42, , рубрики: asterisk, метки: ,

По итогу голосования в группе начинаю цикл статей «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, который работает по тому же приниципу.

Автор: призывник

Источник

Поделиться

* - обязательные к заполнению поля