В данной статье я хочу рассказать о том, как с помощью ael (Asterisk Extension Language) упростить свою жизнь.

Рассмотрим ситуацию, когда при входящем звонке Asterisk обращается к внешней системе (биллинг, CRM) и получает множественные данные о клиенте (например: баланс, номер счета и т.д.). В этом случае встает вопрос: как получать эти данные и как ими пользоваться в дальнейшем наиболее масштабируемо? Массивы сразу были отвергнуты по причине того, что переменные должны располагаться в строгом порядке, и добавление новой переменной может привести к изменению большой части конфигурации Asterisk, поэтому был выбран хэш, о примере использования которого я и хочу рассказать.

Рассмотрим небольшой пример и разберем его построчно:

context testhash {
_00000 => {
Set(CHANNEL(language)=ru);
Answer;
Set(CURLOPT(userpwd)=test:test);
Set(CURLOPT(hashcompat)=yes);
Set(HASH(abon)=${CURL(https://test.test.ru/api/asterisk/info?phone=${CALLERID(num)})});
SayNumber(${HASH(abon,balance)});
};
}


Set(CHANNEL(language)=ru); — устанавливаем язык в канале на русский.
Answer; — «поднимем трубку»
Set(CURLOPT(userpwd)=test:test); — у меня в api используется авторизация, следовательно Curl необходимо передать опции с логином и паролем, что я и делаю
Set(CURLOPT(hashcompat)=yes); — Говорим, что возвращаемые данные совместимы с хэш
Set(HASH(abon)=${CURL(https://test.test.ru/api/asterisk/info?phone=${CALLERID(num)})}); — собственно объявление хэша abon, данные для которого мы запрашиваем через CURL, где CALLERID(num) номер звонящего клиента — системная переменная Asterisk.
SayNumber(${HASH(abon,balance)}); — диктуем абоненту, его баланс, который вытащили из хеша.

Ваш (биллинг, CRM) в ответ на запрос должен вернуть строку следующего вида, где переменные разделены &:

find=1&balance=100.65&variable=4

Удобство этого решение заключается в том, что мы можем свободно в хэш добавить любую переменную и использовать ее потом в Asterisk, при этом текущая конфигурация не будет изменена.

Обращение к нужной переменной:

${HASH(нужный хэш, нужная переменная)}

Для обращение к переменной variable, хэша abon пишем:

${HASH(abon,variable)}

Можем использовать условия, например:

context testhash {
_00000 => {
Set(CHANNEL(language)=ru);
Answer;
Set(CURLOPT(userpwd)=test:test);
Set(CURLOPT(hashcompat)=yes);
Set(HASH(abon)=${CURL(https://test.test.ru/api/asterisk/info?phone=${CALLERID(num)})});
if (${HASH(abon,balance)} < 0 ) {
Playback(records/oplati);
Queue(q1,t,,,,,);
}
Queue(q1,t,,,,,);
};
}

В данном пример, если баланс клиента меньше нуля, мы сначала диктуем ему сообщение «oplati» затем звонок отправляем на очередь q1, если же мы в данное условие не попадаем (баланс больше или равен нулю, переменной баланс не существует) то звонок сразу отправляем на очередь q1.

А далее уже ваши фантазии.