Страница 1 из 2

Конференции

Добавлено: 09 ноя 2016, 17:36
Exploizer
Задача мне поставлена такая - создавать "на ходу" конференции.
То есть: юзер 111 звонит юзеру 222, и они решают позвать юзера 333. 111 нажимает *0 и они вдвоём оказываются в конференции. Затем кто-то из них набирает "что-то" 333, разговаривает с ним, и, если тот согласен, затаскивает его в в ту самую конфу, где ждёт 222.

В общем, понятно. Для начала я решил просто создать конфу и поприглашать туда людей. И ничего не вышло... Я нашёл 2 с половиной варианта, и ни один не заработал как надо. То юзер не заходит, то DTMF фичи не включаются... Вот последняя попытка по рецепту wapo:

extensions.conf

Код: Выделить всё

[from-internal]
exten => _XXX,1,Set(DYNAMIC_FEATURES=pitch0)
exten => _XXX,n,Dial(SIP/${EXTEN},60)
exten => _XXX,n,Hangup

exten => *0,1,NoOp(Conf)
exten => *0,n,Set(CONFBRIDGE_JOIN_SOUND=confbridge-join)
exten => *0,n,Set(CONFBRIDGE_LEAVE_SOUND=confbridge-leave)
exten => *0,n,ConfBridge(${CALLERID(num)})
exten => *0,n,Hangup

exten => _888XXX,1,NoOp(Transfer to conferenc: ${EXTEN:3})
same => n,Set(CONFBRIDGE_JOIN_SOUND=confbridge-join)
same => n,Set(CONFBRIDGE_LEAVE_SOUND=confbridge-leave)
same => n,ConfBridge(${EXTEN:3})

[macro-conf]
exten => s,1,NoOp(---------------------ALL INFO about CHANNELS!!!!---------------)
exten => s,n,NoOp(BRIDGEPEER: ${BRIDGEPEER} for number: ${CALLERID(num)} )
exten => s,n,ChannelRedirect(${BRIDGEPEER},from-internal,888${CALLERID(num)},1)
exten => s,n,NoOp(------------------ALL INFO about CHANNELS!!!!-----------------)
features.conf

Код: Выделить всё

[featuremap]
disconnect=**

[applicationmap]
pitch0=>*0,self/both,Macro,conf
Что получается:

Код: Выделить всё

Connected to Asterisk 11.22.0 currently running on localhost (pid = 31151)
  == Using SIP VIDEO CoS mark 6
  == Using SIP RTP CoS mark 5
    -- Executing [222@from-internal:1] Set("SIP/111-00000065", "DYNAMIC_FEATURES=pitch0") in new stack
    -- Executing [222@from-internal:2] Dial("SIP/111-00000065", "SIP/222,60") in new stack
  == Using SIP VIDEO CoS mark 6
  == Using SIP RTP CoS mark 5
    -- Called SIP/222
    -- SIP/222-00000066 is ringing
    -- SIP/222-00000066 answered SIP/111-00000065
    --  Feature Found: pitch0 exten: pitch0
    -- Executing [s@macro-conf:1] NoOp("SIP/111-00000065", "---------------------ALL INFO about CHANNELS!!!!---------------") in new stack
    -- Executing [s@macro-conf:2] NoOp("SIP/111-00000065", "BRIDGEPEER: SIP/222-00000066 for number: 111 ") in new stack
    -- Executing [s@macro-conf:3] ChannelRedirect("SIP/111-00000065", "SIP/222-00000066,from-internal,888111,1") in new stack
    -- Executing [s@macro-conf:4] NoOp("SIP/111-00000065", "------------------ALL INFO about CHANNELS!!!!-----------------") in new stack
    -- Executing [888111@from-internal:1] NoOp("SIP/222-00000066", "Transfer to conferenc: 111") in new stack
    -- Executing [888111@from-internal:2] Set("SIP/222-00000066", "CONFBRIDGE_JOIN_SOUND=confbridge-join") in new stack
    -- Executing [888111@from-internal:3] Set("SIP/222-00000066", "CONFBRIDGE_LEAVE_SOUND=confbridge-leave") in new stack
    -- Executing [888111@from-internal:4] ConfBridge("SIP/222-00000066", "111") in new stack
    -- <SIP/222-00000066> Playing 'conf-onlyperson.gsm' (language 'en')
  == Spawn extension (from-internal, 222, 2) exited non-zero on 'SIP/111-00000065'
То есть 222 попадает в конфу, а 111 вешает трубку...

Подскажите, пожалуйста, как это правильно сделать ?

Re: Конференции

Добавлено: 09 ноя 2016, 18:24
ded
Exploizer писал(а): юзер 111 звонит юзеру 222, и они решают позвать юзера 333.
При условии цыскофонов это просто!
111 нажимает кнопку Конференция (на телефоне), гудок (а в это время 222 на music-on-hold) и набирает 333,
- Здорово! Мы тут с 222 говорим о новых возможностях, присоединяю тебя в конфу!
опять нажимает кнопку Конференция. Вуа ля! все втроём рассказывают анекдоты. Нужно присоединить ещё 444? Эта возможность есть у крайних в этой цепочке
222 --- 111 --- 333
то есть кнпку конференция может нажать 111 или 333.
Абоненты могут быть как внутренние, так и внешние.

* Если у вас нет цыскофонов, но есть буква Т в опциях Dial(SIP/222,,tT) - а у вас нету:

Код: Выделить всё

Dial("SIP/111-00000065", "SIP/222,60")
то есть возможность трансфера исходящего вызова. 111 делает Blind transfer - #401 и забрасывает таким образом своего оппонента 222 в комнату конференции с номером 401. Которую, конечно, сначала нужно создать. Потом набирает 333, сообщает
- Здорово! Мы тут с 222 говорим о новых возможностях, присоединяю тебя в конфу!
нажимает Blind transfer - #401
потом запрыгивает туда сам.

Неудобно!

Re: Конференции

Добавлено: 10 ноя 2016, 00:42
Exploizer
Некоторая часть телефонов действительно циски, но их относительно мало, и объяснять десяткам юзеров, что вот так они могут, а так нет - нехорошо.
Насчёт создания конференции - я хочу сделать рандомные комнаты вне обычного плана номеров(пятизнаки), чтобы снаружи попасть туда было нельзя, только по вызову изнутри. И без пин-кодов обойтись заодно.
Для регулярных конференций я хочу прикрутить веб-морду (astconfman), пусть там секретари рулят. С кодами, представлениями и прочими пряниками.
Неужели нет простого способа создать конфу и звать туда людей ?

Re: Конференции

Добавлено: 10 ноя 2016, 09:04
virus_net
А что для вас "простой" ? Это понятие тут для каждого свое. Предложенное выше ded`ом:
ded писал(а):делает Blind transfer - #401 и забрасывает таким образом своего оппонента 222 в комнату конференции с номером 401
проще некуда.
Не нравится, что надо помнить номер комнат и для каждого (отдела/человека) делать отдельные ? Не вопрос. Создавайте комнаты динамически, по нажатию соответствующей комбинации клавиш. Я так и поступил в одном из проектов, номер конфы = номер телефона его создавшего.
ConfBridge([confno][,options])
И для меня это не было сложным.
Все было основано на Asterisk n-way call HOWTO.

Re: Конференции

Добавлено: 16 ноя 2016, 18:19
asterisker
Exploizer писал(а):обычного плана номеров(пятизнаки), чтобы снаружи попасть туда было нельзя, только по вызову изнутри
А если брут..? И, гм, у вас что...всё в одном контексте?

Re: Конференции

Добавлено: 16 ноя 2016, 19:46
Zavr2008
А если брут..?
Никакой разницы в каком контексте, уважаемый астерискер.
Читать и еще раз читать книжки! Уделить особенно пристальное внимание словам permit и deny :)

Re: Конференции

Добавлено: 17 ноя 2016, 11:43
nickel82
ded писал(а):При условии цыскофонов это просто!
ну на самом деле далеко не только "цискофоны" могут трёхстороннию конференцию делать. например Granstreamы, даже бюджетного уровня. а если по цене "цискофонов" брать Grandstreamы то там и 4-6 сторонию конференцию с аппарата можно замутить!

Re: Конференции

Добавлено: 17 ноя 2016, 12:11
asterisker
Zavr2008 писал(а):Читать и еще раз читать книжки! Уделить особенно пристальное внимание словам permit и deny
читайте, потом расскажете, как в extensions.conf их применять.

Re: Конференции

Добавлено: 18 ноя 2016, 08:56
virus_net
Для этого есть CID match.

Re: Конференции

Добавлено: 08 дек 2016, 15:09
Exploizer
В общем, всё получилось. Выложу конфиги, может кому пригодится.

PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: extensions.conf
[globals]
DYNAMIC_FEATURES = nway-start
DYNAMIC_FEATURES_NWAYINV = nway-ok#nway-notok

[from-internal]
exten => _XXX,1,Dial(SIP/${EXTEN},60,tT)
exten => _XXX,n,Hangup

[macro-nway-ok]
exten => s,1,ChannelRedirect(${BRIDGEPEER},nway-conf,${CONFNO},1)

[macro-nway-notok]
exten => s,1,SoftHangup(${BRIDGEPEER})

[nway-invite]
exten => s,1,Playback(vm-enter-num-to-call)
same => n,Read(NEW_CALLEE,dial,20,i)
same => n,Playback(vm-dialout)
same => n,Set(DYNAMIC_FEATURES=${DYNAMIC_FEATURES_NWAYINV})
same => n,Set(CALLER=${CALLERID(num)})
same => n,Set(DIALOUT_CONTEXT=${SIPPEER(${CALLER},context)})
same => n,ExecIf($["${DIALOUT_CONTEXT}" = ""]?Set(DIALOUT_CONTEXT=from-internal))
same => n,Dial(Local/${NEW_CALLEE}@from-internal,,gH)
same => n,ChannelRedirect(${CHANNEL(name)},nway-conf,${CONFNO},1)

[macro-nway-start]
exten => s,1,Set(__CONFNO=${RAND(50000,99999)})
same => n,ChannelRedirect(${BRIDGEPEER},nway-conf,${CONFNO},1)
same => n,ConfBridge(${CONFNO},,,nway_menu)

[nway-conf]
exten => _[5-9]XXXX,1,Answer
same => n,ConfBridge(${EXTEN},,,nway_menu)
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: features.conf
[featuremap]
disconnect=**

[applicationmap]
nway-start => *0,self,Macro,nway-start
nway-ok => *7,self/caller,Macro,nway-ok
nway-notok => *8,self/caller,Macro,nway-notok
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER: confbridge.conf
[general]
[default_user]
type=user
music_on_hold_when_empty=yes
announce_only_user=no
dsp_drop_silence=yes

[default_bridge]
type=bridge

[nway_menu]
type=menu
*3=dialplan_exec(nway-invite,s,1)
Проверено на 11.9 и 11.20. Оптимизацией ещё не занимался, может есть что-то лишнее. Маленький косяк только в одном - когда первые юзеры падают в конфу, и один из них вызывает третьего - в конфе тишина. music_on_hold_when_empty=yes не срабатывает, потому что формально в конфе два юзера, просто один временно вышел в другой контекст. Можно сразу одного отправить в контекст вызова нового участника, и тогда MOH будет, но юзерам так не понравилось.

Насчёт попадания в конфу методом подбора номера. Я не очень понимаю, как можно подобрать рандомный _[5-9]XXXX, если внутренний диалплан:

Код: Выделить всё

exten => _XXX,1,Dial(SIP/${EXTEN},60,tT)
а выход в город:

Код: Выделить всё

exten => _98XXXXX.,1,Dial(SIP/${EXTEN:1},60,tT)
посему считаю такие конференции доступными только для вызовов изнутри. Если я неправ - буду признателен за разъяснения.