No artigo anterior construímos uma Distribuição Linux com Asterisk. Para acompanhar este artigo é mandatório ter o Asterisk instalado e em execução, conforme descrito no artigo Construindo uma Distribuição Linux para central telefônica VoIP.
Neste artigo serão criados um plano de discagem em dois ramais SIP utilizando Soft Phone. Será configurado um celular e um computador, porém, nada impede de utilizar/configurar um Telefone IP que aceite o protocolo SIP, o que é muito comum.
A topologia da nossa central VoIP será como abaixo:
Neste caso temos dois departamentos: o da Engenharia de Software (Ramal 1001), configurado em um computador com um software para User-Agent SIP; e o da Engenharia de Hardware (Ramal 1002), com um aplicativo User-Agent SIP instalado em um celular com Android, detalhes na tabela a seguir:
|
User-Agent SIP (UA) | |||||||
|
Departamento Eng. SW |
Departamento Eng. HW | ||||||
| Ramal | 1001 | Ramal | 1002 | ||||
| Equip. |
Notebook/ PC | Linux Mint 15 AMD64 | Kernel 3.8.0-35 | Equip. | Celular |
Motorola XT919 |
Android 4.4.2 |
| Software | Zoiper 3.325608 | Software | Softphone Zoiper 1.43 | ||||
| IP | 10.11.12.110 | IP | 10.11.12.105 |
Inicialmente, a configuração dos ramais, planos de discagem e outras regras são realizados em dois arquivos no Asterisk:
| Configurações do Plano de Discagem | /etc/asterisk/extensions.conf |
| Configurações dos Ramais SIP | /etc/asterisk/sip.conf |
| Configuração AIX (Inter-Asterisk-eXchange) | /etc/asterisk/aix.conf |
DialPlan – Plano de Discagem
O Asterisk reconhece o plano de discagem como Contextos (contexts), e fica no extensions.conf. Exemplo do nosso arquivo de configuração:
;
; SIP Interno apenas Ramal na mesma rede
;
[sip-interno]
;exten => 1001,1,Dial(SIP/1001) ; Modelo de um plano de discagem para o Ramal SIP 1001
exten => _1XXX,1,Dial(SIP/${EXTEN}) ; Apenas chamadas iniciadas com digito 1 com mais 3 digitos, e realiza chamada "Dial"
; usando protocolo SIP com o ramal digitado e representado por ${EXTEN}
exten => _1XXX,2,Hangup() ; Depois da ligacao realiza Handout no sistema
Onde “;” é comentário no arquivo de configuração, o texto sip-interno entre [ ] é uma variável global, ou melhor, um contexto global. Também há o [general] para regras e definições a se aplicar em todos os contextos criados, toda definição de extensão, plano de discagem ou regra inicia com exten = ou exten =>, seguindo o formato:
| exten => EXTENSÃO,PRIORIDADE,COMANDO(PARÂMETROS) |
A PRIORIDADE é a ordem que será seguida. A maior prioridade é o menor número, e COMANDO é uma lista de comandos e parâmetros que se deseja executar/processar. Alguns dos comandos:
Answer, Busy, Dial, Ringing, Hangout, …
Nosso extensions.conf tem apenas Dial (comando para realizar chamadas), que força apenas ramais que comecem com 1 seguido de 3 números, e com ${EXTEN} é o que será representado na ligação, e o comando Hangout (comando para encerrar chamadas).
Neste mesmo arquivo define-se regras para SMS, configuração de troncos, provedores para as ligações, URA e diversas outras configurações.
Mais informações e detalhes do Extensions em Asterisk em Asterisk config extensions.conf e dos Comandos e Parâmetros em Asterisk – Commands Call Management.
Configuração dos Ramais SIP
Neste arquivo ficaram as definições dos ramais SIP, configurações de provedores para ramais e diversas particularidades para cada ramal, como senhas, codecs e acessos do ramal. O sip.conf utilizado para os ramais 1001 e 1002 que definimos:
; ; SIP Configuration example for Asterisk ; [general] bindport = 5060 bindaddr = 0.0.0.0 disallow = all allow = alaw,ulaw,gsm language = pt_BR ; Idioma, util principalmente no caso de uso de audios customizados /usr/share/asterisk/sounds/ [ippbx-codecs](!) disallow=all ; Desabilita todos os codecs ;allow=ilbc ;allow=g729 allow=gsm ; Habilita codec gsm ;allow=g723 allow=ulaw ; Habilita codec ulaw allow=alaw ; Habilita codec alaw ; em uma linha apenas seria ;allow=!all,gsm,alaw,ulaw [1001](ippbx-codecs) callerid = EngenhariaSW<1001> secret = sw1001 host = dynamic type = friend context = sip-interno [1002](ippbx-codecs) ; Utiliza o conteudo que criamos na variavel ippbx-codecs callerid = EngenhariaHW<1002> ; O que será exibido ao chamar secret = hw1002 ; Senha para configurar este ramal SIP host = dynamic type = friend context = sip-interno ; Se aplica ao plano de discagem sip-interno criado
Um ponto muito importante e que requer uma profunda análise é a parte de codecs. Não será abordado neste artigo, mas existem diversos codecs para diversas ocasiões, alguns gratuitos e outros comerciais. Entre os populares estão G.711 (alaw), G.711 (ulaw), gsm, G.729, iLBC, Speex entre outros.
O que um codec influencia? Qualidade, processamento do Algoritmo do Codec – onde entra MIPS (Millions of Instructions per Second) e uso de DSP’s (Digital Signal Processor), MOS (Mean Opinion Score) – sendo a qualidade da voz na escada 1 (Ruim) a 5 (Excelente), largura de banda, entre outros fatores.
Em nosso projeto os testes foram feitos com uLaw, aLaw e GSM. Uma abordagem mais ampla sobre Codecs pode ser vista em Asterisk Codecs.
Ainda no sip.conf faltou a abordagem sobre o que seriam as variáveis host e type, que mereciam uma abordagem fora do arquivo.
| Host | Host ou IP de onde o ramal esta registrado, pode ser um host (voip.meudominio.com.br), um endereço IP (234.123.234.123) ou dynamic (resumidamente, a cada hora um IP é utilizado para registrar) |
| Type | Definição se o ramal pode receber chamadas (peer), realizar chamadas (user), ou receber/realizar chamadas (friend) |
Com estas configurações já podemos configurar os ramais SIP, realizar um reload no serviço do Asterisk ou reiniciar a placa.
Configurando Ramais e realizando ligações
Tanto no computador quando no celular foram utilizados o programa Zoiper, como descrito na tabela no início do artigo, mas existem outras opções como 3CX, X-Lite, Ekiga, LinPhone, Jitsi, entre diversos outros. Alguns apenas desktop, outros mobile/desktop e outros apenas para uso comercial.
Na Figura 2, utilizando o Zoiper no celular será criada uma conta com nome EmbarcadosVOIP, e os parâmetros da conta SIP adicionados são:
| Host (IP Servidor Asterisk) | 10.11.12.1 |
| Username (Ramal SIP) | 1002 |
| Password (Parametros secret em sip.conf) | hw1002 |
A Figura 3 ilustra a conta criada:
O mesmo deverá ser feito com o SoftPhone no computador e no exemplo configurei o Ramal 1001.
Será utilizado o comando asterisk para acessar o modo CLI e entrar com comandos para informações dos ramais SIP até um log final da ligação realizada.
Acessando o CLI do asterisk via terminal:
root@colibri-imx6:/etc/asterisk# asterisk -r vvvvv Asterisk 13.5.0, Copyright (C) 1999 - 2014, Digium, Inc. and others. Created by Mark Spencer <markster@digium.com> Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core 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 'core show license' for details. ========================================================================= Connected to Asterisk 13.5.0 currently running on colibri-imx6 (pid = 979) colibri-imx6*CLI>
Visualizando algumas informações e configurações que definimos:
colibri-imx6*CLI> sip show pe
peers peer
colibri-imx6*CLI> sip show peers
Name/username Host Dyn Forcerport Comedia ACL Port Status Description
1001/1001 (Unspecified) D Auto (No) No 0 Unmonitored
1002 (Unspecified) D Auto (No) No 0 Unmonitored
2 sip peers [Monitored: 0 online, 0 offline Unmonitored: 0 online, 2 offline]
colibri-imx6*CLI>
colibri-imx6*CLI> dialplan show sip-interno
[ Context 'sip-interno' created by 'pbx_config' ]
'_1XXX' => 1. Dial(SIP/${EXTEN}) [pbx_config]
2. Hangup() [pbx_config]
-= 1 extension (2 priorities) in 1 context. =-
colibri-imx6*CLI>
colibri-imx6*CLI> sip show users
Username Secret Accountcode Def.Context ACL Forcerport
1001 sw1001 sip-interno No No
1002 hw1002 sip-interno No No
Conectando o primeiro Softphone Zoiper usando o ramal 1001 (Notebook/PC), acompanhando via log do sistema e CLI Asterisk:
$ tail -f /var/log/asterisk/messages [Oct 16 01:55:09] NOTICE[1006] chan_sip.c: Received SIP subscribe for peer without mailbox: 1001 [Oct 16 01:55:09] NOTICE[1006] chan_sip.c: Received SIP subscribe for peer without mailbox: 1001
colibri-imx6*CLI> sip show peers Name/username Host Dyn Forcerport Comedia ACL Port Status Description 1001/1001 10.11.12.110 D Auto (No) No 48497 Unmonitored 1002 (Unspecified) D Auto (No) No 0 Unmonitored 2 sip peers [Monitored: 0 online, 0 offline Unmonitored: 1 online, 1 offline]
Neste caso, estamos com o 1001 (online), isso ocorre apenas quando o TelefoneIP, SoftPhone ou o User-Agent que esteja utilizando estiver na rede e tenha sido registrado no Asterisk, e esta apto a ser utilizado.
Agora conectando o segundo ramal SIP 1002(Celular):
colibri-imx6*CLI> sip show peers
Name/username Host Dyn Forcerport Comedia ACL Port Status Description
1001/1001 10.11.12.110 D Auto (No) No 48497 Unmonitored
1002/1002 10.11.12.105 D Auto (No) No 36768 Unmonitored
2 sip peers [Monitored: 0 online, 0 offline Unmonitored: 2 online, 0 offline]
[Oct 16 03:00:21] NOTICE[453]: chan_sip.c:27655 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 1001
-- Registered SIP '1001' at 10.11.12.110:32027
> Saved useragent "Z 3.3.25608 r25552" for peer 1001
[Oct 16 03:00:33] NOTICE[453]: chan_sip.c:27655 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 1001
-- Registered SIP '1002' at 10.11.12.105:54677
> Saved useragent "Zoiper rv2.8.15" for peer 1002
colibri-imx6*CLI>
Os dois ramais estão registrados, será feita uma ligação do 1001 para o 1002, abaixo o log do Asterisk CLI de uma ligação de 1:05:
colibri-imx6*CLI>
== Using SIP RTP CoS mark 5
-- Executing [1002@sip-interno:1] Dial("SIP/1001-00000000", "SIP/1002") in new stack
== Using SIP RTP CoS mark 5
-- Called SIP/1002
-- SIP/1002-00000001 is ringing
> 0x76604838 -- Probation passed - setting RTP source address to 10.11.12.105:47370
[Oct 16 03:01:57] NOTICE[497][C-00000000]: res_rtp_asterisk.c:4522 ast_rtp_read: Unknown RTP codec 95 received from '(null)'
-- SIP/1002-00000001 answered SIP/1001-00000000
-- Channel SIP/1002-00000001 joined 'simple_bridge' basic-bridge <6ccb73d6-1234-4b24-ab92-d0ba036e9cfb>
-- Channel SIP/1001-00000000 joined 'simple_bridge' basic-bridge <6ccb73d6-1234-4b24-ab92-d0ba036e9cfb>
> Bridge 6ccb73d6-1234-4b24-ab92-d0ba036e9cfb: switching from simple_bridge technology to native_rtp
> Remotely bridged 'SIP/1001-00000000' and 'SIP/1002-00000001' - media will flow directly between them
> Remotely bridged 'SIP/1001-00000000' and 'SIP/1002-00000001' - media will flow directly between them
> 0x76808c58 -- Probation passed - setting RTP source address to 10.11.12.110:8000
-- Unregistered SIP '1002'
-- Registered SIP '1002' at 10.11.12.105:54677
-- Channel SIP/1002-00000001 left 'native_rtp' basic-bridge <6ccb73d6-1234-4b24-ab92-d0ba036e9cfb>
-- Channel SIP/1001-00000000 left 'native_rtp' basic-bridge <6ccb73d6-1234-4b24-ab92-d0ba036e9cfb>
== Spawn extension (sip-interno, 1002, 1) exited non-zero on 'SIP/1001-00000000'
Na Figura 4 é ilustrado o Zoiper notificando uma ligação no notebook:
Verificando o log após encerrar a ligação:
colibri-imx6*CLI>
[Oct 16 03:07:37] NOTICE[453]: chan_sip.c:27655 handle_request_subscribe: Received SIP subscribe for peer without mailbox: 1001
-- Registered SIP '1002' at 10.11.12.105:39924
-- Unregistered SIP '1002'
-- Registered SIP '1002' at 10.11.12.105:50901
-- Unregistered SIP '1002'
-- Unregistered SIP '1001'
E o log gerado no Master.csv sobre a ligação entre os ramais:
root@colibri-imx6:~# cat /var/log/asterisk/cdr-csv/Master.csv "","1001","1002","sip-interno","""EngenhariaSW"" <1001>","SIP/1001-00000000","SIP/1002-00000001","Dial","SIP/1002","2017-10-16 03:01:53","2017-10-16 03:01:57","2016-10-16 03:03:04",70,66,"ANSWERED","DOCUMENTATION","1476586913.0",""
Na Figura 5 o Celular Ramal 1002 recebendo uma ligação do Ramal 1001, e na Figura 6 a ligação em andamento:
Algumas informações do embarcado com o Asterisk em execução durante uma ligação:
root@colibri-imx6:~# ps aux | grep asterisk
root 426 2.1 2.6 48100 13592 ? Ssl 02:58 0:24 /usr/sbin/asterisk
root 525 0.0 0.1 2724 544 pts/0 S+ 03:18 0:00 grep asterisk
root@colibri-imx6:~# free -m
total used free shared buff/cache available
Mem: 494 17 429 0 47 459
Swap: 0 0 0
Mesmo durante uma ligação o consumo de CPU e Memória do Asterisk continuou relativamente baixa.
O que foi abordado neste artigo é uma base de VoIP, SIP e Asterisk, podendo expandir o número de ramais, opções e acessos fora da rede local. Divirta-se!
Até a próxima!
Referências











