Ключевые слова:asterisk, voip, conference, (найти похожие документы)
From: Николаев Дмитрий (virus (at) subnets.ru) и Панфилов Алексей (lehis (at) subnets.ru)
Date: Mon, 23 Oct 2010 17:02:14 +0000 (UTC)
Subject: Организация работы конференций на базе Asterisk во FreeBSD
Оригинал: http://subnets.ru/blog/?p=803
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/
Удачных вам конференций !
Какя Фря? Какой Астериск?
Я пробовал на Free 8.1 и Аст 1.6.2 собирать DAHDI (которую совсем недавно всё-таки портировали!) и у меня не отваливалось.
Пробуй всё новенькое, zaptel уже не рулит!