sábado, 5 de janeiro de 2013

CCSS (Call Completion Supplementary Services) no Asterisk


O cenário: você liga para um ramal pois precisa falar com o usuário para resolver um problema urgente mas o ramal está ocupado. Você desliga a chamada e de tempos em tempos tenta ligar novamente mas sempre recebe o sinal de ocupado. 

O que fazer? Você pode procurar o usuário para falar pessoalmente com ele. Você também pode desistir de falar com o usuário e tentar resolver o problema por conta própria. Ou então você pode ativar o recurso de Call Completion em seu ramal e esperar que o Asterisk ligue para você quando o ramal do usuário estiver livre.

O CCSS, que está disponível a partir da versão 1.8 do Asterisk, permite que um ramal seja monitorado sob demanda, alertando o usuário e efetuando automaticamente a chamada quando o mesmo ficar disponível. O recurso pode ser utilizado tanto para chamadas não atendidas (CCNR) quando para chamadas ocupadas (CCBS), de forma similar para o usuário.

E como eu implemento o CCSS no Asterisk?

O CCSS é uma feature padrão do Asterisk e para torná-la ativa basta adicionar os seguintes parâmetros a configuração SIP de seus ramais:
cc_agent_policy=generic
cc_monitor_policy=generic
Caso você use SIP realtime, basta adicionar os devidos campos na tabela SIP do banco.

O cc_agent_policy é utilizado pelo usuário que está discando, enquanto o cc_monitor_policy é utilizado pelo usuário a qual está sendo destinada a chamada. Eu prefiro ativar o recurso para todos os ramais, então todos possuem a mesma configuração.

O tipo de agente e de monitor utilizado por mim foi o generic, que atende bem a demanda, mas possui algumas limitações. A principal delas é que o usuário só consegue realizar uma monitoração por vez, ou seja, ele precisa ativar e desativar o recurso para que possa utilizá-lo novamente. 

Outros tipos estão disponíveis e você pode saber mais sobre os mesmos no arquivo /etc/asterisk/ccss.conf, onde você também pode ajustar outras configurações do serviço. A versão 10.X do Asterisk implementa um controle de Device State com o agente genérico que melhora muito a sua funcionalidade.

Uma recomendação para melhorar o funcionamento do sistema é setar a opção callcounter=yes na configuração de seu peer sip e também a opção limitonpeers=yes na seção general do arquivo sip.conf. Apesar de recomendado, efetuei testes sem estas opções (com telefones Polycom) e não encontrei problemas, mas pode ser que outros clientes SIP não se comportem tão bem.

E na prática como funciona?

Na prática funciona da seguinte maneira:

Imaginemos que você queria ligar para o ramal 1200. Você liga para o ramal e ele está ocupado ou não atende a ligação. 

Você desliga a chamada (ou ela é desligada) e você tem até 20 segundos (tempo padrão que pode ser alterado) para solicitar a ativação do serviço de CC. No meu caso basta discar para o *22 que o serviço estará ativo.

Se o ramal estava ocupado, assim que ele desligar o Asterisk irá efetuar uma ligação para o seu ramal. Assim que você atender ele discará automaticamente para o ramal 1200.

Se a ligação não havia sido atendida, o Asterisk entenderá que o usuário não está em sua mesa. Assim, depois que ele fizer uma nova chamada, o Asterisk perceberá que ele está no local e,  assim que ele desligar, realizará uma ligação para o seu ramal e assim que você atender ele discará para o ramal 1200.

Após você falar com o ramal 1200, no entanto, é preciso que você desative o serviço (no meu caso discando para *220), para que possa utilizá-lo novamente (devido ao uso do generic).

Por fim, sugiro que a página de dicas sobre o serviço seja lida, pois ali constam informações e recomendações muito relevantes que devem ser seguidas.

Exemplo do plano de discagem

Segue abaixo um plano de discagem bem simples para ativar e desativar o recurso:
[internal_services]
exten => *22,1,CallCompletionRequest
exten => *22,n,Hangup
exten => *220,1,CallCompletionCancel
exten => *220,n,Hangup

sexta-feira, 4 de janeiro de 2013

Utilizando XMPP para interagir com Asterisk


Na Propus fazemos uso diário da integração de nosso servidor XMPP com o Asterisk

Envio e recebimento de SMS, identificação de chamadas e integração com Google Talk são alguns dos recursos que desenvolvemos e testamos em nosso laboratório. Sempre que posso procuro pesquisar e desenvolver novas ideias para expandir esta integração, pois XMPP e VoIP (em especial Openfire e Asterisk) são duas tecnologias com as quais gosto muito de trabalhar.


Como faço uso destas tecnologias diariamente, nada mais natural do que pensar em utilizar o XMPP para realizar tarefas cotidianas no Asterisk ou até mesmo obter informações do sistema e de seus recursos.

Resolvi então pesquisar mais sobre esta interação e encontrei um blog muito interessante que acabou por me levar a um bot xmpp integrado com Asterisk que vai ao encontro de minhas ideias.

O bot, desenvolvido em perl, faz uso da AMI e da biblioteca Asterisk::AMI para monitorar os eventos do manager do Asterisk e interagir com o sistema. 

Baixei o script e após testá-lo acabei modificando-o e adaptando-o para atender as minhas necessidades, mas "minha" versão ainda está engatinhando, pois ainda existem muitos recursos que podem ser disponibilizados (e alguns mais que estão em construção).

Comando de ajuda implementado pelo script
Compartilho aqui a minha versão do script para que outros possam utilizá-lo e até mesmo estendê-lo e melhorá-lo.

Espero que o mesmo seja útil e que novas versões sejam também compartilhadas nos comentários deste post.

Até mais!

Asterisk e Google Text to Speech

No uso diário do Asterisk, periodicamente me deparo com a necessidade de gerar arquivos de áudio para tocar mensagens informativas básicas para o usuário.

Obter tais arquivos é uma tarefa eventualmente árdua que normalmente envolve a gravação in house dos arquivos (que consome um tempo razoável) ou a contratação de uma empresa especializada. Existem várias empresas excelentes neste nicho de mercado, mas às vezes não existe orçamento ou até mesmo tempo para produzir áudios mais básicos, para consumo interno.

Como alternativa para a criação de tais áudios, encontrei na lista AsteriskBrasil a sugestão do AGI GoogleTTS.

Este AGI utiliza o Google Text to Speech para gerar um arquivo de áudio on demand na linguagem que você indicar, e que, após sua geração, é automaticamente tocado pra o usuário. Como utiliza o Google Text to Speech, este AGI necessita de uma conexão ativa de Internet, mas, como todo software bem planejado, ele  possui um sistema de cache que garante que a mesma mensagem de áudio não precise ser gerada mais de uma vez, o que possibilita que os arquivos de áudio possam ser utilizados mesmo que o link Internet esteja indisponível, contanto que o mesmo já tenha sido gerado anteriormente.

Instalando o googletts.agi

O AGI, que é escrito em perl, depende de algumas bibliotecas e softwares bastante populares, que podem ser facilmente instalados no Ubuntu 12.04 com o comando apt-get install libwww-perl mpg123 sox.

Após fazer o download do arquivo .tar.gz, descompacte-o e coloque o arquivo googletts.agi no diretório /var/lib/asterisk/agi-bin/  para que o Asterisk possa acessá-lo. Não esqueça de verificar as permissões de acesso do arquivo.

Aconselho que antes de iniciar o uso, o arquivo googletts.agi seja editado para definir algumas paramêtros, como a linguagem padrão e o diretório para armazenamento do cache (o diretório padrão, /tmp, certamente não é a melhor escolha para armazenar tais dados).

Utilizando o googletts.agi

Abaixo um pequeno exemplo de utilização da ferramenta para informar de maneira audível ao usuário qual seu ramal e nome de usuário:

[internal_services] 
exten => *65,1,NoOp(Who Am I)
same => n,Answer
same => n,agi(googletts.agi,"Meu ramal é ${CALLERID(num)} e meu usuário é ${CALLERID(name)}",pt-BR)
same => n,Hangup

Use sua criatividade e boa diversão!