AndyBack » 13 сен 2018, 23:54
Решил задачу через конференцию. Не уверен, что решение единственное, правильное и оптимальное...
И так, нам понадобится AMI и Redirect с дополнительным ExtraChannel, то есть двойной редирект. Смысл в том чтобы одновременно разорвать бридж и перебросить одного в конференцию, а второго на холд. Третьего средиректить в ту же конференцию после второй командой. Т.е:
А разговаривает с Б, С на холде. Надо: А разговаривает с С, Б на холде.
1. Разрываем бридж
"Action": "Redirect",
"Channel": А.channelId,
"ExtraChannel": Б.channelId,
"Exten": "to-conf",
"ExtraExten": "to-hold",
"Context": "call-services",
"ExtraContext": "call-services",
"Priority": "1",
"ExtraPriority": "1",
2. Редиректим с холда в конференцию.
"Action": "Redirect",
"Channel": С.channelId,
"Exten": "to-conf",
"Context": "call-services",
"Priority": "1",
Конференция потому что в конференции можно сидеть одному, звонок не теряется. Чтобы в конференции не крякали "вы один в конференции" итп, следует завести отдельные профили selector_profile,selector_user,selector_menu.
Диалплан:
[call-services]
...
exten => to-conf,1,NoOp(to-conf...)
same => n, Answer()
same => n, ConfBridge(${CONFNO},selector_profile,selector_user,selector_menu)
exten => to-hold,1,NoOp(to-hold...)
same => n, Answer()
same => n, MusicOnHold(default)
Answer() не мешает, но позволяет ответить а потом редиректить. Тут сразу возникает вопрос а в какую конференцию редиректить? А сформировать свое имя и установить его в ${CONFNO} через Varset:
"Action": "Setvar",
"Channel": канал,
"Variable": CONFNO,
"Value": confName, ; например, номер А + "-tmp-conf"
Чтобы не разбираться, можно вначале установить данную переменную всем трем каналам. Для "Ring", "Ringing", "Up" каналы есть и их можно узнать и получить. Сие прекрасно, можно редиректить входящие и исходящие, делая им Answer().
Команда на переключение должна подаваться извне. Я смог таким образом переключаться между 20 звонками совершенно спокойно и никого не теряя. Ничего больше в диалплане менять не пришлось, но если несколько линий не поддерживается (не будет состояния "Ring", а будет сразу "Busy"), то надо сразу кидать второго входящего на холд еще в диаплане.
Какие трудности:
1. Слежение за правильным состоянием каналов из AMI. Их На самом деле 4:
A - "Up"
Б - "Up"
C - "Ring"
А2 - "Ringing"
2. Разрывая бридж, всегда приходит событие MusicOnHold на А. Так же надо правильно обрабатывать хангап.
Если кому не понятно - расскажу подробнее. Критика и комментарии приветствуются.