quarta-feira, 23 de maio de 2007

MFCR2: Solução do problema da chamada caindo com o bloqueio de DDC

Após a implementação do E1 com sinalização MFCR2 da BrasilTelecom no Asterisk (link), pude perceber que algumas ligações que eu efetuava eram atendidas e logo em seguida caiam. Busquei uma explicação para isso, e o que o pessoal da BrasilTelecom me informou, é que algumas centrais e/ou aparelhos possuem bloqueio automático à ligações DDC (ligações à cobrar).

O procedimento de uma central que faz bloqueio automático à DDC é:

1. atender a ligação;
2. desligar a ligação;
3. atender novamente.

Em uma ligação à cobrar, no segundo passo do procedimento acima, a ligação cai, e, conseqüentemente, a ligação não é efetuada e o número de destino não vai pagar por esta ligação.

Em uma ligação normal, a ligação não cai no segundo passo, e as pontas conseguem estabelecer comunicação após o terceiro passo.

O que estava acontecendo, era que as ligações efetuadas pelo E1 com sinalização MFCR2 estavam caindo já no segundo passo. A chave para a solução do problema é recompilar a libmfcr2 editando o arquivo mfcr2.c e alterando o valor da linha mfcr2->clear_back_persistence_check de 0 para 3000, da seguinte maneira:
mfcr2->clear_back_persistence_check = 3000;
O valor 3000, equivale à 3000ms, ou seja, 3 segundos. Quem me disse que é essa linha que tem que ser alterada no mfcr2.c foi o Dio Makibara - dioedu (grato novamente!!!), e no email que ele enviou em resposta à minha pergunta na lista AsteriskBrasil.org, o valor que o dioedu me informou foi 500 ou 1500. Conversando com o pessoal da BrasilTelecom de Brasília, eles me informaram que eu posso aumentar este valor. Aumentei para 3000 e para mim está funcionando bem.

Então, se você vai fazer uma nova instalação de um circuito E1 com sinalização MFCR2 e vai utilizar a documentação Asterisk + Sinalização MFCR2 (spandsp + libsupertone + libunicall + libmfcr2), antes de iniciar a compilação da libmfcr2, edite o arquivo mfcr2.c e altere o valor documentado acima, e depois siga o processo de instalação normalmente.

Se o seu circuito já está funcionando e você quer corrigir o problema, entre no diretório onde está o código-fonte do libmfcr2, rode make clean, edite o arquivo mfcr2.c de acordo com as orientações acima, e refaça a instalação (./configure --prefix=/usr/local ; make ; make install). Em seguida, recompile e reinstale o próprio Asterisk (não esqueça do chan_unicall.c e do Makefile modificado dentro do diretório channels).

É isso. Espero de alguma forma ter auxiliado você se chegou até aqui e conseguiu resolver o seu problema. Agradecimento ao Zuca da BrasilTelecom Brasília por ter informado muitos dados importantíssimos para a identificação e resolução do problema, e ao Dio Makibara (dioedu) por ter mostrado o "caminho das pedras" da solução do problema alterando o mfcr2.c.

sábado, 19 de maio de 2007

Calculadora de banda VoIP

O asteriskguru.com tem uma calculadora de banda VoIP muito interessante e funcional. Para quem precisa dimensionar um projeto VoIP, aí vai a dica: http://www.asteriskguru.com/tools/bandwidth_calculator.php .

terça-feira, 15 de maio de 2007

Asterisk + Sinalização MFCR2 (spandsp + libsupertone + libunicall + libmfcr2)

Esta documentação é à respeito da utilização do Asterisk com o protocolo de sinalização E1 MFCR2 com as placas E1 da Digium.

Introdução

Após duas semanas de muitas tentativas de configuração da sinalização MFCR2 de um circuito E1 da BrasilTelecom, utilizando a placa Digium TE210P, resolvi escrever esta documentação com o objetivo de mostrar minhas principais dificuldades encontradas e qual foi o "caminho das pedras" para fazer o circuito E1 com sinalização R2 funcionar com o Asterisk.

-----------------------------

Uma das principais dificuldades encontradas, é a escassez de documentação qualificada à respeito disso. Nessa documentação, não aprofundarei em assuntos técnicos da sinalização MFCR2, por ainda não ter conhecimento técnico suficiente para explicar à nível de protocolo como funciona em detalhes o R2. Porém, nas minhas pesquisas para entender um pouco mais como funciona o R2, encontrei uma documentação do Moisés Humberto Silva Salmerón, "NOTES ABOUT MFCR2 AND UNICALL WITH ASTERISK", que pode ser encontrada aqui ou aqui. Inicialmente, recomendo a leitura deste documento para que tenhas uma abordagem técnica à respeito do MFCR2 com o Asterisk.

Para elaborar esta documentação, estou utilizando o seguinte hardware:
* Servidor Dell Poweredge 860
* Placa Digium TE210P

E o sistema operacional é o Debian GNU/Linux:
saturn:/# uname -a
Linux saturn 2.6.18-4-686 #1 SMP Wed May 9 23:03:12 UTC 2007 i686 GNU/Linux
Inicialmente, eu tentei rodar a sinalização MFCR2 com a versão 1.4.2 do Asterisk. Consegui compilar as bibliotecas e o próprio Asterisk sem problemas, utilizando os fontes de http://moy.ivsol.net/unicall/soft-switch/r1b1/, também do Moisés Silva. Como disse, consegui compilar com os fontes acima e rodar o Asterisk, de acordo com as orientações de http://www.voip-info.org/wiki/view/Asterisk+MFC+R2, porém, estavam ocorrendo problemas de sinalização que eu não conseguia resolver, e também não conseguia entender por que eu via alguns HOW-TOs na Internet ensinando como fazer, e eu não conseguia fazer. Basicamente, com o Asterisk 1.4.2 e as modificações dos pacotes do Moisés Silva, conseguia efetuar ligações porém não conseguia receber ligações pelo canal E1. Depois tentei fazer a mesma coisa com o Asterisk 1.4.4, e também, sem sucesso. Foi aí que eu entrei em contato com o Steve Underwood, o desenvolvedor do spandsp, libsupertone, libunicall e libmfcr2, e ele me orientou a fazer um downgrade da versão do spandsp. Vamos lá, justamente o que eu não queria fazer: downgrade.

Escrevi tudo isso aí acima, para que você possa entender que eu realmente não queria utilizar a versão 1.2.16 do Asterisk e nem as versões que eu estou utilizando do spandsp, libsupertone, libunicall e libmfcr2, mas foi o jeito de fazer funcionar, principalmente após as conversas com o Alexandre Abreu (anonymouz666) e o Carlos Cesario (ccesario) no #asteriskbrasil.org da rede de IRC freenode.

Bom, então, os pacotes utilizados são:
* Asterisk 1.2.16, disponível aqui ou aqui.
* Zaptel 1.2.17.1, disponível aqui ou aqui.
* Libpri 1.2.4, disponível aqui ou aqui.
* Asterisk-addons 1.2.6, disponível aqui ou aqui.
* Asterisk-sounds 1.2.1, disponível aqui ou aqui.

Originalmente, você pode baixar o spandsp, libsupertone, libunicall e libmfcr2 em http://www.soft-switch.org/, porém algumas versões que vamos utilizar, não estão mais disponíveis na página oficial, então, estou disponibilizando as versões que estou utilizando na minha própria página:
* spandsp-0.0.3pre22, disponível aqui.
* libsupertone-0.0.2pre9, disponível aqui.
* libunicall-0.0.3pre9, disponível aqui.
* libmfcr2-0.0.3pre9, disponível aqui.
* Makefile modificado pelo Carlos Cesario, disponível aqui.
* chan_unicall.c, disponível aqui.

Crie o diretório /usr/src/asterisk e baixe todos os arquivos para este diretório. Eu estou utilizando o Debian GNU/Linux, mas com certeza você pode utilizar outra distribuição do GNU/Linux para a instalação do Asterisk e das bibliotecas necessárias para o suporte à MFCR2. Para mais detalhes dos pacotes necessários para a instalação do Asterisk no Debian GNU/Linux, veja esta referência no asteriskguru.com, e para detalhes à respeito da instalação do spandsp + libsupertone + libunicall + libmfcr2, veja http://www.voip-info.org/wiki/view/Asterisk+MFC+R2. Nesta documentação, faremos um passo-à-passo da instalação, mas é bom ler a documentação mencionada acima para ter um bom entendimento de todo o processo de instalação e configuração, e para que você tenha conhecimento do que está fazendo.

Meu sources.list está assim:
saturn:/# cat /etc/apt/sources.list
deb http://ftp.debian.org/debian/ stable main contrib non-free
deb http://security.debian.org/ stable/updates main
deb http://www.backports.org/debian/ sarge-backports main contrib non-free
Vamos começar atualizando a árvore do APT:
saturn:/# apt-get update
Get: 1 http://ftp.debian.org stable Release.gpg [378B]
Get: 2 http://security.debian.org stable/updates Release.gpg [189B]
Hit http://ftp.debian.org stable Release
Get: 3 http://www.backports.org sarge-backports Release.gpg [189B]
Hit http://security.debian.org stable/updates Release
Ign http://ftp.debian.org stable/main Packages/DiffIndex
Hit http://www.backports.org sarge-backports Release
Ign http://security.debian.org stable/updates/main Packages/DiffIndex
Ign http://ftp.debian.org stable/contrib Packages/DiffIndex
Ign http://ftp.debian.org stable/non-free Packages/DiffIndex
Hit http://www.backports.org sarge-backports/main Packages/DiffIndex
Hit http://security.debian.org stable/updates/main Packages
Hit http://ftp.debian.org stable/main Packages
Hit http://ftp.debian.org stable/contrib Packages
Hit http://www.backports.org sarge-backports/contrib Packages/DiffIndex
Hit http://www.backports.org sarge-backports/non-free Packages/DiffIndex
Hit http://ftp.debian.org stable/non-free Packages
Hit http://www.backports.org sarge-backports/contrib Packages
Fetched 191B in 2s (89B/s)
Reading package lists... Done
E em seguida instalando alguns pacotes:
saturn:/# apt-get install bison libncurses-dev libssl-dev libnewt-dev zlib1g-dev initrd-tools cvs procps make gcc g++ libtiff-dev libxml2 libxml2-dev
Descompacte o libpri e instale-o:
saturn:/usr/src/asterisk# tar zxfv libpri-1.2.4.tar.gz
saturn:/usr/src/asterisk# cd libpri-1.2.4
saturn:/usr/src/asterisk/libpri-1.2.4# make
saturn:/usr/src/asterisk/libpri-1.2.4# make install
Eu estou rodando o Kernel 2.6.18-4-686, então, instalo via APT o pacote linux-headers-2.6.18-4-686:
saturn:/usr/src/asterisk# apt-get install linux-headers-2.6.18-4-686
Descubra qual é o kernel que você está rodando e instale os repectivos cabeçalhos (headers).

Descompacte o zaptel e instale-o:
saturn:/usr/src/asterisk# tar zxfv zaptel-1.2.17.1.tar.gz
saturn:/usr/src/asterisk# cd zaptel-1.2.17.1
saturn:/usr/src/asterisk/zaptel-1.2.17.1# make
saturn:/usr/src/asterisk/zaptel-1.2.17.1# make install
Descompacte o spandsp e instale-o:
saturn:/usr/src/asterisk# tar zxfv spandsp-0.0.3pre22.gz
saturn:/usr/src/asterisk# cd spandsp-0.0.3
saturn:/usr/src/asterisk/spandsp-0.0.3# ./configure --prefix=/usr/local
saturn:/usr/src/asterisk/spandsp-0.0.3# make
saturn:/usr/src/asterisk/spandsp-0.0.3# make install
Descompacte libsupertone e instale-o:
saturn:/usr/src/asterisk# tar zxfv libsupertone-0.0.2.tar.gz
saturn:/usr/src/asterisk# cd libsupertone-0.0.2
saturn:/usr/src/asterisk/libsupertone-0.0.2# ./configure --prefix=/usr/local
saturn:/usr/src/asterisk/libsupertone-0.0.2# make
saturn:/usr/src/asterisk/libsupertone-0.0.2# make install
Descompacte libunicall e instale-o:
saturn:/usr/src/asterisk# tar zxfv libunicall-0.0.3.tar.gz
saturn:/usr/src/asterisk# cd libunicall-0.0.3
saturn:/usr/src/asterisk/libunicall-0.0.3# ./configure --prefix=/usr/local
saturn:/usr/src/asterisk/libunicall-0.0.3# make
saturn:/usr/src/asterisk/libunicall-0.0.3# make install
Descompacte libmfcr2 e instale-o:
saturn:/usr/src/asterisk# tar zxfv libmfcr2-0.0.3.tar.gz
saturn:/usr/src/asterisk# cd libmfcr2-0.0.3
saturn:/usr/src/asterisk/libmfcr2-0.0.3# ./configure --prefix=/usr/local
saturn:/usr/src/asterisk/libmfcr2-0.0.3# make
saturn:/usr/src/asterisk/libmfcr2-0.0.3# make install
Descompacte o asterisk:
saturn:/usr/src/asterisk# tar zxfv asterisk-1.2.16.tar.gz
saturn:/usr/src/asterisk# cd asterisk-1.2.16
Copie o Makefile e o chan_unicall.c de /usr/src/asterisk para /usr/src/asterisk/asterisk-1.2.16/channels/:
saturn:/usr/src/asterisk/asterisk-1.2.16# cp /usr/src/asterisk/Makefile /usr/src/asterisk/chan_unicall.c /usr/src/asterisk/asterisk-1.2.16/channels/
Compile e instale o Asterisk:
saturn:/usr/src/asterisk/asterisk-1.2.16# make mpg123
saturn:/usr/src/asterisk/asterisk-1.2.16# make
saturn:/usr/src/asterisk/asterisk-1.2.16# make install
saturn:/usr/src/asterisk/asterisk-1.2.16# make samples
Instale o Asterisk-sounds:
saturn:/usr/src/asterisk# tar zxfv asterisk-sounds-1.2.1.tar.gz
saturn:/usr/src/asterisk# cd asterisk-sounds-1.2.1
saturn:/usr/src/asterisk/asterisk-sounds-1.2.1# make install
Compile e instale o Asterisk-addons:
saturn:/usr/src/asterisk# tar zxfv asterisk-addons-1.2.6.tar.gz
saturn:/usr/src/asterisk# cd asterisk-addons-1.2.6
saturn:/usr/src/asterisk/asterisk-addons-1.2.6# make
saturn:/usr/src/asterisk/asterisk-addons-1.2.6# make install
Agora, crie os seguintes links simbólicos para a libunicall, libsupertone e libspandsp:
saturn:/usr/src/asterisk# ln -s /usr/local/lib/libunicall.so.0 /usr/lib
saturn:/usr/src/asterisk# ln -s /usr/local/lib/libsupertone.so.0 /usr/lib
saturn:/usr/src/asterisk# ln -s /usr/local/lib/libspandsp.so.0 /usr/lib
Configure o arquivo /etc/zaptel.conf, da seguinte maneira:
loadzone=br
defaultzone=br
span=1,0,0,ccs,hdb3
span=1,1,0,cas,hdb3
cas=1-15:1101
dchan=16
cas=17-31:1101
É possível que você precise configurar o seu zaptel.conf de outra maneira, de acordo com qual tipo de hardware você está utilizando, que span você está utilizando, sinalização, etc.

Agora, o próximo passo é reiniciar o servidor, para verificar se os módulos estão subindo na inicialização do sistema. Após reiniciar o sistema, verifique da seguinte maneira:
saturn:/usr/src/asterisk# lsmod | grep zaptel
zaptel 177412 1 wct4xxp
crc_ccitt 2240 1 zaptel
E verifique também se os canais subiram:
saturn:/usr/src/asterisk# cat /proc/zaptel/1
Span 1: TE2/0/1 "T2XXP (PCI) Card 0 Span 1" HDB3/ ClockSource

1 TE2/0/1/1 CAS
2 TE2/0/1/2 CAS
3 TE2/0/1/3 CAS
4 TE2/0/1/4 CAS
5 TE2/0/1/5 CAS
6 TE2/0/1/6 CAS
7 TE2/0/1/7 CAS
8 TE2/0/1/8 CAS
9 TE2/0/1/9 CAS
10 TE2/0/1/10 CAS
11 TE2/0/1/11 CAS
12 TE2/0/1/12 CAS
13 TE2/0/1/13 CAS
14 TE2/0/1/14 CAS
15 TE2/0/1/15 CAS
16 TE2/0/1/16 HDLCFCS
17 TE2/0/1/17 CAS
18 TE2/0/1/18 CAS
19 TE2/0/1/19 CAS
20 TE2/0/1/20 CAS
21 TE2/0/1/21 CAS
22 TE2/0/1/22 CAS
23 TE2/0/1/23 CAS
24 TE2/0/1/24 CAS
25 TE2/0/1/25 CAS
26 TE2/0/1/26 CAS
27 TE2/0/1/27 CAS
28 TE2/0/1/28 CAS
29 TE2/0/1/29 CAS
30 TE2/0/1/30 CAS
31 TE2/0/1/31 CAS
Bom, agora que os módulos subiram e os canais estão configurados com a sinalização correta, e hora de iniciar o asterisk com suporte ao chan_unicall.

Crie o arquivo unicall.conf dentro de /etc/asterisk, de acordo com o seguinte exemplo:
saturn:/usr/src/asterisk# cat /etc/asterisk/unicall.conf
[channels]

context=e1-inline
usecallerid=yes
hidecallerid=no
threewaycalling=yes
transfer=yes
cancallforward=yes
callreturn=yes
echocancel=yes
echocancelwhenbridged=yes
rxgain=0.0
txgain=0.0
relaxdtmf=yes
callgroup=1
pickupgroup=1
immediate=no
callerid=asreceived
musiconhold=default
protocolclass=mfcr2
protocolvariant=br,20,4
protocolend=cpe
group=1
channel => 1-15
channel => 17-31
Uma linha importante, é a protocolvariant=br,20,4. Esta é a especificação para a BrasilTelecom. Se o seu E1 é de outra operadora telefônica, é bem provável que seja diferente. Nas referências apresentadas no início desta documentação, existem os padrões para as outras operadoras de telefonia do Brasil. No mais, o unicall.conf é muito similar ao zapata.conf. Note que a linha context=e1-inline especifica o contexto que as ligações serão direcionadas ao entrarem pelo tronco E1.

Agora, é hora de iniciar o asterisk.
saturn:/usr/src/asterisk# asterisk
saturn:/usr/src/asterisk# asterisk -r
Asterisk 1.2.16, Copyright (C) 1999 - 2006 Digium, Inc. and others.
Created by Mark Spencer
Asterisk comes with ABSOLUTELY NO WARRANTY; type 'show warranty' for details.
This is free software, with components licensed under the GNU General Public
License version 2 and other licenses; you are welcome to redistribute it under
certain conditions. Type 'show license' for details.
=========================================================================
Connected to Asterisk 1.2.16 currently running on saturn (pid = 2732)
saturn*CLI> UC show channels
Channel Extension Context Status Language MusicOnHold
1 e1-inline Idle default
2 e1-inline Idle default
3 e1-inline Idle default
4 e1-inline Idle default
5 e1-inline Idle default
6 e1-inline Idle default
7 e1-inline Idle default
8 e1-inline Idle default
9 e1-inline Idle default
10 e1-inline Idle default
11 e1-inline Idle default
12 e1-inline Idle default
13 e1-inline Idle default
14 e1-inline Idle default
15 e1-inline Idle default
17 e1-inline Idle default
18 e1-inline Idle default
19 e1-inline Idle default
20 e1-inline Idle default
21 e1-inline Idle default
22 e1-inline Idle default
23 e1-inline Idle default
24 e1-inline Idle default
25 e1-inline Idle default
26 e1-inline Idle default
27 e1-inline Idle default
28 e1-inline Idle default
29 e1-inline Idle default
30 e1-inline Idle default
31 e1-inline Idle default
Pelo que podemos observar, os canais estão configurados e funcionando. :-) Note que você não vai mais utilizar o comando zap no asterisk, e sim, o comando UC, quando for trabalhar com unicall. Veja:
saturn*CLI> help UC
UC debug span Enables UC debugging on a span
UC destroy channel Destroy a channel
UC no debug span Disables PRI debugging on a span
UC show channels Show active UniCall channels
UC show channel Show information on a channel
Agora, configure o Asterisk de acordo com as suas necessidades. Primeiramente, configure o dialplan de uma maneira que você possa efetuar testes do circuito E1, e faça alguns testes. Verifique se você está conseguindo originar e receber ligações pelo circuito E1. Note também, que a sua dialplan não irá redirecionar as ligações para o canal Zap, e sim, para o canal Unicall. Veja este simples exemplo do extensions.conf:
[external]
exten => _0061.,1,Dial(Unicall/g1/${EXTEN:4},50)
exten => _0061.,2,Hangup()
É isso. Espero que esta documentação seja útil para você de alguma forma. Se precisar, fique à vontade para entrar em contato comigo no correio eletrônico felipe ARROBA neuwald PONTO biz, ou para postar um comentário aqui no blog.

Boa sorte!

Agradecimentos

Primeiramente à galera da PS5 Internet por ter tido compreensão do motivo do estouro (com dinamite) do tempo deste projeto. U rock guys.

Ao Carlos Cesario (ccesario), por ter feito o Makefile e testes compilando algumas versões no seu ambiente de testes, além das conversas para chegar na solução.

Ao Alexandre Abreu (anonymouz666), por ter indicado as versões corretas do spandsp e das bibliotecas.

Ao Dio Makibara (dioedu) por ter dado algumas dicas e participado da solução do problema.

À toda galera da comunidade Software Livre que vem trabalhando para o desenvolvimento do Asterisk e de soluções livres realmente funcionais e geniais como esta.

O Autor

Felipe Neuwald, contato: felipe ARROBA neuwald PONTO biz.