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.

7 comentários:

Fer disse...

Olá,
Foi lançado recentemente um PABX capaz de integrar-se ao SKYPE, permitindo que telefones comuns possam fazer chamadas para contatos SKYPE ou para outros telefones através da rede SKYPE. As chamadas podem ser realizadas, atendidas, colocadas em espera, transferidas de forma extamente igual as da rede de telefonia convencional. O custo é muito baixo e se pega rápido, rápido.
Veja: www.safesoft.com.br/pabx/

Alberto M. Sato disse...

Felipe Neuwald

Gostei muito desta sua documentação, está muito bem escrita e documentada.

Eu sou do Portal Asterisk on Line (www.asteriskonline.com.br) e gostaria de constar este artigo no nosso Portal; posso fazer isso? Inclusive até gostaria que você ajudasse contribuindo com conteúdos técnicos no nosso Portal com dicas, artigos, notícias, etc.

Em novembro estamos realizando o nosso II Encontro VoIPCenter & Asterisk on Line (www.encontrovoipcenter.com.br), que serão diversas palestras de VoIP e Asterisk. Você gostaria de participar ministrando alguma palestra?

Um grande abraços

Alberto Sato

Unknown disse...

Parabens, a tempos não via uma explicaçao tão boa, Muito Bom!!!

SrCaraDePapa disse...

Muy buen documento pero falto el uso de app_rxfax y app_txfax que con esa version de spandsp no funciona. Para mi es super util el poder recibir fax hacia mi mail o imprimirlo directamente en una impresora.

Very good guide but i feel that mess howto configure app_rxfax and app_txfax because in that version of spandsp not works, is necessary spandsp2pre26

Unknown disse...

Caro Felipe, não entendi suas opções no zaptel.conf , pois pelo que sei um link e1 pode ser CCS ou CAS. Por que vc colocou os dois ?

span=1,0,0,ccs,hdb3
span=1,1,0,cas,hdb3

Grato, Alexandre

JOAO CARLOS MOURA disse...

Parabens pela documentação. Tenho esse cenario rodando mais o problema sao as chamadas a cobrar. Voce pode me ajudar nesse sentido. Como bloquear as chamadas a cobrar usando esta modelo que voce descreveu?
Obrigado e parabens.
Joao Carlos

Flavio disse...

Muito bom e consegui finalmente colocar o asterisk no ar

Tenho uma contribuição que é o bloqueio de ligações a cobrar.

Alterar o chan_unical.c , acrescentando o seguinte após UC_EVENT_OFFERED:

case UC_EVENT_OFFERED:
/* Check for callerid, digits, etc */

if (ev->offered.parms.calling_party_category == 9){
i->blocked = TRUE;
if (option_verbose > 2)
ast_verbose(VERBOSE_PREFIX_3 "Unicall/%d Cat 9 far blocked\n", i->channel);
/*endif*/
i->blocked = FALSE;
break;
}