Библиотека сайта rus-linux.net
Цилюрик О.И. Модули ядра Linux | ||
Назад | Приложение В: Пример - открытые VoIP PBX: Asterisk, FreeSwitch, и другие | Вперед |
Приложение В: Пример - открытые VoIP PBX: Asterisk, FreeSwitch, и другие
Отличной практической иллюстрацией ко всему, о чём рассказывалось ранее, есть структура модулей ядра открытых проектов телефонных и VoIP коммутаторов (Soft Switch), таких, как известнейший и старейший в своём классе Asterisk (http://www.asterisk.org), и менее известные (более поздние), но очень динамично развивающиеся: FreeSWITCH (http://www.freeswitch.org/) или YATE (Yet Another Telephony Engine - http://yate.null.ro). Интерес рассмотрения их структуры имеет в своей основе несколько аспектов:
- реализации Soft Switch — это первые подходы к совершенно новым стратегическим технологическим решениям: NGN — New Generation Net: интегральные сети передачи разнородной информации (голос, видео, цифра, мультимедия, ...);
- интерфейс ко всему разнообразию оконечного оборудования (при всём его различии) аналоговых или цифровых (E1/T1) линий для телефонии во всех PBX (при их отличиях), обеспечивается набором модулей канала под общим названием DAHDI (Digium Asterisk Hardware Device Interface, ранее именовавшийся интерфейсом Zaptel), ставшим постфактум стандартом в области IP телефонии;
- вы можете написать (требующий относительно небольшой трудоёмкости) свой небольшой модуль ядра поддержки собственного, проприетарного физического канала обмена данными (хоть кабель параллельного порта), и тем самым интегрировать свой канал в общемировую систему телефонных коммуникаций и сигнализаций;
- таким путём обеспечивается обслуживание физических линий связи во всех этих PBX под самыми разнообразными операционными системами, под которыми реализован слой интерфейсов DAHDI (Linux, FreeBSD, с ограниченной функциональностью Solaris), а отсутствием интерфейсов DAHDI обусловлена невозможность работы с физическими линиями связи в системах семейства Windows (обслуживаются только сетевые сигнализации SIP, H.323 и IAX2);
Интерфейс устройств zaptel/DAHDI
Крайне бегло рассмотрим схематически структуру интерфейса поддержки физических линий связи DAHDI, при этом, для определённости, ограничим рассмотрение:
- исключим их рассмотрения аналоговые сигнализации FXO/FXS как более простые и вписывающиеся в общую схему;
- из цифровых линий с временным уплотнением каналов будем рассматривать только E1 (европейский стандарт), для T1 (американский стандарт) будет всё то же самое с некоторым численными отличиями (24 канала вместо 32);
- стандарт E1 предусматривает уплотнение в один передаваемый кадр 256 битов, разделенных на 32 временных интервала (тайм-слота) по 8 бит в каждом, и содержащих передаваемые данные;
- передача синхронная, скорость передачи составляет 8000 кадров в секунду, что соответствует 2048 kbit/sec для линии и, следовательно, для каждого канала данных (тайм-слота) обеспечивается полоса 64 kbit/sec;
- обычно временной интервал 0 зарезервирован для целей синхронизации, а число доступных пользователю тайм-слотов составляет 31, из которых один (часто) или несколько используются для обеспечения сигнализации (DSS1, PRI, SS7), а остальные — для передачи оцифрованного аудио потока.
Пакет DAHDI (http://downloads.asterisk.org/pub/telephony/) содержит один общий модуль ядра dahdi.ko, и по одному модулю ядра для поддержки каждого типа используемого оконечного оборудования (например, плата Digium TE405P/TE407P/TE410P/TE412P: PCI 4 порта T1/E1/J1). Модуль dahdi.ko ничего не знает о каналах передачи (от получает данные от канальных модулей), он обеспечивает конфигурирование каналов, обработку управления по сигнализации (PRI, SS7), программное эхо-подавление и другие высокоуровневые функции.
Формирование потоков данных (входных и выходных) осуществляют канальные модули ядра. Точно таким же образом, как и модули из поставки DAHDI, могут быть дописаны и использованы собственные канальные модули для поддержки своей необычной платы, назовём такой модуль, для примера: xxx.ko. Такой модуль:
- Должен инициализировать поддерживаемые ним
аппаратные каналы (создать PCI устройство, установить обработчик
прерывания, настроить DMA...) и вызвать экспортируемую модулем
FONT FACE="Liberation Mono, monospace">dahdi по имени функцию:
int dahdi_register( struct dahdi_span *span, int prefmaster );
В терминологии DAHDI span — это линия, магистраль, для аналоговой линии связи она будет совпадать с каналом, для E1 span будет включать в себя 31 chan, для T1 — 24 chan. - При выполнении конфигурирующей программы /sbin/dahdi_cfg, модуль dahdi.ko читает конфигурацию будущей станции PBX из текстового файла /etc/dahdi/system.conf, и создаёт в каталоге устройств (/dev/dahdi) набор виртуальных устройств - именованных каналов, в виде единой «плоской» последовательности имён вида: /dev/dahdi/1, /dev/dahdi/2, /dev/dahdi/3... При этом каналы из разных магистральных линий разных технологий (цифровые, аналоговые) «выстраиваются» в единую однородную последовательность каналов, с которыми далее можно работать традиционными API: read(), write(), ... (write() при этом будет соответствовать передаче последовательности байт в соответствующий канал линии, а read() - чтению байт из канала).
- Модуль канала xxx.ko должен в своём обработчике прерываний (который будет срабатывать строго 8000 раз в секунду — линии синхронные) принимать очередной кадр (31 байт для E1) из линии, и передавать очередной кадр в линию (по DMA). Приём и передача производится в/из накопительных буферов (CHUNK в терминологии DAHDI), размер CHUNK - 8 (DAHDI_CHUNKSIZE) кадров.
- При завершении обработки очередного CHUNK (а значит 1000 раз в секунду)
модуль xxx.ko
обменивается следующими порциями данных (размером в CHUNK) с
dahdi.ko,
делая последовательно два вызова (экспортированы
dahdi.ko):
int dahdi_receive( struct dahdi_span *span );
int dahdi_transmit( struct dahdi_span *span );
- только-что принятый и накопленный из линии CHUNK передаётся на уровень модуля dahdi.ko, а от него очередной CHUNK поступает для передачи в линию. - Вся остальная обработка (исключая физическое взаимодействие с линией) осуществляется уровнем модуля dahdi.ko, и всеми вышележащими обработчиками PBX (Asterisk, FreeSWITCH, ...) и не требуют никакого вмешательства разработчика канала.
В высшей степени остроумные принятые решения! И все составляющие механизмы для их использования: подключение к шине PCI, установка обработчика прерывания, настройка DMA, экспорт-импорт имён модулями — мы уже рассмотрели в изложении ранее.
Предыдущий раздел: | Оглавление | Следующий раздел: |
Приложение Б: Краткая справка по утилите make | Приложение Г: Тесты распределителя памяти |