В данной статье я хочу рассказать о том, как с помощью ael (Asterisk Extension Language) упростить свою жизнь.
Рассмотрим ситуацию, когда при входящем звонке Asterisk обращается к внешней системе (биллинг, CRM) и получает множественные данные о клиенте (например: баланс, номер счета и т.д.). В этом случае встает вопрос: как получать эти данные и как ими пользоваться в дальнейшем наиболее масштабируемо? Массивы сразу были отвергнуты по причине того, что переменные должны располагаться в строгом порядке, и добавление новой переменной может привести к изменению большой части конфигурации Asterisk, поэтому был выбран хэш, о примере использования которого я и хочу рассказать.
Рассмотрим небольшой пример и разберем его построчно:
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) в ответ на запрос должен вернуть строку следующего вида, где переменные разделены &:
Удобство этого решение заключается в том, что мы можем свободно в хэш добавить любую переменную и использовать ее потом в Asterisk, при этом текущая конфигурация не будет изменена.
Обращение к нужной переменной:
Для обращение к переменной variable, хэша abon пишем:
Можем использовать условия, например:
В данном пример, если баланс клиента меньше нуля, мы сначала диктуем ему сообщение «oplati» затем звонок отправляем на очередь q1, если же мы в данное условие не попадаем (баланс больше или равен нулю, переменной баланс не существует) то звонок сразу отправляем на очередь q1.
А далее уже ваши фантазии.
Рассмотрим ситуацию, когда при входящем звонке 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.
А далее уже ваши фантазии.