Pull to refresh

Использование Hash в asterisk

В данной статье я хочу рассказать о том, как с помощью 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.

А далее уже ваши фантазии.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.