ВидеоКонф(ВКС)  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Запрос голоса в конференции

Проблемы и их решения Asterisk как такового

Модераторы: april22, Zavr2008

Re: Запрос голоса в конференции

Сообщение virus_net » 22 ноя 2016, 18:15

tol_iwan писал(а):Конечно это только мысли

Мысли красивые, но:
tol_iwan писал(а):Имеем у спикера/модератора BLF-панель и на в вносим кастомные HINT для каждого участника

Кол-во участников, как и сами участники, могут варьироваться от конфы к конфе. Исходя из этого получается, что перед каждой конференцией кто-то должен перенастраивать панель модератора. ИМХО это неюзабельно и соответственно нереально.

Так же надобы потестить, что при mute на канале DTMF вообще дойдет, т.к. есть подозрения что будет подавляться ВСЕ что в канале.
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
virus_net
 
Сообщений: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Запрос голоса в конференции

Сообщение trscod » 22 ноя 2016, 18:37

virus_net, спасибо за наводку. Протестим.
Аватар пользователя
trscod
 
Сообщений: 358
Зарегистрирован: 30 авг 2010, 17:34

Re: Запрос голоса в конференции

Сообщение tol_iwan » 23 ноя 2016, 09:15

Я ж сказал мысли, причем недопиленные :-)
virus_net писал(а):есть подозрения что будет подавляться ВСЕ что в канале

Что-то вроде same => n,Set(CONFBRIDGE(user,toggle_mute)=yes)
; toggle_mute
; Включение или выключение микрофона. Если у пользователю выключен микрофон, он не может общаться с другими пользователями конференции, но он по прежнему может слышать всех пользователей конференции. В режиме выключенного микрофона, DTMF команды по прежнему могут быть приняты и обработаны.
virus_net писал(а):перед каждой конференцией кто-то должен перенастраивать панель модератора

Да, неудобно. Но вдруг состав не особо меняется и на панель можно внести всех потенциальных участников. Можно конечно генерить налету скриптом состав панели и провижингом грузить ее в телефон, но это уже перебор все таки :-)
P.S. А не существует готовых web-морд для управления конференциями? Как я говорил не заморачивался этим, но почему-то казалось, что что-то подобное есть.
Аватар пользователя
tol_iwan
 
Сообщений: 273
Зарегистрирован: 11 апр 2014, 11:29
Откуда: Брянск

Re: Запрос голоса в конференции

Сообщение virus_net » 23 ноя 2016, 10:22

tol_iwan, да я знаю. Я выше высказал такую же мысль :) В теории возможно, а на практике нужно читать, делать и проверять.
Я лишь подметил, что ваша идея хороша, но есть нюанс, который может свести идею на нет, к сожалению.
tol_iwan писал(а):CONFBRIDGE(user,toggle_mute)=yes

в Asterisk 1.8 такого нет, т.е. получается что не все смогут воспользоваться, как и предложенным мной способом.
trscod не озвучил какая у него версия Asterisk`а.
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
virus_net
 
Сообщений: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Запрос голоса в конференции

Сообщение trscod » 23 ноя 2016, 21:58

В AMI видны нажатия DTMF, даже в случае mute. Так что задачка решилась. Всем спасибо!
Аватар пользователя
trscod
 
Сообщений: 358
Зарегистрирован: 30 авг 2010, 17:34

Re: Запрос голоса в конференции

Сообщение virus_net » 24 ноя 2016, 10:23

Так все же как именно она решилась ? Может все же стоит поделиться какой именно путь, из предложенных, выбран.
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
virus_net
 
Сообщений: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Запрос голоса в конференции

Сообщение trscod » 24 ноя 2016, 11:27

Задача решилась следующим образом:
В AMI отлавливаем эвенты DTMF.

Инструкция для участника конференции выглядит следующим образом:
После попадания в конференцию, вы не имеете права говорить. Ведущий конференции сам назначает спикера, включая ему микрофон. Но если у Вас есть возражения, или важное заявление, то Вы можете нажать несколько раз на звездочку на Вашем телефонном аппарате. При этом ведущий конференции увидит на экране своего компьютера что Вы запрашиваете слово. И объявит когда или через сколько минут Вам будет предоставлено слово.

Как это работает:
Наша программа видит что участник конференции жмет звездочку. И показывает на экране ведущего конференции иконку запроса слова. Возле фамилии участника.
Как на вебинаре.
Аватар пользователя
trscod
 
Сообщений: 358
Зарегистрирован: 30 авг 2010, 17:34

Re: Запрос голоса в конференции

Сообщение virus_net » 24 ноя 2016, 17:57

Т.е. по итогу это все же Web-приложение.
мой SIP URI sip:virus_net@asterisk.ru
bitname.ru - Домены .bit (namecoin) .emc .coin .lib .bazar (emercoin)

ENUMER - звони бесплатно и напрямую.
virus_net
 
Сообщений: 2337
Зарегистрирован: 05 июн 2013, 08:12
Откуда: Москва

Re: Запрос голоса в конференции

Сообщение trscod » 24 ноя 2016, 18:08

Вот ведь правду говорят: "Истина не в словах говорящего, а в ушах слушающего".
Как будто кроме web не бывает других приложений.
Аватар пользователя
trscod
 
Сообщений: 358
Зарегистрирован: 30 авг 2010, 17:34

Re: Запрос голоса в конференции

Сообщение tol_iwan » 06 дек 2016, 13:21

Реализовал таки схему предложенную мной выше.
Используемое оборудование: Grandstream GXP2140 с LCD доп. панелью GXP2200EXT.
Сразу скажу о недостатках:
1. У организатора/модератора должно быть два телефона: один с панелью, другой для участия любой. Проблема связана с автопровижингом - телефон не принимает новую конфигурацию, если занят.
2. Обновлении списка участников занимает секунд 15 - время на автопровижинг.

Итак выглядит все это так:
1. Участники регистрируются в конференции.
2. Организатор/модератор на панели телефона нажимает кнопку "обновить". На панель загружаются участники конференции. При этом лампы панели загораются зеленым цветом.
3. В конференции при входе/выходе участника проигрывается "beep" или что-то подобное. По этому сигналу или просто периодически организатор/модератор нажимает "обновить", с панели удаляются вышедшие участники, добавляются новые.
4. Участник при желании выступить нажимает на своем телефоне определенную цифру(я делал 3). При этом на панели начинает мигать красным соответствующая участнику лампа.
5. Организатор/модератор нажимает мигающую кнопку и у соответствующего участника включается микрофон, кнопка горит красным.
6. Организатор/модератор нажимает горящую красным кнопку и у соответствующего участника выключается микрофон. Кнопка загорается зеленым.
7. При завершении конференции организатор/модератор нажимают "обновить" и с панели удаляются все участники, т.к. их нет. Можно конечно и независимо от участников сделать кнопку "завершение", но я не делал, реализуется думаю.
Получаем, что кнопка участника имеет три состояния - зеленый(микрофон выключен), красный(микрофон включен), мигающий красный(просит включить микрофон).

Описание реализации:
[Показать] Спойлер:
9002 - exten вызова конференция
9003 - exten запроса голоса
change_status_conf - exten смены кастомного статуса
_XXXX9002 - exten включения/выключения микрофона

1. В sip_notify.conf прописываем событие для обновления конфигурации телефона без перезагрузки. В моем случае:
Код: выделить все
[gs-check-cfg]
Event=>resync

2. Делаем конфигурационный файл для автопровижинга(у меня grandstream21xx_1.0.7.97_conf.xml) - оставляем поля, ответственные за BLF-панель, исключая начальные клавиши - на них будет висеть обновление участников и может что еще нужно постоянное. В моем случае это поля от P23000 до P23198. На одну кнопку выделено 4 записи по порядку, между записями одна пропускается, т.е. запись + 5 это уже следующая. Я оставил необновляемыми 2 кнопки, поэтому начинаю с P23010.
3. Настраиваем автопровижинг для телефона. Настройку не привожу - стандартно.
4. В confbridge.conf создаем профиль конференции и ее меню. Все стандартно за исключением:
- убрать возможность включать микрофон самостоятельно
- на кнопку повесить тот самый запрос слова участником - выполнение команды диалплана, в моем случае
Код: выделить все
3=dialplan_exec(conferention,change_status_conf,1)

5. Для всех возможных участников конференции создать кастомные хинты вида:
Код: выделить все
exten=>25369002,hint,Custom:25369002

Можно сделать и скрипт, который будет добавлять в отдельный файл конкретные хинты при регистрации участника, а файл заинклюдить в контексте конференции. Я не делал.
6. Собственно контекст конференции:
Код: выделить все
[conferention]
exten => 9002,1,Answer()
same    =>    n,Set(DEVICE_STATE(Custom:${CALLERID(num)}${EXTEN})=NOT_INUSE)
same    =>    n,ConfBridge(${EXTEN},conf_bridge,conf_user,conf_menu)
same    =>    n,Hangup()
exten => 9003,1,NoOp()
; запуск скрипта с параметрами: номер конференции и номер телефона с BLF-панелью
same    =>    n,System(/usr/share/asterisk/agi-bin/check_status_queue.php "9002" "2595")
same    =>    n,Hangup()
exten => change_status_conf,1,Set(DEVICE_STATE(Custom:${CALLERID(num)}9002)=RINGING)
same    =>    n,Hangup()
exten => _XXXX9002,1,NoOp(Изменение статуса номера ${EXTEN:0:4} в конференции ${EXTEN:4} и включение/выключение микрофона)
same    =>    n,GoSubIf($[${DEVICE_STATE(Custom:${EXTEN})}=BUSY]?off:on)
same    =>    n(off),Set(DEVICE_STATE(Custom:${EXTEN})=NOT_INUSE)
same    =>    n,System(asterisk -rx 'confbridge mute ${EXTEN:4} SIP/${EXTEN:0:4}')
same    =>    n,Hangup()
same    =>    n(on),Set(DEVICE_STATE(Custom:${EXTEN})=BUSY)
same    =>    n,System(asterisk -rx 'confbridge unmute ${EXTEN:4} SIP/${EXTEN:0:4}')
same    =>    n,Hangup()

7. Собственно сам скрипт check_status_queue.php. Писал на PHP, сразу говорю - не умею, делал, чтоб получилось, поэтому код скорей всего из вида "*овнокода"
Код: выделить все
<?php
# Изменяемый файл конфигурации
$file_conf = "/usr/share/asterisk/phoneprov/grandstream21xx_1.0.7.97_conf.xml";
# Переданные скрипту параметры:
## Номер телефона, на котором обновляется панель
$phone_number = $argv[2];
## Номер конференции
$conf_number = $argv[1];
#$conf_number = "9002";
# Первый и последний параметр файла конфигурации, отвечающий за клавиши панели, которые будем менять
$member_first = 23010;
$member_end = 23195;
# шаг в значениях параметров соседних клавиш
$member_step = 5;
# Позиция начала номера участника конференции в выводе 'confbridge list'
$position = 88;
# Длина строки в выводе 'confbridge list'
$line_len = 94;

# Открытие файла конфигурации для изменения
if (file_exists($file_conf)) {
   $xml = simplexml_load_file($file_conf);
   }
else {
    exit('Не удалось открыть файл '.$file_conf."\n");
}

# Получение данных об участниках конференции
$output = shell_exec("asterisk -rx 'confbridge list $conf_number' | grep conf_");

# Заполнение массива участников на основании полученных данных
$step = 1;
if (strlen($output) > 1) {
   while ( $position <= strlen($output)){
      $conf_member = $output[$position+1].$output[$position+2].$output[$position+3].$output[$position+4];
      $position = $position+$line_len;
      echo $conf_member."\n";
      $conf_members[$step]["name"] = "Member".$conf_member;
      $conf_members[$step]["number"] = $conf_member.$conf_number;
      $step = $step + 1;
   }
}
else {
   echo("Ошибка получения списка участников конференции. Убедитесь, что конференция запущена.\n");
}

# Установка переменной текущего параметра в файле конфигурации
$memberX = $member_first;
# Статус устанавливаемой кнопки("1" - BLF, "-1" - отключена)
$member_status = 1;

# Запись клавиш для каждого участника очереди
# На каждую клавишу приходится 4 параметра:
# - состояние клавиши
# - привязанная учетная запись(не меняется, т.к. на телефоне используется одна)
# - подпись
# - значение
if (isset($conf_members)) {
   foreach ($conf_members as $conf_member) {
      echo $conf_member["name"]." ".$conf_member["number"]."\n";
      $memberX1 = $memberX + 2;
      $memberX2 = $memberX + 3;
      $member1 = 'P'.$memberX;
      $member2 = 'P'.$memberX1;
      $member3 = 'P'.$memberX2;
      $xml->config[0]->$member1 = $member_status;
      $xml->config[0]->$member2 = $conf_member["name"];
      $xml->config[0]->$member3 = $conf_member["number"];
      $memberX = $memberX + $member_step;
   }
}
# Обнуление неиспользуемых клавиш
$member_status = -1;
while ($memberX <= $member_end){
   $memberX1 = $memberX + 2;
   $memberX2 = $memberX + 3;
   $member1 = 'P'.$memberX;
   $member2 = 'P'.$memberX1;
   $member3 = 'P'.$memberX2;
   $xml->config[0]->$member1 = $member_status;
   $xml->config[0]->$member2 = "";
   $xml->config[0]->$member3 = "";
   $memberX = $memberX + $member_step;
}
$xml->asXML($file_conf);
shell_exec("asterisk -rx 'sip notify gs-check-cfg $phone_number'");
?>

Кажется ничего не забыл.

Как-то так, вдруг кому пригодится.
Еще была мысли через MicroSIP - там есть загрузка XML-справочника абонетов с показом состояния. Может через него можно. Но мысль пришла позже, проверять уже не очень хочется.
Аватар пользователя
tol_iwan
 
Сообщений: 273
Зарегистрирован: 11 апр 2014, 11:29
Откуда: Брянск

Пред.След.

Вернуться в Конфигурация и настройка Asterisk

Кто сейчас на форуме

Сейчас этот форум просматривают: Scarabey и гости: 42

© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH