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

UnixForum





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

На главную -> MyLDP -> Электронные книги по ОС Linux
Цилюрик О.И. Модули ядра 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   Приложение Г: Тесты распределителя памяти