Команда MeetMe()


Назначение:


Точка входа в конференцию MeetMe.

Описание


MeetMe([confno][,[options][,pin]])

confno – номер конференции.
Если номер конференции пропущен, пользователю будет проиграно приглашение ввести номер конференции.

Обратите внимание: Для работы конференции необходим работающий DAHDI (Zaptel) таймер! См: DAHDI Таймер для сервера Asterisk.

Добавлено, начиная с asterisk версии 1.2: Теперь в приложении конференции пользователи могут регулировать громкость своего и уровень принимаемого сигнала (каждый пользователь может регулировать уровни независимо от других);
В меню 'admin' и 'user' внесены соответствующие изменения и включены новые звуковые файлы для этой функции.
Однако если пользователь совершает вызов через DAHDI канал, который не имеет систему аппаратного распознавания DTMF сигнала, увеличивает уровень своего сигнала, то он далее не сможет войти в меню или сделать другие манипуляции
посредством DTMF сигналов, т.к. программный DTMF детектор будет не в состоянии детектировать DTMF сигнал, принимаемый через это устройство.

Параметр option - это или пустая строка, или содержащая следующие символы:

  • '1' — Выключает проигрыш сообщения "Вы единственный участник в этой конференции" ("You are currently the only person in this conference") для первого участника вошедшего в конференцию. (Появилось с версии 1.2, но отсутствует в версии 1.2.11) .
  • 'a' — Включает административный режим.
  • 'A' — Включает режим маркировки (marked mode).
  • 'b' — Запускается AGI скрипт, который указан в переменной ${MEETME_AGI_BACKGROUND}
    • По умолчанию: conf-background.agi (Обратите внимание: Это не работает для не DAHDI/Zap каналов).
  • 'c' — Включает анонс о количестве пользователей в конференции при входе в нее.
  • 'd' — Динамическое добавление конференции.
  • 'D' — Динамическое добавление конференции с запросом pin кода.
    • При запросе pin кода, если пользователь НЕ желает защитить конференцию PIN кодом, то он должен просто нажать кнопку '#'.
  • 'e' — Выбор пустой конференции.
  • 'E' — Выбор пустой конференции, которая не защищена pin кодом.
  • 'F' — Режим, когда DTMF сигналы пересылаются через конференцию.
  • 'i' — Проигрывает подробный анонс участникам конференции о входе/выходе участников в нее — требуется chan_dahdi (chan_zap.so) (появилось, начиная с версии 1.2) — Asterisk версии 1.4 имеет проблемы с громким “хрюканьем” звука после проигрыша анонса. См. описание в багрепорте #9430
  • 'I' — Проигрывает анонс участникам конференции о входе/выходе участников в нее без подробностей.
  • 'M' — Включает музыку ожидания, когда в конференции только один участник.
  • 'm' — Установка режима мониторинга (Пользователь может только слушать конференцию, его в ней никто не слышит).
  • 'p' — Позволяет пользователям покинуть конференцию, нажатием кнопки '#'.
  • 'P' — Всегда запрашивать pin код при входе в конференцию, даже если он для нее не установлен.
  • 'q' — "Тихий" режим (не проигрывать никаких сообщений при входе и выходе участников конференции).
  • 'r' — Запись конференции (Запись в файл, заданный в переменной ${MEETME_RECORDINGFILE}, используя формат из ${MEETME_RECORDINGFORMAT}). По умолчанию, имя файла: meetme-conf-rec-${CONFNO}-${UNIQUEID} и формат, по умолчанию: wav. Требуется chan_dahdi.so .
  • 's' — Включает доступ к меню (пользователя или админа), при нажатии кнопки '*'.
  • 't' — Установка режима "только разговор". (Пользователя слышат в конференции, он никого не слышит).
  • 'T' — Установка режима детектирования наличия разговора в конференции (события отправляются в manager interface и в meetme).
  • 'v' — Режим видеоконференции (На данный момент опция не производит никакого эффекта).
  • 'w' — Ожидание, пока отмеченный (marked) пользователь войдет в конференцию.
    • Все остальные пользователи будут слушать музыку ожидания (MusicOnHold), пока отмеченный пользователь не войдет в конференцию.
  • 'X' — Позволяет пользователю выйти из конференции введя номер екстеншена от 1 до 9 в контексте, определенном в переменной ${MEETME_EXIT_CONTEXT} или в текущем контексте, если эта переменная не определена.
  • 'x' — Закрыть конференцию, когда последний помеченный пользователь выйдет из нее.

Детальное описание некоторых опций.


Опция 's'

Опция 's', как и опция 'p', не работают, если указана совместно с опцией 'X'.
  • Пользовательское меню (т.е. указано без опции 'a'): При нажатии "*" проигрывается голосовое меню "Нажмите 1, чтобы включить или выключить свой микрофон" ("Please press 1 to mute or unmute yourself"). Начиная с asterisk v1.2, стала доступна регулировка громкости конференции для каждого участника MeetMe конференции, нажав "*" и (один или несколько раз) "4" или "6" для уменьшения громкости или ее увеличения; по аналогии, в версиях, куда включен патч #4170, можно регулировать громкость своего сигнала, который поступает в конференцию, нажав "*" и (один или несколько раз) "7" или "9", для увеличения или уменьшения свое громкости соответственно. Нажатие "8" возвращает в обычный режим работы.
  • Административное меню (используется совместно с опцией 'a'): При нажатии "*" проигрывается голосовое меню: "Нажмите 1, чтобы включить или выключить свой микрофон, 2, чтобы заблокировать или разблокировать конференцию, и т.д. ("Press 1 to mute/unmute yourself, 2 to lock/unlock this conference")

Опция 'r'

Установите переменную ${MEETME_RECORDINGFILE} перед запуском MeetMe() с включенной записью. Иначе звуковые файлы, в которые будет вестись запись конференции, будут располагаться в директории (по умолчанию): /var/lib/asterisk/sounds.
Пример:
exten => s,n(record),SetVar(MEETME_RECORDINGFILE=/var/spool/asterisk/meetme/conference_recording-${EPOCH}-${USER});
exten => s,n,MeetMe(,rDMpc) ; Создаем новую конференцию и записываем ее.

Опция 'j' канала chan_local

Asterisk jitterbuffer для IAX и SIP в версиях 1.4 (и вероятно также в версии 1.6) работает только для соединений
между двумя каналами (bridged channels), это не относится к вызовам в приложения, типа MeetMe(), Record() и т.д.
Однако, используя конструкцию с использованием канала chan_local с опцией 'j', можно обойти этот момент:

[some-context]
exten => 123,1,Dial(Local/124 some-context/nj)
exten => 124,1,MeetMe(some-room,dM)


Дополнение по опции 'b' (AGI_BACKGROUND)

/август 2004/


Вопрос:
Я правильно понимаю, что скрипт MEETME_AGI_BACKGROUND **БУДЕТ РАБОТАТЬ**
для вызовов в конференцию из SIP каналов, **БЕЗ** **АКТИВНЫХ** zap каналов — ТОЛЬКО ТОГДА,
ЕСЛИ В сервере с ASTERISK УСТАНОВЛЕНЫ ИНТЕРФЕЙСНЫЕ КАРТЫ ОТ DIGIUM?


Ответ:

Нет, это не правильно.

Микширование входящих звуковых пакетов и вывод микшированного звука в звуковые каналы вывода производиться в пределах
драйвера DAHDI (Zaptel).
Для "настоящих" Zap каналов, все эти операции производятся на уровне драйвера. Для НЕ-Zap каналов, приложение app_meetme создает Zap псевдо-канал, который будет использоваться драйвером, и копирует все аудиоданные между НЕ-ZAP каналом и созданным для него псевдо-ZAP каналом в обоих направлениях.
Это видно где-то в середине исходного кода приложения в функции conf_run().

Загвоздка в том, что функция conf_run() или вызывает AGI скрипт, или запускает копирование аудиоданных через ZAP псевдоканал, но не то и другое одновременно. Соответственно, если Вы используете AGI скрипт, то не-ZAP канал не соединяется с соответствующим ему ZAP псевдоканалом.

Это не отменяет использование DAHDI карт или dummy драйвер для тайминга (например, dahdidummy), чтобы конференция MeetMe вообще могла работать, но не поможет Вам в использовании AGI скриптов совместно, например, с SIP каналами: Они не имеют возможности использовать любые AGI скриптов в конференции вообще. Если Вы попробуете их использовать, то, как результат, звука не будет вообще.

Обратите внимание, что когда используется AGI скрипт для конференции, также теряется некоторая встроенная функциональность, такая, как выключение/включение микрофона, удаление пользователей из конференции, и музыка, когда в конференции только один пользователь.

Хотя, нет причин, мешающих Zap и SIP каналы соединить в одну и ту же конференцию через разные екстеншены, используя разные опции для входа в конференцию и (для Zap каналов) различные AGI скрипты.


AGI_BACKGROUND Ограничения и возможности.


Если используется внешний скрипт AGI_BACKGROUND, тогда вы теряете возможность выключать микрофон или удалять пользователей из конференции при помощи командной строки.
MeetMe Параметр 'p' (выход из конференции по нажатию решетки) также не будет функционировать при использовании AGI_BACKGROUND.
При использовании AGI_BACKGROUND, Вы также теряете возможность мониторить внешние каналы, которые подключены к конференции.

Если Вы хотите удалить кого-нибудь из конференции, просто убейте процесс AGI_BACKGROUND сигналом 9 (kill -9).
Когда скрипт AGI_BACKGROUND прекращает свою работу, пользователь автоматически удаляется из конференции.

Все DTMF сигналы передаются, как события в процесс/скрипт AGI_BACKGROUND. Таким образом, в своем .agi скрипте Вы можете создать бесконечный цикл, который принимает события поступления DTMF сигналов, и на основании Ваших требований производит какие-либо действия.

Использование AGI_BACKGROUND открывает много заманчивых для рограммирования возможностей. Например, можно использовать средства коммуникации между процессами (используя сокеты, сигналы и т.д.), для удаленного контроля пользователями, которые находятся в конференции. (например: проигрывание ему звуковых файлов, в зависимости от внешних событий или на основании ввода пользователя).


Некоторые замечания, касающиеся работы конференции Meetme.


  • В конференции микширования звука, по умолчанию, используется кодек ulaw. Если Вы разрешаете своим пользователям подключаться к конференции с другими кодеками, например GSM, тогда asterisk будет использовать дополнительные мощности CPU на конвертацию между звуковыми кодеками.
  • Переменная MEETMESECS содержит количество секунд, которые пользователь провел в конференции.
  • Приложение Meetme перечитывает файл конфигурации meetme.conf каждый раз, когда пользователь входит в статическую конференцию. Следовательно, нет необходимости перегружать модуль при каких-либо изменениях в конфигурации.
  • Проверить авторизацию можно при помощи приложения authenticate(), если Вам нужно проверять авторизацию пользователя перед тем, как впустить его в конференцию meetme.
  • Вы можете ограничить число участников конференции, используя функцию meetmecount() и переменные в плане набора.
  • Для работы конференции MeetMe, в сервере asterisk необходимо наличие работающего DAHDI (Zaptel) таймера. Сигналы тайминга могут быть получены с интерфейсных карт (например, Digium) или сгенерированы некоторыми драйверами. Смотри раздел Таймер для сервера Asterisk.


Обратите внимание.


  • Динамически создаваемые конференции работают немного не так, как можно было бы подумать. Итак, если пользователь "A" создает динамическую конференцию #200, после этого приходит пользователь "B" и также создает динамическую конференцию #200. Это вполне допустимая ситуация для пользователя "B", он просто войдет в конференцию, созданную пользователем "A", вместо того, чтобы получить сообщение о том, что конференция #200 уже кем-то была создана. Кроме того, если созданная пользователем "A" динамическая конференция защищена PIN кодом, то пользователь "B" услышит сообщение о некорректном PIN коде и приглашение ввести новый номер конференции. Как решение, для создания динамической конференции использовать опцию 'e', тогда asterisk сама выберет номер конференции и пользователь не столкнется с вышеописанной ситуацией.


Архитектура приложения и ее ограничения.


В приложении app_meetme (версия 1.2) существует только одна блокировка для защиты связанного списка, который содержит в себе конфигурацию каждой конференции.
Когда должно что-то измениться в конфигурации какой-либо из конференций, например, добавление нового канала в конференцию, все конференции блокируются. Это не то, чтобы большая проблема, когда у Вас работают одна или две конференции, но когда у Вас в системе работает их штук 10 - 15, то появляется своего рода сложность. Например, когда Вы имеете дело с 150 каналами, которые постоянно то добавляются, то удаляются - эта сложность перерастает в большую проблему. Однако, использование всего одной блокировки позволяет предотвратить взаимные блокировки (deadlock), но было бы намного лучше, если бы использовалась методика по безопасному программированию потоков (thread safe programming), которые не нуждаются в блокировках.


Объединение конференций.


Эту операцию можно произвести, используя канал chan_local и Asterisk manager API. (Возможно, можно использовать AGI или .call файлы)
Ниже приводиться пример для OriginateAction, с помощью которого объединяем конференции 123 и 124:

Пример плана набора (context = default):
exten => 7799,1,Meetme(123|qd)
exten => 7798,1,Meetme(124|qd)

Команда для Manager API:
Action: Originate
ActionID: 12345678
Channel: local/7798
Context: default
Exten: 7799
Priority: 1



Примеры.


Вход в комнату конференции 101, которая определена в файле конфигурации meetme.conf с паролем (PIN) 123456:
exten => 500,1,MeetMe(101||123456)

Вход в конференцию с авторизацией:
exten => 18,1,Answer
exten => 18,2,Wait(1)
exten => 18,3,Authenticate(5678)
exten => 18,4,MeetMe(18|p)
exten => 18,5,Playback(vm-goodbye)
exten => 18,6,Hangup

Динамическое создание конференц-комнат.
Пользователь должен ввести номер конференции для ее создания:
exten => 9999,1, Wait(1)
exten => 9999,2,MeetMe(|Md) ; Замечание: Если Вы добавите опцию 'e', Asterisk сам присвоит Вам номер конференции
;Измените опцию 'd' на 'D', если Вы хотите создавать конференции, защищенные PIN кодом.

Динамическая конференция с номером 123, вход не сопровождается оповещениями.
Любой пользователь станет отмеченным (marked) пользователем конференции, если совершит вызов на екстеншен '10'.
Конференция работает, пока отмеченный пользователь присутствует в ней.
Когда он выйдет, все остальные участники, которые попали в конференцию через екстеншен '11' будут отсоединены.
exten => 10,1,MeetMe(123|Aqd)
exten => 11,1,MeetMe(123|xqd)

Замечание: начиная с версии 1.6, во всех командах, и в том числе MeetMe, в качестве разделителя используется
запятая, а не символ "|".


Ссылки по теме:




источник: http://www.voip-info.org/wiki/view/Asterisk+cmd+MeetMe