# Глава 2. Архитектура Asterisk

> *Прежде всего, но не обязательно в таком порядке.*
>
> – Доктор Кто

Asterisk очень отличается от других, более традиционных УАТС тем, что диалплан в Asterisk обрабатывает все входящие каналы по существу одинаково, а не разделяя их на станции, транки, периферийные модули и т.д.

В традиционной АТС существует логическое различие между станциями (телефонными аппаратами) и транками (магистралями - ресурсами, которые подключаются к внешнему миру). Это ограничение делает творческую маршрутизацию в традиционных УАТС очень сложной или невозможной.

Asterisk, с другой стороны, не имеет внутреннего понятия транков или станций. В Asterisk все, что входит или выходит из системы, проходит через какой-то канал. Существует множество различных типов каналов; однако диалплан Asterisk обрабатывает все каналы аналогичным образом, что означает, например, внутренний пользователь может существовать на конце внешнего транка (например, сотовый телефон) и обрабатываться диалпланом точно так же, как если бы пользователь был на внутреннем номере. Если вы не работали с традиционной АТС[1](#sdfootnote1sym), то может быть не сразу очевидно насколько это является мощным и освобождающим. Рисунок 2-1 иллюстрирует различия между этими двумя архитектурами.

![Рисунок 2-1. Архитектура Asterisk против УАТС](pics/pic2-1.png)
 *Рисунок 2-1. Архитектура Asterisk против УАТС*

## Модули

Asterisk построена на *модулях*. Модуль — это загружаемый компонент, обеспечивающий определенную функциональность, такую как драйвер канала (например, chan_pjsip.so) или ресурс, который позволяет подключиться к внешней технологии (например func_odbc.so). Модули Asterisk загружаются на основе параметров, определенных в файле */etc/asterisk/modules.conf*. Мы обсудим использование многих модулей в этой книге, но на этом этапе мы просто хотим представить концепцию модулей и дать вам представление о типах модулей, которые доступны.

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

В![img](file:///tmp/lu11103ktjkbj.tmp/lu11103ktjkcp_tmp_5d7740068e6bed33.png) ы можете запустить Asterisk без модулей, загружаемых по умолчанию и загружать каждый нужный модуль вручную из консоли, но это не то, что вы хотели бы запустить в продакшн; это было бы полезно только в том случае, если бы вы настраивали производительность системы, в которой хотели убрать все, что не требуется вашим конкретным приложением Asterisk.      

Типы модулей в Asterisk включают в себя следующие:

- Приложения - рабочие лошадки диалплана, такие как Dial(), Voicemail(), Playback(), Queue() и т.д.
- Модули соединения — механизмы, которые соединяют каналы (вызовы) друг с другом
- Модули записи деталей вызовов (CDR)
- Модули регистрации событий канала (CEL)
- Драйверы каналов — различные соединения с системой и из системы; SIP (Session Initiation Protocol) использует канальный драйвер PJSIP
- Трансляторы кодеков — преобразовывают различные кодеки как G729, G711, G722, Speex и так далее
- Интерпретаторы форматов — как указано выше, но относящиеся к файлам, хранящимся в файловой системе
- Функции диалплана — расширенные возможности диалплана
- Модули УАТС
- Модули ресурсов
- Дополнительные модули
- Тестовые модули

Существует официальный список типов статуса поддержки, включенных в menuselect[2](#sdfootnote2sym).

### Приложения

Приложения диалплана используются в *extensions.conf* для определения различных действий, применимых к вызову. Например, приложение Dial() отвечает за создание исходящих соединений с внешними ресурсами и, возможно, является самым важным приложением диалплана. Доступные приложения перечислены в Таблице 2-1.

*Таблица 2-1. Популярные приложения диалплана*

| Имя                 | Назначение                                                   |
| ------------------- | ------------------------------------------------------------ |
| app_authenticate    | Сравнивает сигналы набора DTMF с 			указанной строкой (паролем) |
| app_cdr             | Записывает данные в CDR                                      |
| app_chanspy         | Позволяет каналу прослушивать аудио 			на другом канале |
| app_confbridge      | Обеспечивает конференц-связь                                 |
| app_dial            | Используется для соединения каналов 			вместе (т. е. для совершения телефонных 			звонков) |
| app_directed_pickup | Отвечает на вызов, 			который вызывает 			другой добавочный номер |
| app_directory       | Представляет список имен из 			*voicemail.conf*     |
| app_dumpchan        | Дамп переменных канала в интерфейс 			командной строки Asterisk (CLI) |
| app_echo            | Эхо-сигналы, полученные обратно в 			исходный канал (может быть полезно 			для демонстрации задержки) |
| app_exec            | Содержит Exec(), 			TryExec() 			и ExecIf(): 			выполняет приложение диалплана по 			условию |
| app_mixmonitor      | Записывает обе стороны вызова (передача 			и прием) и смешивает их вместе в один 			файл |
| app_originate       | Позволяет логике диалплана 			инициировать вызов (в отличие от 			вызова, поступающего на канал) |
| app_page            | Создает несколько аудио соединений 			с указанными устройствами для 			публичного вещания (пейджинг) |
| app_parkandannounce | Включает автоматическое оповещение 			о припаркованных вызовах |
| app_playback        | Воспроизведение файла в 			канал (не принимает ввод) |
| app_playtones       | Воспроизведение пар тонов указанных 			частот (в основном DTMF) |
| app_queue           | Обеспечивает автоматическое 			распределение вызовов (ACD) |
| app_read            | Запрашивает ввод цифр от абонентов 			и назначает ввод переменной |
| app_readexten       | Запрашивает ввод цифр у вызывающих 			абонентов и передает вызов на указанный 			добавочный номер и контекст |
| app_record          | Запись полученного аудио в файл                              |
| app_senddtmf        | Передает DTMF вызывающей стороне                             |
| app_stack           | Обеспечивает Gosub(), 			GoSubIf(), 			Return(), 			SteckPop(), 			LOCAL() 			и 			Local_PEEK() |
| app_stasis          | Передает управление вызовами в 			приложение ARI - многие разработчики 			Asterisk используют это приложение, а 			оттуда обрабатывают всю остальную 			часть своей разработки за пределами 			диалплана Asterisk |
| app_system          | Выполняет команды в Linux shell                              |
| app_transfer        | Выполняет трансфер на текущем канале                         |
| app_voicemail       | Предоставляет голосовую почту                                |
| app_while           | Включает While(), 			EndWhile(), 			ExitWhile() 			и 			ContinueWhile(); 			обеспечивает функциональность цикла 			while 			в диалплане |

### Модули соединений

Модули соединений выполняют фактическое соединение каналов. Эти модули, перечисленные в Таблице 2-2, в настоящее время используются только для (и необходимы) *app_confbridge*.

*Таблица 2-2. Модули соединений*

| Имя                     | Назначение                                                   |
| ----------------------- | ------------------------------------------------------------ |
| bridge_builtin_features | Выполняет соединение при использовании 			встроенных пользовательских функций 			(например, найденных в *features.conf*). |
| bridge_multiplexed      | Выполняет сложное мультиплексирование, 			как требуется в большом конференц-зале 			(несколько участников). В настоящее 			время используется только app_confbridge. |
| bridge_simple           | Выполняет простое соединение 			канал-канал.        |
| bridge_softmix          | Выполняет простое мультиплексирование, 			как требуется в большом конференц-зале 			(несколько участников). В настоящее 			время используется только app_confbridge. |

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

### Модули записи деталей вызова (CDR)

Модули CDR, перечисленные в Таблице 2-3, предназначены для обеспечения как можно большего числа методов хранения записей сведений о вызовах. CDR можно хранить в файле (по умолчанию), базе данных, RADIUS или *syslog*.

З![img](file:///tmp/lu11103ktjkbj.tmp/lu11103ktjkcp_tmp_5d7740068e6bed33.png) аписи деталей вызовов не предназначены для использования в сложных приложениях биллинга. Если вам требуется больше контроля над биллингом и отчетностью о вызовах - обратите внимание на журнал событий канала (CEL), обсуждаемый далее. Преимущество CDR заключается в том, что он просто работает.       

*Таблица 2-3. Общие модули записи деталей вызова*

| Имя               | Назначение                                                   |
| ----------------- | ------------------------------------------------------------ |
| cdr_adaptive_odbc | Позволяет записывать CDR через платформу 			ODBC с возможностью добавления 			пользовательских полей |
| cdr_csv           | Записывает CDR на диск в файл с 			разделителями-запятыми (CSV) |
| cdr_custom        | Записывает CDR в файл CSV, но допускает 			добавление пользовательских полей |
| cdr_odbc          | Пишет CDR через ODBC фреймворк                               |
| cdr_syslog        | Записывает CDR в *syslog*                                    |

### Модули **журналирования** событий канала

Регистрация событий канала (CEL) обеспечивает гораздо более мощный контроль над отчетами об активности вызовов. Кроме того, он требует более тщательного планирования вашего плана набора и ни в коем случае не будет работать автоматически. Модули Asterisk CEL перечислены в Таблице 2-4.

*Таблица 2-4. Модули логирования событий канала*

| Имя         | Назначение       |
| ----------- | ---------------- |
| cel_custom  | CEL на диск/файл |
| cel_manager | CEL в AMI        |
| cel_odbc    | CEL в ODBC       |

### Драйверы каналов

Без драйверов каналов у Asterisk не было бы возможности совершать или принимать вызовы. Каждый драйвер канала специфичен для протокола или типа канала, который он поддерживает (SIP, ISDN и т.д.). Модуль канала действует как шлюз к ядру Asterisk. Некоторые из наиболее популярных драйверов каналов Asterisk перечислены в Таблице 2-5.

*Таблица 2-5. Популярные драйверы каналов*

| Имя                | Назначение                                                   |
| ------------------ | ------------------------------------------------------------ |
| chan_bridge        | Используется внутри приложения 			ConfBridge(); 			не должен использоваться напрямую |
| chan_dahdi         | Обеспечивает подключение к картам 			ТфОП, использующим драйверы каналов 			DAHDI |
| chan_local         | Предоставляет механизм для обработки 			части диалплана как канала |
| chan_motif         | Реализует протокол Jingle, включая 			возможность подключения к Google Talk и 			Google Voice; представлен в Asterisk 11 |
| chan_multicast_rtp | Обеспечивает подключение к потокам 			многоадресного Realtime Transport Protocol (RTP) |
| chan_pjsip         | Драйвер канала Session Initiation Protocol (SIP)             |

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

Трансляторы кодеков[3](#sdfootnote3sym) (часто называемые *транскодерами*) позволяют Asterisk конвертировать форматы аудиопотоков между вызовами. Поэтому, если вызов поступает по каналу PRI (используя G.711) и должен быть передан в сжатый канал SIP (например, используя G.729 - один из многих кодеков, которые может обрабатывать SIP), соответствующий транслятор кодека выполнит преобразование.

​			Кодеки - это сложные 		алгоритмы, обрабатывающие преобразование 		аналоговой информации (в данном случае 		звука, но также может быть и видео) в 		цифровой формат. Многие кодеки также 		обеспечивают сжатие и исправление 		ошибок, но это не является обязательным 		требованием. 	

Е![img](file:///tmp/lu11103ktjkbj.tmp/lu11103ktjkcp_tmp_5d7740068e6bed33.png) сли кодек (например G.729) использует сложный алгоритм кодирования, интенсивное использование транскодинга может создать огромную нагрузку на процессор. Специализированное оборудование для декодирования/кодирования G.729 доступно от производителей оборудования, таких как Sangoma и Digium (и, вероятно, других).       

Asterisk делает довольно хорошую работу по поддержке кодеков, но в основном сосредоточен на кодеках, обычно используемых телефонными приложениями (в отличие от кодеков, используемых, скажем, для музыки или видео, таких как MP3 или MP4). Они перечислены в Таблице 2-6.

*Таблица 2-6. Общие трансляторы кодеков*

| **Название**   | Назначение                                                   |
| -------------- | ------------------------------------------------------------ |
| codec_alaw     | Кодек PCM A-law используется во всем мире 			для ТфОП 			(кроме Канады/США). Этот кодек (вместе 			с ulaw) должен быть включен на всех ваших 			каналах. |
| codec_g729     | До недавнего времени это был 			запатентованный кодек, но теперь он 			является бесплатным. На момент 			написания этой статьи он по-прежнему 			продается Digium в качестве дополнения, 			но его также можно найти в виде 			бесплатного пакета. Это очень популярный 			кодек, если требуется сжатие (и 			использование процессора не является 			проблемой), но он накладывает нагрузку 			на процессор, добавляет задержку к 			вызовам, немного снижает качество и 			никоим образом не уменьшает накладные 			расходы. |
| codec_a_mu     | Прямой конвертер A-law в mu-law.                             |
| codec_g722     | Широкополосный аудиокодек.                                   |
| codec_gsm      | Кодек Global System for Mobile Communications (GSM). Очень 			низкое качество звука. |
| codec_ilbc     | Интернет-кодек с низким битрейтом 			(iLBC).        |
| codec_lpc10    | Линейный предсказательный кодирующий 			вокодер (чрезвычайно низкая пропускная 			способность). |
| codec_opus     | Предназначен для замены speex (и vorbis).                    |
| codec_resample | Пересемлирование между 8-ми и 			16-тибитными линейными сигналами. |
| codec_speex    | Кодек Speex.                                                 |
| codec_ulaw     | Кодек PCM Mu-law, используемый на ТфОП в 			Канаде/США. Более точно 			описывается 			как μ-закон, но не у многих людей есть 			греческая буква μ на клавиатуре, 			поэтому обычно пишется как ulawa. 			Часто является кодеком по умолчанию, 			и должен быть включен на всех ваших 			каналах. |

a Произносится как “мью-лоу”, но так же вы часто будете слышать как "ю-лоу".

D![img](file:///tmp/lu11103ktjkbj.tmp/lu11103ktjkcp_tmp_a3840d58b3bba40d.png) igium предоставляет некоторые дополнительные полезные модули кодеков: codec_g729, codec_silk, codec_siren7 и codec_siren14. Эти модули кодеков не являются open source по различным причинам. Вы должны приобрести лицензию на использование codec_g729, но остальные являются бесплатными. Вы можете найти их на сайте Digium.       

### Интерпретаторы формата

Интерпретаторы форматов в Таблице 2-7 выполняют ту же функцию, что и трансляторы кодеков, но они работают с файлами, а не с каналами, и обрабатывают не только аудио. Если у вас есть запись в меню, которая была сохранена как GSM - вам нужно будет использовать интерпретатор формата для воспроизведения этой записи на любые каналы, не использующие кодек GSM[4](#sdfootnote4sym).

Если вы храните запись в нескольких форматах одновременно (например, WAV, GSM и т. д.), Asterisk определит наименее затратный формат[5](#sdfootnote5sym) для использования, когда каналу необходимо воспроизвести эту запись.

*Таблица 2-7. Интерпретаторы форматов*

| **Название**      | Воспроизведение файлов, хранящихся 			в             |
| ----------------- | ------------------------------------------------------------ |
| format_g729       | G.729: .*g729*                                               |
| format_gsm        | RPE-LTP (оригинальный 			кодек GSM): .*gsm*         |
| format_h264       | H.264 video: .*h264*                                         |
| format_ilbc       | Интернет кодек 			с низким битрейтом: .*ilbc*       |
| format_jpeg       | Графический 			файл: .*jpeg*, .*jpg*                |
| format_ogg_vorbis | Ogg контейнер: 			.*ogg*                            |
| format_pcm        | Различные форматы 			импульсно-кодовой модуляции: .*alaw*, 			.*al*, .*alw*, .*pcm*, .*ulaw*, .*ul*, 			.*mu*, .*ulw*, .*g722*, .*au* |
| format_siren14    | G.722.1 Annex C (14 kHz): 			.*siren14*             |
| format_siren7     | G.722.1 (7 kHz): .*siren7*                                   |
| format_sln        | 8-bit signed linear: .*sln*, 			.*raw*              |
| format_vox        | .*vox*                                                       |
| format_wav        | .*wav*                                                       |
| format_wav_gsm    | GSM аудио в 			контейнере WAV: .*wav*, .*wav49*     |

### Функции диалплана

Функции диалплана, перечисленные в Таблице 2-8, дополняют приложения диалплана (смотри [“Приложения”](). Они предоставляют множество полезных улучшений для таких вещей, как обработка строк, смещение времени и даты и подключение ODBC.




*Таблица 2-8. Cписок полезных функций диалплана*

| **Название**          | Назначение                                                   |
| --------------------- | ------------------------------------------------------------ |
| func_audiohookinherit | Позволяет записывать звонки после 			трансфера      |
| func_blacklist        | Пишет/читает черный список в *astdb*                         |
| func_callcompletion   | Получает/устанавливает параметры 			конфигурации завершения вызова для 			канала |
| func_callerid         | Получает/устанавливает идентификатор 			звонящего (Caller ID) |
| func_cdr              | Получает/устанавливает переменную 			CDR            |
| func_channel          | Получает/устанавливает информацию 			канала         |
| func_config           | Включает AST_CONFIG(); 			считывает переменные из файла 			конфигурации |
| func_curl             | Использует cURL для получения данных 			из URI      |
| func_cut              | Делит и нарезает строки                                      |
| func_db               | Предоставляет функции *astdb*                                |
| func_devstate         | Получает состояние устройства                                |
| func_dialgroup        | Создает группу для одновременного 			набора         |
| func_dialplan         | Проверяет, что назначенная цель 			существует в диалплане |
| func_env              | Включает FILE(), 			STAT() 			и ENV(); 			выполняет действия операционной 			системы |
| func_global           | Получает/устанавливает глобальные 			переменные     |
| func_groupcount       | Получает/устанавливает количество 			каналов для участников группы |
| func_hangupcause      | Получает/устанавливает информацию 			о зависании из канала |
| func_logic            | Включает ISNULL(), 			SET(), 			EXISTS(), 			IF(), 			IFTIME()и 			IMPORT(); 			выполняет различные логические 			функции |
| func_math             | Включает MATH(), 			INC() 			и DEC(); 			выполняет математические функции |
| func_odbc             | Позволяет интегрировать диалплан с 			ресурсами ODBC |
| func_rand             | Возвращает случайное число в заданном 			диапазоне  |
| func_realtime         | Выполняет поиск в Asterisk Realtime Architecture 			(ARA) |
| func_redirecting      | Предоставляет доступ к информации о 			том, откуда был перенаправлен этот 			вызов |
| func_shell            | Выполняет операции оболочки Linux и 			возвращает результаты |
| func_sprintf          | Выполняет функции строкового формата, 			аналогичные функции C 			с тем же именем |
| func_srv              | Выполняет поиски SRV в диалплане                             |
| func_strings          | Включает в себя более десятка функций 			обработки строк |
| func_timeout          | Получает / устанавливает таймауты на 			канале      |
| func_uri              | Преобразует строки в URI-безопасную 			кодировку    |
| func_vmcount          | Возвращает количество сообщений в 			папке голосовой почты для определенного 			пользователя. |

### PBX Модули

Модули PBX - это периферийные модули, обеспечивающие улучшенные механизмы управления и настройки. Например, pbx_config - это модуль, загружающий традиционный диалплан Asterisk. Доступные в настоящее время модули PBX перечислены в Таблице 2-9.

*Таблица 2-9. PBX модули*

| **Название** | Назначение                                                   |
| ------------ | ------------------------------------------------------------ |
| pbx_config   | Этот модуль предоставляет традиционный, 			популярный язык диалплана для Asterisk. 			Без этого модуля Asterisk не может читать 			*extensions.conf*. |
| pbx_dundi    | Выполняет поиск данных в удаленных 			системах Asterisk. |
| pbx_realtime | Предоставляет функциональные 			возможности, связанные с архитектурой 			Asterisk Realtime. |
| pbx_spool    | Обеспечивает поддержку исходящих 			сообщений, относящихся к файлам 			вызовов Asterisk. |

### Модули ресурсов

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

#### Бэкэнды конфигурации

Asterisk по умолчанию настроен с использованием текстовых файлов в */etc/asterisk*. Модули, перечисленные в Таблице 2-10, предоставлют альтернативные методы настройки. Смотри [Глав]()[у]()[ 15]() для получения подробной документации по настройке конфигурации на основе базы данных.

*Таблица 2-10. Конфигурационные бэкэнд-модули*

| **Название**    | Назначение                                                   |
| --------------- | ------------------------------------------------------------ |
| res_config_curl | Получает информацию о конфигурации, 			используя cURL |
| res_config_ldap | Получает информацию о конфигурации, 			используя LDAP |
| res_config_odbc | Получает информацию о конфигурации, 			используя ODBC |

#### Итеграция календаря

Asterisk включает некоторую интеграцию с календарными системами. Вы можете читать и записывать информацию календаря из диалплана. Вы также можете иметь звонки на основе записей календаря. Интеграция основного календаря обеспечивается модулем res_calendar. Остальные модули предоставляют возможность подключения к определенным типам календарных серверов. Таблица 2-11 перечисляет модули интеграции календаря.

*Таблица 2-11. Модули интеграции календаря*

| **Название**           | Назначение                                                   |
| ---------------------- | ------------------------------------------------------------ |
| res_calendar           | Обеспечивает базовую интеграцию с 			календарными системами |
| res_calendar_caldav    | Позволяет функциям, предоставляемым 			res_calendar 			, подключаться к календарям через 			CalDAV |
| res_calendar_exchange  | Позволяет функциям res_calendar 			подключаться к MS Exchange |
| res_calendar_icalendar | Позволяет функциям res_calendar 			подключаться к Apple/Google iCalendar |

#### Другие модули ресурсов

Таблица 2-12 включает остальные модули ресурсов, которые не вписываются в одну из подгрупп, которые мы определили ранее в этом разделе.

*Tаблица 2-12. Модули ресурсов*

| **Название**       | **Назначение**                                               |
| ------------------ | ------------------------------------------------------------ |
| res_adsi           | Предоставляет ADSIa                                          |
| res_agi            | Предоставляет Asterisk Gateway Interface (смотри 			[Глав](https://translaster.github.io/Definitive-Guide-5th-Edition/glava-18.md)[у](https://translaster.github.io/Definitive-Guide-5th-Edition/glava-18.md)[ 				18](https://translaster.github.io/Definitive-Guide-5th-Edition/glava-18.md)) |
| res_corosync       | Предоставляет распределенные сообщения 			индикации ожидания (MWI) и состояние 			устройства уведомления через Corosync 			Cluster Engine |
| res_crypto         | Предоставляет криптографические 			возможности      |
| res_curl           | Предоставляет общие подпрограммы 			для других модулей cURL |
| res_fax            | Предоставляет общие подпрограммы 			для других факсимильных модулей |
| res_fax_spandsp    | Плагин для факса с использованием 			пакета `spandsp` |
| res_http_post      | Обеспечивает поддержку POST upload для 			HTTP-сервера Asterisk |
| res_http_websocket | Обеспечивает поддержку WebSocket для 			внутреннего HTTP-сервера Asterisk (требуется 			WebRTC) |
| res_monitor        | Предоставляет ресурсы записи разговоров                      |
| res_musiconhold    | Предоставляет ресурсы музыки на 			удержании (MOH)  |
| res_mutestream     | Позволяет заглушить/включить звук 			аудиопотоков   |
| res_odbc           | Предоставляет общие подпрограммы 			для других модулей ODBC |
| res_phoneprov      | Автонастройка телефонов с HTTP-сервера 			Asterisk  |
| res_pktccops       | Предоставляет ресурсы PacketCable COPS                       |
| res_security_log   | Включает ведение журнала событий 			безопасности, генерируемых другими 			частями Asterisk |
| res_snmp           | Предоставляет информацию о состоянии 			системы в SNMP-managed network |
| res_speech         | Общий API распознавания речиb                                |
| res_stasis         | Связывает различные компоненты 			инфраструктуры приложений Stasis |
| res_xmpp           | Предоставляет ресурсы XMPP (FKA Jabber)                      |

a Хотя большинство функций ADSI в Asterisk никогда не используется - приложение голосовой почты использует этот ресурс.

b Для использования требуется отдельно лицензируемый продукт.

### Дополнительные модули

Дополнительные модули - это разработанные сообществом модули с правами на использование или распространение, отличными от основного кода (Таблица 2-13). Они хранятся в отдельном каталоге и не компилируются и не устанавливаются по умолчанию. Чтобы включить эти модули, используйте утилиту настройки сборки menuselect.

*Таблица 2-13. Дополнительные модули*

| **Название**     | Назначение                                                   | Популярность/статус |
| ---------------- | ------------------------------------------------------------ | ------------------- |
| chan_ooh323      | Позволяет совершать и принимать VoIP 			звонки по протоколу H323 | Usable              |
| format_mp3       | Позволяет Asterisk воспроизводить MP3 			файлы      | Usable              |
| res_config_mysql | Использует базу данных MySQL как сервер 			конфигурации в режиме реального 			времени | Useful              |

### Тестовые модули

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

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

Более подробная информация о тестах доступна в разделе [“](http://bit.ly/14SLEqs)[Asterisk Test Suite](http://bit.ly/14SLEqs)[”](http://bit.ly/14SLEqs), или вы можете присоединиться к каналу *#asterisk-testing* в IRC-сети Freenode.

## Файловая структура

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

### Конфигурационные файлы

Конфигурационные файлы Asterisk включают в себя *extensions.conf*, *pjsip.conf*, *modules.conf* и десятки других файлов, определяющих параметры для различных каналов, ресурсов, модулей и функций, которые могут использоваться.

Эти файлы обычно находятся в */etc/asterisk*. Вы будете много работать в этой папке, когда будете настраивать и администрировать свою систему Asterisk.

### Модули

Модули Asterisk обычно устанавливаются в папку */usr/lib/asterisk/modules*. Обычно вам не придется взаимодействовать с этой папкой, однако будет полезно узнать где находятся модули. Например, если вы обновите Asterisk и выберете разные модули на этапе установки menuselect, старые (несовместимые) модули из предыдущей версии Asterisk не будут удалены, и вы получите предупреждение от сценария установки. Эти старые файлы необходимо будет удалить из папки *modules*. Это можно сделать либо вручную, либо с помощью make uninstall.

### Библиотека ресурсов

Существует несколько ресурсов, которым требуются внешние источники данных. Например, музыка на удержании (MOH) не может воспроизводиться если у вас нет какой-то музыки для воспроизведения. Системные подсказки также должны храниться где-то на жестком диске. В папке */var/lib/asterisk* хранятся системные приглашения, сценарии AGI, музыка на удержание и другие файлы ресурсов.

### Spool

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

В Asterisk спул используется для хранения временных элементов, таких как голосовые сообщения, записи вызовов[6](#sdfootnote6sym), файлы вызовов и так далее.

Спул Asterisk находится в каталоге */var/spool/asterisk*.

### Журналирование

Asterisk может генерировать несколько разных типов лог-файлов. Папка */var/log/asterisk* - это место, куда записываются подробные записи вызовов (CDR), события канала из CEL, журналы отладки, журналы очереди, сообщения, ошибки и другие выходные данные.

Эта папка будет чрезвычайно важна для любых предпринимаемых вами действий по устранению неполадок. Мы поговорим подробнее о том, как использовать логи Asterisk в [Главе 21]().

## Диалплан

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

Диалплан обычно пишется с использованием собственного синтаксиса Asterisk, который хранится в файле с именем */etc/asterisk/extensions.conf* . Существуют и другие способы управления потоком вызовов, и мы рассмотрим их позже, но независимо от того, какой метод вы в конечном итоге используете, вы обнаружите, что базовое понимание традиционной схемы диалплана будет чрезвычайно полезным. Именно на этом мы сосредоточимся большую часть первых двух третей этой книги.

Позже мы рассмотрим обработку потока вызовов вне диалплана, используя такие технологии, как AMI, AGI и ARI.

## Аппаратные средства

Asterisk способен общаться с огромным количеством различных технологий. Как правило, эти соединения выполняются через сетевое соединение TCP/IP (обычно с использованием SIP). Однако подключения к более традиционным телекоммуникационным каналам, таким как PRI (T1, E1 и т.д.), BRI (EuroISDN) SS7 (в основном T1 и E1), и аналоговым (все, от нескольких портов FXO и FXS до крупных банков каналов, питаются через соединения T1/E1 CAS/RBS), также может быть достигнуто с помощью физических карт, установленных на сервере.

Многие компании производят это оборудование, такие как Digium (спонсор, владелец и основной разработчик Asterisk), Sangoma (который недавно приобрел Digium), Dialogic (также компания Sangoma), OpenVox, Pika, Voicetronix, beroNet и многие другие. Все эти компании были связаны с Asterisk на протяжении многих лет.

Наиболее популярное оборудование для Asterisk, как правило, предназначено для работы через интерфейс аппаратного устройства Digium Asterisk (известный как DAHDI). Это сложная архитектура и она выходит за рамки этой книги. Все серверные телефонные карты будут иметь требования к установке, уникальные для производителя, и вам потребуются навыки в установке оборудования Linux, а также в устранении неисправностей и подготовке традиционных сетей ТфОП.

Если вам необходимо взаимодействовать с традиционными линиями ТфОП с использованием Asterisk, мы рекомендуем вам сохранить Asterisk в качестве платформы только для SIP и взаимодействовать с помощью стороннего шлюза какого-либо рода. Имейте в виду: это не материал начального уровня, и если вы только начинаете использовать Asterisk - вам настоятельно рекомендуется оставить свои первоначальные решения только для SIP.

## Версии Asterisk

Методология выпуска Asterisk прошла через несколько стилей. В прошлом это приводило к некоторой путанице, но в наши дни управление версиями довольно простое и относительно легкое для понимания. Digium сохранил отличную ссылку на [Asterisk wiki](http://bit.ly/2XTb5Wl), и мы призываем вас перейти на последние подробности о версиях Asterisk.

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

## Вывод

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

[1](#sdfootnote1anc)Хорошим показателем того, что вы работали с традиционными УАТС, является наличие большой мозоли на лбу, полученной в результате слишком большого количества ударов головой о кирпичную стену, чтобы сосчитать.

[2](#sdfootnote2anc)Эта команда доступна как часть процесса установки. Мы обсудим использование menuselect в главе об установке.

[3](#sdfootnote3anc)Термин кодек - это сокращение от «кодер-декодер».

[4](#sdfootnote4anc)Отчасти по этой причине мы не рекомендуем формат GSM по умолчанию для системных записей. WAV-записи будут звучать лучше и использовать меньше тактов процессора.

[5](#sdfootnote5anc)Некоторые кодеки создают значительную нагрузку на ЦП, настолько, что система, которая может поддерживать несколько сотен каналов без транскодирования, будет обрабатывать только несколько десятков при его использовании.

[6](#sdfootnote6anc)Не записи деталей вызовов (CDR), а скорее аудиозаписи вызовов, генерируемых MixMonitor() и связанными приложениями.
