Вызов внутреннего и мобильного номеров сотрудника без задержек в 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
comments powered by Disqus