Executar um shell de asterisco em uma chamada não parece certo para mim. Provavelmente funciona ok, mas o status de um par não deve ser conhecido pelo asterisco?
Eu uso a função SIPPEER()
com a qual você pode solicitar o status de um par. Se os 3 primeiros caracteres (de OK (44 ms)
) forem OK
, você poderá chamar o peer. Todas as outras situações que você pode encaminhar para outro par.
Eu faço algo assim:
exten => _202,1,Log(NOTICE,Dial Status of ${EXTEN}: ${SIPPEER(${EXTEN},status)})
exten => _202,n,GotoIf($["${SIPPEER(${EXTEN},status):0:3}"="OK "]?ok1:forward)
exten => _202,n(ok1),Log(NOTICE,Calling number is available)
exten => _202,n,Dial(SIP/${EXTEN},50,wW)
exten => _202,n,Hangup()
exten => _202,n(forward),Log(NOTICE,Calling forward number)
exten => _202,n,Dial(SIP/201,50,wW)
exten => _202,n,Hangup()
Isso verifica o status antes de irmos para Dial()
e vai para n(forward)
se o par estiver indisponível, ocupado ou não estiver OK.
Existe, no entanto, um pequeno problema com isto. Quando o par nega a ligação (ou, por outro motivo, não está disponível, por exemplo, ele entrou on-line antes do próximo cheque on-line), a ligação não é recebida.
Existe uma função DIALSTATUS
que podemos usar depois do Dial()
para verificar se a chamada foi respondida com sucesso. Então use isso depois do Dial()
e se ele não for respondido também faça o forward. (Ele funcionou em um teste que eu fiz. Negar a chamada deu BUSY
no log e foi para o próximo par)
Você recebe algo assim:
exten => _202,1,Log(NOTICE,Dial Status of ${EXTEN}: ${SIPPEER(${EXTEN},status)})
exten => _202,n,GotoIf($["${SIPPEER(${EXTEN},status):0:3}"="OK "]?ok1:forward)
exten => _202,n(ok1),Log(NOTICE,Calling number is available)
exten => _202,n,Dial(SIP/${EXTEN},50,wW)
exten => _202,n,Log(NOTICE,Dial status: ${DIALSTATUS})
exten => _202,n,GotoIf($["${DIALSTATUS)}"="ANSWER"]?ok2:forward)
exten => _202,n(ok2),Log(NOTICE,Successfull call)
exten => _202,n,Hangup()
exten => _202,n(forward),Log(NOTICE,Calling forward number)
exten => _202,n,Dial(SIP/201,50,wW)
exten => _202,n,Hangup()
Eu não testei este último bit (com DIALSTATUS
) extensivamente, então você deve fazer alguns testes, mas aqui parece funcionar.