Demo com Freeswitch: Criar usuários e gravar ligações

O que é?

FreeSWITCH é uma plataforma de telefonia feita para facilitar a criação de produtos voltados a comunicação (voz, vídeo…), o que inclui a famosa VoIP (voz sobre IP). Além disso, é uma plataforma de código aberto! O código fonte está todo disponível online e acessível a quem quiser conferir ou, até mesmo, brincar e fazer suas próprias alterações (hack it!). FreeSWITCH começou com um grupo de desenvolvedores de outra plataforma de comunicações: Asterisk. Esse grupo de desenvolvedores tinha algumas ideias diferentes para esse tipo de plataforma e precisavam de outro espaço para desenvolvê-las, assim surgiu o FreeSWITCH, que visa a maior escalabilidade e performance.

O demo

Nesse artigo, vou descrever o processo de instalar FreeSWITCH em um MacBook compilando o código fonte, criar novos ramais (FreeSwitch já vem com alguns terminais padrão definidos, 1000, 1001, 1002…) e configurar para que as ligações sejam gravadas automaticamente.

Instalação

Para a instalação, eu segui esse guia de instalação para o Mac OS. Note que o guia está em inglês, então farei minha própria versão em português aqui.

Se você usa outro sistema operacional, a instalação dos pré-requisitos pode ser um pouco diferente. Guias de instalação para outros sistemas operacionais pode ser encontrado nesse link, basta navegar no menu ao lado esquerdo e selecionar seu sistema operacional.

Um elemento importante para a instalação a partir do código fonte é o XCode, se você ainda não o tem instalado, é melhor ir à App Store e deixar baixando, porque ele é grande e vai demorar um pouco.

Para instalar os pré-requisitos do FreeSWITCH, usaremos o Homebrew, que é um gerenciador de pacotes para o Mac (assim como tem o apt-get para o Debian/Ubuntu). Para instalar o Homebrew, devemos rodar a seguinte linha de comando no terminal, conforme indicado na página oficial do projeto:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Essa instrução vai baixar o script Ruby de instalação e rodá-lo.

Tendo instalado o Homebrew, vamos agora instalar os pré-requisitos do FreeSWITCH da seguinte forma:

brew install autoconf automake curl FreeSWITCH/homebrew-freeswitch/flite jpeg ldns libsndfile libtool lua openssl opus pcre pkg-config speex speexdsp sqlite yasm

Convencionalmente, instala-se o FreeSWITCH no diretório /usr/local. Sendo assim, vamos baixar o código fonte em /usr/local/src. Dessa forma, utilize os seguintes comandos:

cd /usr/local/src
git clone -b v1.6 https://stash.freeswitch.org/scm/fs/freeswitch.git

Estamos baixando a versão 1.6 porque é a versão utilizada nesse demo. Para baixar a versão de desenvolvimento mais atual, bastaria clonar o master branch (git clone https://stash.freeswitch.org/scm/fs/freeswitch.git).

O branch será clonado para a pasta /usr/local/src/freeswitch. Agora entre nessa pasta e vamos começar a instalação!

cd freeswitch # Pasta que o git acabou de criar
./bootstrap.sh
./configure

O shell script bootstrap.sh vai criar os arquivos/scripts de configuração para a compilação do FreeSWITCH, o que vai criar o script configure. Note que ele não existia antes de rodar o bootstrap. Agora vamos compilar e instalar:

make
make install

Para limpar os arquivos criados durante a compilação, podemos utilizar make clean em seguida.

Testando a instalação

Instalamos o FreeSWITCH, certo? Vamos ver se está tudo ok… Em seu terminal, vá à pasta em que o FreeSWITCH foi instalado e rode-o:

cd /usr/local/freeswitch/bin
./freeswitch

Aparecem várias mensagens de inicialização, terminando com uma caixa com o nome dos desenvolvedores:

Agora podemos rodar alguns comandos básicos para verificarmos que FreeSWITCH está rodando sem problemas maiores:

version
status

No espaço em que se digita cada comando, tem-se algo parecido com:

No seu caso, deve existir outro conteúdo depois desse @, pois é o nome de seu domínio local, anote-o porque a gente vai usar na seção seguinte, ok?

Testando ligações

Para testar ligações, vamos precisar de um aplicativo que suporte o protocolo SIP (Session Initiation Protocol). Sendo assim, vá à App Store e pesquise por SIP. Nesse guia, utilizarei o aplicativo Telephone.

Após instalado o aplicativo, abra-o.

FreeSWITCH vem com alguns ramais (usuários) pré-definidos. Para testar ligações, vamos começar utilizando esses ramais.

Ao abrir o Telephone pela primeira vez, a seguinte tela será exibida:

Adicionaremos nossa primeira conta desse demo:

Full Name: A
Domain: SEUDOMINIO
User Name: 1000
Password: 1234

Em Domain, coloque o domínio que você anotou na seção anterior. Note que, em password, colocamos 1234, que é a senha padrão desses ramais do FreeSWITCH (você pode alterar em /usr/local/freeswitch/conf/vars.xml).

Agora vá a Telephone->Preferences (ou ⌘ , ) e clique em Accounts. Você deverá ter uma tela como a seguinte:

Agora adicione outra conta:

Full Name: B
Domain: SEUDOMINIO
User Name: 1001
Password: 1234

E tenha certeza de que a caixa Use this account está marcada em ambas as contas. Fazendo isso, você deve ter as duas linhas ativas:

Em uma das janelas, digite o número do outro ramal e pressione enter, o que deverá fazer uma ligação de um para o outro (fique a vontade para atender e falar um pouco).

FreeSWITCH pode dar alguns alertas porque nós não alteramos a senha padrão desses ramais, mas, para os fins desse demo, não se faz necessário.

A esse ponto, você já deve ter conseguido fazer ligações com os ramais padrões, mas agora vamos criar nossos próprios ramais, né? Criaremos os ramais 100 e 101.

Primeiro vá até a pasta /usr/local/freeswitch/conf/directory e abra o arquivo default.xml em seu editor, vamos adicionar um grupo de ramais chamado medium:

Agora salve o arquivo e crie, na mesma pasta, uma nova pasta chamada de medium. Dentro dela, vamos adicionar nossos usuários, cada um será representado por um arquivo de configuração em xml.

Nosso primeiro ramal será o 100. Então crie o arquivo 100.xml em /usr/local/freeswitch/conf/directory/medium com o seguinte conteúdo:

 <include>
<user id=”100">
<params>
<param name=”password” value=”bar0"/>
</params>
<variables>
<variable name=”user_context” value=”default”/>
</variables>
</user>
</include>

Assim estamos criando um ramal chamado 100 com a senha bar0. Para o ramal 101, faremos algo similar e criaremos o arquivo 101.xml com um conteúdo bem similar:

<include>
<user id=”101">
<params>
<param name=”password” value=”bar1"/>
</params>
<variables>
<variable name=”user_context” value=”default”/>
</variables>
</user>
</include>

Salve esses arquivos e quase pronto! Temos nossos ramais criados, mas precisamos dizer ao FreeSWITCH como proceder com as ligações efetuadas de/para esses ramais. Para isso, vamos alterar o dialplan, logo abra o arquivo /usr/local/freeswitch/conf/dialplan/default.xml em seu editor de texto. Nesse arquivo, são salvas as extensões do dialplan e diz ao FreeSWITCH como se comportar em determinadas situacões. Procure por Local_Extension e você achará a extensão utilizada para os ramais padrões (aquele 1000 e 1001, lembra?)

Procure a tag xml que fecha essa (</extension>) e colocaremos a nossa extensão logo em seguida. Nossa extensão é ligeiramente parecida à padrão, mas tentei enxugá-la para deixar apenas o essencial e, também, adicionar a ação de gravar as ligações. Para isso, adicionemos a seguinte extensão:

1. <extension name="Medium_Extension">
2. <condition field="destination_number" expression="^(10[0-5])$">
3. <action application="export" data="dialed_extension=$1"/>
4. <action application="export" data="execute_on_answer=record_session $${base_dir} /recordings/${strftime(%Y%m%d%H%M%S)}_${caller_id_number}.wav"/>
5. <action application="set" data="ringback=${us-ring}"/>
6. <action application="set" data="call_timeout=30"/>
7. <action application="set" data="hangup_after_bridge=true"/>
8. <action application="set" data="continue_on_fail=true"/>
9. <action application="bridge" data="user/${dialed_extension}@${domain_name}"/>
10. <action application="answer"/>
11. <action application="sleep" data="1000"/>
12. <action application="bridge" data="loopback/app=voicemail:default ${domain_name} ${dialed_extension}"/>
13.   </condition>
14.</extension>

Colocamos um comportamento similar ao utilizado pelos ramais padrões: Ao realizar uma ligação, chamará por 30s e vai encaminhar para a caixa de mensagens caso não seja atendida. Já se a ligação for atendida, será desligada após a conclusão da conversa.

A linha 2 informa a condição para que essa extensão será utilizada. Em nossa condição, nós comparamos o destination_number (número de destino) à expressão regular ^(10[0–1])$. Essa expressão regular significa: 100 ou 101, exatamente os ramais que queremos adicionar.

A linha 4 é a responsável pela gravação das ligações, salvando-as em arquivo .wav na pasta /usr/local/freeswitch/recordings.

A linha 9 é responsável por direcionar a ligação para o destinatário, note que dialed_extension é uma variável que nós mesmos criamos a partir do resultado do agrupamento da expressão regular, o que acontece na linha 3.

As demais linhas configuram a extensão conforme discutimos (30s de tom de chamada etc.)

Agora salve e temos nossos novos ramais adicionados e devidamente configurados! Em seguida, adicione esses ramais às contas do Telephone e ligue de um para o outro. Ao terminar a ligação, verifique que haverá um arquivo na pasta recordings correspondente à gravação dessa ligação.

Escutou? Perceba que esse arquivo é um pouco mais longo do que a ligação em si. Na verdade, ele começa com uma versão acelerada [e engraçada] das falas, só depois o áudio original aparece. Isso acontece porque o FreeSWITCH grava uma versão com uma taxa de amostragem menor no começo do arquivo, o que pode ser utilizado para reconstrução do áudio ou, até, abrir espaço para fazer análises sobre as conversas, talvez um pouco de machine learning?

Conclusão

FreeSWITCH é uma ótima plataforma de comunicações e, facilmente, conseguimos deixar up and running, ainda fazer um demo simples e já fazer ligações! 
Várias empresas têm construído produtos tendo como base o FreeSWITCH, adicionando funcionalidades e impactando o mercado.

Ah, e o comando para finalizar o FreeSWITCH é shutdown ;)

Like what you read? Give Vinicius Dantas a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.