Pull to refresh

Снимаем ограничение 3-х сторонней конференции на VoIP телефонах при помощи Asterisk

Не секрет, что большинство SIP телефонов способны создавать конференцию максимум из 3-х участников. Но что делать, если в процессе разговора возникла необходимость подключить четвертого?

Оказывается решение давно придумали (n-way+call), вот только оно работает с небольшими доработками в диалплане и только для исходящих. А если это был входящий звонок… Перезванивать?

Следующее решение позволяет создавать конференцию на сервере Asterisk во время разговора обоим участникам!

Как это работает?


  1. Для того, чтобы добавить участников к существующему разговору нажимаем "*0" (перевод звонка). Появляется зумер. Нажимаем «0» и оба участника разговора попадают в конференцию.
  2. Нажимаем «0». Появляется зумер. Вводим номер телефона абонента, которого хотим добавить в конференцию и "#", для ускорения процесса. Когда новый участник ответил можно с ним поговорить и "**" — добавить в конференцию, либо "*#" — не добавлять участника в конференцию, а самому вернуться в конференцию.
  3. Пункт 2 повторяем «неограниченное» количество раз для такого же количества новых участников.


А теперь сама реализация


Такое у нас в extensions.conf:
[default]
exten => _X.,1,NoOp()
 same => n,Macro(dyn-features-nway-start)
 same => n,Dial(SIP/${EXTEN},,tT)

[macro-dyn-features-nway-start]
;Добавляем возможность создания n-way конференции
exten => s,1,NoOp()
 same => n,Set(__GOTO_ON_BLINDXFR=fromtransfer^0^1)
 same => n,Set(__TRANSFER_CONTEXT=fromtransfer)
 same => n,Set(__CONFNO=${CALLERID(num)})

[fromtransfer]
;На следующие extentions можно перевести звонок, нажав "*0" (пункт 1.) 
;Если нажмём "0" - попадаём в контекст [dynamic-nway]
;Если же ничего не нажать, либо нажать не "0", то вернёмся обратно к разговору (не в конференцию)
exten => 0,1,NoOp()
 same => n,Gosub(dynamic-nway,${CONFNO},1)
 same => n,Hangup()
 
[dynamic-nway]
;Тут создаётся новая комната для конференций
;№ комнаты = № абонента, который инициировал создание конференции (нажал "*0 0")
exten => _X.,1,NoOp()
 same => n,Answer
 same => n,Set(CONFNO=${EXTEN})
 same => n,Set(MEETME_EXIT_CONTEXT=dynamic-nway-invite)
 same => n,Set(DYNAMIC_FEATURES=)
 same => n,MeetMe(${CONFNO},1pdMX)
 same => n,Hangup

[dynamic-nway-invite]
;Когда мы находимся в конференции и нажимаем "0" появляется гудок в линии. 
;После чего набираем номер нового участника конференции и "#"
exten => 0,1,NoOp()
 same => n,Read(DEST,dial,,i)
 same => n,Set(DYNAMIC_FEATURES=nway-inv#nway-noinv)
 same => n,Dial(Local/${DEST}@default,,g)
 same => n,Set(DYNAMIC_FEATURES=)
 same => n,Goto(dynamic-nway,${CONFNO},1)
exten => i,1,Goto(dynamic-nway,${CONFNO},1)

[macro-nway-ok]
;Сюда попадаем, если нажмём "**" для добавления нового участника в конференцию
exten => s,1,NoOp()
 same => n,ChannelRedirect(${BRIDGEPEER},dynamic-nway,${CONFNO},1)

[macro-nway-notok]
;Тут мы окажемся, если не захотим добавлять нового участника в конференцию
exten => s,1,NoOp()
 same => n,SoftHangup(${BRIDGEPEER})



Да, ещё нужно, чтоб в features.conf как-то оказались следующие строки:
[featuremap]
blindxfer => *0

[applicationmap]
nway-inv => **,caller,Macro,nway-ok
nway-noinv => *#,caller,Macro,nway-notok



Перезагружаем Asterisk.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.