Mostrando postagens com marcador asterisk. Mostrar todas as postagens
Mostrando postagens com marcador asterisk. Mostrar todas as postagens

quarta-feira, 22 de janeiro de 2014

Limitação do número de ligações simultâneas via IAX


Uma situação bastante comum quando você precisa interligar duas (ou mais) filiais via IAX para que os usuários de ambos locais possam falar sem custo entre si, é a existência de uma banda limitada para o uso de voz.

Quando temos este cenário, normalmente surge um problema: como podemos garantir que não teremos mais ligações simultâneas do que permite a "banda reservada" para este recurso.

Com esta demanda nas mãos, criei um plano de discagem que permite limitar o número de ligações simultâneas quando for utilizado IAX2 (ou, com pequenas adaptações, qualquer outro tipo de canal, como, por exemplo, SIP).

Para efeito de demonstração, vamos supor que você utilize um codec que consuma 64Kbps para cada ligação (G.711 a-law). Vamos supor também que você tenha 256Kbps disponível para voz, podendo realizar então até quatro ligações simultâneas sem perda na qualidade (cortes, "voz robótica", etc...).

A configuração necessária para tal controle é feita no extensions.conf, em três contextos diferentes (não esqueça de adaptar o exemplo à sua realidade):

  • o contexto [globals] é padrão do Asterisk e nele você pode declarar variáveis para uso no plano de discagem;
  • o contexto [from-iax] é o contexto que controlará as chamadas recebidas via IAX;
  • o contexto [saidaexterna] é o contexto de saída das chamadas (exceto chamadas entre ramais locais);

Contexto globals

No contexto [globals] você irá declarar a variável que controla o número máximo de chamadas permitidas, da seguinte forma:
; Controle de chamadas
; 256Kbps  = 4 chamadas a-law de 64Kbps cada
CALL_LIMIT_IAX=4 

Contexto from-iax

No contexto [from-iax]  você irá controlar as chamadas entrantes via IAX, da seguinte forma:
exten => _XXXX.,1,NoOp(Chamada via IAX)
same => n,NoOP(Chamada de origem ${CALLERID(num)} discando para ${EXTEN})
; Adiciona chamada no grupo do IAX2
same => n,NoOP(Adicionando chamada entrante ao grupo IAX2)
same => n,Set(GROUP()="IAX2")
; verifica o número de chamadas simultâneas no grupo
same => n,Set(SIMULTCALL=${GROUP_COUNT("IAX2")})
same => n,NoOp(Ligacoes em curso IAX2: ${SIMULTCALL} de ${CALL_LIMIT_IAX})
; verifica se a chamada pode ser realizada
same => n,GotoIf($[0${SIMULTCALL} <= 0${CALL_LIMIT_IAX}]?call:nocall)
; seção utilizada quando a chamada não pode ser realizada
same => n(nocall),NoOp(Limite de chamadas IAX2 excedido - chamada entrante recusada)
same => n,Playback(canais_iax_ocupados)
same => n,Hangup()
; seção utilizada para realização da chamada para ramais (sip)
same => n(call),Goto(sip,${EXTEN},1)
same => n,Hangup()

Contexto saidaexterna

No contexto [saidaexterna] você irá controlar as chamadas saintes via IAX e outras tecnologias como DAHDI, Khomp ou DGV, da seguinte forma:
exten => _X.,1,Progress
; AGI para obter a variável de discagem ${DIAL} com base no destino da ligação
;
; As saídas possíveis são, por exemplo:
; Khomp/Gebt/${EXTEN}
; Khomp/Ggsm/${EXTEN}
; DGV/g1/${EXTEN}
; IAX2/SPO/${EXTEN}
; SIP/vono/${EXTEN}
;
; Não vou postar o AGI porque ele é muito específico para a solução
; mas você pode gerar o seu próprio AGI com base na sua estrutura
;
same => n,AGI(dialout.agi)
; Obtém o tipo de canal de saída
same => n,Set(OUTCHAN=${DIAL:0:4})
; Verifica se o canal é IAX2. Se não for IAX2 vai diretamente para a discagem
same => n,GotoIf($["${OUTCHAN}"="IAX2"]?iax:call)
; Adiciona chamada no grupo IAX2
same => n(iax),NoOP(Adicionando chamada sainte ao grupo IAX2)
same => n,Set(GROUP()="IAX2")
; verifica o número de chamadas simultâneas IAX2
same => n,Set(SIMULTCALL=${GROUP_COUNT("IAX2")})
same => n,NoOp(Ligacoes em curso IAX2: ${SIMULTCALL} de ${CALL_LIMIT_IAX})
; verifica se a chamada pode ser realizada
same => n,GotoIf($[0${SIMULTCALL} <= 0${CALL_LIMIT_IAX}]?call:nocall)
; seção usada quando a chamada não pode ser realizada
same => n(nocall),NoOp(Limite de chamadas IAX2 excedido - chamada sainte recusada)
same => n,Playback(canais_iax_ocupados)
same => n,Hangup()
; disca
same => n(call),Dial(${DIAL},60,TWXr)
same => n,Hangup()

ATENÇÃO: É importante que este plano de discagem seja implementado em ambos servidores para que possamos garantir que não sejam recebidas e nem realizadas mais ligações do que o valor limite.

Agora é com você. Adapte e estenda este plano de discagem e se quiser compartilhar suas melhorias, fique à vontade para postá-las nos comentários.


Até a próxima.




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!

sábado, 1 de dezembro de 2012

Ainda sobre o VOX IP da GVT

Após realizar uma nova configuração do GVT VOX IP com Asterisk, eis que percebi que faltaram algumas informações relevantes no post anterior

Como a GVT continua não provendo uma documentação mínima do serviço (confesso que não foi solicitado diretamente, mas, na minha opinião, na instalação do serviço deveria ser entregue ao cliente pelo menos um documento com os dados completos da rede e informações relevantes de configuração), novamente foi preciso utilizar a experiência adquirida para resolver algumas questões. 

Sonho com o dia em que a GVT dará um status mais profissional ao VOX IP, pois parece ainda tratar-se de um serviço "alternativo" ou em fase de testes, o que não é verdade, pois o serviço é bem estável e funcional. Além disso, eu acredito que esse tipo de entroncamento (SIP) será o substituto natural do link E1, apesar das operadoras não quererem aceitar esta realidade.

Pois bem, este post é complementar ao primeiro, e possui algumas informações que serão bastantes úteis na configuração do serviço.

Codecs

A dica inicial é: atenção aos codecs. A GVT instala um link de 1Mbps para  prover 30 canais, e, se não for utilizado o codec adequado, o número de canais pode cair pela metade.

Apesar do VOX IP aceitar o uso do codec g711 alaw (segundo a informação este deve ser o codec secundário na configuração do peer SIP), o mesmo utiliza 64 Kbps de banda, fazendo com que só possam ser utilizados 15 canais simultâneos na banda disponível.

Por isso a GVT recomenda a utilização do codec g729, que utiliza uma banda muito menor possibilitando o uso dos 30 canais simultaneamente. No entanto é importante esclarecer que o Asterisk não disponibiliza o codec. Para instalá-lo é preciso adquirir as licenças da Digium, ao custo de USD 10,00 cada.

Fax

Para uso do Fax, o VOX IP dispõe do T.38, que é o protocolo para transmissão de fax sobre redes IP. O Asterisk já provê suporte a este protocolo, mas também é possível enviar fax utilizando-se o codec g711, com softwares como iaxmodem e hylafax (No caso de uso do T.38, a alternativa para o iaxmodem  é o t38modem).

Também é possível utilizar o Fax for Asterisk, da Digium, mas cada licença para uso de fax (simultâneo) tem o custo de USD 40. 

Uma outra alternativa seria o uso do Free Fax for Asterisk, que disponibiliza uma única licença sem custos, e que pode ser usado em ambientes onde o Fax é utilizado de maneira esporádica.

Identificação de entrada

Um fato que merece ser citado é que o VOX IP não entrega somente o MCDU, mas sim o número completo de destino (DDD + número). 

Assim, se você está migrando de um link E1, ou está acostumado a instalações com links E1, adapte seu plano de discagem para este novo formato.

Roteamento da rede do VOX IP

A abordagem adotada no roteamento da rede do VOX IP tem sido meio radical, mas como não há informação completa da GVT, a mesma tem proporcionado o funcionamento adequado do serviço.

Vou exemplificar:

  • Rede entregue pela GVT para enlace: 10.153.X.Y/29
  • IP de registro do servidor: 10.150.X.Y

Como não havia informações sobre a rede a ser roteada, foi realizado o roteamento da rede 10.150.X.0/24. 

Com este roteamento, apesar do SIP ficar registrado e a chamada ser completada, a ligação ficava muda em ambas pontas. Após uma investigação com o tcpdump, pode-se observar que haviam pacotes vindos da rede 10.152.X.Y, que não estava roteada, o que causava o problema.

Como não havia conflito na rede em questão, foi realizado então o roteamento da rede 10.128.0.0/9, o que certamente não é a melhor prática, mas que permitiu que o serviço funcionasse corretamente.

Caso alguém possua informações corretas sobre a rede a ser roteada, por favor poste nos comentários.

Host não identificado

E, para finalizar, se você se deparar com um erro semelhante no console do Asterisk, pode ficar tranquilo:
[Dec  1 08:37:42] ERROR[11427]: netsock2.c:269 ast_sockaddr_resolve: getaddrinfo("PAE1CS2K", "5060", ...): Name or service not known
[Dec  1 08:37:42] WARNING[11427]: chan_sip.c:16078 check_via: Could not resolve socket address for 'PAE1CS2K:5060'
O host em questão é o servidor SIP onde você está registrado. 

Para que tal erro não ocorra mais, adicione a seguinte linha no seu arquivo /etc/hosts:


10.150.X.Y   PAE1CS2K

De momento é isso, mas assim que houverem novas informações, possivelmente será feito um update no post.

UPDATE 12/12/2012: é muito importante que seja sempre utilizado o Progress ao receber ou realizar uma chamada externa, caso contrário as ligações podem ser derrubadas pela operadora durante seu curso.

UPDATE 27/12/2012: muita gente relatou ter dificuldades para identificar suas chamadas com o número dos ramais ao invés do número chave do tronco (eu mesmo me deparei com tal situação). Isso ocorre porque a GVT utiliza os headers From e Contact do pacote SIP para fazer a identificação, ao invés de somente o ${CALLERID(num)} provido pelo Asterisk. Para que você possa se identificar com o número do DDR, sete o ${CALLERID(num)} e não utilize o parâmetro fromuser na sua configuração SIP do VoxIP.

Leia também:


quarta-feira, 29 de junho de 2011

Fim dos releases de manutenção do Asterisk 1.4 e 1.6.2


Foram lançados hoje os últimos releases de manutenção das versões 1.4 e 1.6.2 do Asterisk.

As versões 1.4.42 e 1.6.2.19 trazem a correção de várias questões reportadas pela comunidade e sua instalação é recomendada.

Apesar de ser o release final de manutenção o suporte a atualizações de segurança será mantido para ambas versões até o dia 21 de abril de 2012, como é possível ver no calendário de versões.

segunda-feira, 27 de junho de 2011

Enviando SMS interativamente (Asterisk + XMPP + Digivoice ou Khomp)


Ainda falando sobre Asterisk e XMPP e seus usos (veja mais neste post) uma ideia que tive no final de semana e coloquei hoje em testes foi o envio interativo de SMS utilizando para isso um Asterisk integrado com XMPP (e uma placa Digivoice GSM ou uma placa/EBS Khomp GSM).

Objetivo

Enviar SMS de forma interativa utilizando um servidor Asterisk conectado a um servidor XMPP.

Requisitos

Servidor Asterisk integrado com um servidor XMPP (Openfire, ejabberd, Prosody, etc...) e com o Google Talk. Saiba como realizar esta integração aqui.

O procedimento

Novamente o contexto proposto é muito simples e atende somente um ramal (já que envia a mensagem para um usuário específico) ficando aberto para melhorias via  AEL ou AGI de forma a estender o recurso para todos usuários de seu domínio XMPP e todos seus ramais.

O contexto funciona da seguinte maneira: o usuário disca para o número *767* (*SMS*) e recebe uma mensagem em seu cliente XMPP solicitando o destino do SMS. Após informar o número o usuário recebe uma nova mensagem solicitando que seja informado o conteúdo do SMS. Assim que informar o conteúdo o Asterisk envia o SMS para o destino.
[sendsms]

exten => *767*,1,Answer() ;Atende a chamada
same => n,Set(CANAL=${CUT(CHANNEL,,1)}) ;Armazena o canal
same => n,NoOp(Envio de SMS de ${CANAL}) ;Mensagem do Asterisk
same => n,NoOp(Mandando mensagem para ${JABBERDEST}@jabberpriv.propus.com.br) ;Mensagem do Asterisk
same => n,JabberSend(propuspriv,${JABBERDEST}@jabberpriv.propus.com.br,Envio de SMS - Informe a número de destino) ;Solicita o número do destinatário do SMS
same => n,Set(OPCAODEST=${JABBER_RECEIVE(propuspriv,${JABBERDEST}@jabberpriv.propus.com.br,30)}) ;Recebe o número do destinatário do SMS
same => n,JabberSend(propuspriv,${JABBERDEST}@jabberpriv.propus.com.br,Envio de SMS - Digite a mensagem) ;Solicita o conteúdo do SMS
same => n,Set(OPCAOMSG=${JABBER_RECEIVE(propuspriv,${JABBERDEST}@jabberpriv.propus.com.br,30)}) ;Recebe o conteúdo do SMS
same => n,JabberSend(propuspriv,${JABBERDEST}@jabberpriv.propus.com.br,Enviando a mensagem "${OPCAOMSG}" para ${OPCAODEST}) ;Mensagem para o usuário
same => n,DgSendSMS(g1,${OPCAODEST},${OPCAOMSG}) ;Envia o SMS (g1 = grupo de canais GSM)
same => n,HangUp
Finalizando

Novamente um recurso muito útil e facilmente implementável. E como no post anterior, melhorias no contexto são muito bem vindas. Fique à vontade para contribuir !!!

;-)

UPDATE 28/12/12: para enviar o SMS usando uma placa/EBS da Khomp altere a seguinte linha:

same => n,DgSendSMS(g1,${OPCAODEST},${OPCAOMSG}) ;Envia o SMS (g1 = grupo de canais GSM)

para:

same => n,KSendSMS(recurso,${OPCAODEST},${OPCAOMSG}) ;Envia o SMS

onde recurso pode ser tanto a placa (b0, b1) com um canal específico (b0c2, por exemplo).

sábado, 25 de junho de 2011

Discando interativamente para contas Google Talk (Asterisk + XMPP)


Objetivo

Possibilitar a realização de chamadas de voz para contas Google Talk de forma interativa utilizando um servidor Asterisk conectado a um servidor XMPP.

Requisitos

Servidor Asterisk integrado com um servidor XMPP (Openfire, ejabberd, Prosody, etc...) e com o Google Talk. Saiba como realizar esta integração aqui.

O procedimento

O contexto aqui proposto é bastante simples e atende somente um ramal (já que envia a mensagem para um usuário específico). Você pode aprimorá-lo utilizando AEL ou AGI possibilitando assim estender o recurso para todos usuários de seu domínio XMPP.

O contexto funciona da seguinte maneira: o usuário disca para o número *48255* (*GTALK*) e recebe uma mensagem em seu cliente XMPP solicitando o destino da chamada. Após informar o endereço Google Talk do destinatário o Asterisk realiza a "discagem" e o usuário de imediato já passa a escutar o tom de chamada, como em qualquer outra ligação realizada.

O contexto:
[togtalk]
exten => *48255*,1,Answer() ; atende a chamada
same => n,Set(CANAL=${CUT(CHANNEL,,1)}) ; Armazena o canal que efetuou a chamada
same => n,NoOp(Discando Gtalk de ${CANAL}) ; Mensagens no asterisk
same => n,NoOp(Mandando mensagem para marcelo@xmpp.dominio.com.br) ; Mensagens no Asterisk
same => n,JabberSend(xmpp,marcelo@xmpp.dominio.com.br,Discando Google Talk - Informe a conta de destino) ; Envia msg para o usuário solicitando o endereço GTalk do destinatário
same => n,Set(OPCAO=${JABBER_RECEIVE(xmpp,marcelo@xmpp.dominio.com.br,30)}) ; Aguarda 30 segundos pela resposta do usuário
same => n,JabberSend(xmpp,marcelo@xmpp.dominio.com.br,Discando para ${OPCAO}) ; Envia msg para o usuário informando para onde irá discar
same => n,Dial(gtalk/asterisk-gtalk/${OPCAO}) ; Realiza a chamada
same => n,HangUp
Finalizando

Como podemos observar trata-se de um recurso muito útil e de fácil implementação. 

Caso você desenvolva um contexto mais elaborado não deixe de compartilhá-lo através dos comentários.

:-)

UPDATE 30/05/2012

Segue exemplo de configuração do jabber.conf:

[asterisk-gtalk]
type=client
serverhost=talk.google.com
username=myuser@gmail.com/Talk
secret=mysecret
port=5222
usetls=yes
usesasl=yes
statusmessage="Asterisk Server"
timeout=100

domingo, 12 de junho de 2011

Problemas com Iaxmodem e Khomp

Ainda falando de Asterisk e serviço de "fax virtual", outro problema que enfrentei recentemente foi relacionado ao software iaxmodem.

Após configurar o serviço corretamente pude observar o seguinte: a ligação era recebida, o iaxmodem atendia a mesma, disponibilizava o "sinal de fax", mas o fax não conseguia ser entregue. Até pensei em configurar o Free Fax for Asterisk para o recebimento (já que o envio não apresentava problemas), mas como o mesmo era limitado em apenas um canal simultâneo (é possível adquirir licenças adicionais, é claro) acabei desistindo da ideia.

Foi então que o Marlon Dutra me lembrou de um detalhe: esse era um problema já conhecido no uso do iaxmodem com as placas da Khomp. Para solucionar tal problema a própria Khomp havia disponibilizado um patch para o software.

Apliquei tal patch e o serviço ficou perfeito. Mas, como a Khomp removeu o patch da sua área de downloads, resolvi disponibilizar os fontes do iaxmodem 1.2.0 já devidamente patcheados aqui.

Problemas com Hylafax no Ubuntu 10.04

Deparei-me dia desses com um problema que me deu muita dor de cabeça e que acabou tomando muito do meu tempo com pesquisas e testes até conseguir solucioná-lo.

A tarefa era simples: precisava instalar um Hylafax em um servidor Ubuntu 10.04 para juntamente com o Iaxmodem e o Asterisk disponibilizar um serviço de "fax virtual" para um cliente.

Após a instalação e configuração dos pacotes os problemas começaram: apesar dos faxes serem recebidos com sucesso, "aparentemente" todos apresentavam problemas de conexão e o arquivo não continha muito mais do que a folha de rosto e algumas linhas da página enviada.

Após vários testes e brainstorms, acabei percebendo que a versão do Hylafax que vem com o Ubuntu 10.04 (Hylafax 6.0.3) estava bugada, motivo pelo qual estava tendo tantos problemas.

Fax recebido com o Hylafax 6.0.3 (pacote do Ubuntu 10.04)

Resolvi então testar uma versão mais atual do software e percebi que a versão 6.0.5 disponibilizada pelo Ubuntu 11.04 tinha as mesmas dependências da versão anterior.

Baixei os arquivos .deb da nova versão e instalei-os manualmente. Voilá, o serviço de fax ficou perfeito.

Fax recebido com o Hylafax 6.0.5 (pacote do Ubuntu 11.04)

Ainda não reportei o bug mas pretendo fazê-lo nos próximos dias. Assim, enquanto não sai a correção oficial, espero que este post possa ajudar outras pessoas que estejam passando pelo mesmo problema que tive.

quarta-feira, 23 de fevereiro de 2011

GVT VOX IP com Asterisk (dicas)

Configurar o GVT VOX IP no Asterisk é tão simples quanto adicionar um novo peer SIP no seu servidor. Mas apesar de toda simplicidade seguem algumas dicas que podem ser muito úteis para que o serviço funcione de forma adequada.

Problema 1: ligações eventualmente são encerradas de forma abrupta

Para resolver essa questão, segundo a equipe técnica da GVT, "era preciso que o Asterisk, após o Trying, respondesse 180 Ringing ou 183 Session Progress. Sem isso a central não repassava a informação as operadoras que originaram a chamada temporizando assim a ligação."

Para ativar tais sinalizações abra o arquivo sip.conf e adicione/ajuste os seguintes parâmetros:
progressinband=yes
prematuremedia=no

Desde que tais parâmetros foram setados não houve mais ocorrências do problema, o que é um bom sinal. Como isso ocorria de forma aleatória, se o problema persistir eu atualizarei esse post com a informação.

Problema 2: chamadas que ficam mudas ao serem atendidas

Uma situação muito estranha do GVT VOX IP é que algumas ligações geradas fazem com que o usuário seja "direcionado" para o Music on hold (mesmo com a opção de forçar o ring ativada - parâmetro r do comando Dial) o que faz com que o mesmo acredite ter discado para seu próprio PBXIP. Tais ligações quando atendidas ficam mudas.

A solução desse problema foi dada pelo Anderson Eckhardt na lista AsteriskBrasil.

Segue a explicação do Anderson sobre o problema:
"Sobre a música em espera, também estou passando por isso com diversas versões do Asterisk(1.4/1.6/1.8), até o momento não tenho solução, e forçar o ring me agrada! No entanto observei que este fato ocorre somente com números portados. Se analisar os pacotes nestas chamadas, com alguma ferramenta de rede wireshark/tcpdump, vai notar o erro nas informações/portas SDP(parâmetro acima), e também podemos ver q existe um outro tipo de consulta/tráfego para estes casos, sendo neste momento que a chamada entra em espera, e por isso a música..."

Para resolver essa situação foi necessário editar o arquivo sip.conf e adicionar o seguinte parâmetro a configuração do SIP da GVT:
ignoresdpversion=yes

Tal configuração não solucionou a questão do Music on hold, mas possibilitou que as ligações funcionassem corretamente (agora quando as mesmas são atendidas não ficam mais mudas). Ainda é aguardada a posição/solução oficial da GVT sobre esse problema, e quando a mesma for enviada será publicada neste post.

Tem mais ?

Por enquanto é isso que posso relatar...

Na minha opinião é uma falha grave da GVT não repassar essas informações quando o serviço é instalado, já que encontrei várias pessoas reclamando dos mesmos problemas. No entanto, como o VOX IP é relativamente novo e normalmente a GVT presta um excelente serviço acho que vale dar um voto de confiança para a operadora.

Se você conhecer outras dicas relacionadas ao GVT Vox IP não deixe de compartilhá-las nos comentários do post.



terça-feira, 25 de janeiro de 2011

Asterisk - controle de horário de atendimento

Existe uma situação relacionada a telefonia que me incomoda bastante: você liga para uma empresa e o telefone chama sem parar até a ligação cair. Às vezes (e isso já aconteceu comigo) você acaba sendo atendido pelo vigia, que lhe informa que o expediente já terminou. Na minha opinião (considerando-se o porte da empresa, é claro) isso transmite uma sensação de amadorismo e descaso com o cliente.

Nessas horas eu sempre me pergunto: custava colocar uma mensagem informando o horário de funcionamento?

Temos sempre de lembrar que muitas empresas (principalmente as menores) ainda utilizam pequenas centrais telefônicas que dificultam (ou em alguns casos impossibilitam) que essa mensagem seja disponibilizada, mas se você utiliza o Asterisk isso pode ser configurado facilmente.

Para implementar o controle de horário no Asterisk vamos utilizar a aplicação GotoIfTime.

Com o GotoIfTime é possível realizar controles de fluxo no plano de discagem com base no horário atual (é SEMPRE MUITO IMPORTANTE manter o relógio de seu servidor atualizado - saiba mais sobre NTP).

Segue um exemplo que redireciona as chamadas de entrada com base no horário:

/etc/asterisk/extensions.conf

[from-pstn]
; contexto de chamadas recebidas da pstn

; inclui o contexto de controle de horário
include => horario

[horario]
; contexto de controle de horário

; Se a ligação foi recebida das 9 às 14:59 horas de segunda a sexta-feira
; segue para o contexto de ramais
exten => _XXXX,1,GotoIfTime(9:00-14:59|mon-fri|*|*?ramais,${EXTEN},1)

; Se a ligação foi recebida das 15 às 18 horas de segunda a sexta-feira
; segue para o contexto de fax
exten => _XXXX,1,GotoIfTime(15:00-18:00|mon-fri|*|*?ramais,${EXTEN},1)

; Nas ligações recebidas nos demais horários é executada a mensagem
; de horário de atendimento e a chamada é desligada
exten => _XXXX,n,Answer
exten => _XXXX,n,Wait(1)
exten => _XXXX,n,Playback(horario_de_atendimento)
exten => _XXXX,n,HungUp

[ramais]
; contexto de discagem para os ramais

exten => _XXXX,1,Answer
exten => _XXXX,n,Wait(1)
exten => _XXXX,n,Dial(SIP/${EXTEN},30)

[fax]
; contexto de discagem para o fax

exten => _XXXX,1,Answer
exten => _XXXX,n,Wait(1)
exten => _XXXX,n,Dial(DAHDI/g2/${EXTEN},30)

A aplicação, como pode-se perceber, abre um grande leque de possibilidades permitindo um controle minuscioso de horário para o tratamento das chamadas.

Adapte-a para seu ambiente e você certamente agregará muito valor a sua telefonia IP.

Asterisk - controlando o número máximo de chamadas recebidas por ramal


Apesar de não existir limite de número de chamadas simultâneas num ramal SIP (o que é eventualmente controlado pelo cliente em uso), se você precisa desse tipo de restrição é possível implementá-la diretamente no Asterisk.

Para isso podemos fazer uso de duas funções disponíveis no plano de discagem (que substituem o antigo parâmetro call-limit da configuração sip): GROUP e GROUP_COUNT. A função GROUP adiciona um canal em um grupo, enquanto a função GROUP_COUNT conta o número de canais de um grupo.

Abaixo um pequeno exemplo de como fazer com que os ramais SIP recebam somente uma chamada por vez (sem limites de chamadas originadas).

/etc/asterisk/extensions.conf
[ramais]
; contexto de recebimento de chamadas no ramais

exten => _XXXX,1,NoOp

; adiciona o ramal no grupo ramalXXXX
exten => _XXXX,n,Set(GROUP()=ramal${EXTEN})

; verifica o número de chamadas simultâneas no grupo ramalXXXX
exten => _XXXX,n,Set(SIMULTCALL=${GROUP_COUNT(ramal${EXTEN})})

exten => _XXXX,n,NoOp(Ligacoes em curso ramal ${EXTEN}: ${SIMULTCALL})

; verifica se o número de chamadas é 1 (a própria chamada)
; se for igual a 1 efetua a discagem, caso contrário nega o recebimento
exten => _XXXX,n,GotoIf($["${SIMULTCALL}" = "1"]?call:nocall)

; seção usada quando a chamada não pode ser realizada (ramal em uso)
exten => _XXXX,n(nocall),NoOp(Limite Excedido - ramal ${EXTEN})
exten => _XXXX,n(nocall),HungUp

; seção usada para realização da chamada
exten => _XXXX,n(call),NoOp(Ligacao OK - ramal ${EXTEN})
exten => _XXXX,n(call),Dial(SIP/${EXTEN},30,twxr)


[outgoing]
; contexto das ligações para a pstn

exten => _X.,1,NoOp
exten => _X.,n,Noop(CALLERID: ${CALLERID(all)})

; adiciona o ramal no grupo ramalXXXX
; apesar de não haver limite de chamadas originadas é preciso computar
; essa ligação, pois caso o ramal esteja em uso por ter originado uma ligação
; é preciso bloquear o recebimento de uma nova chamada neste
exten => _X.,n,Set(GROUP()=ramal${CALLERID(number)})

exten => _X.,n,Set(SIMULTCALL=${GROUP_COUNT(ramal${CALLERID(number)})})
exten => _X.,n,NoOp(Ligacoes em curso ramal: ${SIMULTCALL})

; Disca para a pstn
exten => _X.,n,Dial(DAHDI/g1/${EXTEN},60,TWXr)
exten => _X.,n,HungUp

Como pode-se perceber, o recurso pode ser facilmente implementado. O código acima é um modelo que pode ser facilmente aprimorado com o uso de voicemail ou de uma mensagem previamente gravada em caso de rejeição da chamada. Tudo de acordo com a necessidade específica de seu ambiente.

ATENÇÃO (17/02/2011): o recurso acima apresenta um problema: chamadas transferidas continuam sendo consideradas chamadas em andamento e só são removidas do grupo após a ligação original (já transferida) ser finalizada. Estou estudando como contornar a situação.

segunda-feira, 20 de dezembro de 2010

Instalando o zimlet Asterisk no Zimbra 6.0.X

Quem utiliza o Zimbra sabe muito bem que os zimlets podem agregar recursos muito interessantes à ferramenta.

Dentro da grande gama de opções disponíveis na galeria, um zimlet que merece destaque é o de integração com o Asterisk (Asterisk PBX Integration).

A integração com o Asterisk permite que sejam realizadas ligações com um simples clique do mouse. Bastar clicar no número telefônico desejado na interface web do Zimbra (na lista de endereços ou no corpo de um e-mail, por exemplo) que a ligação é efetuada.

E como funciona ?

Ao clicar no número telefônico, o Zimbra (utilizando-se da AMI - Asterisk Manager Interface) faz o Asterisk discar para o ramal do usuário. Quando o usuário atende a ligação, o Asterisk então disca para o número de destino estabelecendo a chamada.

Certamente esse é um recurso muito útil, mas que, no entanto, tem um processo de instalação um pouco complicado se a versão do Zimbra for a 6.0.X.

Instalando o zimlet Asterisk PBX no Zimbra


Antes de mais nada é preciso ter ciência de que a última versão oficial desse zimlet (0.65) não é compatível com o Zimbra 6.0.X, o que impossibilita sua instalação.

Pesquisando nos fóruns do Zimbra encontrei um post que possui uma versão modificada que atende os requisitos do Zimbra 6.0.X. Baixe o zimlet compatível aqui.

Vamos então a instalação:
  • Logue como root no servidor zimbra e acesse o diretório /opt/zimbra/jetty/webapps/zimlet/WEB-INF ;
  • Renomeie o subdiretório lib para lib.old, por exemplo;
  • Crie os seguintes links simbólicos com os comandos:
ln -s /opt/zimbra/jetty/webapps/zimbra/WEB-INF/lib /opt/zimbra/jetty/webapps/zimlet/WEB-INF
ln -s /opt/zimbra/jetty/webapps/zimbra/WEB-INF/tags /opt/zimbra/jetty/webapps/zimlet/WEB-INF
ln -s /opt/zimbra/jetty/webapps/zimbra/WEB-INF/tlds /opt/zimbra/jetty/webapps/zimlet/WEB-INF
ln -s /opt/zimbra/jetty/webapps/service/WEB-INF/zimbra.tld /opt/zimbra/jetty/webapps/zimlet/WEB-INF
  • Instale o zimlet Asterisk PBX pela interface administrativa do Zimbra ;
  • Configure o Asterisk para ativar a AMI (Asterisk Manager Interface), editando o arquivo /etc/asterisk/manager.conf e alterando a opção enabled para yes. Crie também um usuário com todos poderes, que será posteriormente configurado no zimlet. Por exemplo:
[zimbra]
secret = password
read = system,call,log,verbose,command,agent,user,config, command,dtmf,reporting,cdr,dialplan,originate
write = system,call,log,verbose,command,agent,user,config, command,dtmf,reporting,cdr,dialplan,originate
  • Baixe o arquivo de configuração modelo (o arquivo gerado pelo zimlet tem um problema nas tags que dificulta seu uso) e edite-o colocando os dados de seu servidor Asterisk;
  • Logado como usuário zimbra em seu servidor, importe o arquivo de configuração modificado com o comando: zmzimletctl configure /path/do/arquivo/ch_bnc_asterisk_config.xml ;
  • Remova do diretório /opt/zimbra/jetty/webapps/zimlet/WEB-INF/lib, se existirem, os arquivos asterisk-java-1.0.0-m1.jar e/ou asterisk-java-1.0.0-m2.jar ;
  • Reinicie o mailboxd com o comando: zmmailboxdctl restart
Pronto, a instalação foi concluída.

Configuração do usuário

Para começar a discar, antes de mais nada, é necessário que o usuário configure o zimlet. Para isso ele deve clicar na opção Asterisk Integration do menu Zimlets da sidebar esquerda.

Configurando o zimlet

Na tela de preferências é preciso configurar obrigatoriamente o ramal e o contexto com o qual serão realizadas as chamadas (não esqueça de fornecer essa informação para seus usuários).

Preferências do Asterisk Integration

Com as configurações finalizadas, basta agora clicar nos números telefônicos para começar a realizar as chamadas.

domingo, 19 de dezembro de 2010

Ativando o suporte ao XMPP e ao Google Talk no Asterisk

Para quem não sabe, o Asterisk possui suporte a XMPP, o que permite a implementação de uma série de interações entre sua estrutura VoIP e seu servidor XMPP (Openfire, ejabberd, etc...).

Na Propus fazemos uso dessa integração para enviar para o cliente de IM os dados da ligação entrante (número e identificação, caso o mesmo já esteja cadastrado em nossa agenda), numa espécie de Bina customizada que garante um atendimento telefônico mais eficiente. E isso é só um pequeno exemplo do que pode ser implementado (Asterisk -> Cliente IM).

Além disso também é possível fazer a interação inversa (cliente IM -> Asterisk), com a qual você pode, por exemplo, desviar uma ligação entrante para um ramal específico enviando um comando via XMPP para o Asterisk.

E as vantagens não param por aí: você também pode fazer uso do canal Google Talk (chan_gtalk), que possibilita a realização de ligações de seu ramal para contas Google Talk e Google Voice sem a necessidade do uso de softwares específicos.

E como devo proceder para ativar tais recursos ?

A ativação desses recursos depende de uma biblioteca chamada iksemel. Basta fazer o download dos fontes e instalá-los:

wget http://iksemel.googlecode.com/files/iksemel-1.4.tar.gz
tar xvzf iksemel-1.4.tar.gz
cd iksemel-1.4
./configure
make
make install
Após instalar a biblioteca inicie o processo de compilação do Asterisk.

Ao final da execução do ./configure rode o comando make menuconfig e verifique no menu Resource Modules se a opção res_jabber está marcada. Veja no menu Channel Drivers se a opção chan_gtalk ficou marcada também.




Finalize então a instalação do Asterisk e divirta-se desenvolvendo novos recursos para seu PBXIP.

UPDATE 22/12/2010: Caso o módulo jabber do Asterisk não seja carregado automaticamente acesse o rasterisk rode o seguinte comando:
module load res_jabbber.so
Se você se deparar com o erro:
Error loading module 'res_jabber.so': libiksemel.so.3: cannote open
shared object file: No such file or directory
rode os seguintes comandos e reinicie o asterisk:
echo "/usr/local/lib" > /etc/ld.so.conf.d/iksemel.conf
ldconfig

Notas (super) rápidas da semana

  • Lançado o ejabberd 2.1.6 - Saiba mais aqui.
  • Lançado o Asterisk 1.8.1.1 - Leia o changelog aqui.

quarta-feira, 3 de novembro de 2010

Notas rápidas da semana (Pidgin e Asterisk)


Algumas notícias da semana que merecem destaque:
  • Lançado o Pidgin 2.7.5 , versão de correção de bugs do conhecido cliente IM (e que traz algumas pequenas melhorias). ChangeLog completo aqui.
  • Lançado também o Wiki do Asterisk (anunciado na Astricon 2010). O Wiki do Asterisk pretende ser uma grande fonte de referência para o software, disponibilizando documentações, informações sobre o desenvolvimento e muito mais. Se for tudo que promete, será a mina de ouro dos sysadmins da ferramenta.
  • Outra notícia relevante (anunciada na Astricon 2010) foi o lançamento do Asterisk SCF. O Asterisk SCF (Asterisk Scalable Communications Framework) é uma plataforma de comunicações e suite de aplicações que pretende ser extensível, escalável e distribuída (além, é claro, de ser open source). Suas metas são:
1. Escalabilidade
2. Alta disponibilidade e tolerância a falhas
3. Extensibilidade
4. Performance

Como, na minha opinião, só as notícias do Asterisk já valiam um post, as "Notas rápidas da semana" foram antecipadas de sexta para quarta. Se houverem mais notícias importantes, uma edição extra será lançada.

domingo, 31 de outubro de 2010

Asterisk 1.4 + MySQL - Como armazenar o uniqueid na tabela CDR

Essa semana me deparei com um "problema", que do meu ponto de vista é algo totalmente improdutivo (e, no mínimo, desnecessário).

Encontrei uma instalação do Asterisk que não gravava dados no campo uniqueid da tabela CDR do DB MySQL, e, resolver tal situação me tomou um tempo precioso.

Depois de muita pesquisa consegui encontrar a solução, que é bastante simples, mas que, do meu ponto vista, é injustificável.

Para quem não sabe, o suporte ao uso do CDR em um banco de dados MySQL é disponibilizado pelo pacote asterisk-addons. Não sei se por um erro, ou por uma decisão consciente dos desenvolvedores (que me parece ser uma das mais equivocadas que já vi), é preciso alterar o código fonte desse pacote para habilitar o suporte ao armazenamento do uniqueid na tabela.

Então, se você também está passando por situação semelhante, mãos à obra:
  • Vá no diretório dos fonte do asterisk-addons e edite o arquivo cdr_addon_mysql.c;
  • Adicione a linha #define MYSQL_LOGUNIQUEID no início do arquivo;
  • Compile o asterisk-addons e voilá;
Pesquisei nos fontes e percebi várias linhas se referindo a tal constante, mas a mesma não era declarada em lugar algum, o que fazia com que o suporte ao recurso não fosse habilitado.

Não achei uma explicação para tal comportamento, que, pelo que pude observar já existe há mais de 3 anos. Se alguém souber o motivo disso, por favor deixe seus comentários.

quinta-feira, 21 de outubro de 2010

Liberada a versão final do Asterisk 1.8

Depois de meses de desenvolvimento e do lançamento de cincos versões RC, foi disponibilizada na data de hoje a versão final do Asterisk 1.8.

O Asterisk 1.8 é a nova versão LTS (Long Term Support) do projeto (assim como a versão 1.4), e será mantida até 21/10/2014 (saiba mais aqui).

A nova versão traz uma quantidade imensa de novos recursos e correções, então aconselho a leitura do ChangeLog para saber mais sobre o software.

Baixe a nova versão do Asterisk aqui.

terça-feira, 1 de junho de 2010

Notas rápidas (KDE e Asterisk) - update Pidgin

Algumas notícias que merecem destaque:
  • Lançado o KDE SC 4.4.4, o minor release mensal de correção de bugs do projeto. Leia o anúncio oficial aqui. Como de costume, já estão disponíveis pacotes para o (K)Ubuntu 10.04, Lucid Lynx, que podem ser facilmente instalados através da adição do repositório ppa do Kubuntu(ppa:kubuntu-ppa/ppa). Saiba como fazê-lo no Guia dos Repositórios do Kubuntu. Atualização recomendada.
  • Lançadas também na data de hoje novas versões do Asterisk 1.4 e 1.6.2. As versões 1.4.32 e 1.6.2.8 resolvem alguns bugs e problemas encontrados nos releases anteriores.
UPDATE 02/06/10: Lançado também essa semana o Pidgin 2.7.1. Vários bugs foram corrigidos, mas na minha opinião o maior destaque da nova versão é o suporte a conexões diretas no protocolo MSN, o que aumenta a velocidade de transmissão de arquivos, smileys e ícones. Leia o changelog completo aqui.