@Cipceroid

Проверка на занятость линии и как лучше это сделать?

У меня существует такой механизм проверки занятость линии и оповещения об этом инициатора звонка:

[phonecheck]
exten = _X.,1,Noop(УВЕДОМЛЕНИЕ! Вызываемый абонент "${EXTEN} в настоящий момент ${DEVICE_STATE(PJSIP/${EXTEN})}")
exten = _X.,n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "INUSE"]?s-BUSY,1)
exten = _X.,n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "BUSY"]?s-BUSY,1)
exten = _X.,n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "UNAVAILABLE"]?s-UNAVAILABLE,1)
exten = _X.,n,Return()

exten = s-BUSY,1,Playback(${CallisBusy})
exten = s-BUSY,n,Return()

exten = s-UNAVAILABLE,1,Playback(${NumisDND})
exten = s-UNAVAILABLE,n,Wait(2)
exten = s-UNAVAILABLE,n,Hangup(18)


Если линия занята, то инициатору звонка проигрывается аудиофайл:
exten = s-BUSY,1,Playback(${CallisBusy})
После того, как проигрывания файла закончится происходит возврат в основной контекст и только тогда начинается звонок.

Основная проблема в том, что необходимо параллельно начать звонить абоненту и включать файл для оповещения о занятости линии, т.к пока запись не закончится - звонка не будет, а если не будет звонка занятой абонент так и не узнает, что ему звонили. Пробовал вместо Playback использовать Background(), не подошло

Как сделать так, чтобы Dial() не ждал пока Playback() закончит свою работу
  • Вопрос задан
  • 469 просмотров
Решения вопроса 1
@dronmaxman
VoIP Administrator
exten = s-BUSY,1,Playback(${CallisBusy})

Не делай так, это устаревшая конструкция ломающая CDR. Не надо менять EXTEN.

Для решения твоей проблемы, попробуй вот так. Я не тестировал этот код, написал из головы.

Через MOH
- создаешь папку с новым MOH, например тут /usr/share/asterisk/moh_busy
- кладешь в эту папку два файла, 01_busy.slm и 02_ring.slm.
- правишь musiconhold.conf, добавляешь

[busy]
mode=files
directory=moh_busy

не забудь сделать moh reload

В результате Dial будет проигрывать файлы из этой директории (moh_busy) во время звонка по очереди.

exten => _X.,1,NoOp(-------MAIN-DIALPLAN---------)
 same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "UNKNOWN"]?unknown)
 same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "INVALID"]?invalid)
 same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "UNAVAILABLE"]?unavailable)
 same => n,ExecIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "INUSE"]?SET(MOH_FILE=busy))
 same => n,ExecIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "BUSY"]?SET(MOH_FILE=busy))
 same => n,Dial(PJSIP/${EXTEN},60,m(${MOH_FILE}))
;; Unavailable
 same => n(unavailable),Noop(---Unavailable---)
 same => n,PlayBack(unavailable)
 same => n,HangUp()
;; Unknown
 same => n(unknown),Noop(----Unknown----)
 same => n,PlayBack(unknown)
 same => n,HangUp()
;; Invalid
 same => n(invalid),Noop(----Invalid----)
 same => n,PlayBack(invalid)
 same => n,HangUp()


или так

exten => _X.,1,NoOp(-------MAIN-DIALPLAN---------)
 same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "UNKNOWN"]?unknown)
 same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "INVALID"]?invalid)
 same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "UNAVAILABLE"]?unavailable)
 same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "INUSE"]?busy)
 same => n,GotoIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "BUSY"]?busy)
 same => n,Dial(PJSIP/${EXTEN},60)
 same => n,HangUp()
 same => n(busy),Dial(PJSIP/${EXTEN},60,m(busy))
 same => n,HangUp()
;; Unavailable
 same => n(unavailable),Noop(---Unavailable---)
 same => n,PlayBack(unavailable)
 same => n,HangUp()
;; Unknown
 same => n(unknown),Noop(----Unknown----)
 same => n,PlayBack(unknown)
 same => n,HangUp()
;; Invalid
 same => n(invalid),Noop(----Invalid----)
 same => n,PlayBack(invalid)
 same => n,HangUp()
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы