Снимаем ограничение 3-х сторонней конференции на VoIP телефонах при помощи Asterisk
Invite pending
Не секрет, что большинство SIP телефонов способны создавать конференцию максимум из 3-х участников. Но что делать, если в процессе разговора возникла необходимость подключить четвертого?
Оказывается решение давно придумали (n-way+call), вот только оно работает с небольшими доработками в диалплане и только для исходящих. А если это был входящий звонок… Перезванивать?
Следующее решение позволяет создавать конференцию на сервере Asterisk во время разговора обоим участникам!
Такое у нас в extensions.conf:
Да, ещё нужно, чтоб в features.conf как-то оказались следующие строки:
Перезагружаем Asterisk.
Оказывается решение давно придумали (n-way+call), вот только оно работает с небольшими доработками в диалплане и только для исходящих. А если это был входящий звонок… Перезванивать?
Следующее решение позволяет создавать конференцию на сервере Asterisk во время разговора обоим участникам!
Как это работает?
- Для того, чтобы добавить участников к существующему разговору нажимаем "*0" (перевод звонка). Появляется зумер. Нажимаем «0» и оба участника разговора попадают в конференцию.
- Нажимаем «0». Появляется зумер. Вводим номер телефона абонента, которого хотим добавить в конференцию и "#", для ускорения процесса. Когда новый участник ответил можно с ним поговорить и "**" — добавить в конференцию, либо "*#" — не добавлять участника в конференцию, а самому вернуться в конференцию.
- Пункт 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.