Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

Система Asterisk

Глава 1 из книги "Архитектура приложений с открытым исходным кодом", том 1.

Оригинал: Asterisk, глава из книги "The Architecture of Open Source Applications" том 1.
Автор: Russell Bryant
Перевод: Н.Ромоданов

1.1. Основные архитектурные концепции

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

1.1.1. Каналы

Канал (channel) в Asterisk представляет собой соединение между системой Asterisk и некоторым конечным телефонным устройством (рис.1.1). Наиболее общим примером является случай, когда телефон отправляет телефонный вызов в систему Asterisk. Такое соединение будет представлено в виде в отдельного канала. В коде Asterisk канал существует как экземпляр структуры данных {ast_channel.

Рис.1.1: Одиночный вызов, представленный отдельным каналом

1.1.2. Соединение каналов типа «мост»

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

Рис.1.2: Два звена вызова, представленных двумя каналами

Когда каналы системы Asterisk соединяются таким образом, то такое соединение между каналами называется соединением типа «мост» (channel bridge). Создание моста является действием по соединению каналов вместе с целью передачи между ними медиаданных. Даже в случае, когда для каждой вызова с конечного устройства есть более одного потока медиаданных (например, аудио и видео данных), в системе Asterisk используется только единственный канал. На рис.1.2, где показаны два канала для телефонов А и В, на соединение типа «мост» возложена обязанность передачи медиаданных, идущих из телефона А в телефон В и, аналогичным образом, передачи медиаданных, идущих из телефона В в телефон А. Система Asterisk выступает в роли посредника по передаче всех потоков медиаданных. Не разрешено ничего, что не определено в системе Asterisk и над чем в системе Asterisk нет полного контроля. Это означает, что система Asterisk может делать записи, манипулировать с аудио-сообщениями и производить преобразования между форматами, относящимися к различным технологиям.

Когда происходит соединение двух каналов с помощью моста, то есть два способа, с помощью которых это можно сделать: создать универсальный мост (generic bridge) или нативный мост (native bridge). Универсальный мост является соединением, которое может работать независимо от того, какие технологии используются внутри канала. Он передает все аудио-сообщения и сигналы через абстрактный интерфейс, имеющийся в системе Asterisk. Хотя это наиболее гибкий способ создания мостового соединения, он является также наименее эффективным из-за того, что есть несколько уровней абстракций, которые требуется использовать с тем, чтобы выполнить задачу. Пример универсального моста приведён на рис.1.2.

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

Решение о выборе универсального или нативного мостового соединения делается с помощью сравнения каналов в тот момент, когда они соединяются мостом. Если для обоих каналов указывается, что в них поддерживается один и тот же способ нативного мостового соединения, то именно он и будет использоваться. В противном случае будет использован универсальный способ соединения типа «мост». Для того чтобы определить, поддерживается ли в обоих каналах один и тот же нативный способ мостового соединения, применяется простая функция, написанная на языке C, в которой выполняется сравнение указателей. Естественно, что это не самый элегантный способ, но мы еще ни разу не сталкивались с какими-либо случаями, когда этого для наших целей оказывалось недостаточным. Функция создания нативных мостовых соединений каналов будет более подробно рассматриваться в разделе 1.2. На рис.1.3 показан пример нативного мостового соединения.

Рис.1.3. Пример нативного соединения типа «мост»

1.1.3. Фреймы

Передача данных внутри кода Asterisk во время осуществления вызова происходит с использованием фреймов (frames); каждый фрейм является экземпляром структуры данных ast_frame. Фреймы могут быть либо медиафреймами (media frames), либо сигнальными фреймами (signalling frames). Во время обычного телефонного вызова звонка через систему будет передаваться поток медиафреймов, содержащих аудио данные. Сигнальные фреймы используются для передачи сообщений о событиях, касающихся вызова, например, о нажатии кнопки с цифрой, о переводе вызова в режим ожидания или о завершении вызова.

Список имеющихся фреймов определен статически. Каждый фрейм маркируется числом, в котором закодирован тип и подтип. Полный список можно найти в исходном коде в файле include/asterisk/frame.h; ниже приведено несколько примеров:

  • VOICE: С помощью этих фреймов осуществляется передача порции аудиоданных.
  • VIDEO: С помощью этих фреймов осуществляется передача порции видеоданных.
  • MODEM: Этот кодирование используется для данных при передаче данных во фрейме, например, использование протокола T.38 для передачи факса поверх IP. Первоначально этот тип фрейма использовался для факсов. Важно, что фреймы с данными можно совершенно спокойно оставлять в том виде, как они есть, поскольку сигнал будет успешно декодирован на другом конце линии. Они отличаются от фреймов AUDIO, так что его можно преобразовывать с помощью других кодеков и сохранять пропускную способность канала за счет снижения качества звука.
  • CONTROL: Сообщение, сигнализирующее о вызове, которое указывается этим фреймом. Эти фреймы используются для индикации событий, сигнализирующих о вызове. К числу этих событий относятся ответ на телефонный вызов, завершение вызова, удержание вызова и т.д.
  • DTMF_BEGIN: Начало нажатия на клавишу с цифрой. Этот фрейм отправляется, когда абонент начинает нажимать клавишу DTMF [2] на своем телефоне
  • DTMF_END: Завершение нажатия на клавишу с цифрой. Этот фрейм отправляется, когда абонент прекращает нажимать клавишу DTMF [2] на своем телефоне.

Продолжение статьи: Компонентные абстракции системы Asterisk.