Asterisk® SCF™ Extension States e HINT/BLF em ARA (Realtime)

Extension States

Os estados de extensão são outro conceito importante no Asterisk® SCF™. Os estados de extensão (Extension States) são o que os dispositivos (Endpoints/Devices) SIP assinam para obter informações de presença (a presença SIP é discutida em mais detalhes em um post futuro chamado Presença SIP). O estado de uma extensão é determinado verificando o estado de um ou mais dispositivos. A lista de dispositivos que mapeiam para estados de extensão é definida no Dialplan do Asterisk® SCF™, /etc/asterisk/extensions.conf (ou extensions.lua em LUA, ou ainda extensions.ael em AEL), usando uma diretiva de HINT especial. A próxima figura, é sobre o Mapeamentos de Estados de Extensão, que mostra o mapeamento entre dispositivos, estados de dispositivos (Extension States), e estados de extensão (Device States), além é claro dos próprios Devices..
 

Hints

Para definir um HINTs de estado de extensão no Dialplan do Asterisk® SCF™, o HINT é utilizado como uma palavra chave (keyword), no lugar da prioridade. Aqui está um exemplo simples do Dialplan relacionado à figura acima mostrada, sobre Mapeamentos de Estado de Extensão.

[default]
exten => 1234,hint,SIP/phoneA&SIP/phoneB&SIP/phoneC
exten => 5555,hint,DAHDI/1
exten => 31337,hint,MeetMe:31337

Normalmente, os HINTs são simplesmente definidas junto com o restante da extensão. Este próximo exemplo adiciona entradas de extensão simples para o que aconteceria se cada uma dessas extensões fosse chamada:

[default]
exten => 1234,hint,SIP/phoneA&SIP/phoneB&SIP/phoneC
exten => 1234,1,Dial(SIP/phoneA&SIP/phoneB&SIP/phoneC)

exten => 5555,hint,DAHDI/1
exten => 5555,1,Dial(DAHDI/1)

exten => 31337,hint,MeetMe:31337
exten => 31337,1,MeetMe(31337,dM)

Em nosso exemplo, fizemos uma correlação direta entre o número do ramal do HINT e o número do ramal que está sendo destinado a chamada, embora não seja necessário que esse seja o caso.

Verificando Extension States

A maneira mais fácil de verificar o estado atual em uma extensão é na *CLI> do Asterisk® SCF™. O comando core show hints mostrará todos os HINTs atualmente configurado. Considere a seguinte definição de HINT.

[phones]
exten => 7001,hint,SIP/0004F2060EB4

Quando o core show hints é executado no *CLI> do Asterisk® SCF™, a seguinte saída é apresentada quando o dispositivo (Device/Endpoint) está em uso:

*CLI> core show hints
    -= Registered Asterisk Dial Plan Hints =-
           7001@phones   : SIP/0004F2060EB4    State:InUse    Watchers  0
----------------
- 1 hints registered


Além de mostrar o estado da extensão, a saída do core show hints, também fornece uma contagem de observadores. Um observador é algo no  Asterisk® SCF™ que se inscreveu para receber atualizações sobre o estado desta extensão. Se um telefone SIP assinar o estado de um ramal, a contagem de observadores será aumentada.

O estado da extensão também pode ser recuperada com uma função do Dialplan, EXTENSION_STATE( ). Essa função opera de maneira semelhante à função DEVICE_STATE( ), iremos também em um post futuro descrever sobre essa função. O exemplo a seguir mostra uma extensão que imprimirá o estado atual de outra extensão no *CLI> do Asterisk® SCF™:

exten => 7013,1,Answer()
 same => n,Verbose(3,The state of 7001@phones is ${EXTENSION_STATE(7001@phones)})
 same => n,Hangup()


Quando esta extensão é chamada, esta é a mensagem detalhada que aparece no *CLI> do Asterisk® SCF™:

 -- The state of 7001@phones is INUSE

A lista a seguir inclui os valores possíveis que podem ser retornados da função EXTENSION_STATE( ):
  • UNKNOWN;
  • NOT_INUSE;
  • INUSE;
  • BUSY;
  • UNAVAILABLE;
  • RINGING;
  • RINGINUSE;
  • HOLDINUSE;
  • ONHOLD. 

Device States

Existem dois tipos de dispositivo aos quais os estados do dispositivo se referem: dispositivos reais e dispositivos virtuais. Dispositivos reais são terminais de telefonia que podem fazer ou receber chamadas, como Telefones SIP. Dispositivos virtuais incluem coisas que estão dentro do Asterisk® SCF™, mas fornecem informações úteis de estado. A tabela a seguir, Dispositivos virtuais no Asterisk lista os dispositivos virtuais disponíveis no Asterisk.
 
 
Virtual deviceDescription
MeetMe:<conference bridge>O estado de uma ponte de conferência MeetMe( ). O estado refletirá se a ponte de conferência tem ou não participantes chamados no momento. Mais informações sobre o uso de MeetMe( ) para chamadas de conferência podem ser encontradas na seção chamada “Conferencing with MeetMe( )”.
SLA:<shared line>Informações de estado de Aparência de LInha compartilhada. Este estado é manipulado pelos aplicativos SLATrunk( ) e SLAStation( ). Mais detalhes podem ser encontrados na seção chamada “Shared Line Appearances”.
Custom:<custom name>Estados de dispositivos personalizados. Esses estados têm nomes persolaizados e são modificados usando a função DEVICE_STATE( ). O uso de exemplo pode ser encontrado na seção chamada “Using Custom Device States”.
Park:<exten@context>O estado de uma vaga em um estacionamento de chamadas. As informações de estado refletirão se um chamador está ou não estacionado naquele ramal. Mas informações sobre estacionamento de chamdas no Asterisk® SCF™ podem ser encontradas na seção chamada “Parking Lots”.
Calendar:<calendar name>Estado do calendário. O Asterisk® SCF™ usará o conteúdo do calendário nomeado para definir o estado como disponível (available) ou ocupado (busy). Mais informações sobre integração de calendário no Asterisk podem ser encontradas no capítulo 18 do Livro Asterisk The definitive Guide 3ª Edição, chamada de External Services.


Um estado de dispositivo é um mapeamento simples de um para um para um dispositivo. A figura a seguir, mostra esse maepamento de estado do dispositivo:

 

Verificando os estados do dispositivo

A função do Dialplan DEVICE_STATE( ) pode ser usada para ler o estado atual de um dispositivo. Aqui está um exemplo bem simples de uno no Dialplan:
  
exten => 7012,1,Answer()

; *** This line should not have any line breaks
    same => n,Verbose(3,The state of SIP/0004F2060EB4 is
${DEVICE_STATE(SIP/0004F2060EB4)})
    same => n,Hangup()
 
Se chamarmos o ramal 7012 do mesmo dispositivo do qual estamos verificando o estado, a seguinte mensagem detalhada aparecerá no console do Asterisk® SCF™:
 
-- The state of SIP/0004F2060EB4 is INUSE
 
É importante resaltar que no livro acima citado, no capítulo 20, Asterisk Manager Interface (AMI). A ação do gerenciador GetVar pode ser usada para recuperar valores de estado do dispositivo em um programa externo. Você pode usá-lo para obter o valor de uma variável normal ou de uma função do Dialplan, como o DEVICE_STATE( ).
 
A lista a seguir inclui os valores prossíveis que retornarão da função DEVICE_STATE( ):
  • UNKNOWN
  • NOT_INUSE
  • INUSE
  • BUSY
  • INVALID
  • UNAVAILBLE
  • RINGING
  • RINGINUSE
  • ONHOLD
 

Conclusão

Então após está explicação, eu estava trabalhando em um método para deixar o HINTs/BLF em ARA (Asterisk Realtime Architecture), após alguns dias de pesquisa intensa, encontrei uma solução parcial para o meu desafio, aqui vai algumas dicas, na expectativa de mais alguém ter está necessidade e quem sabe vir a ajudar a melhorar esta funcionalidade ou recurso. 

Mudanças necessárias para o sip.conf: 
  • notifyringing deve ser definido como "yes"; 
  • tanto rtcachefriends e rtupdate definido como "yes"; 
  • limitonpeers deve ser definido como "yes". 
Alterações na tabela SIP TABLE, inserir as seguintes colunas: 
  • "call-limit" do tipo "int";
  • "subscribecontext" do tipo "varchar(80)"
o "subscribecontext" tem de ter o mesmo nome do contexto em que o comandos estão, eu uso "[blf_pbx]". A minha necessidade é de fazer uma "Terminal Inteligente" Virtual.  

Eu já disponibilizei aqui uma maneira de fazer o HINT/BLF funcionar em um aparelho da Khomp o "IPS 212". Claro que esta solução é toda desenvolvida no "extensions.conf" ou no "extensions.ael" de maneira manual ou seja para cada extensão telefônica adicionada no seu PBX IP você tem obrigatoriamente que incluir no "subscribecontext".  Mas se você (como eu) estiver usando "ARA" (Asterisk Realtime Architecture) isto acaba sendo uma inconveniente. 

Este ponto de vista de fazer o HINTs/BFL dinâmico é na verdade um Shell Script que fica sendo executado no CRON. Caso você venha a alterar o Shell Script de maneira que fique melhor agradeceria em compartilhar aqui no post. 

Caso queira mudar o nome do contexto, pode fazê-lo no Shell Script na linha que escrevemos o "switch => realtime/@".  

Em seguida ele escrevera o necessário nos arquivos extensions.conf ou extensios.ael, ou seja, de maneira dinâmica. 
"exten => ,hint,SIP/".


appenddynamic()
{
  mysql -u dbusername -pdbpassword -h dbhostname dbname -se "select distinct(context) from extensions" | grep -v '^context$' | while read context; do
    echo "[$context]" >> $ASTCONF
    echo "switch => Realtime/@" >> $ASTCONF
    if [ $context = "target_context" ]
    then
        echo "exten => 100,hint,SIP/100"
        echo "exten => 101,hint,SIP/101"
    fi
    echo "" >> $ASTCONF
  done
}

Eu realmente espero que faça algum sentido para alguém.

Ishfaq Malik
Software Developer
PackNet Ltd

Fonte: Lista de Discussão Asterisk Developer.

Nenhum comentário

Toda vez que um homem supera os reveses, torna-se mentalmente e espiritualmente mais forte!

Tecnologia do Blogger.