Как можно определить, занята ли линия связи, и каким наилучшим способом это сделать?

Как можно сделать так, чтобы Dial() не ожидал завершения работы Playback() и начал звонок абоненту одновременно с проигрыванием аудиофайла, чтобы абонент, даже если был занят, всегда получал оповещение о входящем звонке?
  • 19 октября 2023 г. 6:29
Ответы на вопрос 3
Для определения занятости линии связи можно использовать функцию DIALSTATUS в Asterisk. Она возвращает текущее состояние звонка, включая информацию о том, занято ли соединение или не удалось установить соединение.

Чтобы Dial() и Playback() выполнялись одновременно, вам может потребоваться использовать фоновый режим для Playback(). Это можно сделать, передав аргументом "b" в функцию Playback(). Например:

exten => 100,1,Answer()
same => n,Playback(filename,b)
same => n,Dial(SIP/100)

Здесь функция Playback() будет проигрывать аудиофайл в фоновом режиме, одновременно с выполнением Dial().

Таким образом, абонент всегда будет получать оповещение о входящем звонке, независимо от того, занят ли он или нет.
exten = s-BUSY,1,Playback(${CallisBusy}) 
 Обновите код, чтобы избежать проблем с CDR и не меняйте EXTEN. Попробуйте использовать следующий вариант кода:

```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(ANONSE_FILE=busy))
 same => n,ExecIf($["${DEVICE_STATE(PJSIP/${EXTEN})}" = "BUSY"]?SET(ANONSE_FILE=busy))
 same => n,Dial(PJSIP/${EXTEN},60,A(${ANONSE_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()

;; 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()```
Похожие вопросы