freeswitch, eventsocket, twisted!

freeswitchApós meses tentando resolver problemas ridículos com meu discador automático baseado em Asterisk, acabei mudando totalmente o rumo do sistema e re-escrevi todo o código para o FreeSWITCH.

A versão anterior se conectava no manager do Asterisk, originava as chamadas, e naquela completa bagunça sem padrão ia controlando o fluxo da chamada com auxílio de um AGI. Funções como transferência e gravação com detecção de caixa postal geravam diversas complicações devido à maneira como o Asterisk funciona, e o resultado era muita dor de cabeça.

Agora, a bagunça é assíncrona, tem padrão, e controla totalmente o FreeSWITCH através do Event Socket. Ao se conectar no Inbound Socket, o sistema origina as chamadas com destino ao Outbound Socket, onde cada uma é controlada individualmente e todos recursos funcionam perfeitamente, inclusive as várias maneiras de realizar transferência (bridge).

O FreeSWITCH está próximo da perfeição no quesito funcionamento, pecando apenas na documentação e alguns detalhes relacionados ao retorno (erro, etc) na originação de chamadas. Porém, esses detalhes são totalmente contornáveis com soluções simples, sem gambiarras e maracutaias como era com o Asterisk.

Em uma máquina comum, consigo manter 60 ligações simultâneas consumindo apenas 3% de cpu time. E o FreeSWITCH, que faz todo o controle das chamadas – conversão de mídia, gravação, detecção de caixa postal, de fax, etc etc etc, consome apenas 30% de cpu time.

Tudo isso é feito usando um protocolo do Twisted pro Event Socket do FreeSWITCH, que escrevi no último final de semana – entre carnaval, rock, etc. E pra felicidade geral da nação, tornei público pela lisença GPLv2, disponível no Google Code com exemplos.

Anúncios

o que é freeswitch?

O FreeSWITCH é um soft-switch modular, escrito em C e licenciado sob a Mozilla Public License. Ele surge como uma alternativa viável para a maioria das necessidades em aplicações de voz, desde roteamento de sinalização SIP e mídia RTP ou SRTP, até URAs e fácil integração com aplicações externas.

Apesar das versões preliminares serem utilizadas em alguns ambientes de produção, com vazão de 300 chamadas por segundo, poderemos utilizá-lo com mais segunraça a partir do dia 26 de maio, quando será lançada sua versão 1.0.

Já existem alguns bindings da API do FreeSWITCH para algumas linguagens, como: Python, Java, Perl, Lua, Javascript; além de alguns frameworks que se conectam ao Event Socket e exportam funções para o disparo e controle de chamadas. Em ambos os casos, a abstração esperada é alcançada.

A arquitetura do FreeSWITCH foi cuidadosamente montada para evitar deadlocks, race conditions e todos os outros problemas enfrentados por usuários e programadores do Asterisk. Outra diferença para o Asterisk, é que o núcleo (core) do FreeSWITCH é consistente e não depende de módulos externos. O núcleo não deveria, nunca, depender de módulos externos, porém o do Asterisk depende.

Tudo isso se traduz em aprender com os erros e escrever software que trabalhe conosco, não contra nós. O core é orientado por uma máquina de estados, que controla o estado de cada nova sessão (ou chamada) criada. A cada transição de estado, um evento é gerado. Qualquer módulo pode registrar event handlers que são chamados quando determinados eventos são gerados. Inclusive, é possível que existam diversos event handlers pra um determinado evento. A propagação do mesmo se dará até que um dos event handlers chamados retorne SWITCH_STATUS_FALSE.

Toda essa coerência torna desnecessário os hacks para alcançar os objetivos de um soft-switch moderno, além de tornar o FreeSWITCH uma plataforma de desenvolvimento – mas não pára por aí.

Por padrão, o software lê suas configurações a partir de arquivos XML, mas qualquer módulo poderia ser o responsável por requisitar e interpretar as configurações. Uma estratégia interessante, é utilizar o mod_xml_curl, que já faz parte do FreeSWITCH, para solicitar todas as configurações via HTTP, ao invés de ler arquivos XML do disco.

Assim, poderia existir um servidor de configuração, que rodaria um webserver, um banco de dados e alguma linguagem de scripting ou um CGI. Poderiam existir 10 servidores com FreeSWITCH rodando, que executariam GETs no servidor de configuração, que entregaria a opção desejada.

Arquitetura simples, com configuração centralizada e desempenho escalonável: se uma expansão for necessária, é só adicionar mais um servidor com FreeSWITCH, igual aos outros já existentes. As configurações que podem ser puxadas remotamente não se limitam à adição e exclusão de usuários, mas a toda e qualquer opção configurável do software. Isso inclui o dialplan, que é flexível o suficiente para tomar decisões não apenas baseado em extension matching, mas também em endereços de rede, variáveis do canal, dados do usuário, etc., o que torna o esquema todo muito flexível.

  • Protocolos VoIP suportados: SIP, IAX e Jinggle
  • TDM: Linhas analógicas (FXS e FXO) e ISDN PRI
  • Codecs: G.711, G.722 (passthru), G.723.1 (passthru), G.726, G.729 (passthru), AMR (passthru), iLBC, Speex, lpc10 e DVI4.
Suporte para MFC/R2, amplamente utilizado no Brasil, está sendo escrito. Desta forma, poderemos utilizar os benefícios de uma plataforma VoIP livre e confiável.
Links, todos com conteúdo em inglês: