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

UnixForum





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

Система Asterisk

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

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

1.2.3. Функции dialplan

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

exten => 1234,1,Set(MY_VARIABLE=foo)
    same => n,Verbose(MY_VARIABLE is ${MY_VARIABLE})

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

В следующем примере демонстрируется использование функции dialplan. Во-первых, в командную строку Asterisk выводится идентификатор CallerID текущего канала. Затем, с помощью приложения SET изменяется значение CallerID. В этом примере, Verbose и SET являются приложениями маршрутизации, а CALLERID является функцией.

exten => 1234,1,Verbose(The current CallerID is ${CALLERID(num)})
    same => n,Set(CALLERID(num)=<256>555-1212)

В данном случае функция dialplan используется вместо обычной переменной, поскольку информация CallerID хранится в структуре данных в экземпляре ast_channel. В коде функции dialplan известно, как этой структуре присваивать значения и как из нее значения извлекать.

В следующем примере использования функции dialplan показано, как добавлять специальную информацию в журналы вызовов, называемыми записями CDR (Call Detail Records или подробные записи о вызове). Функция CDR позволяет получать записи с подробной информацией о вызове, а также добавлять специальную информацию.

exten => 555,1,Verbose(Time this call started: ${CDR(start)})
    same => n,Set(CDR(mycustomfield)=snickerdoodle)

1.2.4. Трансляторы кодеков

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

Когда устанавливается соединение, Asterisk для того, чтобы не надо было делать преобразований, будет пытаться сделать так, чтобы на двух конечных устройствах использовались одинаковые медиакодеки. Однако, это возможно не всегда. Даже если используются одинаковые кодеки, все равно может потребоваться преобразование. Например, если система Asterisk настроена так, что когда аудиосигнал проходит через систему, требуется какая-нибудь его обработка (например увеличение или уменьшение уровня громкости), то системе Asterisk прежде, чем она сможет выполнить обработку сигнала, потребуется перекодировать аудио сигнал в распакованные вариант. Система Asterisk также может быть сконфигурирована так, чтобы записывать телефонные вызовы. Если указанный в конфигурации формат записи отличается от того, который используется при вызове, то потребуется перекодировка.

Взаимодействие кодеков

То, как осуществляется выбор, какой кодек будет использоваться для медиа-потока, конкретно зависит от технологии, используемой для передачи вызова в систему Asterisk. В некоторых случаях, например, как вызов в традиционной телефонной сети (PSTN), вариантов выбора вообще нет. Однако в других случаях, особенно при использовании протоколов IP, выбирается такой способ, когда для обеих сторон указываются возможности и предпочтения и выбирается общий подходящий кодек.

Например, когда вызов посылается в систему Asterisk, то, в случае использования протокола SIP (протокол, наиболее часто используемый в сетях VOIP), процедура выбора кодека, в самом общем виде, будет выглядеть следующим образом:

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

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

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

Более подробную информацию об интерфейсе API трансляторов кодеков смотрите в include/asterisk/translate.h и в main/translate.c. Реализации абстракции трансляторов можно найти в каталоге codecs.


Продолжение статьи: Потоки.