Pull to refresh

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

Reading time2 min
Views4.8K
По итогу голосования в группе начинаю цикл статей «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.P.S.: кроме readsql, существует writesql, который работает по тому же принципу.
Tags:
Hubs:
+5
Comments1

Articles

Change theme settings