Сергей Маликов
02.07.2020
1415

Использование AEL в диалплане

Asterisk начиная с версии 1.4 поддерживает также и диалплан, написанный на Asterisk Extension Language (AEL), который прописывается в файле extensions.ael. Возможно одновременное использование как традиционного диалплана, прописанного в extensions.conf, так и extensions.ael. Если присутствуют оба файла extensions.conf будет переписывать идентичные части. В Asterisk присутствует утилита для преобразования ael в формат extensions.conf, которая называется aelparse. Утилита […]

Asterisk начиная с версии 1.4 поддерживает также и диалплан, написанный на Asterisk Extension Language (AEL), который прописывается в файле extensions.ael. Возможно одновременное использование как традиционного диалплана, прописанного в extensions.conf, так и extensions.ael. Если присутствуют оба файла extensions.conf будет переписывать идентичные части. В Asterisk присутствует утилита для преобразования ael в формат extensions.conf, которая называется aelparse. Утилита aelparse также используется для поиска синтаксических ошибок в extensions.ael.

Команды для ael в CLI

Для применения изменений в extensions.ael в консоли Asterisk необходимо выполнить команду

ael reload
Успешное применение изменений extensions.ael

Введенная в консоли Asterisk команда

dialplan show

выведет совокупный диалплан, загруженный Asterisk из extensions.conf и extensions.ael.

Совокупный диалплан из extensions.conf и extensions.ael.

Источник каждого правила отображается в квадратных скобках, предшествующих правилу.

Сравнение extensions.conf и extensions.ael

Конец строки – команды в AEL должны  заканчиваться символом “;” так как в одной строке может быть несколько команд.

Контекст, экстеншены, приоритеты.

В AEL используются фигурные скобки. Указание приоритетов (1…n) больше не требуется.

extensions.conf:

[from-internal]
exten => _1XX,1,Dial(SIP/${EXTEN})
exten => _2XX,1,Dial(SIP/${EXTEN})

extensions.ael

context from-internal {
  _1XX => {
    Dial(SIP/${EXTEN});
  }
  _2XX => {
    Dial(SIP/${EXTEN});
  }
}

Если для экстеншена выполняется только одна команда, то фигурные скобки можно опустить:

context default {
  222 => Playback(hello);
}
В AEL открывающая фигурная скобка блока — “{", всегда должна стоять на той же строке, а не отдельно!

Комментарии

Комментарии инициируются в AEL через „//“ (две косые черты). Для многострочных комментариев, введите каждую строку отдельно с помощью „//“ .

extensions.conf

; комментарий
exten => _2XX,1,Dial(SIP/${EXTEN}) ; Dial

extensions.ael

// комментарий
_2XX => {
  Dial(SIP/${EXTEN});  // Dial
}

Включение других контекстов (include).

extensions.conf

[office1]
exten => _1XX,1,Dial(SIP/${EXTEN})
exten => 0101,1,Dial(SIP/89990001122)

[office2]
exten => 3001,1,Dial(SIP/${EXTEN})

[from-internal]
include => office1
include => office2

extensions.ael

context office1 {
  _1XX => {
    Dial(SIP/${EXTEN});
  }
  0101 => {
    Dial(SIP/89990001122);
  }
}

context office2 {
  _2XX => {
    Dial(SIP/${EXTEN});
  }
}

context from-internal {
  includes {
    office1;
    office2;
  }
}
Необходимо обратить внимание: в extensions.conf используется директива «include», в AEL «s» в конце – «includes».

extensions.conf

[globals]
PREFIX=2
FORMAT=wav

extensions.ael

globals {
  PREFIX=2;
  FORMAT=wav;
}

Выражения и назначения

AEL не является полноценным языком программирования, но поддерживает конструкции if(), while(), for(). Для получения предсказуемых результатов при назначении переменных лучше использовать Set:

extensions.conf

exten => 77,1,Set(action=saypin)
exten => 77,n,ExecIf($["${action}" = "saypin"],SayDigits,56558)

extensions.ael

77 => {
  Set(action=saypin);
  if ("${action}" = "saypin") {
    SayDigits(56558);
  }
}
}

Метки (именованные приоритеты) и переходы к ним — goto и jump

Как и в extensions.conf в ael является необязательным указание контекста (в goto, jump), экстеншена(в goto). Т.е. для того, чтобы перейти к какой либо метке в пределах текущего контекста, экстеншена в ael необходимо ввести goto label.

Следующие примеры переходов эквивалентны:

extensions.conf

Goto(from-internal,200,1)

ael(goto)

goto from-internal|200|1

ael(jump)

jump 200@from-internal
Циклы
В extensions.conf можно было использовать только 
В AEL присутствуют циклы for и while. В extensions.conf можно использовать приложения While() и EndWhile(), с помощью которых также можно описать логику цикла for.
В AEL также есть команды break и continue, которые можно использовать в циклах. break переходит к концу цикла, continue - переходит к началу.
extensions.conf
exten => 555,1,Set(x=0)
exten => 555,n,While($[${x} <= 5])
exten => 555,n,NoOp(x ist ${x})
exten => 555,n,Playback(beep)
exten => 555,n,Set(x=$[${x} + 1])
exten => 555,n,EndWhile()
exten => 555,n,NoOp(End)

extensions.ael (for)

555 => {
  for (x=0; ${x}<=5; x=${x}+1) {
    NoOp(x is ${x});
    Playback(beep);
  }
  NoOp(End);
}
extensions.ael (while)
555 => {
  x=0;
  while (${x} <= 5) {
    NoOp(x is ${x});
    // также в цикле в extensions.ael поддерживаются
    // конструкции выполняющие проверку и выход из цикла
    // if (${x} > 4) {
    //  break;
    // }
    //
    Playback(beep);
    x=${x} + 1;
  }
  NoOp(End);
}
Диалплан в extensions.ael
Сообщения в консоли при выполнении

Фильтрация по CallerID

В extensions.conf диалплан, предназначенный для определенного CallerID прописывался так:

 ;нежелательный звонок
exten => 110/89990001122,1,NoOp(Blacklist)
exten => 110/89990001122,n,Busy()
;остальные звонки
exten => 110,1,Dial(SIP/${EXTEN})

;нежелательный звонок
exten => 110/89990001122,1,NoOp(Blacklist)
exten => 110/89990001122,n,Busy()
;остальные звонки
exten => 110,1,Dial(SIP/${EXTEN})

extensions.ael

//нежелательный звонок
110/89990001122 => {
  NoOp(Blacklist);
  Busy();
}
//остальные звонки
110 => {
  Dial(SIP/${EXTEN});
}

Также вместо конкретного CallerID можно указывать шаблоны вида _23X.

Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

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

Надежен в эксплуатации.

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

Гибкий в настройке.

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

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

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

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.