Вызов внутреннего и мобильного номеров сотрудника без задержек в Asterisk
Иногда бывают такие ситуации когда необходимо позвонить сотруднику и обязательно до него дозвониться. Для этого сначала вызывается внутренний номер сотрудника и если он не ответил на вызов, то вызывается мобильный номер.
Диалплан выглядит очень просто:
exten => 123,1,Dial(SIP/${EXTEN},15,Ttfg)
exten => 123,n,ExecIf($["${DIALSTATUS}" = "ANSWER"]?HangUp())
exten => 123,n,Dial(SIP/out-trunk/81234567890)
exten => 123,n,HangUp
Но такой план дозвона выглядит крайне некрасивым для звонящего. Ведь сначала он слушает длинные гудки от внутреннего телефона, а затем наступает тишина до тех пор, пока не установится соединение с мобильным номером и снова начинаются длинные гудки. Момент установления соединения с мобильным номером может быть длительным по разным причинам, но даже оптимально-минимальное время установления соединения составляет порядка 4 секунд. Это много.
Необходимо реализовать параллельный дозвон сразу на 2 номера, но на мобильный с небольшой задержкой.
Для этого будет использован тип канала Local
. С его помощью любой номер можно рассматривать как отдельное устройство. И тогда последующий диалплан будет выглядеть так:
exten => 123,1,Dial(Local/123@local/nmb&Local/123mob@local/nmb)
[local]
exten => 123,1,Dial(SIP/123,15)
exten => 123,n,HangUp
exten => 123mob,1,Wait(11)
exten => 123mob,n,Dial(SIP/out-trunk/81234567890)
exten => 123mob,n,HangUp
Вызываются одновременно 2 номера. Для вызова мобильного номера установлена задержка на 4 секунды меньше, чем длится вызов внутреннего номера сотрудника, чтобы как только перестает звонить внутренний номер уже начинал звонить мобильный номер.
В итоге звонящий слышит ровные гудки, без их пропаданий, без перескакиваний (если неверно подобран таймаут при обычном Dial
). И не успев прекратиться вызов внутренний, как тут же звонит мобильный. При ответе на вызов внутреннего номера сотрудника вызов мобильного номера не будет осуществлен.
Для канала ~Local` используются ключи:
- /n - оставляем канал “живым” при установлении соединения командой
Dial
. Необходимо для того, чтобы действовали ограничения от командыDial
. - /b - передавать реальный канал, а не виртуальный по запросу. Необходимо для перевода вызовов.
- /m - для возможности передачи Early Media установленного в канале от
Dial
.
Унифицированный вид диалплана будет выглядеть так:
[default]
exten => _XXX,1,Dial(Local/${EXTEN}@local/nmb&Local/8123456789@waitout/nmb)
[local]
exten => _XXX,1,Dial(SIP/${EXTEN},15)
exten => _XXX,n,HangUp
[waitout]
exten => _8X.,1,Wait(11)
exten => _8X.,n,Dial(SIP/out-trunk/${EXTEN})
exten => _8X.,n,HangUp