среда, 16 февраля 2011 г.

Организация работы конференций на базе Asterisk во FreeBSD

app_meetme VS app_conference для Asterisk под FreeBSD

   Появилась задача, организовать конференции в Asterisk.

   Все кажется просто, поправить два конфига и вуаля, но на деле все
   оказалось не просто.

   Читаем инструкцию Asterisk cmd MeetMe. Пробуем, получаем облом. Не
   работает. Почему ? Расскажу как было у меня:

   посмотрим, что у нас в подгруженных в Asterisk модулях, для этого
   зайдем в его CLI:

           /usr/local/sbin/asterisk -r

   и выполним команду show modules:

           aster*CLI> show modules

   у себя я обнаружил, что модуля app_meetme.so в списке нету....

   можно выполнить и более предметную команду:

           aster*CLI> module show like app_meetme

   а в логах честно об этом написано:

           pbx_extension_helper: No application `MeetMe'

   Начинаем гуглить и копать. Выясняется, что для того, чтобы был этот
   модуль нужно собрать zaptel

   Ну чтож... идем в порт asterisk`а, делаем:

           cd /usr/ports/net/asterisk
           make rmconfig
           make

   выбираем в списке zaptel и после мейка делаем:

           make install

   в /usr/local/etc/rc.d появляется файл zaptel:

           /usr/local/etc/rc.d/zaptel

   дописываем в /etc/rc.conf:

           zaptel_enable="YES"

   запускаем:

           /usr/local/etc/rc.d/zaptel start

   после этого проверяем наличие загруженных модулей zaptel.ko и
   ztdummy.ko:

           /sbin/kldstat

           Id Refs Address Size Name
           ..................
           3    5 0xc4fb9000 32000    zaptel.ko
           .....................
           14 1 0xc62a2000 2000 ztdummy.ko

   если не подгрузилось, то они лежат тут: /usr/local/lib/zaptel,
   подгрузите их руками.

   проверяем, что в /usr/local/lib/asterisk/modules появился app_meetme.so.

   открываем файл /usr/local/etc/asterisk/modules.conf и добавляем:

           load => app_meetme.so

   открываем /usr/local/etc/asterisk/meetme.conf и добавляем конференцию:

           conf => 501

   открываем /usr/local/etc/asterisk/extensions.conf и добавляем экстенш
   для того, что бы попадать в эту конференцию:

           exten => 501,1,MeetMe(501)

   т.е. при звонке на внутренний номер 501 мы должны попадать в
   конференцию с номером 501.

   да, замечу, что номер exten и номер конференции могут не совпадать.

   Ну чтож, вроде все хорошо и здорово, перезапускаем asterisk:

           /usr/local/etc/rc.d/asterisk restart

   звоним на номер 501 и слышим: "В настоящий момент вы единственный в
   этой конференции" и трубка вешается (происходит Hangup)

   как говориться "приехали".....

   смотрим в логи и видим:

           app_meetme.c:800 build_conf: Unable to open pseudo device

   начинаем гуглить и толком ничего не находим. Кто-то так и не смог
   решить проблему, кто-то ремил куски кода в исходках.

   Что бы мы не делали, тока менялись ошибки:

           app_meetme.c:1022 conf_run: Unable to set flags: Inappropriate ioctl for device

   или

           app_meetme.c:1756 conf_run: Unable to set buffering information: Bad file descriptor

   или

           app_meetme.c:1777 conf_run: Error getting conference

   или

           app_meetme.c: Unable to set flags: Inappropriate ioctl for device

   Вот последнее что удалось добиться:

           WARNING[4670] app_meetme.c: Unable to set flags: Inappropriate ioctl for device
           WARNING[4670] app_meetme.c: Unable to set buffering information: Bad file descriptor
           WARNING[4670] app_meetme.c: Unable to set linear mode: Bad file  descriptor
           WARNING[4670] app_meetme.c: Error getting conference
           WARNING[4670] app_meetme.c: Error setting conference
           WARNING[4670] app_meetme.c: Error flushing channel
           WARNING[4670] app_meetme.c: Failed to read frame: Bad file descriptor

   конференция так и не заработала...

   Изрядно подустав от этого дела, мы обнаружили что существует
   альтернатива для app_meetme.so и это [14]app_conference.so.

   Читаем Asterisk cmd Conference

   Приступаем к инсталлу:

           cd /usr/ports/net/asterisk
           make extract
           cd work/asterisk-1.4.23.1
           fetch http://dfn.dl.sourceforge.net/sourceforge/appconference/appconference-2.0.1.tar.gz
           tar -zxf appconference-2.0.1.tar.gz

Правим Makefile, вот diff:

        --- Makefile    2008-02-26 19:05:57.000000000 +0300
        +++ Makefile.new        2009-02-10 21:03:09.000000000 +0300
        @@ -18,9 +18,9 @@
        #

        INSTALL_PREFIX :=
        -INSTALL_MODULES_DIR := $(INSTALL_PREFIX)/usr/lib/asterisk/modules
        +INSTALL_MODULES_DIR := $(INSTALL_PREFIX)/usr/local/lib/asterisk/modules

        -ASTERISK_INCLUDE_DIR ?= ../asterisk/include
        +ASTERISK_INCLUDE_DIR ?= /usr/local/include

        REVISION = $(shell svnversion -n .)

   Собираем:
   
           cd appconference-2.0.1
           gmake install

   убеждаемся что файл app_conference.so появился в /usr/local/lib/asterisk/modules/

   открываем файл /usr/local/etc/asterisk/modules.conf и добавляем:

           load => app_conference

   открываем /usr/local/etc/asterisk/extensions.conf и добавляем экстенш
   для того, что бы попадать в конференцию:

           exten => 502,1,Conference(502)

   перегружаем asterisk и убеждаемся что модуль подгружен:

           aster*CLI> module show like app_conference

           Module                         Description                              Use Count
           app_conference.so              Channel Independent Conference Applicati 0
           1 modules loaded

   Основное отличие app_meetme.so и это app_conference.so в том что
   app_conference.so создает конференцию налету (on the fly) и не требует
   наличия zaptel.

   Экстеншеном 502 мы попадаем в автоматом созданную конференцию 502.

   И все РАБОТАЕТ !

   Но app_conference.so не полный аналог app_meetme.so. Например не
   поставить PIN на вход или так же просто записать разговор в
   конференции. Эти вопросы можно решить с помощью самого asterisk ;)

   о PIN: Asterisk cmd Conference в разделе " Setting up conferences".

   запись разговора в конференции: Asterisk cmd Monitor

   пример записи конференции, extensions.conf :

           exten => 502,1,Answer
           exten => 502,2,Wait(1)
           exten => 502,3,Monitor(wav,myfilename)
           exten => 502,4,Conference(502,ps)

   Записанные файлы myfilename-in.wav и myfilename-out.wav будут лежать в
   /var/spool/asterisk/monitor/

   Удачных вам конференций !

Комментариев нет:

Отправить комментарий