Яндекс.Метрика

Курс Zabbix: мониторинг Asterisk и VoIP

Курс Zabbix: мониторинг Asterisk и VoIP с 8 сентября по 12 сентября

Количество
свободных мест

8 Записаться

Дистанционные курсы по Asterisk

Дистанционные курсы по Asterisk с 18 августа по 24 августа

Количество
свободных мест

2 Записаться

Курсы по Mikrotik MTCRE

Курсы по Mikrotik MTCRE с 8 декабря по 11 декабря

Количество
свободных мест

6 Записаться
Межканальная передача переменных в Asterisk
29
Доклад
Игорь Гончаровский
Межканальная передача переменных в Asterisk
скачать презентацию

Межканальная передача переменных в Asterisk

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

Одна из типичных задач — передача переменных между каналами. Это особенно актуально при работе с Dialplan, когда создаётся несколько каналов, и необходимо передавать переменные от одного канала к другому.

С самого начала Asterisk поддерживает определённые механизмы для этого. Однако понимание синтаксиса и логики их работы часто вызывает затруднения, особенно у инженеров, впервые сталкивающихся с такими задачами. Например, вопросы вызывают различия между одной и двумя подчёркиваниями в именах переменных.

Подчёркивания и передача переменных

Согласно внутренней логике Asterisk:

  • Переменные с одним подчёркиванием (_) копируются при создании нового канала, но не передаются далее.
  • Переменные с двумя подчёркиваниями (__) передаются во все дочерние каналы по цепочке.

Эта логика реализована в коде Asterisk и встречается во множестве функций. Внутри функции создания канала производится выбор переменных: _ удаляется, __ остаётся. Это позволяет обеспечить корректную передачу переменных между локальными каналами.

Возврат значений из дочерних каналов

Если переменные были переданы от одного канала к другому, возникает следующая задача — вернуть обратно результаты (например, статус вызова, продолжительность и т.п.). Здесь появляется функция MASTER_CHANNEL.

Эта функция находит канал с тем же linkedid, что и текущий, и выбирает самый «старый» из них. Однако при сложных сценариях следует учитывать, что канал, породивший другие, может уже завершить своё существование. Тогда обращение через MASTER_CHANNEL может привести к другому, более «живому» каналу, имеющему тот же linkedid.

Важно понимать, что MASTER_CHANNEL не ищет «родителя» в дереве каналов, а просто находит первый канал с совпадающим linkedid. Это касается и случаев, когда каналы были разделены (например, через transfer).

MASTER_CHANNEL работает также при инициировании вызова через AMI Originate. В этом случае создаются два независимых канала, но у них один linkedid, что позволяет использовать один из них как хранилище общих переменных.

EXPORT / IMPORT и именованные каналы

Для передачи переменных между независимыми каналами можно использовать функции IMPORT и EXPORT. Эти функции позволяют работать с переменными канала, зная его полное имя.

Пример использования: в конференц-сценарии канал A запускает каналы B и C. Необходимо, чтобы B и C знали общие переменные из A. Сначала через EXPORT переменные задаются в A, затем в B и C импортируются через IMPORT. Таким образом, переменные сохраняются в пространстве канала A.

Функции работают и с другими функциями Asterisk — можно, например, вызывать RTPSTAT или другие, если требуется получить данные другого канала.

Работа с SIP и межсерверное взаимодействие

При работе с несколькими серверами (например, продукт типа спикет-антибот), переменные приходится передавать между серверами.

Передача в прямом направлении возможна через SIP-заголовки. Заголовки задаются в INVITE при создании канала и передаются в SIP. Однако они добавляются только на этапе инициации вызова.

Для передачи данных обратно (например, при завершении вызова), не всегда возможно пересоздать вызов. В таких случаях можно использовать функцию CONNECTEDLINE. Она отправляет reINVITE с нужными заголовками и может быть использована для записи статистики или других параметров в CDR.

Другой способ — завершить вызов и инициировать новый, передавая параметры в номере. Например, затрансферить звонок обратно на исходный сервер с параметрами, закодированными в exten.

Опасности использования AStDB и Share

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

Вместо AStDB можно использовать MASTER_CHANNEL, передавая переменные с уникальными идентификаторами.

Также встречается использование функции SHARED. Она создаёт отдельное хранилище переменных, прикреплённое к каналу, но работает нестабильно. В документации прямо говорится о возможных состояниях гонки и отсутствии гарантий, в какой канал переменная будет установлена. Функция может использовать префикс вместо имени канала, что делает поведение непредсказуемым.

Если всё же используется SHARED, крайне рекомендуется применять LOCK/UNLOCK для управления доступом к переменным.

Заключение

Работа с переменными в Asterisk требует аккуратного подхода. Использование нативных средств — __, MASTER_CHANNEL, IMPORT/EXPORT, CONNECTEDLINE — позволяет решать большинство задач без привлечения внешних механизмов.
При проектировании систем на Asterisk важно отдавать предпочтение прозрачным и управляемым средствам передачи переменных, избегая неочевидных или устаревших решений.

Ежегодная конференция по Asterisk 2025!

Билеты уже в продаже!

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

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

Наши
клиенты

Посмотреть все