Архитектура Asterisk

Архитектура Asterisk

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

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

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

Архитектура Asterisk

Asterisk имеет ядро, которое может взаимодействовать с многими модулями. Модули, называемые канальными драйверами, предоставляют каналы, которые следуют диалоговому окну Asterisk, для выполнения запрограммированного поведения и облегчения связи между устройствами или программами вне Asterisk. Каналы часто используют механизм моста для взаимодействия с другими каналами.
Ядро
Сердцем любой системы Asterisk является ядро. Ядро PBX является важным компонентом, который обеспечивает всю инфраструктуру. Среди основных функций ядро считывает файлы конфигурации, включая dialplan, и загружает все остальные модули, различные компоненты, которые обеспечивают большую функциональность.
Ядро загружает и строит маршрутизацию, которая является одним и основных компонентов любой системы Asterisk. Диалплан содержит список команд, которые Asterisk должна соблюдать, чтобы знать, как обрабатывать входящие и исходящие вызовы в системе.
Модули
Помимо функциональности, предоставляемой ядром Asterisk, модули обеспечивают все остальные функции. Многие модули распространяются вместе с Asterisk, хотя другие модули могут быть доступны членам сообщества или даже предприятиям, которые создают коммерческие модули. Модули, распространяемые вместе с Asterisk, могут быть созданы при установке Asterisk.
Модули не только произвольно построены, но и вы можете повлиять на время загрузки, будут ли они вообще загружены, порядок загрузки или даже выгрузить/загрузить их во время выполнения. Большинство модулей независимо настраиваются и имеют свои собственные файлы конфигурации. Некоторые модули поддерживают конфигурацию, которая будет читаться статически или динамически (в реальном времени) из баз данных.
С точки зрения логистики эти модули обычно представляют собой файлы с расширением .so, которые находятся в каталоге модулей Asterisk (обычно это /usr/lib/asterisk/modules). Когда Asterisk запускается, он загружает эти файлы и добавляет их функциональность в систему.
Модули Asterisk, которые являются частью ядра, имеют имя файла, которое выглядит как pbx_xxxxx.so.
Некоторые примеры модулей:
  • chan_pjsip использует res_pjsip и многие другие модули res_pjsip для предоставления стека SIP для SIP-устройств и взаимодействия с Asterisk и друг с другом через Asterisk.
  • app_voicemail предоставляет традиционные функции голосовой почты.
  • app_confbridge предоставляет конференц-комнаты с многими дополнительными функциями.
  • res_agi предоставляет интерфейс Asterisk Gateway, API, который позволяет управлять вызовами из внешних скриптов и программ.
Звонки и каналы
Основной целью Asterisk является создание отказоустойчивых систем и приложений, работающих в реальном времени.
В большинстве, но не во всех случаях это означает, что вы будете иметь дело с концепцией «вызовы». Вызовы в терминологии телефонии обычно относятся к одному телефону, обменивающемуся (вызывающим) с другим телефоном через телефонную сеть. Однако в случае Asterisk вызов обычно использует один или несколько каналов.
Вот несколько примеров «вызовов»:
  • Телефон вызывает другой телефон через Asterisk.
  • Телефон вызывает сразу несколько телефонов (например, пейджинг) через Asterisk.
  • Телефон вызывает приложение, например, app_voicemail или app_queue
  • Создание локального канала для взаимодействия с приложениями или другим каналом.
Каналы
Каналы создаются Asterisk с использованием Channel Drivers. Они могут использовать другие ресурсы в системе Asterisk для облегчения различных типов связи между одним или несколькими устройствами. Каналы могут быть подключены к другим каналам и подвержены воздействию приложений и функций. Каналы могут использовать многие другие ресурсы, предоставляемые другими модулями или внешними библиотеками. Например, SIP-каналы при передаче звука будут использовать кодеки и модули формата. Каналы могут взаимодействовать сразу со множеством разных модулей.
Маршрутизация
Dialplan – это один из основных способов управления поведением Asterisk. Dialplan существует в виде текстовых файлов (например, extensions.conf) либо во встроенном языке сценариев dialplan, в форматах AEL или LUA. В качестве альтернативы Dialplan может быть прочитан из базы данных вместе с другой конфигурацией модуля. При написании Dialplan вы будете активно использовать приложения и функции для воздействия на каналы, конфигурацию и функции.
Dialplan также может вызывать другие интерфейсы, такие как AGI, для получения инструкции управления вызовами из внешних скриптов и программ.

Типы модулей Asterisk

Существует множество различных типов модулей, каждый из которых предоставляет свои функции и возможности Asterisk.
Используйте команду «module show» модуля в CLI, чтобы увидеть все загруженные модули в вашей системе Asterisk.

Канальные драйверы

Драйверы каналов взаимодействуют с устройствами вне Asterisk и переводят эту конкретную сигнализацию или протокол в ядро.

Приложения Dialplan

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

Функции Dialplan

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

Ресурсы

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

Кодеки

CODEC (который является акронимом для COder/DECoder) – это модуль для кодирования или декодирования аудио или видео. Как правило, кодеки используются для кодирования носителя, чтобы он занимал меньше полосы пропускания. Они необходимы для перевода звука между аудиокодеками и типами используемых нагрузок различных устройств.

Драйвер формата файла

Драйвер формата файла используется для сохранения носителя на диск в определенном формате и для преобразования этих файлов в медиапотоки в сети.

Драйвер записи подробной информации о вызовах (CDR)

Драйверы CDR записывают журналы вызовов на диск или в базу данных.

Драйверы журнала событий (CEL)

Журналы событий вызовов аналогичны журналам CDR, но записывают более подробную информацию о том, что произошло внутри Asterisk во время определенного вызова.

Мостовые драйверы

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

Модули драйвера канала

Все вызовы извне Asterisk проходят через драйвер канала до достижения ядра, и все исходящие вызовы проходят через драйвер канала по пути к внешнему устройству.
Драйвер канала PJSIP (chan_pjsip), например, связывается с внешними устройствами с использованием протокола SIP. Он преобразует сигнализацию SIP в ядро. Это означает, что ядро ​​Asterisk сигнализирует об агностике. Поэтому Asterisk – это не просто механизм связи SIP или VOIP, это многопротокольный движок.
Все драйверы каналов имеют имя файла, которое выглядит как chan_xxxxx.so, например chan_pjsip.so или chan_dahdi.so.

Модули приложений Dialplan

Модули маршрутизации обеспечивают функцию вызова для системы. Эти приложения последовательно запускаются в диалплане. Например, вызов может использовать одно приложение для ответа на вызов, другое – для воспроизведения звуковой подсказки с диска и третьего приложения, позволяющего вызывающему абоненту оставлять голосовую почту в определенном почтовом ящике.
Все прикладные модули имеют имена файлов, которые выглядят как app_xxxxx.so, например app_voicemail.so, однако приложения и функции также могут предоставляться ядром и другими модулями. Модули, такие как res_musiconhold и res_xmpp, предоставляют приложения, связанные с их собственной функциональностью.

Модули функций Dialplan

Функции Dialplan несколько похожи на приложения Dialplan, но вместо того, чтобы выполнять работу на определенном канале или вызове, они просто извлекают или устанавливают конкретную настройку на канале или выполняют манипуляции с текстом. Например, функция Dialplan может извлекать информацию идентификатора вызывающего абонента из входящего вызова, фильтровать текст или устанавливать тайм-аут для ввода вызывающего абонента.
Все функциональные модули Dialplan имеют имена файлов, которые выглядят как func_xxxxx.so, например func_callerid.so, однако приложения и функции также могут предоставляться ядром и другими модулями. Модули, такие как res_musiconhold и res_xmpp, предоставляют приложения, связанные с их собственной функциональностью.

Ресурсные модули

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

Модули кодеков

Модули CODEC имеют имена файлов, которые выглядят как codec_xxxxx.so, такие как codec_alaw.so и codec_ulaw.so.
CODEC представляют собой математические алгоритмы для кодирования (сжатия) и декодирования (декомпрессии) медиапотоков. Asterisk использует модули CODEC для отправки и получения мультимедиа (аудио и видео). Asterisk также использует модули CODEC для преобразования (или перекодирования) медиапотоков между различными форматами.
Asterisk снабжен модулями CODEC для следующих типов носителей:
  • ADPCM, 32 кбит/с
  • G.711 A-law, 64 кбит/с
  • G.711 μ-law, 64 кбит/с
  • G.722, 64 кбит/с
  • G.726, 32 кбит/с
  • GSM, 13 кбит/с
  • LPC-10, 2,4 кбит/с
Ядро Asterisk предоставляет возможность для 16-битного Signed Linear PCM, который кодирует или кодирует все кодеки. Существует еще один модуль CODEC, codec_resample, который позволяет повторную выборку Signed Linear в разные частоты дискретизации 12,16,24,32,44,48,96 или 192 кГц для облегчения перевода.
Также могут быть установлены аналогичные модули CODEC, если их зависимости обнаружатся во время компиляции Asterisk.
Если обнаружены драйверы DAHDI, то будет установлен codec_dahdi.
Если обнаружены библиотеки разработки Speex (www.speex.org), будет также установлен codec_speex.
Если обнаружены библиотеки разработки iLBC (www.ilbcfreeware.org), будет также установлен codec_ilbc.
Поддержка патентованных кодеков G.729A или G.723.1 предоставлена ​​Digium на коммерческой основе с помощью программного обеспечения (G.729A) или оборудования (G.729A и G.723.1). Для получения дополнительной информации о приобретении лицензий или оборудования для использования кодеков G.729A или G.723.1 с Asterisk обратитесь на сайт Digium.
Поддержка обремененных патентом, но свободных G.722.1 кодеков Siren7 и G.722.1C Siren14, или для SILK CODEC для Skype, может быть включена в Asterisk, загрузив двоичные модули CODEC с веб-сайта Digium.
В интерфейсе командной строки Asterisk используйте команду «core show translation», чтобы отобразить время перевода между всеми зарегистрированными аудиоформатами.

Драйвер формата файла

Asterisk использует модули формата файла для переноса медиафайлов (например, аудио и видео) из сети и сохранения их на диске или извлечения указанных файлов с диска и преобразования их обратно в медиапоток. Хотя это часто связано с кодеками, может быть более одного доступного формата на диске для конкретного кодека.
Модули формата файла имеют имена файлов, которые выглядят как format_xxxxx.so, такие как format_wav.so и format_jpeg.so.
Ниже приведен список модулей формата, включенных в последние версии Asterisk:
  • format_g719
  • format_g723
  • format_g726
  • format_g729
  • format_gsm
  • format_h263
  • format_h264
  • format_ilbc
  • format_jpeg
  • format_ogg_vorbis
  • format_pcm
  • format_siren7
  • format_siren14
  • format_sln
  • format_vox
  • format_wav_gsm
  • format_wav

Драйвер записи информации о вызовах (CDR)

Модули CDR используются для хранения записей подробной информации о вызовах (CDR) в различных форматах. К популярным механизмам хранения относятся файлы с разделителями-запятыми (CSV), а также реляционные базы данных, такие как MySQL или PostgreSQL. Записи с подробной информацией о вызовах обычно содержат по одной записи за звонок и предоставляют подробную информацию, например, кто сделал звонок, кто ответил на звонок, время, затраченное на вызов, и так далее.
Модули записи подробной информации о вызовах имеют имена файлов, которые выглядят как cdr_xxxxx.so, например cdr_csv.so. Рекомендуемым модулем для подключения к CDR Storage Backends является cdr_adaptive_odbc.so.

Модули драйверов событий (CEL)

Журналы событий вызовов записывают различные действия, которые происходят при вызове. Таким образом, они, как правило, более подробно описывают записи подробных сведений о вызовах. Например, журнал событий звонков может показать, что Алиса позвонила Бобу, что звонок Боба прозвучал в течение двадцати секунд, затем мобильный телефон Боба зазвонил в течение пятнадцати секунд, затем звонок перешел к голосовой почте Боба, где Алиса оставила голосовую почту на двадцать пять секунд и повесила трубку. Система также позволяет регистрировать пользовательские события.
Модули регистрации событий вызова имеют имена файлов, которые выглядят как cel_xxxxx.so, такие как cel_custom.so и cel_adaptive_odbc.so.

Мостовые модули

Начиная с Asterisk 1.6.2, Asterisk представил новый метод для соединения вызовов. Он опирается на различные модули моста для контроля того, как медиапотоки должны смешиваться для участников при вызове.
Мостовые модули имеют имена файлов, которые выглядят как bridge_xxxxx.so, такие как bridge_simple.so и bridge_multiplexed.so.

Каталог и структура файлов

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

Файлы конфигурации Asterisk

astetcdir => /etc/asterisk
Это место используется для хранения и чтения файлов конфигурации Asterisk. Обычно это файлы с расширением .conf, .lua и .ael.
Модули Asterisk
astmoddir => /usr/lib/asterisk/modules
Загружаемые модули в формате Shared Object (.so), установленные Asterisk или пользователем, находятся здесь.
Различные библиотеки
astvarlibdir => /var/lib/asterisk
Здесь добавляются дополнительные элементы библиотеки и файлы, содержащие данные, используемые во время выполнения.
Каталог баз данных
astdbdir => /var/lib/asterisk
Это место используется для хранения файла данных для внутренней базы данных Asterisk. В версиях Asterisk с использованием базы данных SQLite3 файл будет называться astdb.sqlite3.
Шифрование ключей
astkeydir => /var/lib/asterisk
При настройке шифрования на основе ключей, Asterisk будет их искать в этом каталоге.
Каталог системных данных
astdatadir => /var/lib/asterisk
По умолчанию звуки Asterisk сохраняются и считываются из подкаталога звуков в этом месте.
Интерфейс AGI (интерфейс сервера Asterisk)
astagidir => /var/lib/asterisk/agi-bin
При использовании различных приложений AGI Asterisk по умолчанию ищет скрипты AGI в этом каталоге.
Каталог очередей
astspooldir => /var/spool/asterisk
Этот каталог используется для хранения файлов очередей из различных компонентов ядра и модулей Asterisk.
Большинство из них используют свои собственные подкаталоги, например:
  • dictate
  • meetme
  • monitor
  • outgoing
  • recording
  • system
  • tmp
  • voicemail
Запуск процессов
astrundir => /var/run/asterisk
Когда Asterisk работает, вы увидите здесь два файла: asterisk.ctl и asterisk.pid. Это управляющий сокет и файлы PID (Process ID) для Asterisk.
Логи
astlogdir => /var/log/asterisk
Когда Asterisk настроен на предоставление вывода файлов логов, они будут сохранены в этом каталоге.
Системный двоичный каталог
astsbindir => /usr/sbin
По умолчанию Asterisk ищет в этом каталоге любые системные двоичные файлы, которые он использует, если вы переместите двоичный файл Asterisk или любые другие, которые он использует, вам нужно будет изменить это местоположение.