Как стать автором
Обновить

Снимаем ограничение 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.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.