Saturday, September 23rd, 2017

Создание сервера видеоконференций на базе OpenMCU и GnuGK

Published on Март 30, 2009 by   ·   Комментариев нет

Введение

best mac antivirus software

Эта статья призвана немного восполнить пробел практически полного отсутствия
информации о проекте OpenMCU на русском языке. Пару раз эта тема проскакивала здесь
на opennet.ru и на форуме ixbt.com и, собственно, из этих источников я и узнал
о существовании OpenMCU :) А вот, как его все-таки использовать,
информации было крайне мало и она была неполная. На английском языке ее,
по-моему, также не густо, лучшее, что я нашел, было в зарубежных списках
рассылки, опубликованных на http://osdir.com/ml/telephony.openh323.general/ ,
небольшом мануале на openmcu (man openmcu) и сайте, посвященном GnuGK http://www.gnugk.org/,
который, в отличие от OpenMCU, куда лучше документирован.
Буду очень благодарен за любые замечания и улучшения.

Дистрибутив:
Я использовал Linux OpenSUSE 10.3, версия ядра 2.6.22.5-31

Версии пакетов:
openmcu-2.2.0-104 (сервер видеоконференций, использующий протокол H323)
gnugk-2.2.5-65 (H323 Gatekeeper)
Используемые библиотеки:
openh323-1.19.0.1-106
pwlib-1.10.7-61

Процесс установки описывать не буду, никаких трудностей в нем нет, положим,
все необходимое уже установлено.

По поводу того, что такое протокол H323, привратник, MCU и т.д.
можно почитать, например, Здесь
и Здесь

Как все это работает?
Клиент регистрируется у привратника (GnuGK) под именем, скажем, nm1. Затем набирает
код выхода на openmcu, например, «02» и привратник соединяет его с сервером видеоконференций (OpenMCU),
где nm1 ждет остальных участников. Все остальные попадают на конференцию точно так же.
Для всех собравшихся используется default room — комната видеоконференции по умолчанию.
Привратник не является обязательным компонентом, но дает удобную возможность использовать
короткие символьные имена вместо ip-адресов. Так, все зарегестрировшиеся у привратника могут
также вызывать друг друга по имени, например, клиент зарегестрировавшийся, как nm2 может вызвать nm1
по его имени и организовать с ним видеообщение на 2 участников (point-to-point).
Тогда openmcu не используется.

Конфигурация GnuGK:
/etc/gnugk.ini

        [Gatekeeper::Main]
        FourtyTwo=42
        Name=GNU_Gk
        ;EndpointSuffix=_gnugk
        Home=127.0.0.1
        StatusTraceLevel=2
        UseBroadcastListener=0
        TimestampFormat=ISO8601
        EndpointSignalPort=1721
        EncryptAllPasswords=0
        UseMulticastListener=0
        StatusPort=7000   #Порт мониторинга
       
        SignalCallId=1
       
        [GkStatus::Auth]  #Здесь задаются правила доступа к
        #мониторингу GnuGK
        rule=explicit   #Доступ осуществляется на основе ip
        192.168.2.106=allow #Хост с которого можно мониторить GnuGK
        Shutdown=allow    #Разрешено отключать gnugk в мониторинге
       
        #Самое важное:
        #Описываем постоянные точки подключения, то есть те, которые будут
        #постоянно храниться в регистрационной таблице привратника

        [RasSrv::PermanentEndpoints]
        127.0.0.1:1720=mcu;02   #наш mcu

        [RasSrv::GWPrefixes]
        mcu=02      #префикс выхода на него

        #Остальное можно не трогать
        [RasSrv::RRQFeatures]
        AcceptEndpointIdentifier=1
        AcceptGatewayPrefixes=1
        OverwriteEPOnSameAddress=1
        IRQPollCount=0

        [RasSrv::ARQFeatures]
        CallUnregisteredEndpoints=0
        ArjReasonRouteCallToGatekeeper=0

        [RoutedMode]
        GKRouted=1
        H245Routed=1
        CallSignalPort=1721
        AcceptNeighborCalls=1
        AcceptUnregisteredCalls=1
        RemoveH245AddressOnTunneling=0
        RemoveCallOnDRQ=1
        DropCallsByReleaseComplete=1
        SendReleaseCompleteOnDRQ=1
        SupportNATedEndpoints=1
        TranslateFacility=1

        [Proxy]
        Enable=1
        ProxyForNAT=1
        RTPPortRange=1024-65535

        [RoutingPolicy]
        00=explicit,internal
        02=internal,explicit
        Default=explicit,internal,numberanalysis

        [CallTable]
        GenerateNBCDR=0
        GenerateUCCDR=1

        [Gatekeeper::Auth]
        FileIPAuth=optional;RRQ
        SQLPasswordAuth=required;RRQ
        SQLAuth=required;ARQ,Setup

        [Gatekeeper::Acct]
        SQLAcct=required;start,update,stop

Подробное описание каждого из параметров можно найти на http://www.gnugk.org/gnugk-manual.html

Работу GnuGK можно мониторить подключившись к серверу на 7000 порт.
Например, мой сервер — 192.168.3.2

        telnet 192.168.3.2 7000

        Version:
        Gatekeeper(GNU) Version(2.2.5) Ext(pthreads=1,radius=1,mysql=0,pgsql=0,firebird=0,large_fd
        set=0,crypto/ssl=1) Build(Sep 25 2007, 22:47:36) Sys(Linux i686 2.6.22.5-31-default)
        GkStatus: Version(2.0) Ext()
        Toolkit: Version(1.0) Ext(basic)
        Startup: Thu, 26 Feb 2009 14:09:41 +0600   Running: 0 days 23:41:38;

Конфигурация OpenMCU

OpenMCU по умолчанию хранит свой конфиг в

    ~/.pwlib_config/openmcu.ini

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

        [Parameters]
        Username=mcu
        Password=*******    #Пароль здесь указывать не надо, это
        #можно сделать через веб-интерфейс, а здесь хранится только хэш
        Log Level=4
        HTTP Certificate=server.pem
        HTTP Port=1420   
        Gatekeeper Mode=No gatekeeper #Не использовать регистрацию у
        #привратника
        #Далее идут различные параметры, связанные с обслуживанием
        #видеоконференции,
        #можно все оставить, как есть, все нормально работает с дефолтовыми
        #параметрами
        Interface Array Size=0
        Enable video=True
        Video frame rate=10
        Video quality=10
        Default room=room101
        Room time limit=0
        Connecting WAV File=/usr/sbin/connecting.wav
        Entering WAV File=/usr/sbin/entering.wav
        Leaving WAV File=/usr/sbin/leaving.wav
        Call log filename=/var/log/openmcu/opemcu.log
        Force split screen video=False

Для описания этих параметров читайте man на openmcu.

Как уже говорилось, настраивать openmcu можно также через web-интерфейс.
Для этого нужно набрать в браузере https://your-MCU-ip:1420/

Доступны следующие опции:
* Parameters
* MCU Status
* Invite user to conference

С помощью Parametrs можно производить настройку сервера
В MCU status можно мониторить его текущее состояние. Очень полезная вещь!
Invite user to conference — отправить пользователю приглашение на конференцию
(не понял, как это должно работать:))

Для отладки сервисов можно использовать команды

    gnugk -c имя_конфига -ttt (trace - расширенный вывод данных)
        openmcu -i имя_конфига  -cx (запускать как обычную программу с выводом данных на экран)

Чтобы сервисы автоматически запускались при старте, надо создать их стартовые скрипты и
положить их (в зависимости от дистрибутива) в /etc/rc.d/ или /etc/init.d/

Сами скрипты тоже могут отличаться в зависимости от используемого дистрибутива.
Вообще-то эти скрипты обычно идут вместе с пакетом (или архивом с исходниками)
программы, но для openmcu он отсутствовал, а для gnugk я немного
изменил строчку запуска

  startproc $OPENGK_BIN -c /etc/gnugk.ini -o  /var/log/gnugk/gnugk.log -t

Скрипт для запуска openMCU я на скорую руку слепил из шаблона для стартовых
скриптов /etc/init.d/skeleton

#!/bin/sh
#
#
# /etc/init.d/openmcu
#
### BEGIN INIT INFO
# Provides:          openMCU
# Required-Start:    $network $syslog $remote_fs
# Should-Start: $time ypbind smtp
# Required-Stop:     $syslog $remote_fs
# Should-Stop: $time ypbind smtp
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Short-Description: OpenMCU
# Description:       Start openMCU
### END INIT INFO
#

FOO_BIN="/usr/sbin/openmcu -d"
MCU_BIN="/usr/sbin/openmcu"

test -x $MCU_BIN || { echo "$MCU_BIN not installed";
        if [ "$1" = "stop" ]; then exit 0;
        else exit 5; fi; }

. /etc/rc.status

# Reset status of this service
rc_reset

case "$1" in
    start)
        echo -n "Starting OpenMCU "
        ## Start daemon with startproc(8). If this fails
        ## the return value is set appropriately by startproc.
        /sbin/startproc $FOO_BIN

        # Remember status and be verbose
        rc_status -v
        ;;
    stop)
        echo -n "Shutting down OpenMCU"
        ## Stop daemon with killproc(8) and if this fails
        ## killproc sets the return value according to LSB.

        /sbin/killproc -TERM $MCU_BIN

        # Remember status and be verbose
        rc_status -v
        ;;
    try-restart|condrestart)
        ## Do a restart only if the service was active before.
        ## Note: try-restart is now part of LSB (as of 1.9).
        ## RH has a similar command named condrestart.
        if test "$1" = "condrestart"; then
                echo "${attn} Use try-restart ${done}(LSB)${attn} rather than condrestart ${warn}(RH)${norm}"
        fi
        $0 status
        if test $? = 0; then
                $0 restart
        else
                rc_reset  # Not running is not a failure.
        fi
        # Remember status and be quiet
        rc_status
        ;;
    restart)
        ## Stop the service and regardless of whether it was
        ## running or not, start it again.
        $0 stop
        $0 start

        # Remember status and be quiet
        rc_status
        ;;
    force-reload)
        ## Signal the daemon to reload its config. Most daemons
        ## do this on signal 1 (SIGHUP).
        ## If it does not support it, restart the service if it
        ## is running.

        echo -n "Reload service OpenMCU "
        ## if it supports it:
        /sbin/killproc -HUP $FOO_BIN
        rc_status -v

        ## Otherwise:
        #$0 try-restart
        #rc_status
        ;;
    reload)
        ## Like force-reload, but if daemon does not support
        ## signaling, do nothing (!)

        # If it supports signaling:
        echo -n "Reload service OpenMCU "
        /sbin/killproc -HUP $FOO_BIN
        rc_status -v
       
        ## Otherwise if it does not support reload:
        #rc_failed 3
        #rc_status -v
        ;;
    status)
        echo -n "Checking for service OpenMCU "

        # NOTE: checkproc returns LSB compliant status values.
        /sbin/checkproc $MCU_BIN
        # NOTE: rc_status knows that we called this init script with
        # "status" option and adapts its messages accordingly.
        rc_status -v
        ;;
    probe)

esac
rc_exit

Не забудьте назначить скриптам права на выполнение.

Собственно, теперь надо положить соответсвующие ссылки на скрипты в rcN.d,
то есть для соответствующих уровней запуска.
Я предпочитаю делать это программой chkconfig

    chkconfig openmcu on
        chkconfig gnugk on

Теперь все готово для запуска сервисов.

  service gnugk start
        service openmcu start

В настройках NetMeeting надо выставить Сервис-Параметры — Расширенный вызов-
Использовать привратника для вызовов и Регистрация моей учетной записи
(имя учетной записи).
После активации параметров в правом нижнем углу у него должен появиться значок
«Есть регистрация у привратника». Теперь набираем наш префикс выхода (02) и
попадаем на сервер OpenMCU, на экране будет виден соответствующий логотип.
Все остальные участники, также регистрируясь у привратника и набирая 02, будут
попадать на нашу конференцию.

Но тут возникает один интересный вопрос. Получается, что наш сервер будет
обслуживать одновременно только одну видеоконференцию, ту, что в default room.
А как сделать так, чтобы на одном сервере MCU одновременно проводить несколько
параллельных конференций?

Именно для этого и используется разделение конференций по комнатам.
К сожалению, NetMeeting не умеет указывать при вызове желаемую комнату для
конференции и может попадать только на default room, если она задана.
Поэтому организовывать различные комнаты мы будем, используя различные префиксы
выхода на MCU в gnugk.

Например, так:
/etc/gnugk.ini

        [RasSrv::GWPrefixes]
        #Комната 00
        mcu=00
        #Комната 11
        mcu=11
        #Комната 22
        mcu=22

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

  "room_name@server_name"

NetMeeting эту возможность не поддерживает, поэтому можно использовать другого
h323 клиента, например, несколько хороших клиентов перечислены здесь:
http://www.gnugk.org/h323-endpoint.html

В этом случае, можно не использовать регистрацию у привратника, а сразу набирать
выход на openmcu в адресной строке, например, набираем example@192.168.3.2
и попадаем на наш openmcu. Аналогично другие клиенты могут указывать свои
комнаты, отличные от example и участвовать в отдельной конференции.

Заключение

Число комнат, по идее, ограничено только аппаратными ресурсами вашего сервера.
Что касается того, сколько максимально участников может одновременно участвовать
в одной видеоконференции, то я использовал конференции лишь до 4-х
участников включительно и могу сказать только, что это работает. Что
касается большего числа участников, то единственную информацию, которую мне
удалось найти на этот счет была на http://www.e-bizone.com/e_chinabo_03.htm
(но,к сожалению, не было возможности проверить, так что за что купил,
за то и продаю)

You hear the audio from the other users, but only see the video from the
four users actively talking.

zp8497586rq















































































Смотрите также:

Readers Comments (Комментариев нет)

Comments are closed.

Exchange 2007

Проведение мониторинга Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 3)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Проведение мониторинга Exchange 2007 с помощью диспетчера System ... [+]

Практическое рассмотрение перехода с Exchange 2003 на Exchange 2007 (часть 1)

Введение В этой статье из нескольких частей я хочу показать вам процесс, который недавно использовал для перехода с существующей среды Exchange 2003 ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 2)

Если вы пропустили первую часть этой серии, пожалуйста, прочтите ее по ссылке Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (Часть ... [+]

Мониторинг Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 2)

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Мониторинг Exchange 2007 с помощью диспетчера System Center Operations ... [+]

Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 5)

Если вы пропустили предыдущие части этой серии статей, перейдите по ссылкам: Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 1) ... [+]

Установка и настройка Exchange 2007 из командной строки (Часть 3)

If you missed the previous parts in this article series please read: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 1)

Инструмент ExRCA Текущий выпуск инструмента предоставляется только в целях тестирования и оснащен 5 опциями: Тест подключения Outlook 2007 Autodiscover Тест подключения Outlook 2003 RPC ... [+]

Развертывание сервера Exchange 2007 Edge Transport (часть 5)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Развертывание сервера Exchange 2007 Edge Transport (часть 1) Развертывание ... [+]

Установка и настройка Exchange 2007 из командной строки (часть 2)

Если вы пропустили первую статью данного цикла, пожалуйста, перейдите по ссылке: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование интегрированных сценариев Using Exchange Server 2007 – часть 2: генерирование отчетов агента Transport AntiSpam Agent

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Использование интегрированных сценариев Using Exchange Server 2007 – часть ... [+]