Asterisco: encaminhar se par inacessível

1

Gostaria de responder às chamadas recebidas, verificando se um ponto específico está ao alcance e discar o número apropriado de acordo.

Atualmente eu fiz isso:

exten => 1200,1,Answer()
same => n,Set(reachable=${SHELL(asterisk -rx "sip show peers" | grep ^cedrich-phone.*OK)})
same => n,GotoIf($["${LEN(${reachable})}" = "0"]?extoffline)
same => n,Dial(SIP/cedrich-phone,20)
same => n(extoffline),Dial(SIP/another-phone,20,tr)
same => n,Hangup()

Você poderia me dizer se isso é aceitável e se pode ser melhorado usando as práticas recomendadas?

    
por Cedric H. 13.10.2013 / 18:48

3 respostas

5

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.

    
por 14.10.2013 / 18:21
1

Como @arops mencionados, você pode usar DEVICE_STATE () para obter o status de um dispositivo específico, se for um mapeamento 1: 1 (1 conta em 1 dispositivo). Você pode usar o seguinte:

${DEVICE_STATE(${CHANNEL(channeltype)}/${CHANNEL(peername)})}

Outra possibilidade é a função EXTENSION_STATE () caso você tenha 1: muitos mapeamento (uma extensão com mais de um dispositivo).

Ambos podem ter dicas, conforme descrito aqui , se você precisar tem um usuário para usar vários dispositivos. Aqui você pode ver como criar dicas dinâmicas

    
por 21.01.2014 / 21:26
-1

O uso do sistema no dialplan abrirá o shell e gerará 2 processos para cada chamada.

Claro asterisco tem função para sua tarefa. É descrito em todos os livros.

-= Info about function 'DEVICE_STATE' =- 

[Synopsis]
Get or Set a device state. 

[Description]
The DEVICE_STATE function can be used to retrieve the device state from any
device state provider. For example:
NoOp(SIP/mypeer has state ${DEVICE_STATE(SIP/mypeer)})
NoOp(Conference number 1234 has state ${DEVICE_STATE(MeetMe:1234)})
The DEVICE_STATE function can also be used to set custom device state from
the dialplan.  The 'Custom:' prefix must be used. For example:
Set(DEVICE_STATE(Custom:lamp1)=BUSY)
Set(DEVICE_STATE(Custom:lamp2)=NOT_INUSE)
You can subscribe to the status of a custom device state using a hint in
the dialplan:
exten => 1234,hint,Custom:lamp1
The possible values for both uses of this function are:
UNKNOWN | NOT_INUSE | INUSE | BUSY | INVALID | UNAVAILABLE | RINGING |
RINGINUSE | ONHOLD
    
por 18.10.2013 / 23:57

Tags