Проверка DIALSTATUS для внутренних звонков

Asterisk DIALSTATUS

Alexcr

Проверка DIALSTATUS перед выполнением команды DIAL 

[internal]
include => parkedcalls

exten => _XXX,1,Verbose(3,Internal calls from ${CALLERID(num)} to ${EXTEN})
same => n,ExecIf($["${A_DUMP_CHAN}"="yes"]?DumpChan)
same => n,ExecIf($["${REC_INTERNAL}"!=""]?MixMonitor(${REC_INTERNAL}))
same => n,Set(CDR(maflags)=INTERAL)
same => n,GoSub(subcheck_devstate,${EXTEN},1)
same => n,Verbose(3,Device ${EXTEN} is ${GOSUB_RETVAL})
same => n,GoToIf($["${GOSUB_RETVAL}"="UNAVAILABLE"]?Unavailable)
same => n,GoToIf($["${GOSUB_RETVAL}"="BUSY"]?Busy)
same => n,GoSubIf($["${GOSUB_RETVAL}"="RINGING"]?redial-local(${EXTEN},${TRUE_EXTEN}))
same => n,GoSubIf($["${GOSUB_RETVAL}"="INUSE"]?redial-local(${EXTEN},${TRUE_EXTEN}))
same => n,Set(AUDIOHOOK_INHERIT(MixMonitor)=yes)
same => n,Dial(SIP/${EXTEN},60,TtWw)
same => n(Unavailable),VoiceMail(${EXTEN}@internal,u)
same => n,Hangup()
same => n(Busy),VoiceMail(${EXTEN}@internal,b)

[subcheck_devstate]
exten => _${A_EXTEN},1,Verbose(3,Check DEVSTATE ${DEVICE_STATE(SIP/${EXTEN})})
same => n,SET(D_STATUS=${DEVICE_STATE(SIP/${EXTEN})})
same => n,Return(${D_STATUS})

Это дает нам возможность узнать статус SIP устройства без выполнения звонка на него.  Кроме того мы можем использовать полученный статус для реализации Re-dial функции или переадресации на другой номер.