PJI11104-2016-2

De MediaWiki do Campus São José
Revisão de 13h38min de 8 de fevereiro de 2017 por Msobral (discussão | contribs) (→‎Links interessantes)
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

Endereço encurtado: http://bit.ly/pji420162

Presença: Presença

Projeto Integrador IV

Professores: Marcelo Maia Sobral (Facebook2.png Facebook) e Simara (simara.sonaglio@ifsc.edu.br)
Encontros: 2a feira/18:45, 3a feira/19:00
Atendimento paralelo: 2a e 3a feira 18:30 h
Coordenadoria pedagógica (Graciane): graciane@ifsc.edu.br (3381-2890, 3381-2842)

Objetivo Geral

  1. Implantar um PABX IP integrado com serviços de telefonia fixa e móvel convencionais.
  2. Prover a infraestrutura de rede necessária para o adequado funcionamento deste PABX IP.
  3. Integrar os serviços de telefonia com outros serviços de rede.

Ementa

O foco do Projeto Integrador está oferta de serviços ao usuário final e na convergência de serviços de telecomunicações, incluindo a integração dos serviços de telefonia fixa, móvel e VoIP. Na parte de redes de computadores, além do suporte de comunicação para a convergência de serviços, também será tratado a instalação de servidores Web, Email, Telefonia IP, administração de sistemas e usuários, compartilhamento de recursos, etc.

Bibliografia básica

  1. KUROSE, J. e ROSS, K. Redes de Computadores e a Internet: Uma abordagem top-down. Tradução da 3a edição, Addison Wesley, 2006.
  2. COLCHER, Sérgio. VOIP: voz sobre IP. Rio de Janeiro: Elsevier, 2005.

Bibliografia complementar

  1. VALLE, O. T. Administração de Redes com Linux: Fundamentos e práticas. Publicação IFSC. 2010.

Links interessantes

Provedores VoIP no Brasil

Avaliações

Aluno(a) Avaliação 1 Avaliação 2 Nota final
Lucas 7,0 8,0 7,0
Luciano 6,0 7,0 6,0
Thiago 5,0 8,0 5,0
Victor 9,0 8,0 8,0

Diário de Aula 2016-2

15/08: Apresentação da disciplina

Aula 1

Itens a serem implementados no PABX IP:

  1. Discador preditivo;
  2. Retorno de chamadas;
  3. Transferência;
  4. Permissão diferentes para grupos de ramais diferentes (contextos diferentes);
  5. URA receptiva;
  6. URA ativa;
  7. Reconhecimento de caixa postal;
  8. Correio de voz;
  9. Desvio condicional;
  10. Mensagem de espera;
  11. Criar agenda compartilhada;
  12. Blacklist;
  13. Conferência;
  14. Chamada em espera;
  15. Tarifação/bilhetagem;
  16. Associação de ramal SIP com IP do telefone IP;
  17. Bloqueio de ligação a cobrar;
  18. Limite de tempo para chamadas;
  19. Consulta à portabilidade;
  20. Horário de funcionamento;
  21. Gravação de chamadas.


Itens para integração com PABX IP:

  1. Sistema de vigilância por câmeras e envio de notificações via e-mail ou SMS;
  2. Integrar com CRM para compartilhar informações sobre contatos;
  3. Controle de acesso (tag, biométrico, etc) integrado com notificações e-mail e com possibilidade de posicionamento de câmera;
  4. Envio de e-mail quando um determinado número de chamadas em um ramal não for atendida;
  5. Envio de e-mail ou SMS quando fila de atendimento estiver muito alta;
  6. Geração e envio automáticos de relatórios com estatísticas das chamadas;
  7. Integração com servidor de backup para armazenamento de gravações das chamadas.

16/08: Instalação do Asterisk

Aula 2

Um PBX IP funciona como uma central telefônica, porém intermediando chamadas VoIP. Com isso, as chamadas são feitas de um telefone IP em direção ao PBX IP, que a encaminha ao telefone IP de destino de acordo com suas regras de discagem. A figura abaixo ilustra como funciona uma chamada VoIP típica através de um PBX IP.

Voip-call.png


Nas nossas aulas faremos uso de um PBX IP Asterisk, que é um software desenvolvido pela Digium. O Asterisk roda em computadores do tipo PC que possuem sistema operacional baseado em Linux. Sua licença é livre, o que significa que não há custo de licenciamento para utilizá-lo.

PBX IP Asterisk


Asterisk: uma solução completa de PABX baseado em software, permitindo ligar o mundo IP ao mundo da rede pública de telefonia comutada.

Características Básicas: faz tudo que um PABX pequeno e simples faz e pouco mais

  • ˆ Transferência, música de espera, siga-me, etc.
  • Conferência, correio de voz, URA, fila de chamadas, monitoramento de chamadas, integração com o Jabber (Google talk)


Asterisk-ex1.png
Exemplo de cenário de uso do Asterisk


Plano de discagem

O plano de discagem define como cada chamada deve ser processada. As instruções de processamento residem no arquivo de configuração /etc/asterisk/extensions.conf. O fluxo de processamento de chamadas pode ser visto resumidamente abaixo:

Asterisk-fluxo.png


Um exemplo de plano de discagem simples pode ser visto abaixo:

[alunos]; o nome deste contexto

# Chamadas para o número 101 são feitas via SIP para o canal "maria"
exten=>101,1,Dial(SIP/maria)
same=>n,Hangup()

# Chamadas para "teste" serão atendidas com um som de beep, seguido 
# da reprodução do arquivo de som "hello-world", em seguida outro beep e
# enfim se encerra a chamada.
exten=>teste,1,Playback(beep)
same=>n,Wait(1)
same=>n,Playback(hello-world)
same=>n,Wait(1)
same=>n,Playback(beep)
same=>n,Hangup

A estrutura do plano de discagem é composta por extensões (um termo específico do Asterisk). Cada extensão identifica um número (ou usuário) que pode ser chamado, e como essa chamada deve ser processada. A sintaxe pode ser vista abaixo:

exten=>identificador,prioridade,aplicação
  • identificador: o número ou usuário chamado
  • prioridade: a prioridade da extensão. Isso determina a ordem de execução das extensões que tratam do mesmo identificador.
  • aplicação: uma ação a ser realizada quando a extensão for processada. Por exemplo, a aplicação Dial determina que deve ser encaminhada a outro canal.

Como o processamento de uma chamada usualmente envolve uma sequência de extensões, existe uma sintaxe opcional para simplificar a declaração:

exten=>identificador,prioridade,aplicação
same=>prioridade,aplicação
  • same: declara uma nova extensão com mesmo identificador da extensão imediatamente anterior

Por fim, a prioridade (que define a ordem com que as extensões são processadas) declarada com o valor n equivale à prioridade da extensão imediatamente anterior incrementada em uma unidade:

exten=>101,1,Dial(SIP/101)
same=>n,Hangup; a prioridade aqui terá o valor 2

Canais SIP

Cada telefone SIP deve ter seu identificador cadastrado no Asterisk. O identificador pode tanto ser um número, análogo a um ramal, ou uma string alfanumérica. No terminologia do Asterisk, cada telefone SIP é chamado de canal SIP, e deve estar declarado em /etc/asterisk/sip.conf:

; Canal 2000 (um exemplo)
[2000]
defaultuser=maria ; o nome do usuário para fins de autenticação
secret=kabrum
type=friend ; pode efetuar e receber chamadas
host=dynamic ; pode conectar-se a partir de qualquer endereço IP
insecure=port,invite ; 
context=alunos ; o contexto do plano de discagem para chamadas originadas neste canal
disallow=all
allow=gsm ; habilita este codec para o João.
allow=alaw ; outro codec
allow=ulaw ; mais um codec
qualify=yes; monitora o UAC

; Canal 1000 (outro exemplo)
[1000]
defaultuser=joao ; o nome do usuário para fins de autenticação
secret=blabla
type=friend ; pode efetuar e receber chamadas
host=dynamic ; pode conectar-se a partir de qualquer endereço IP
insecure=port,invite ;
context=alunos ; o contexto no plano de discagem para chamadas originadas neste canal
disallow=all
allow=gsm ; habilita este codec
allow=alaw ; outro codec
allow=ulaw ; mais um codec
qualify=yes; monitora o UAC

Como se pode notar, a declaração de um canal SIP envolve muitos parâmetros que envolvem autenticação, controle de acesso, localização na rede, codecs e possivelmente outras capacidades. Como os valores de alguns parâmetros podem ser iguais para vários canais, o Asterisk possibilita a declaração de perfis (templates):

; Perfil alunos
[alunos](!);  a sequência "(!)" define isto como um perfil
type=friend ; pode efetuar e receber chamadas
host=dynamic ; pode conectar-se a partir de qualquer endereço IP
insecure=port,invite ; 
context=alunos ; o contexto no plano de discagem para chamadas originadas neste canal
disallow=all
allow=gsm ; habilita este codec
allow=alaw ; outro codec
allow=ulaw ; mais um codec
qualify=yes; monitora o UAC

; Canal 2000
[2000](alunos); a sequência "(alunos)" copia as definições do perfil "alunos"
defaultuser=maria ; o nome do usuário para fins de autenticação
secret=kabrum

; Canal joao
[joao](alunos)
defaultuser=joao ; o nome do usuário para fins de autenticação
secret=blabla

Experimento: comunicação entre telefones IP ou softphones por meio de um PBX IP

Para realizar esses exercícios você deve usar o Asterisk na máquina virtual rmu-asterisk. Para testar as chamadas, use um softphone em seu celular ou em um computador, e um telefone IP ou ATA.


1. Criar os seguintes canais SIP: 100 e 101 (escolha usuários e senhas para autenticação)

2. Crie um plano de discagem em que todos podem fazer chamadas para todos (isso é, 100 pode chamar 101, e vice-versa).

3. Execute o softphone, configurando-o de forma autônoma (sem registrar em um servidor SIP ou PBX IP)

4. Instale um telefone IP, configurando-o também de forma autônoma.

5. A partir do softphone faça uma chamada para a conta do telefone IP. Verifique se o telefone IP acusou o recebimento de chamada. Caso isso não tenha ocorrido, verifique seu plano de discagem.

6. Agora configure o softphone de forma que se registre no PBX Asterisk, usando uma das contas SIP criadas previamente. Faça o mesmo com o telefone IP ou ATA.

7. A partir do softphone faça uma chamada para a conta do telefone IP. Verifique se o telefone IP acusou o recebimento de chamada. Caso isso não tenha ocorrido, verifique seu plano de discagem. Em seguida faça uma chamada em sentido contrário.

8. Execute o comando rasterisk -vvv no computador do Asterisk.

9. Usando o comando sip show peers, visualize os estados dos canais SIP conhecidos pelo Asterisk.

10. Refaça uma chamada entre softphone e telefone IP, e observe o que aparece na tela do rasterisk.

11. Será possível verificar que chamadas estão em andamento no Asterisk usando o rasterisk ? Pesquise como se pode fazer isso.

12. Use o rasterisk para testar chamadas. Use o comando console dial canal_SIP para chamar um canal SIP (substitua canal_SIP pelo número a ser chamado). Ao final, execute console hangup.

13. Acrescente mais um canal SIP, editando o arquivo sip.conf. Configure o softphone para usar esse novo canal (ou o telefone IP para se associar também a esse canal SIP).

14. Teste chamadas entre os telefones usando esse novo número.

Possíveis problemas

  1. Em cada softphone ou telefone IP crie uma conta SIP, que deve ser identificada por ramal@IP_do_PBX (ex: se o PBX tiver IP 192.168.2.110, as contas de alunos podem ser 100@192.168.2.110 e 101@192.168.2.110).
  2. Após definir as contas, verifique se os telefones indicaram que elas estão disponíveis (online). Você pode fazer essa verificação também no próprio Asterisk. Neste caso execute o seguinte comando para acessar o console do Asterisk:
    sudo rasterisk -vvv
    host*CLI> sip show peers
    host*CLI> sip show peers
    Name/username              Host             Dyn Nat ACL Port     Status     
    101/101                    192.168.2.10       D          11270    OK (6 ms)
    102/102                    192.168.2.210      D          63169    OK (12 ms)
    2 sip peers [Monitored: 2 online, 0 offline Unmonitored: 0 online, 0 offline]
    
  3. Se algum dos telefones não aparecer como OK no console do Asterisk, verifique se o número de ramal e a senha configuradas no telefone são os mesmos declarados em /etc/asterisk/sip.conf. Outro teste que se pode fazer é acessar o console do Asterisk, e depois tentar ativar as contas SIP nos telefones (i.e. colocá-las para indisponível ou offline, e depois reativá-las). O Asterisk irá mostrar algumas linhas informativas sobre os registros dos telefones..
  4. Se as contas SIP estão devidamente registradas no Asterisk, mas ainda assim as chamadas não são realizadas, o problema deve estar no plano de discagem. Neste caso, acesse o console do Asterisk e tente novamente fazer a chamada. Veja se o Asterisk informa na tela o motivo para a chamada não ser realizada. Em seguida, confira se seu plano de discagem (/etc/asterisk/extensions.conf) possui uma extensão que satisfaça a chamada que se deseja realizar. Isso é, se você estiver tentando chamar o ramal SIP 101@192.168.2.110, deve haver uma extensão assim:
    exten=>101,1,Dial(SIP/101)
    same=>n,Hangup
    

DICAS ASTERISK

Comandos válidos no CLI do Asterisk:

  1. Recarregar as configurações do arquivo sip.conf: sip reload</syntaxhighlight>
  2. Recarregar as configurações do arquivo extensions.conf: dialplan reload</syntaxhighlight>
  3. Ver canais SIP criados: sip show peers</syntaxhighlight>
  4. Gerar uma ligação via console: console dial canal_sip@extensão</syntaxhighlight>

22/08/16: O protocolo SIP

Aula 3

O protocolo SIP

O protocolo SIP segue um modelo P2P (peer-to-peer), em que dois ou mais participantes, chamados de agentes, trocam mensagens com a finalidade de estabelecerem algum tipo de sessão (de voz no nosso caso, mas pode ser de video, mensagem instantânea, ou algum outro tipo de serviço). Assim, cada agente em uma sessão SIP se comporta tanto como cliente (quando envia requisições SIP) quanto servidor (quando responde a requisições SIP). A parte que inicia requisições se chama UAC (User Agent Client), e a que responde requisições é denominada UAS (User Agent Server), estando ambas implementadas nos telefones IP e similares.

Uma sessão SIP envolve a interação entre duas entidades lógicas, que no caso de chamadas VoIP são por vezes chamadas simplesmente de usuários. A diferença entre entidade lógica e agente é que a primeira é o usuário (recurso) que inicia ou recebe chamadas, e o segundo é a aplicação que contém os mecanismos para efetuar e receber chamadas - pense que a entidade seria uma pessoa, e o agente o aparelho telefônico em uma chamada telefônica convencional. Cada entidade é identificada por uma URI (Uniform Resource Indicator) SIP, semelhante a um número de telefone. Além de identificar uma entidade lógica, a informação em uma URI SIP indica a forma com que essa entidade deve ser contatada via SIP. Exemplos de URI SIP seguem abaixo:

# Uma URI simples, tipicamente usada em mensagens INVITE (que iniciam sessões SIP)
sip:1234@biloxi.example.com

# Uma URI mais elaborada, tipicamente usada em alguns cabeçalhos SIP (ex: Contact ou Refer-to)
sip:joseph.fourier@transform.org:5060;transport=udp;user=ip;method=INVITE;ttl=1;
maddr=240.101.102.103?Subject=FFT

As comunicações SIP seguem uma hierarquia, cujos níveis são:

  • Mensagens: mensagens de texto individuais trocadas entre agentes.
  • Transação: sequência de mensagens entre dois agentes iniciando com uma requisição e terminando com uma resposta final.
  • Diálogo: uma relação entre dois agentes que persiste por algum tempo, e identificada por um Call-ID.
  • Chamada: composta por todos os diálogos originados por um agente.

Sip-relation.gif
'Mensagens, transações, diálogos e chamadas

Mensagens SIP

O protocolo SIP tem uma estrutura simplificada com mensagens de pedido e resposta, assemelhando-se ao protocolo HTTP. Essas mensagens possuem a seguinte estrutura:

Linha inicial
Cabeçalho1: valor do cabeçalho 1
Cabeçalho2: valor do cabeçalho 2
...
CabeçalhoN: valor do cabeçalho N
<linha em branco>
corpo da mensagem (opcional)

A diferença básica entre pedidos e respostas SIP está na linha inicial: pedidos contém um método SIP e seus parâmetros, e respostas possuem um código de status junto com um curto texto informativo. Abaixo são mostradas duas mensagens SIP: um pedido e sua respectiva resposta. Nesse exemplo, ambas mensagens não possuem um corpo de mensagem (lembre que isso é opcional):


Sip-example1.png


Pedido:

REGISTER sips:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Bob <sips:bob@biloxi.example.com>;tag=a73kszlfl
To: Bob <sips:bob@biloxi.example.com>
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
Contact: <sips:bob@client.biloxi.example.com>
Content-Length: 0

Resposta:

SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashd92
 ;received=192.0.2.201
From: Bob <sips:bob@biloxi.example.com>;tag=ja743ks76zlflH
To: Bob <sips:bob@biloxi.example.com>;tag=37GkEhwl6
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 2 REGISTER
Contact: <sips:bob@client.biloxi.example.com>;expires=3600
Content-Length: 0

O pedido exemplificado foi uma mensagem do tipo REGISTER, que é um tipo de método SIP. Um método pode ser entendido como um comando enviado de um participante a outro. A resposta contém o status 200 OK, que significa que o pedido foi atendido com sucesso. Por fim, ambas mensagens contiveram um conjunto de cabeçalhos necessários para caracterizá-las, dentre eles Via, From, To, Call-Id, CSeq, Contact e Content-Length. As tabelas a seguir descrevem resumidamente os principais métodos e cabeçalhos SIP.

Método SIP Descrição
REGISTER Usado por um agente para notificar a rede SIP (outros agentes) sobre sua URI de contato
INVITE Usado para estabelecer sessões entre dois agentes
ACK Confirma respostas finais a requisições INVITE
BYE Termina uma sessão previamente estabelecida
CANCEL Encerra tentativas de chamadas
OPTIONS Consulta um agente sobre suas capacidades

Tabela de métodos SIP (não exaustiva ... apenas os principais métodos)


Cabeçalho SIP Descrição Obrigatoriedade Uso
Via Registra a rota seguida por uma requisição, sendo usado para que respostas sigam o caminho inverso Requisição e resposta Requisição e resposta
To Identifica o destinatário de uma requisição Requisição e resposta Requisição e resposta
From Identifica o originador da requisição Requisição e resposta Requisição e resposta
Call-Id Identifica univocamente uma chamada entre um UAC e um UAS. Requisição e resposta Requisição e resposta
CSeq Numera as requisições de uma mesma chamada de um mesmo UAC Requisição Requisição e resposta
Contact Identifica o originador da requisição ou o recurso requisitado Requisição e resposta
Max-Forwards Máximo número de saltos que a requisição pode atravessar Requisição Requisição
Content-Length Informa a quantidade de bytes do corpo da mensagem Requisição e resposta
Date Informa a data e horário de uma requisição ou resposta Requisição e resposta
Supported Lista uma ou mais opções suportadas por um UAC ou UAS Requisição e resposta
User-Agent Informa sobre o agente (o programa) originador de uma requisição
Allow Informa os métodos SIP aceitos pelo UAS Resposta
Content-type Informa o tipo de conteúdo contido no corpo da mensagem
WWW-Authenticate Informa que o UAC deve se autenticar para o UAS (e como isso deve ser feito) Resposta
Authorization Contém as credenciais para autenticar o UAC para o UAS Requisição

Tabela de cabeçalhos SIP (não exaustiva ... apenas os principais cabeçalhos)

Diagramas de chamadas

Alguns tipos de chamadas VoIP com SIP são recorrentes, estando representadas nas subseções a seguir.

Registro de agente SIP em um proxy SIP

Esta chamada ocorre entre um agente SIP e um servidor de registro SIP (SIP Registar), que está implementado tipicamente em um proxy SIP, um gateway de media, ou um PBX IP (este último incorpora as funções dos dois primeiros com as de um PBX). O registro do agente SIP tem por finalidade fazer com que o servidor de registro SIP conheça a localização do agente (endereço IP e port usado pelo UAS).

Fone 1                      Proxy SIP ou PBX IP
     |                             |
     |          REGISTER           |
     |---------------------------->|
     |      401 Unauthorized       |
     |<----------------------------|
     |          REGISTER           |
     |---------------------------->|
     |            200 OK           |
     |<----------------------------|
     |                             |

Chamada direta entre dois agentes SIP

Uma chamada direta entre dois agentes envolve uma transação INVITE, em que um agente convida o outro a estabelecer uma sessão SIP com um determinado tipo de media (ex: audio). A chamada é finalizada quando um dos agentes inicia uma transação BYE.

 Fone 1                    Fone 2
     |                        |
     |       INVITE           |
     |----------------------->|
     |    180 Ringing         |
     |<-----------------------|
     |                        |
     |       200 OK           |
     |<-----------------------|
     |         ACK            |
     |----------------------->|
     |      RTP Media         |
     |<======================>|
     |                        |
     |         BYE            |
     |<-----------------------|
     |       200 OK           |
     |----------------------->|
     |                        |

Chamada entre dois agentes SIP com intermediação de um Proxy SIP

A principal diferença entre este tipo de chamada e o anterior é o uso de um (ou mais) proxy SIP entre os dois agentes. O proxy SIP tem por finalidade ajudar na realização das chamadas, uma vez que usualmente incorpora a função de servidor de registro. Um proxy SIP encaminha chamadas para o agente chamado, ou para outro proxy mais próximo do destino, podendo aplicar regras de controle de acesso quanto a quem pode realizar chamadas para quem.

Fone 1      Proxy SIP ou PBX IP     Fone 2  
             (directmedia=yes)          
     |                |                |                
     |   INVITE       |                |                
     |--------------->|   INVITE       |                
     |  100 Trying    |--------------->|    
     |<---------------|   100 Trying   |
     |                |<---------------|                
     |                |                |     
     |                |  180 Ringing   |
     |  180 Ringing   |<---------------|                
     |<---------------|                |    
     |                |    200 Ok      |
     |     200 Ok     |<---------------|                
     |<---------------|                |                
     |     ACK        |                |                
     |--------------->|    ACK         |                
     |                |--------------->|    
     |                |                |
     |         RTP Media               |
     |<===============================>|
     |                |                |
     |                |    BYE         |
     |     BYE        |<---------------|                
     |<---------------|                |                
     |     200 Ok     |                |                
     |--------------->|     200 Ok     |                
     |                |--------------->|    
     |                |                |
     |                |                |

Chamada entre dois agentes SIP com intermediação de um gateway de media

Este caso é parecido com o anterior, que usa um proxy SIP. A diferença está na intermediação do fluxo de media, que é feita pelo gateway de media. Isso possibilita que dois agentes estabeleçam uma chamada mesmo usando codecs diferentes, pois o gateway de media fará a tradução entre codecs.

Fone 1            PBX IP              Fone 2
              (directmedia=no)        
     |                |                |
     |   INVITE       |                |
     |--------------->|   INVITE       |
     |  100 Trying    |--------------->| 
     |<---------------|  100 Trying    |
     |                |<---------------| 
     |                |   180 Ringing  |
     |   180 Ringing  |<---------------|                
     |<---------------|                |      
     |                |    200 Ok      |
     |     200 Ok     |<---------------|
     |<---------------|                |
     |     ACK        |                |
     |--------------->|    ACK         |
     |                |--------------->|
     |    RTP Media   |   RTP Media    |
     |<==============>|<==============>|
     |     BYE        |                |
     |--------------->|    BYE         |
     |                |--------------->|
     |                |    200 Ok      |
     |     200 Ok     |<---------------|
     |<---------------|                |
     |                |                |

Chamada entre dois agentes SIP com intermediação de um gateway de media e uso de re-INVITE

O uso de re-invite possibilita que o fluxo de media seja estabelecido diretamente entre os agentes SIP, caso usem o mesmo codec. Assim, evita-se a carga de processamento envolvida na intermediação pelo gateway de media. Isso é feito com o envio pelo gateway de media (representado abaixo por um PBX IP) de um novo INVITE para cada agente SIP, após a sessão SIP estar estabelecida. Esse novo INVITE contém uma descrição de media (mensagem SDP embutida no corpo da mensagem INVITE) com a localização do outro agente SIP - isso é, seu endereço IP, port UDP para a stream RTP e codec a ser usado.

Fone 1            PBX IP              Fone 2
              (directmedia=yes)        
     |                |                |
     |   INVITE       |                |
     |--------------->|   INVITE       |
     |  100 Trying    |--------------->| 
     |<---------------|  100 Trying    |
     |                |<---------------| 
     |                |  180 Ringing   |
     |  180 Ringing   |<---------------|                
     |<---------------|                |      
     |                |    200 Ok      |
     |     200 Ok     |<---------------|
     |<---------------|                |
     |     ACK        |                |
     |--------------->|    ACK         |
     |    INVITE      |--------------->|
     |<---------------|   INVITE       |
     |    200 OK      |--------------->|
     |--------------->|    200 OK      |
     |    ACK         |<---------------|
     |--------------->|    ACK         |
     |                |<---------------| 
     |                                 |
     |              RTP Media          |
     |<===============================>|
     |     BYE        |                |
     |--------------->|    BYE         |
     |                |--------------->|
     |                |    200 Ok      |
     |     200 Ok     |<---------------|
     |<---------------|                |
     |                |                |

Correção para o wireshark

O wireshark instalado no Ubuntu 14.04, como nas VM do laboratório, possui um bug que impede que se visualize a análise do fluxo de chamadas VoIP. Nessa versão, quando se seleciona no menu Telephony->VoIP Calls, e em seguida clica-se em uma das chamadas apresentadas e depois o botão Flow, o wireshark termina a execução. A solução para esse problema envolve instalar uma versão mais recente do wireshark:

sudo add-apt-repository ppa:wireshark-dev/stable
sudo apt-get update
sudo apt-get install wireshark-gtk

... e após a instalação execute wireshark-gtk.

23/08/16: Entroncamentos SIP no Asterisk

Aula 4

A empresa onde se deve implantar a infraestrutura telefônica possui uma matriz e uma filial. Ambas possuem seus próprios PBX e suas linhas telefônicas locais. Por padronização seus PBX possuem as mesmas funcionalidades. Por fim, chamadas entre ramais da matriz e filial da empresa são feitas por um tronco privativo implantado com VoIP.


A interligação entre PBX Asterisk pode ser feita via rede de dados usando os protocolos SIP ou IAX2 (porém este segundo está em desuso). No primeiro caso, o encaminhamento de uma chamada entre dois PBX funciona como uma chamada SIP usual, e isso significa que a sinalização é feita com SIP e o áudio flui em separado com RTP. No segundo caso, o protocolo IAX2 (Inter-Asterisk eXchange) encapsula tanto a sinalização quanto os fluxos de áudio, o que simplifica o estabelecimento do tronco.

Modelo-pbx-asterisk.png


Inicialmente criaremos a infraestrutura para chamadas VoIP, a qual aumentaremos gradualmente para podermos reproduzir o modelo aqui descrito.

Tronco SIP

Em um entroncamento SIP (SIP trunking), um PBX pode encaminhar chamadas através de um tronco SIP. Essas chamadas podem ser originadas de diferentes formas, tais como telefones IP ou convencionais. Entre os PBX do entroncamento, as chamadas são sinalizadas com SIP e transmitidas com RTP e algum codec.

Sip-trunk.png

A ativação de um entroncamento SIP entre dois PBX Asterisk pode ser feita seguindo o exemplo abaixo:

PBX sip.conf extensions.conf
Norte
[Sul]
type=user
secret=supersercreta
host=IP_PBX_Norte
disallow=all
allow=ulaw
;canreinvite=no
directmedia=no
context=troncoSIP
qualify=yes

[ParaSul]
type=peer
fromuser=Norte
username=Norte
secret=supersecreta
host=IP_PBX_Sul
disallow=all
allow=ulaw
;canreinvite=no
directmedia=no
qualify=yes
 [troncoSIP]
 ; Ligando para a outra central e, na sequência, o "ramal" de destino
 exten => _4XXX,1,Dial(SIP/ParaSul/${EXTEN})
 same=>n,Hangup
Sul
[Norte]
type=user
secret=supersercreta
host=IP_PBX_Sul
disallow=all
allow=ulaw
;canreinvite=no
directmedia=no
context=troncoSIP
qualify=yes

[ParaNorte]
type=peer
fromuser=Sul
username=Sul
secret=supersecreta
host=IP_PBX_Norte
disallow=all
allow=ulaw
;canreinvite=no
directmedia=yes
qualify=yes
 [troncoSIP]
 ;
 ; Ligando para a outra central e, na sequência, o "ramal" de destino
 exten => _2XXX,1,Dial(SIP/ParaNorte/${EXTEN})
 same=>n,Hangup


Outra forma de fazer um entroncamento SIP é o seguinte:

PBX sip.conf extensions.conf
Central1
[central2]
type=friend
;defaultuser=central1; Canal SIP criado na Central 1
username=central1
host=192.168.25.102 ;ip da Central 2
secret=123
context=alunos
 [alunos]
 ; Ligando para a outra central e, na sequência, o "ramal" de destino
 exten => _4XX,1,Dial(SIP/central2/${EXTEN})
 same=>n,Hangup
Central2
[central1]
type=friend
;defaultuser=central2; Canal SIP criado na Central 2
username=central2
host=192.168.25.101 ;ip da Central 1
secret=123
context=alunos
 [alunos]
 ;
 ; Ligando para a outra central e, na sequência, o "ramal" de destino
 exten => _2XX,1,Dial(SIP/central1/${EXTEN})
 same=>n,Hangup

Atividade: estabelecendo chamadas entre diferentes PBX Asterisk

Nesta atividade, vamos realizar chamadas entre softphones registrados em diferentes PBX Asterisk. Isso implica definir um plano de numeração para os ramais da empresa. Sendo assim:

  1. Defina esse plano de numeração
  2. Crie as regras de discagem entre ramais da empresa
  3. Teste as chamadas
  4. Investigue a comunicação através do tronco (use o wireshark)


29/08/16: O transporte do audio nas chamadas VoIP

Aula 5

SDP (Session Description Protocol)

Ao iniciar uma chamada com SIP, a negociação de midia a ser transmitida é especificada no corpo da mensagem INVITE. O formato da especificação é descrito pelo protocolo SDP (Session Description Protocol), contendo as seguintes informações:

  • Endereço IP
  • Perfil RTP (usualmente RTP/AVP)
  • Número de port do protocolo de transporte (usualmente UDP)
  • Tipo de midia (audio, video, e possivelmente outros)
  • Esquema de codificação de midia (o tipo de codec a ser usado)
  • Assunto da sessão (uma descrição)
  • Horários de início e fim
  • Identificação do contato da sessão

Assim como SIP, SDP codifica suas informações em texto simples. Uma mensagem SDP é composta por linhas de texto chamadas de campos, cujos nomes são abreviados por uma única letra. Os campos de uma mensagem SDP são:

Sdp-fields.png
Tabela de campos SDP


Um exemplo de mensagem SDP segue abaixo:

Sdp-msg.png


A descrição completa de cada campo, e os possíveis valores que ele pode assumir, pode ser lida nas referências (em especial, este capítulo de livro).

Protocolo RTP


O protocolo RTP (Real-Time Protocol) foi desenvolvido para possibilitar o transporte de datagramas de tempo-real contendo voz, video, ou outro tipo de dados, sobre IP. Tanto H.323 quanto o modelo SIP usam RTP para o transporte de media, tornando-o o padrão mais comum para comunicações desse tipo na Internet. Apesar desse protocolo não prover qualidade de serviço (i.e. ele não possui mecanismos para atender tais tipos de requisitos), ele torna possível a detecção de alguns dos problemas introduzidos por uma rede IP, tais como:

  • Perda de pacotes
  • Atraso fim-a-fim variável
  • Chegada de pacotes fora de ordem


Esses problemas não são novidade ... nós já os discutimos nas aulas sobre transmissão de dados multimidia. O que há de novo é um protocolo que dá subsídios para as técnicas que buscam atender requisitos de qualidade de serviço. Esses subsídios são informações providas pelo RTP para ajudar a identificar os problemas citados acima, as quais são:

  • Identificação do tipo do conteúdo que está sendo carregado (codec): isso informa ao receptor como ele deve decodificar o conteúdo transportado (ver esta tabela de identificadores de codec usados pelo RTP)
  • Numeração de sequência: essa informação possibilita identificar pacotes perdidos ou fora de ordem.
  • Marcação de tempo (timestamp): com isso é possível efetuar o cálculo de variação de atraso e implementar algum mecanismo de sincronização com a fonte (ex: atraso de reprodução).


Essas informações fazem parte da PDU RTP, como se pode ver a seguir:

Localização do RTP na camada de transporte Cabeçalho RTP
Rtp1.png Tip-Rtp-header.png


Tip-Rtp-avp.png
Perfil RTP/AVP, com codecs e seus códigos numéricos

RTCP

Além do RTP, o protocolo auxiliar RTCP (Real-Time Control Protocol, também definido na RFC 3550) foi definido para o monitoramento da entrega dos pacotes (recepção da stream). Com esse protocolo, os participantes de uma sessão de media podem fazer o intercâmbio de relatórios e estatísticas. Cada tipo de relatório é transportado por um tipo de pacote RTCP. O uso de relatórios possibilita o feedback sobre a qualidade da comunicação, incluindo informações como:

  • Número de pacotes enviados e recebidos
  • Número de pacotes perdidos
  • Jitter (variação de atraso)

Os cinco tipos de relatórios são:

  • Relatório do transmissor (Sender Report - SR)
  • Relatório do receptor (Receiver Report - RR)
  • Descrição da fonte (Source Description - SDES)
  • Bye
  • Específico da aplicação (Application Specific - APP)

Como o tráfego RTCP é puramente overhead, o protocolo foi projetado para que seu consumo da capacidade da rede seja constante, não importa quantos participantes da sessão de media existam. A ideia é que quanto mais participantes houver, menos frequentemente os relatórios RTCP são enviados. Por exemplo, se em uma conferência houver somente dois participantes, os relatórios podem ser enviados a cada 5 segundos. Se houver quatro participantes, os relatórios são enviados a cada 10 segundos. Com isso o consumo de banda para relatórios se mantém constante e previsível.

Atividade 1

Essa atividade busca ilustrar os fluxos RTP com um exemplo:

  1. Estabeleça uma chamada VoIP entre dois softphones usando o Asterisk como intermediário.
  2. Execute o wireshark no computador onde roda o Asterisk, e ative a captura de datagramas UDP.
  3. Procure no wireshark as mensagens SIP trocadas entre os softphones e o Asterisk. Observe os cabeçalhos Call-Id, From, To, Via, CSeq das mensagens SIP. Quais mantiveram seus valores ao longo de todas transações, e quais mudaram ?
  4. As mensagens SIP tinham por objetivo estabelecer uma chamada de áudio entre os softphones. Essa informação está no corpo das mensagens INVITE, o qual possui uma mensagem de outro protocolo chamado SDP. Observe as informações contidas na mensagem SDP, e identifique:
    • O tipo de midia a ser transmitida
    • O endereço IP, port e protocolo de transporte de midia a serem usados para essa transmissão.
    • Os codecs que podem ser usados para a transmissão de midia.
  5. A negociação sobre a transmissão de midia se concretiza na mensagem 200 OK em resposta ao INVITE. Observe que ela também contém uma mensagem SDP. Observe as informações ali contidas e compare-as com as que havia no INVITE. Como essa resposta complementa o que foi informado no INVITE ?
  6. Uma vez estabelecida a chamada, ocorre a transmissão da midia. Qual o protocolo utilizado ? Que informações ele contém em seu cabeçalho ? Descubra essas informações observando o que mostra o wireshark.
  7. Experimente estabelecer chamadas com diferentes codecs, e observe a negociação realizada com SDP.
  8. Observe os pacotes RTP capturados pelo Wireshark. Selecione alguns deles e investigue as informações contidas em seu cabeçalho. Procure identificar o codec usado e as marcações de tempo.
  9. Observe os relatórios RTCP:
    • Que tipos de relatórios são enviados ?
    • Com que frequência esses relatórios são transmitidos ?
    • Que informações esses relatórios contêm ?


Atividade 2

Comentar o parâmetro canreinvite=no no arquivo sip.conf e investigar a causa da falta de áudio nas chamadas detectado na última aula.

30/08/16: O transporte do audio nas chamadas VoIP

Aula 6

Continuação da Aula 5

05/09/16: VoIP e NAT

Aula 7

A existência de um ou mais tradutores NAT entre telefones dificulta o estabelecimento de chamadas. Isso porque o NAT modifica o endereço IP e port (UDP ou TCP) de origem de pacotes que viajam da rede interna para a externa, o que fica inconsistente com o que foi negociado na chamada com SDP. Há alguma abordagens para contornar esse problema:

  • Informando o endereço IP e port UDP que de fato aparecerão para a rede externa: proposta do STUN e ICE, porém nem sempre funciona (STUN) ou é complicado (ICE).
  • Usando gateway de midia: abordagem mais comum, por ser mais fácil de ser implantada e dar bons resultados.

Usando o Asterisk para contornar NAT

O Asterisk pode ajudar a viabilizar a comunicação com telefones VoIP que estão atrás de gateways NAT. Na definição de cada canal SIP devem-se incluir as opções:

nat=yes
qualify=yes
directmedia=no

Aqui tem uma boa explicação sobre o que fazem essas opções.

Se for o Asterisk que está atrás de NAT, então deve-se configurar seu IP válido, de forma que o PBX possa informá-lo nas mensagens SDP para as streams de audio. Para isso, deve-se acrescentar em sip.conf na seção [general] [1]:

[general]
externip=IP_público

; devem-se informar as redes privativas onde está o Asterisk (pode haver mais de uma ... basta repetir o 
; atributo localnet para cada subrede). Isso é importante para que o Asterisk saiba quando usar o IP
; público (para telefones fora de sua rede) ou privativo (telefones dentro de sua rede) nas mensagens
; SDP que especificam o IP e port UDP para as streams RTP.
localnet=prefixo/máscara


OBS: isso só funciona quando o Asterisk está no caminho da stream de áudio. No caso de telefones VoIP que conversam diretamente, só resta STUN ou alguma outra técnica do tipo ...

Atividade - Softphone atrás de NAT

Cenário1-Aula7.png

  1. A comunicação entre canais SIP internos a cada PABX IP de cada aluno deve estar funcionando corretamente (completamento e áudio) tanto com REINVITE como SEM REINVITE;
  2. A comunicação entre canais SIP de diferentes PABX IP deve estar funcionando corretamente tanto com REINVITE como SEM REINVITE;
  3. Cada aluno deve montar uma estrutura de rede que será apresentada em aula utilizando AP TP-LINK;
  4. Fazer as devidas configurações para que tenha áudio nas comunicações entre os diferentes PABX IP.


Dica para testar o áudio

Para testar o áudio com apenas um softphone logado você pode criar uma extension no arquivo extensions.conf que toque uma música. Segue abaixo:

exten=>999,1,Answer exten=>999,n,Playback(tt-monkeys) exten=>999,n,Hungup()</syntaxhighlight>

06/09/16: VoIP e NAT

Aula 8

Atividade - Asterisk atrás de NAT

Cenário1-Aula8.png

  1. Configurar a rede indicada na figura acima;
  2. Abrir o Wireshark na máquina onde o Asterisk está instalado;
  3. Tentar registrar um usuário SIP usando o softphone mostrado na figura. Foi possível? A máquina Asterisk recebeu alguma solicitação?
  4. Fazer as configurações necessárias para que o Asterisk receba as as solicitações vindas do softphone;
  5. Uma vez o usuário estando registrado, fazer testes de chamadas e verificar se há áudio.

12/09/16: Funções de PBX

Aula 9

O tema do projeto

Estamos em um momento em que podemos partir para cenário a ser implantado. Antes de prosseguir no estudo da infraestrutura VoIP com Asterisk e SIP, precisamos definir claramente a estrutura do projeto, e as funcionalidades e serviços que devem existir. Assim retomamos a discussão do início do semestre, quando se pensou no tema do projeto.


O objetivo desta aula é revisar o projeto, de forma a delimitar sua infraestrutura, sua finalidade e consequentemente seus serviços.

Cenário-pji4.png

Funções usando o plano de discagem

Para implantar funcionalidades conhecidas ou novas no Asterisk usando o plano de discagem, devem-se conhecer alguns recursos avançados. Aqui são apresentados quatro deles: extensões especiais, aplicações, padrões de extensões e variáveis.

Aplicações

As aplicações são usadas no plano de discagem. Assim, o processamento de uma chamada se faz pela execução sucessiva de aplicações, de forma a se obter o efeito desejado.

Dial

Encaminha a chamada para um destino.

Exemplo:

exten=>_1XXXX,1,Dial(SIP/${EXTEN})
same=>n,hangup
Background

Toca um arquivo de som como música de fundo. Esse arquivo deve estar em /usr/share/asterisk/sounds, e ser codificado com codec PCM ou WAV.

Exemplo:

exten=>666,1,Answer
same=>n,Background(hello-world)
same=>n,Hangup
Playback

Toca um arquivo de som. A diferença em relação a Background é que Playback devolve o controle ao Asterisk (i.e. ao plano de discagem) somente após tocar todo o arquivo. Esse arquivo deve estar em /usr/share/asterisk/sounds, e ser codificado com codec PCM ou WAV.

Exemplo:

exten=>666,1,Answer
same=>n,Playback(hello-world)
same=>n,Hangup
Wait

Força uma espera durante o processamento da chamada.

Exemplo:

exten=>666,1,Answer
same=>n,Playback(hello-world)
same=>n,Wait(1)
same=>n,Playback(beep)
same=>n,Hangup
Answer e Hangup

Answer atende uma chamada. Hangup termina uma chamada.

Exemplo:

exten=>666,1,Answer
same=>n,Playback(hello-world)
same=>n,Hangup
GoTo

Pula para um contexto (opcional), extensão, prioridade específica. Exemplo:

exten=>100,1,GoTo(vendas,s,1)
GoToIf

Trata-se do comando GoTo condicional. Sua sintaxe é:

GoToIf(condição?[rótulo se verdade]:[rótulo se falso])

Os rótulos podem assumir a forma:

 [[contexto],extensão,]prioridade

Exemplo:

[alunos]

exten=>6111,1,GoToIf($["${CALLERID(num)}" != "6112"]?2:4)
same=> n,Dial(SIP/6111,30)
same=> n,Hangup
same=> n,Answer
same=> n,Playback(hello-world)
same=> n,Hangup
Set

Modifica o valor de uma variável.

Exemplo:

exten=>666,1,Set(Tentativas=1)
same=>2,Dial(SIP/666,10)
same=>3,Set(Tentativas=${Tentativas}+1)
same=>4,GoToIf($[${Tentativas} < 2]?2:5)
same=>5,Hangup
Log

Grava um texto qualquer no log do Asterisk.

Exemplo:

exten=>666,1,Log(DEBUG,"Chamada para 666")
same=>n,Dial(SIP/666,10)
same=>n,Hangup
NoOp

Não faz nada, sendo útil para depurar o plano de discagem. Exemplo:

exten=>100,1,NoOp(${CONTEXT})

Padrões de extensões

Extensões podem ser representadas de forma compacta com padrões de extensões. Com esse recurso, muitas extensões podem ser atendidas com um único conjunto de regras, evitando um plano de discagem repetitivo. Por exemplo, se uma empresa possui ramais entre 100 e 199, o plano de discagem pode ser escrito assim:

exten=>_1XX,1,Dial(SIP/${EXTEN})
same=>n,Hangup

A extensão _1XX contida na primeira linha está escrita como um padrão (pattern), pois inicia com o caractere _. Os caracteres que seguem _ indicam cada dígito que deve aparecer para satisfazer essa extensão. Nesse exemplo, deve aparecer 1 seguido de dois dígitos quaisquer entre 0 e 9 (é esse o significado do caractere X). Desta forma, essa extensão atende qualquer número entre 100 e 199. Por fim, o número de fato chamado é armazenado na variável ${EXTEN}, que pode assim ser usada dentro da regra de discagem.

Alguns caracteres têm significado especial em padrões, como mostrado no exemplo (caractere X). A tabela abaixo lista esses caracteres:

Caractere Descrição
X Qualquer dígito entre 0 e 9
Z Qualquer dígito entre 1 e 9
N Qualquer dígito entre 2 e 9
[13-6] Qualquer dígito entre os colchetes (no exemplo, 1,3,4,5,6)
. Qualquer sequência de um ou mais dígitos
! Qualquer sequência de zero ou mais dígitos

Variáveis

O uso de variáveis no Asterisk possui funcionamento semelhante àquele encontrado nas linguagens de programação, permitindo ao “programador” utilizar variáveis já definidas pelo Asterisk bem como definir suas próprias variáveis. As definições das variáveis devem ser feitas no arquivo extensions.conf.

A sintaxe para trabalhar com variáveis no Asterisk é semelhante a do c-shell, porém as variáveis definidas pelo usuário não são sensíveis a caixa, ou seja, VAR e var referem-se à mesma variável.

  • Para definir uma variável: VAR=valor
  • Para obter o valor de uma variável: ${VAR}

Existem três tipos de variáveis:

  • Variáveis globais: Variáveis que estarão disponíveis a todos os canais e contextos em um plano de discagem. Essas devem ser declaradas dentro do contexto [globals] existente no arquivo extensions.conf ou utilizando a função GLOBAL() no plano de discagem.
  • Variáveis do canal: Variáveis que estão associadas especificamente com uma unica ligação. São definidas durante a chamada e só estão disponíveis para os participantes desta chamada. O Asterisk já define algumas variáveis específicas ao canal (Ex: ${CALLERID(num)}).
  • Variáveis de ambiente: São as variáveis obtidas do sistema operacional. Estas são referenciadas através do comando ENV. Ex: ${ENV(path)}.

Abaixo se pode ver um exemplo de plano de discagem que usa variáveis:

[globals]
; definicao de uma variavel global
VENDAS=SIP/6112

[alunos]
; definicao de uma variavel global atraves do comando Global e aplicacao Set
exten=> 6666,1,Set(GLOBAL(COMPRAS)=SIP/6113)
exten=> 6666,2,NoOp(${GLOBAL(COMPRAS)})

; definicao de uma variavel especifica ao canal
exten=> 7777,1,Set(teste=1)
exten=> 7777,n,NoOp(${teste})
exten=> 7777,n,Set(teste=$[${teste} + 1])
exten=> 7777,n,NoOp(${teste})
exten=> 7777,n,Hangup

Extensões especiais

Além das extensões criadas pelo usuário, o Asterisk apresenta algumas extensões especiais, tais como:

  • s (start): tem por objetivo tratar qualquer chamada que entre em um contexto e que não tenha um destino específico.
  • i (invalid): tem por objetivo tratar entradas inv ́lidas em um menu interativo
  • t (timeout): Em um menu interativo intercepta a chamada caso o usuário não forneça uma entrada dentro de um período de tempo estipulado.

Atividades

  1. Faça com que chamadas para números externos à sua central recebam o prefixo 048.exten=>_NXXXXXXX,1,Dial(SIP/qualquer_tronco_externo/048${EXTEN})</syntaxhighlight>
  2. Faça com que números externos sempre saiam pela operadora Pastel Telecom, que tem um prefixo 66. Ex: se a chamada for para 0144935221111, o número chamado deve ser 0664935221111.exten=>_0ZZZZZXXXXXXX,1,Dial(SIP/qualquer_tronco_externo/066${EXTEN:3})</syntaxhighlight>
  3. Façam com que chamada para celulares, que têm primeiro dígito entre 6 e 9, sejam sempre encaminhados por um determinado tronco.exten=>_[6-9]XXXXXXX,1,Dial(SIP/qualquer_tronco_gsm/${EXTEN})</syntaxhighlight>
  4. Faça com que chamadas que saiam de sua central tenha como identificador de chamada o número da central e o nome do originador da chamada. Dica: ver a variável predefinida CALLERID do Asterisk. Dica

Alterar chamador e verificar alteração: exten=>_2XXX,1,set(CALLERID(name)=um_nome) exten=>_2XXX,n,set(CALLERID(num)=048${EXTEN}) exten=>_2XXX,n,NoOp(${CALLERID(all)}) exten=>_2XXX,n,Dial(SIP/${EXTEN}) ;Discar para a extensão normalmente </syntaxhighlight>

  1. Crie uma extensão que, caso não seja atendida em 15 segundos, uma gravação seja apresentada comunicando que o ramal chamado está indisponível. Dica:: ver os comandos Dial e Playback.exten=>_2XXX,1,Dial(SIP/${EXTEN},15)

same=>n,Playback(audio_qualquer)</syntaxhighlight>

  1. Crie outra extensão que, se não for atendida em 15 segundos, seja encaminhada para outro ramal (ex: telefonista).exten=>2001,1,Dial(SIP/2001,15)

same=>n,Dial(SIP/2000)</syntaxhighlight>

  1. Crie outra extensão cujas chamadas estejam limitadas em 60 segundos após o atendimento. Se esse tempo for excedido, dois beeps devem ser apresentados (um beep por segundo) e chamada é encerrada. Dica: ver o comando Dialexten=>_2XXX,1,Dial(SIP/${EXTEN},15,L(60000))

same=>n,Playback(beep) same=>n,wait(1) same=>n,Playback(beep)</syntaxhighlight>

  1. Modifique o exercício anterior para que os dois beeps sejam apresentados 10 segundos antes da chamada exceder o tempo limite de 60 segundos.exten=>_2XXX,1,Dial(SIP/${EXTEN},15,L(60000:50000:2000))</syntaxhighlight>
  2. Modifique a extensão do exercício 6 para que o encaminhamento para outro ramal ocorra somente se o primeiro ramal estiver ocupado. Se estiver indisponível, a chamada deve ser terminada. Dica: ver o comando GotoIf<exten=>101,1,Dial(SIP/101,15)

exten=>101,n,Gotoif("${DIALSTATUS}"="BUSY"?nocupado:ocupado) exten=>101,n(ocupado),Dial(SIP/100) exten=>101,n(nocupado),Noop(O status é ${DIALSTATUS}) exten=>101,n,hangup</syntaxhighlight>

  1. Crie uma extensão que está associada a um grupo de ramais. Uma chamada para essa extensão é encaminhada simultaneamente para todos os ramais do grupo. O primeiro ramal que atender captura a chamada exten=>999,1,Dial(SIP/2000&SIP/2001)

exten=>999,n,Hangup</syntaxhighlight>

  1. Crie uma extensão que, ao receber uma chamada, apresente uma mensagem dizendo digite um ramal, e em seguida espere até 10 segundos para que um ramal seja digitado. Se nenhum ramal for digitado, a chamada é desviada para a telefonista.exten=> 999,1,Answer

exten=> 999,n,background(tt-monkeys) exten=> 999,n,waitexten(10)

exten=> t,1,Dial(SIP/100) exten=> t,n,hangup</syntaxhighlight>

  1. Crie uma extensão que reproduza um áudio três vezes usando o conceito de contador (uma variável que controle a quantidade de repetições).exten=> 998,1,Set(cont=0)

exten=> 998,n,NoOp(O valor de cont é igual a ${cont}!!!) exten=> 998,n(executa),playback(hello-world) exten=> 998,n,Set(cont=$[${cont}+1]) exten=> 998,n,NoOp(O valor de cont é igual a ${cont}!!!) exten=> 998,n,Gotoif($[${cont}<3]?executa:desliga) exten=> 998,n(desliga),Hangup</syntaxhighlight>

  1. Crie uma extensão que, ao receber uma chamada, apresente uma mensagem de voz informando a data e horário no seguinte formato: dia, mês, dia da semana, hora, minuto, segundo. exten=> 995,1,Answer

same=>n,SayUnixTime(dBAHMS) same=>n,Hangup</syntaxhighlight>

  1. Crie uma extensão que somente pode receber chamadas dentro de determinados horários. Fora desses horários uma gravação deve ser reproduzida.Ver GotoIfTime
  2. Crie uma extensão que, enquanto se espera que a chamada seja atendida, o chamador escute uma música. Dica: ver a funcionalidade de música em espera (music on hold).
  3. Chamadas para números externos devem ser feitas primeiro digitando-se 0 e, após escutar o tom de linha livre, digitando-se o número externo. Faça com que seu plano de discagem apresente o tom de linha livre somente se a linha externa estiver de fato disponível. Caso ela esteja em uso, um sinal de ocupado deve ser apresentado. Dica: veja a aplicação ChanIsAvail.
  4. Crie um serviço que possibilite saber se um determinado ramal SIP está disponível. Esse serviço deve retornar uma mensagem de voz informando o estado do ramal em questão (disponível, ocupado, indisponível).

13/09/16: Funções de PBX

Aula 10

19/09/16: Funções de PBX

Aula 11

20/09/16: Funções de PBX

Aula 12

26/09/16: Funções de PBX: URA e correio de voz

Aula 13

O que é uma URA (Unidade de Resposta Audível) ? Clique na imagem abaixo ...

Ura-tabajara.png
URA Tabajara

Uma URA implementa um menu audível para auto-atendimento. Sua construção é feita toda no plano de discagem, como se pode ver no exemplo abaixo:

[default]
exten => 666,1,Goto(ura,s,1) 

[ura]
exten => s,1,Answer
exten => s,2,NoOp(Ligação entrou na URA)
exten => s,n,Background(/var/lib/asterisk/sounds/benvindo)
exten => s,n,NoOp(Digite a opção/1-suporte/2-comercial/3-financeiro)
exten => s,n,WaitExten(6); caso nada tenha sido digitado durante a mensagem "benvindo", espera mais 6 segundos no máximo

exten => 1,1,NoOp(Chamada foi para Suporte)
same => n,Dial(SIP/2402,60)
same => n, Hangup

exten => 2,1,NoOp(Chamada foi para Comercial)
same => n,Dial(SIP/2801,60)
same => n, Hangup

exten => 3,1,NoOp(Chamada foi para Financeiro)
same => n,Dial(SIP/2000,60)
same => n, Hangup

exten => i,1,NoOp(Extensão inválida)
same => n,Play(beep)
same => n,GoTo(s,3); volta para o menu

exten => t,1,NoOp(Tempo esgotado)
same => n,Dial(SIP/3401,60)
same => n,Hangup

A URA é composta por mensagens de voz, que instruem o usuário sobre o que ele pode fazer (isto é, apresentam as opções), e músicas, que o entreteem (!?) enquanto aguarda uma operação ser realizada. Assim, para criar uma URA minimamente funcional são necessários esses arquivos de voz. Para gravá-los, pode-se criar uma extensão especial, por exemplo, que atenda por 9005nome_de_um_arquivo. Ao chamar essa extensão, pode-se pronunciar a mensagem de voz assim que o Asterisk atender. Para encerrar a mensagem, deve-se digitar #. O arquivo de voz resultante estará no diretório /var/lib/asterisk/sounds, ou em qualquer outro diretório especificado na aplicação record.

exten=>_9005.,1,answer()
same=>n,record(/var/lib/asterisk/sounds/${EXTEN:4}.wav,5,t)
same=>n,playback(/var/lib/asterisk/sounds/${EXTEN:4})
same=>n,hangup()

Para a implantação de uma URA (e de muitas outras funções típicas de PBX) em um PBX Asterisk, é necessário conhecer os recursos que ele oferece. Dentre esses recursos, há aplicações e variáveis, já estudados em aulas anteriores, e características (features). Hoje serão vistos alguns desses recursos, que usaremos para implantar uma URA.

Correio de voz


A função de correio de voz possibilita a gravação de mensagens de voz para usuários do PBX. Um usuário é identificado por um número de caixa postal, que usualmente corresponde ao seu número telefônico. A ativação dessa função envolve duas configurações no PBX:

  1. Devem-se declarar as caixas postais, com seus números, senhas, identificação de usuário e email. Isso se faz no arquivo voicemail.conf.
  2. Deve-se criar a lógica de discagem que possibilite a gravação de mensagens de voz. Isso se faz no plano de discagem, e a aplicação para gravar uma mensagem se chama voicemail.


1- Editar o arquivo voicemail.conf e deixar apenas as seguintes linhas:

[general] format=wav ;Formato do áudio a ser armazenado maxmsg=100 ;Máximo de mensagens gravadas na pasta minsecs=3 ;Tempo mínimo da mensagem maxsilence=10 ;Período máximo de silêncio silencethreshold=128 ;Limiar para detecção de silêncio. O default é 128 maxlogins=3 ;Número máximo de tentativas de login por usuário

[default] 2000 => 1234,um_nome,um_email</syntaxhighlight>

2- Editar o arquivo extensions.conf, direcionar as chamadas não atendidas de uma extensão para o correio de voz e criar uma segunda extensão que dê acesso às caixas de mensagens:

VOICEMAIL MENU

exten => 999,1,VoiceMailMain() exten => 999,2,HangUp() exten => 999,3,PlayBack(vm-goodbye) exten => 999,4,HangUp()

RAMAL 100 + VOICEMAIL (FOR TEST ONLY)

exten => 2000,1,Dial(SIP/2000,5) exten => 2000,2,VoiceMail(2000) </syntaxhighlight>


3- Reloads:

dialplan reload voicemail reload </syntaxhighlight>

27/09/16: Outras funções de PBX

Aula 14

Após experimentar a implantação de um correio de voz e uma URA, podem-se conhecer outras possíveis funções de PBX existentes no Asterisk, tais como:

Essas funções podem ser úteis na infraestrutura de telefonia a ser implantada na primeira etapa do projeto. Como exemplo, algumas delas são apresentadas a seguir.

Música de espera

O Asterisk permite o uso de MP3 como música de espera, porém MP3 são arquivos complicados de se trabalhar pois requerem o uso de aplicações externas para que possam ser reproduzidos, como por exemplo mpg123. Seu funcionamento também pode não agradar muito já que em alguns casos a música pode ser reproduzida em alta rotação além de elevar a carga de processamento da máquina no caso de soluções de grande porte.

A partir da versão 1.2 do Asterisk se sugere não mais usar o mpg123. O melhor é converter arquivos MP3 para um formato que o Asterisk trate nativamente, como por exemplo, wav ou pcm (μLaw). A ferramenta ffmpeg pode ser usada para converter arquivos MP3 para WAV ou PCM.

# convertendo o arquivo musica.mp3 para musica.wav e musica.pcm
ffmpeg -i musica.mp3 -ar 8000 -ac 1 -ab 64 musica.wav -ar 8000 -ac 1 -ab 64 -f mulaw
musica.pcm -map 0:0 -map 0:0

Os arquivos de música devem ficar em um diretório especificado para cada contexto, conforme definido no arquivo musiconhold.conf:

# configuracao no arquivo musiconhold.conf
[alunos]
mode=files
directory=/var/lib/asterisk/moh
sort=random
# deve-se colocar os arquivos wav e/ou pcm no diretorio especificado acima

Para testar a música em espera no plano de discagem, pode-se usar a aplicação MusicOnHold:

exten=>667,1,Set(CHANNEL(musicclass)=alunos)
same=>n,Answer
same=>n,MusicOnHold()
same=>n,Dial(SIP/667)
same=>n,Hangup

Filas de atendimento

Amplamente utilizadas nos sistemas de 0800. A configuração é feita no arquivo queues.conf:

[fila-suporte]
musicclass=default
strategy=ringall; roundrobin, rrmemory
timeout=10
wrapuptime=30
periodic-announce = em-breve
periodic-announce-frequency=60
member=>SIP/6111
member=>SIP/6112

No plano de discagem a fila de atendimento pode ser usada da seguinte forma:

[suporte]
exten=> s,1,Set(CHANNEL(musicclass)=suporte)
exten=> s,2,Playback(bem-vindo)
exten=> s,3,Queue(fila-suporte)

Captura de chamadas

A captura possibilita que se puxe uma chamada de um colega no mesmo grupo de chamadas. Isso evita que se tenha que levantar para atender um telefone do seu vizinho que não para de tocar. A captura pode ser feita discando *8 (isso pode ser alterado no arquivo features.conf).


Call-capture.png
Captura de chamadas - figura obtida de: Flávio Gonçalves. Guia de Configuração para Asterisk PBX, 5a edição.

Para habilitar a captura de chamadas é suficiente definir a que grupo de chamadas cada canal pertence (parâmetro callgroup), e de que grupos se pode capturar chamadas (parâmetro pickupgroup). No caso de canais SIP isso fica em sip.conf:

[joaozinho]
callgroup=1
pickupgroup=1,2
...

Estacionamento de chamadas

O estacionamento de chamadas é feito no arquivo features.conf fazendo uso dos seguintes parâmetros:

  • parktext: Extensão utilizada para fazer o estacionamento de chamadas, após invocá-la o sistema irá indicar em qual posição a chamada atual foi estacionada.
  • ˆ parkpos: Define o número de vagas para o estacionamento de chamadas.
  • context: Define o nome do contexto para o estacionamento de chamadas. É necessário incluir este contexto nos demais contextos que poderão usar o estacionamento de chamadas.
  • parkingtime: Se definida, indica o tempo máximo que uma chamada poderá ficar estacionada. Se este tempo estourar o sistema irá fazer uma ligação para o ramal que estacionou a chamada em questão.


Parking-calls.png
Estacionamento de chamadas - figura obtida de: Flávio Gonçalves. Guia de Configuração para Asterisk PBX, 5a edição.

Abaixo se pode ver um exemplo de plano de discagem que usa estacionamento de chamadas:

[vendas]

include=>parkedcalls

exten=>6200,1,Dial(SIP/6200,30,tT)
exten=>6200,n,Hangup

03/10/16: Conexão com a PSTN e PABX legado

Aula 15

A rede pública de telefonia comutada (do inglês Public switched telephone network ou PSTN) é o termo usado para identificar a rede telefônica mundial comutada por circuitos destinada ao serviço telefônico. A PSTN é administrada pelas operadoras de serviço telefônico e inicialmente foi projetada como uma rede de linhas fixas e analógicas, porém atualmente é digital e inclui também dispositivos móveis como os telefones celulares. Através dela podem ser realizadas chamadas locais (chamada realizada na mesma cidade/região), longa distância (chamada realizada para outra cidade/região) ou internacionais (chamada realizada para outros países).

Além da PSTN, existem também as Centrais Privadas de Comutação Telefônica (PABX). Os PABXs operam de forma similiar a PSTN, porém são restritas ao ambiente de uma empresa. Os PABXs tem a função de interligar os telefones dos usuários da empresa (ramais) e também conectar-se a Central Pública (PSTN) através de uma ou mais linhas telefônicas (linhas tronco).

Ambos, PSTN e PABX convencional, operam de forma similar e fazem uso de comutação de circuitos. Mais recentemente, surgiu o conceito de PBX IP que funciona como uma central telefônica convencional (PABX), porém intermediando chamadas VoIP. Com isso, as chamadas são feitas de um telefone IP em direção ao PBX IP, que a encaminha ao telefone IP de destino de acordo com suas regras de discagem. O PBX IP, diferentemente da PSTN e do PABX convencional, não utiliza a comutação de circuitos, mas sim opera sobre a rede de dados utilizando comutação de pacotes.

O Asterisk é uma solução completa de PABX baseado em software, permitindo ligar o mundo IP ao mundo da rede pública de telefonia comutada. Para funcionar como um PABX IP puramente, o Asterisk não necessita de nenhum item adicional. Basta apenas instala-lo em um computador e fazer as devidas configurações. Porém, se deseja-se que o Asterisk se comunique com a PSTN ou com PABX convencional, são necessários placas ou gateways que façam a interface com o mundo da telefonia baseada em comutação de circuitos. Abaixo temos o exemplo de algumas placas que podem ser adicionas à máquina onde foi instalado o Asterisk:


  • Placa FXO/FXS

Fxo-fxs.png


  • Placa de E1

E1.png


  • Placa GSM

Gsm.png

Através destas placas podemos integrar o Asterisk em diversos cenários, como abaixo:


  • Cenário 1

Cenário1.png


  • Cenário 2

Cenário2.png


  • Cenário 3

Cenário3.png


Além da inserção de placas na máquina onde está instalado o Asterisk, é possível utilizar gateways VoIP que fazem a interface entre a PSTN e PABX convencionais legados e o Asterisk. Com estes gateways não é necessária a inserção de placas na máquina do Asterisk. Exemplos de interligações que podem ser feitas usando gateways VoIP podem ser vistos abaixo:

  • Cenário 1 com Gateway VoIP

Gateway1.png


  • Cenário 2 com Gateway VoIP

Gateway2.png


Instalação do Channel Driver

1- Acessar a página Channel Driver Khomp: http://tele.sj.ifsc.edu.br/~msobral/pji/khomp/ e baixar o arquivo adequado a sua máquina;

2- Descompactar o arquivo usando gunzip arquivo</syntaxhighlight>

3- Executar o comando abaixo e aguardar o termino: bash arquivo.sh</syntaxhighlight>

4- Abrir o navegador e acessar: localhost:14100</syntaxhighlight>

04/10: Refazendo o Asterisk para conectá-lo com a PSTN

Aula 16
  1. Remova a versão do Asterisk instalada pelo Ubuntu:
    sudo apt-get remove asterisk
    
  2. Atualize os pacotes de software do Ubuntu:
    sudo apt-get update
    
  3. Instale estes pacotes de software:
    sudo apt-get install -y libncurses-dev libssl-dev libsqlite3-dev libxml2-dev
    
  4. Baixar a versão do Asterisk sob medida para o channel driver Khomp.
  5. Descompacte o arquivo asterisk-11.1.1.tar.gz.
  6. Entre no diretório asterisk-11.1.1.
  7. Execute estes comandos:
    ./configure --prefix=/usr/local
    make
    sudo make install
    sudo make samples
    sudo make config
    
  8. Para facilitar a edição dos arquivos de configuração, faça o seguinte:
    cd /etc
    mv asterisk asterisk.orig
    ln -s /usr/local/etc/asterisk
    
  9. Copie os arquivos de configuração originais do Asterisk que você editou até o momento:
    sudo cp asterisk.orig/extensions.conf asterisk/
    sudo cp asterisk.orig/sip.conf asterisk/
    sudo cp asterisk.orig/voicemail.conf asterisk/
    
  10. Execute este comando para que o Asterisk consiga ser executado:
    sudo -s
    echo /usr/local/lib > /etc/ld.so.conf.d/asterisk.conf
    ldconfig
    exit
    
  11. Baixe o arquivo do channel driver da Khomp. Em seguida descompacte-o (ele deve estar em Downloads).
  12. Execute estes comandos para instalar o channel driver:
    cd Downloads
    sudo bash channel_4.3_009_x86-64.sh --just-remove
    sudo bash channel_4.3_007_x86-64.sh
    
  13. Copie o channel driver da Khomp para o diretório correto do Asterisk (no caso da instalação que fizemos):
    sudo cp /usr/lib/asterisk/modules/chan_khomp.so /usr/local/lib/asterisk/modules/
    
  14. Inicie o Asterisk:
    sudo /etc/init.d/asterisk start
    
  15. Acesse a interface de administração da Khomp, e prossiga na instalação do módulo EBS.
    1. Entre com usuário admin e senha khomp
    2. Vá em Configuração, e em seguida clique no botão Procurar
    3. Selecione o dispositivo encontrado, e clique em Adicionar
    4. Defina um endereço IP para o dispositivo, e ative os links E1 em modo R2. Ao final clique em Salvar, e depois Aplicar.
    5. Vá em Monitoração, e em seguida em Serviços. Ali confira se o Khomp API Server está ativado. Caso não, clique na opção para ativá-lo (ícone com um triângulo ao lado da palavra Inativo).
    6. Se o Asterisk estiver inativo, reinicie-o.
    7. Vá em Dispositivos, e confira se o dispositivo foi reconhecido e está em estado ativado (Up).
    8. Você pode ver os canais existentes no seu módulo EBS clicando em Canais. O número de cada canal (encontrado na primeira coluna da tabela) deve ser usado para identificá-lo no plano de discagem do Asterisk.

Como fazer chamadas através de canais Khomp


Canais Khomp devem ser identificados no plano de discagem com esta notação, sendo X o número do módulo EBS (por ordem em que foi adicionado) e Y o número do canal. No exemplo a seguir, a extensão 9 é encaminhada pelo canal 60 do módulo 0:

exten=>9,1,Dial(Khomp/bXcY)
same=>n,hangup

10/10: Conexão com a PSTN

Aula 17

Atividades

  • Concluir as atividades propostas na aula passada.

11/10: Conexão com a PSTN

Aula 18

Uma vez adicionado o módulo Khomp e este estando com status UP, pode-se fazer as configurações para que as chamadas sejam roteadas através dele.

  1. Para fazer ligação para um ramal conectado já na placa FXS é necessário criar uma extensão no plano de discagem conforme o exemplo: exten=>777,1,Dial(Khomp/b0c60,20,t)

exten=>777,n,hangup</syntaxhighlight> Onde b0 indica o módulo e c60 indica o canal;

  1. Para fazer ligação a partir deste ramal, é necessário em primeiro lugar criar um contexto de entrada no arquivo khomp.conf: context-fxs = khomp-DD-CC</syntaxhighlight> Onde DD é o módulo Khomp (ex. 00) e CC é o canal (ex. 60);
  2. Também é possível criar um único contexto que sirva para todos os ramais da placa FXS: context-fxs-alt = khomp-DD </syntaxhighlight> Onde DD indica o módulo Khomp
  3. Após alterar o khomp.conf, é necessário criar um contexto com o mesmo nome no arquivo extensions.conf. Exemplo, se você criou o contexto context-fxs-alt = khomp-00, você deve criar este contexto no extensions.conf para tratar as chamadas entrantes dos ramais analógicos;
  4. Se você quer configurar os links E1, a configuração de saída de chamada sobre o link E1 deverá ser feita no arquivo extensions.conf de forma semelhante ao feito com os ramais. No entanto, agora é necessário informar para qual número você pretende discar via E1. Exemplo a seguir onde se disca para o número 100 via E1: exten=>555,1,Dial(Khomp/b0c30-59/100)

exten=>555,n,hangup </syntaxhighlight>

  1. Para receber chamadas via E1 é necessário também configurar o khomp.conf e criar um contexto para o link E1 desejado: context-digital = khomp-DD-LL</syntaxhighlight> Onde DD é o módulo e LL é o link.
  2. Após alterar o khomp.conf, é necessário criar um contexto com o mesmo nome no arquivo extensions.conf.
  3. Para fazer chamadas via FXO, a configuração de saída de chamada sobre o link E1 deverá ser feita no arquivo extensions.conf de forma semelhante ao feito com os ramais. No entanto, agora é necessário informar para qual número você pretende discar via FXO. Exemplo a seguir onde se disca para o número 100 via FXO: exten=>555,1,Dial(Khomp/b0c68/100)
  4. Para receber chamadas via FXO é necessário também configurar o khomp.conf e criar um contexto para a linha analógica: context-fxo = khomp-DD-CC</syntaxhighlight> Onde DD é o módulo Khomp (ex. 00) e CC é o canal (ex. 68);
  5. Após alterar o khomp.conf, é necessário criar um contexto com o mesmo nome no arquivo extensions.conf e neste contexto deve ser criada uma exten s para encaminhar todas as chamadas para um atendedor fixo. Exemplo: [khomp-00-68]

exten=>s,1,Dial(SIP/1000) same=>n,hangup</syntaxhighlight>

17/10: Conexão com a PSTN

Aula 19

Uma vez adicionado o módulo Khomp e este estando com status UP, pode-se fazer as configurações para que as chamadas sejam roteadas através dele.

  1. Para fazer ligação para um ramal conectado já na placa FXS é necessário criar uma extensão no plano de discagem conforme o exemplo: exten=>777,1,Dial(Khomp/b0c60,20,t)

exten=>777,n,hangup</syntaxhighlight> Onde b0 indica o módulo e c60 indica o canal;

  1. Para fazer ligação a partir deste ramal, é necessário em primeiro lugar criar um contexto de entrada no arquivo khomp.conf: context-fxs = khomp-DD-CC</syntaxhighlight> Onde DD é o módulo Khomp (ex. 00) e CC é o canal (ex. 60);
  2. Também é possível criar um único contexto que sirva para todos os ramais da placa FXS: context-fxs-alt = khomp-DD </syntaxhighlight> Onde DD indica o módulo Khomp
  3. Após alterar o khomp.conf, é necessário criar um contexto com o mesmo nome no arquivo extensions.conf. Exemplo, se você criou o contexto context-fxs-alt = khomp-00, você deve criar este contexto no extensions.conf para tratar as chamadas entrantes dos ramais analógicos;
  4. Se você quer configurar os links E1, a configuração de saída de chamada sobre o link E1 deverá ser feita no arquivo extensions.conf de forma semelhante ao feito com os ramais. No entanto, agora é necessário informar para qual número você pretende discar via E1. Exemplo a seguir onde se disca para o número 100 via E1: exten=>555,1,Dial(Khomp/b0c30-59/100)

exten=>555,n,hangup </syntaxhighlight>

  1. Para receber chamadas via E1 é necessário também configurar o khomp.conf e criar um contexto para o link E1 desejado: context-digital = khomp-DD-LL</syntaxhighlight> Onde DD é o módulo e LL é o link.
  2. Após alterar o khomp.conf, é necessário criar um contexto com o mesmo nome no arquivo extensions.conf.

18/10: Conexão com a PSTN

Aula 20

24/10: Conclusão do projeto 1

Aula 21

25/10: Conclusão do projeto 1

Aula 22

31/10: Início da Etapa 2

Aula 23


A Etapa 2 do Projeto Integrador 4 consiste em implantar um sistema de vigilância eletrônica. Este sistema de vigilância deverá possibilitar alguma futura integração com a Etapa 1 do PJI4.


Atividade para entregar

Pesquisa individual a ser entregue no final da aula de hoje. Deve ser entregue um documento em formato PDF com os seguintes tópicos:

  1. Câmeras IP;
  2. Softwares de vigilância que podem ser utilizados no sistema de vigilância a ser implementado.


Em relação as câmeras IP, pesquisar como elas podem ser acessadas (diferentes métodos, http, rtsp):

Cada método deve ser demonstrado e analisado:

- como ele funciona ? que protocolos estão envolvidos, e como se dá a comunicação ?

- outros softwares (ex: vlc) conseguem acessar estas câmeras? e será que um softphone conseguiria ver o vídeo de uma câmera usando SIP ?


Em relação ao software de vigilância, verificar:

- como se integra com as câmeras IP?

- é software free?

- roda em Linux?

- possui algum recurso que permita a integração com serviços de rede? Exemplo, e-mail, web e DNS.

- possui algum recurso que permita a integração com o sistema já implementado na Etapa1?

01/11: Avaliação do projeto 1

Aula 24
  • Avaliação teórica e prática.


Atividade prática

Cada aluno será responsável por um Asterisk. Cada central IP deverá atender os seguintes pontos:


  1. As contas SIP de cada central deverão ser criadas nas faixas 1XX para a Central 1 (Aluno 1), 2XX para a Central 2 (Aluno 2), 3XX para a Central 3 (Aluno 3) e 4XX para a Central 4 (Aluno 4);
  2. Para ligação interna em cada central, os usuários deverão discar 11XX, 22XX, 33XX e 44XX. Por exemplo, ao discar 1100 a chamada deve ser encaminhada para a conta 100, ao discar para 1101 a chamada deve ser encaminhada para 101 e assim por diante;
  3. Cada central deverá ter um contexto chamado INTERNO, o qual será usado para que as chamadas internas em cada central sejam completadas;
  4. Todo o áudio das chamadas deverá passar por dentro da central;
  5. Todos os ramais devem se comunicar, inclusive devem ser capazes de ligar para a URA a ser desenvolvida em central;
  6. Cada ramal interno deverá ter um desvio se não atende e se ocupado para algum outro ramal da mesma central;
  7. Cada central deverá ter um tronco SIP para as demais centrais e com a central dos professores. Este tronco SIP deve utilizar o contexto SIP-EXT;
  8. Um ramal de uma central deve ser capaz de ligar para qualquer numeração em outra central discando no mesmo formato usado para sua comunicação interna (e.g. 1100, 2200, etc);
  9. Cada central será responsável por um DDD. A Central 1 terá o DDD 48, a Central 2 o DDD 51, a Central 3 o DDD 41 e a Central 4 o DDD 11;
  10. Devem ser criados mais dois contextos, LOCAL e DDD;
  11. Deve ser dada a permissão para que todos os ramais utilizem o contexto LOCAL. No entanto, apenas alguns devem ter a permissão para acessar o contexto DDD;
  12. Ramais que acessam o contexto DDD também devem acessar o contexto LOCAL;
  13. Todas as chamadas que possuam numeração compatível com uma discagem local devem ser tratadas no contexto LOCAL e encaminhadas a PSTN via via central dos professores;
  14. Todas as chamadas que possuam numeração compatível com uma discagem DDD devem ser tratadas no contexto DDD e encaminhadas a PSTN via central dos professores;

07/11: Câmeras IP e sistema de vigilância

Aula 25

08/11: Câmeras IP e sistema de vigilância

Aula 26

Reinstalação do Zoneminder

Para instalar e configurar essa ferramenta no ubuntu 14.04 deve-se seguir os passos, que também mostrará a sequência para configuração e funcionamento de uma câmera Intelbras.

  1. Instalando a ferramenta. Caso o Apache ainda não esteja instalado ele será instalado juntamente com o ZoneMinder, já que está na tabela de pendências do mesmo.
apt-get update
apt-get install zoneminder </syntaxhighlight>
  1. Criando um link da configuração do ZoneMinder com o Apache:
ln -s /etc/zm/apache.conf /etc/apache2/sites-enabled/ </syntaxhighlight>
  1. Iniciando/reiniciando os serviços:
service zoneminder restart
service apache2 restart </syntaxhighlight>
  1. Verifique se está tudo correto, caso apresente algum problema corrija. Com um navegador acesse:
ip_do_servidor/zm </syntaxhighlight>
  1. Instalando a câmera Intelbras, lembrando que a câmera que possuímos está com ip fixo 192.168.1.108.
    1. Primeiramente deve-se garantir acesso ao ip da câmera, por exemplo criando um apelido de ip na máquina. X = 1 para M1, 2 para M2, ..., 13 para M13 e 14 para M14.
ifconfig eth0:0 192.168.1.X </syntaxhighlight>
    1. Teste o acesso fazendo um ping para o ip da câmera.
    2. Na tela do ZoneMinder clique na opção Adicionar Monitor.
    3. Configure a aba General.
    4. Configure a aba Origem.

Source Path rtsp://admin:admin@192.168.1.108:554/cam/realmonitor?channel=1&subtype=0 </syntaxhighlight>

    1. Na tela do ZoneMinder clique no link Intelbras (logo abaixo de Nome), se a imagem da câmera não aparecer execute o seguinte procedimento, de acordo com o procedimento para correção de bug:

service apache2 stop service zoneminder stop rm -rf /tmp/zm/*.* a2enmod cgi service zoneminder start service apache2 start </syntaxhighlight>

    1. Acesse novamente o link Intelbras.


OBS: acrescente isto ao arquivo /etc/apache2/sites-enabled/apache.conf:

Alias  /javascript /usr/share/javascript

Métodos de acesso a câmeras

  • HTTP
  • RTSP/RTP
  • SIP/RTP
  • outros ??

Atividade

A tarefa deve ser entregue até terça (15/11). Trata-se de uma captura do wireshark que deve ser analisada. Deve ser gerado um diagrama semelhante ao da página 6 deste arquivo [4], porém neste diagrama também devem constar as portas envolvidas na comunicação.


Além disso, vocês também devem comentar os métodos envolvidos (OPTION, SETUP, etc) e suas respectivas respostas. Um material de consulta é este link.

14/11: Feriado

Aula 27

15/11: Feriado

Aula 28

21/11: vigilância eletrônica: acesso remoto às câmeras

Aula 29
  1. Acesso das câmeras via smartphone;
    1. App Zoneminder;
    2. Outros;
  2. Vídeo chamada no Asterisk;
    1. No sip.conf devem ser feitas algumas alterações para permitir vídeo. Abaixo um exemplo: [1000]

defaultuser=1000 secret=1000 type=friend host=dynamic insecure=port,invite ; context=alunos videosupport=yes disallow=all allow=gsm ; habilita este codec allow=alaw ; outro codec allow=ulaw ; mais um codec allow=h264 qualify=yes

directmedia=no</syntaxhighlight>
  1. Acesso à câmera via SIP;

22/11: vigilância eletrônica: detecção de movimento

Aula 30

Detecção de movimento na câmera

Nos últimos anos houve uma grande expansão no mercado de equipamentos com a capacidade de detectar o movimento através de sensores externos, ou pela própria imagem, possibilitando assim o monitoramento automático e inteligente da cena. Nestes sistemas a observação e interpretação humana foram substituídas por algoritmos computacionais automatizados e inteligentes (WANG et al., 2004) (CEDRAS; SHAH, 1995). A detecção de movimento e a segmentação da imagem são áreas do processamento de sinais que tem forte apelo de uso seja em sistemas e vigilância eletrônica ou em outras aplicações como controle de acesso, visão robótica e sistemas de auxílio à direção de veículos (WANG et al., 2004).

A maioria desses sistemas segmenta a imagem, separando o objeto em movimento do fundo estático. Esta segmentação é realizada com o objetivo de detectar o movimento na cena. O companhamento da trajetória do objeto segmentado e a gravação das imagens para posterior análise são opções que também são frequentemente implementadas. O processo de detecção do movimento normalmente envolve tanto a modelagem do ambiente, que consiste na representação da imagem de fundo, como a segmentação do objeto em movimento e a sua classificação (WANG et al., 2004).

A detecção de movimento através de sinais de vídeo tem como objetivo básico detectar o movimento em ambientes com predominância de cenas estáticas, ou seja, em ambientes em que normalmente não ocorre movimentação (JONES, 1995) (PINHEIRO; LINS, 2007). A implementação da detecção de movimento pode ser feita principalmente através de duas técnicas: 1) a subtração do fundo, que consiste na diferença entre o modelo do ambiente e a imagem atual captada; ou 2) através da diferença temporal entre quadros sucessivos (WANG et al., 2004).


As câmeras geram alertas ao detectarem movimento nas regiões configuradas. Esses alertas podem ser emitidos de diferentes formas, dentre elas chamadas de video com SIP. Se as chamadas forem direcionadas para um servidor SIP ou PBX IP (como o Asterisk), elas podem ser encaminhadas para algum contato SIP ou mesmo gravadas para fins de registro. Com base nisso, na aula de hoje será feito o seguinte:

  • Configuração das câmeras para detecção de movimento, com geração de alerta via chamada SIP
  • Configuração do Asterisk para encaminhar as chamadas para contatos SIP (ex: celular): isso envolve criar tanto canais SIP no Asterisk quanto criar regras no plano de discagem para encaminhar chamadas geradas pela detecção de movimento.
  • Configuração do Asterisk para gravação do video: chamadas vindas de câmeras devem ter seus videos sempre gravados pelo Asterisk. Além disso, quando se faz uma chamada para uma câmera, para visualizar sua imagem, deve ser possível instruir o Asterisk a gravar o video caso desejado.
  • .. e um exercício final: sumarização diária dos videos: ao final do dia, os videos gravados no Asterisk devem ser concatenados automaticamente em um único arquivo de video. Alguns utilitários podem ser úteis: avconv, mencoder, ffmpeg.

Avaliação de recuperação

  • análise de arquivos de captura

A recuperação da primeira avaliação envolve analisar um conjunto de chamadas entre agentes SIP e PBX Asterisk. Essas chamadas tiveram seus pacotes capturados e gravados em arquivos de captura compatíveis com Wireshark e tcpdump. Os arquivos de captura são estes:


As capturas envolvem várias situações:

  • chamadas normais com e sem directmedia
  • chamadas para números que não existem
  • chamadas através de nat (com reinvite)
  • chamadas através de nat e sem áudio
  • chamadas com codecs incompatíveis


O cenário onde as capturas foram realizadas pode ser visualizada nesta figura:

Pji4-rede-captura.png


Esses arquivos devem ser analisados (dica: use o wireshark) de forma a relatar o seguinte:

  • descrição das chamadas com sucesso (SIP, SDP e RTP)
  • descrição das chamadas que falharam, com diagnóstico e proposta de solução
  • análise, diagnóstico e proposta de solução das chamadas com problemas de áudio (caso existam)
  • duração das chamadas, independente de serem bem sucedidas ou não
  • jitter durante as transmissões de midia


O relatório deve incluir todas as chamadas encontradas descritas por diagramas. Os diagramas devem mostrar a sinalização SIP e indicar em que momento houve a transmissão de audio com RTP. Os parâmetros envolvidos nas comunicações devem também ser informados: endereços IP e ports dos participantes (tanto para SIP quanto RTP), mensagens SIP e status de resposta, e codecs.


Prazo de entrega: '29/11

  • OBS: entregar em documento digital (ex: arquivo PDF).

28/11: vigilância eletrônica: conclusão

Aula 31
  • Concluir atividades da Aula 30.


  • Cenário da Etapa 1

Na Etapa 1 o objetivo era implementar um PABX IP como o mostrado no cenário da figura abaixo. Para isso foi utilizado o ASterisk para criar os canais SIP e o plano de discagem. No plano de discagem criado foram utilizadas diversas aplicações diferentes que o Asterisk possui para implementar facilidades comuns a um PABX comercial. Como terminais SIP foram utilizados nas atividades predominantemente softphones instalados em smartphones. O PABX IP de cada aluno foi conectado aos demais através de troncos SIP e também através de diferentes tipos de entrocamentos comuns a PSTN.

Cenário-etapa1.jpeg


  • Cenário da Etapa 2

Na Etapa 2 o objetivo foi montar um sistema de vigilância eletrônica e integrá-lo com o cenário já implementado na Etapa 1 (ver figura abaixo). Nesta etapa tivemos como foco os diferentes métodos de acesso a stream de vídeo (via RTSP e SIP), a utilização de um sistema de vigilância centralizado (ZoneMinder), a integração com o Asterisk e a gravação das streams capturadas para uso posterior.

Cenário-etapa2.jpeg


  • Cenário da Etapa 3

Na Etapa 3 o objetivo básico será a integração de todos os cenários implementados anteriormente com diversos serviços de rede, como DNS, E-mail e Web. Além disso, implementaremos um serviço de Instante Message para gerar mensagens instantâneas para notificação dos usuários do Asterisk quando ocorrerem eventos relevantes no sistema de segurança.

Cenário-etapa3.jpeg

29/11: Etapa 3: integração com serviços de rede

Aula 32

Integração com o DNS

1. No arquivo /etc/bind/named.conf.local será criado o domínio seu-nome.edu.br e seu reverso:

...
zone "seu-nome.edu.br" {
   type master;
   file "/etc/bind/seu-nome.edu.br";
};
zone "10.in-addr.arpa" {
   type master;
   file "/etc/bind/10.in-addr.arpa";
};

Obs: Deve-se alterar o domínio redes.sj.ifsc.edu.br pelo domínio que você realmente deseja criar. Este é apenas um exemplo =)

2. Próxima etapa: as informações específicas de domínio em /etc/bind/redes.sj.ifsc.edu.br:

$TTL 86400
@         IN   SOA   ns1.seu-nome.edu.br.   admin.seu-nome.edu.br. (
    2010033101   ; serial
            1d   ; refresh
            1h   ; retry
            1w   ; expire
            1d   ; negative cache ttl
)
@        IN   NS     ns1
ns1      IN   A      IP-maquina-ns1
www      IN   CNAME  ns1
servidor IN   CNAME  ns1
  • A primeira linha ($TTL) indica o tempo que os registros permanecem no cache do DNS sem atualização e é obrigatória, normalmente é dada em segundos, mas pode ser dada em horas, dias, semanas;
  • A segunda linha: início da configuração da zona de domínio, contém inicialmente o nome da zona (representado por um sinal de @ o que equivale ao nome da zona de domínio). A sigla IN indicando que se refere a Internet, a sigla SOA indicando que se trata do início do documento, o nome do servidor primário DNS e o e-mail do administrador;
  • Depois há uma série de números, que obrigatoriamente devem ser informados, esses números indicam respectivamente:
  1. O número de série da zona de domínio, normalmente iniciando com o ano, seguido do mês, dia e um número sequencial qualquer.
  2. Período de refresh para servidores slave.
  3. Período de espera até uma nova tentativa de refresh em caso de erro.
  4. Período de expiração para servidores slave e
  5. TTL default para os RR que não possuem valor especificado.
  • Em seguida informamos os nameservers (NS), no caso ns1;
  • Podemos informar também um registro do tipo MX (Mail Exchanger) que se trata do servidor de e-mail no recebimento de e-mails;
  • E por último foram feitas as associações entre nomes de máquinas e seus respectivos IP’s.

3. Configuração do DNS reverso, arquivo /etc/bind/10.in-addr.arpa:

$TTL 86400
@      IN   SOA   ns1.seu-nome.edu.br.   admin.seu-nome.edu.br. (
    2010033101   ; serial
            1d   ; refresh
            1h   ; retry
            1w   ; expire
            1d   ; negative cache ttl
)
@      IN   NS    ns1.seu-nome.edu.br.
1.0.0 IN   PTR   ns1

4. Utilitário para testar o arquivo que contém o conteúdo de uma zona: named-checkzone nome_do_dominio arquivo_da_zona ==> Aponta possíveis erros no arquivo de configuração. named-checkzone seu-nome.edu.br /etc/bind/seu-nome.edu.br</syntaxhighlight> 5. Utilitário para testar a configuração do BIND: named-checkconf -z </syntaxhighlight> 6. Como este serviço pode rodar com má configuração, é interessante (re)iniciar o serviço com um monitor dos registros em uma janela:

tail -f /var/log/syslog

7. E em outra janela reiniciar o serviço:

/etc/init.d/bind9 restart

O registro SRV

Um registro de serviço (SRV) é um tipo relativamente novo de registro DNS que fornece informações sobre serviços disponíveis. Definido na RFC 2782, é frequentemente utilizado por protocolos mais recentes (SIP é um deles). Se você quiser suporte a pesquisas SIP em seu domínio, você precisará de um registro SRV para responder a estas pesquisas adequadamente.

Quando uma conexão SIP faz uma pesquisa em leif@shifteight.org, o registro SRV pode responder que o serviço solicitado (SIP) é encontrado no servidor pbx.shifteight.org.

A maioria dos servidores DNS executa o BIND (Berkeley Internet Name Daemon). O registro BIND para uma entrada SRV para SIP será algo como abaixo:

_sip._udp.shifteight.org. 86400 IN SRV 0 0 5060 pbx.shifteight.org.</syntaxhighlight>

Nome Descrição Exemplo
Serviço Nome simbólico do serviço _sip.
Proto protocolo de transporte _udp.
Nome nome de domínio para este registro shifteight.org.
TTL Time to Live 86400
Classe Campo classe do DNS IN
Prioridade Prioridade do host 0
Peso Peso relativo do registro 0
Porta Porta TCP ou UDP 5060
Alvo Nome da máquina que prove o serviço pbx.shifteight.org.

Testes

  1. Altere o arquivo /etc/resolv.conf

nameserver IP-do-seu-DNS </syntaxhighlight>

  1. Utilize o comando dig para testes diversos ao seu domínio. Abaixo alguns exemplos:dig -x 150.162.12.25 ; consulta ao DNS reverso

dig www.das.ufsc.br ; consulta ao DNS direto dig +trace www.polito.it ; consulta ao DNS direto mostrando toda a árvore de DNS consultados dig @200.135.37.65 www.polito.it ; consulta ao servidor DNS 200.135.37.65</syntaxhighlight>

  1. Você também pode fazer testes de ping à maquinas configuradas no seu domínio.
  2. Você pode testar o registro SRV usando o comando: dig SRV _sip._udp.seu-nome.edu.br</syntaxhighlight>
  3. Como resultado, você deve ver algo do gênero: ;; ANSWER SECTION:

_sip._udp.seu-nome.edu.br. 14210 IN SRV 0 0 5060 maquina.seu-nome.edu.br.</syntaxhighlight>

05/12: Etapa 3: integração com E-mail

Aula 33

Instalação e testes com o Postfix

  1. Configurar um registro MX no seu DNS. Utilize o nome mail.seu-dominio.edu.br. O registro deve ser inserido conforme abaixo: @ IN MX 10 mail.pji4.edu.br.</syntaxhighlight>
  2. Em /etc/resolv.conf configurar: nameserver ip-do-seu-DNS</syntaxhighlight>
  3. Tenha certeza que seu serviço DNS esteja funcionando corretamente e você consiga acessar os domínios internos criados. ping mail.seu-dominio.edu.br </syntaxhighlight>
  4. Instale o postfix em sua máquina virtual: apt-get install postfix. Escolha Site Internet e nome como mail.mail.seu-dominio.edu.br, este nome deve ser exatamente igual ao declarado no serviço DNS, na definição MX.
  5. Configure-o para que se comunicar na Internet, criando o domínio de email seu-domínio.edu.br. Edite o arquivo /etc/postfix/main.cf e crie ou edite os seguintes parâmetros, deixando-os da seguinte forma:
    myhostname = mail.seu-dominio.edu.br
    mydomain = seu-dominio.edu.br
    myorigin = $mydomain
    inet_interfaces = all
    inet_protocols = ipv4
    mynetworks = 192.168.1.0/24, 127.0.0.0/8
    mynetworks_style = subnet
    mydestination = $myhostname, $mydomain
    
  6. Reinicie o serviço: service postfix restart.
  7. Verifique se o servidor "subiu" corretamente: tail /var/log/syslog.
  8. Verifique se não houve erros de configuração: tail -n 30 /var/log/mail.log.
  9. Caso tudo esteja correto, teste o envio de e-mail usando o telnet: telnet seu-nome.edu.br 25 </syntaxhighlight>
    1. Converse com o servidor de e-mails: helo mail

250 mail.seu-nome.edu.br mail from: qualquer@qualquer 250 2.1.0 OK rcpt to: usuario@seu-dominio.edu.br 250 2.1.5 OK data 354 End data with <CR><LF>.<CR><LF>

Subject: Teste - AlunoX

Testando o envio de uma mensagem na manualmente ...

. 250 2.0.0 Ok: queued as 57C486819C quit 221 2.0.0 Bye</syntaxhighlight>

  1. Verifique se o email foi perfeitamente encaminhado procurando pela string sent no /var/log/mail.log.
  2. Instale um cliente de Email: apt-get install mailutils
  3. Envie um email:
    mail usuario@seu-dominio.edu.br
    Cc: 
    Subject: Teste de email
    Isto é somente um teste...
    ... para sair, em uma linha em branco digite: CTRL d
    
  4. Verifique se o email foi perfeitamente encaminhado procurando pela string sent no /var/log/mail.log.
  5. Para ler email, logado com o usuário desejado, execute o comando mail e digite o número da mensagem desejada.
  6. Teste o envio de mensagens para usuários dos domínios de seus colegas. Acompanhe o processamento das mensagens olhando o log.

Dicas

Atenção para vários problemas comuns na implantação do correio eletrônico:

  • Domínio DNS sem registro MX: sem isso os MTAs não sabem como enviar mensagens para esse domínio
  • Registro MX aponta um nome de host desconhecido: causa o mesmo problema acima
  • Nome de host configurado como localhost no Postfix: o nome de host (parâmetro myhostname em /etc/postfix/main.cf) deve ser o nome DNS do servidor onde roda o Postfix.
  • Erros de configuração (sintaxe) em /etc/postfix/main.cf: tais erros podem fazer com que um dos subsistemas do Postfix aborte sua execução, impedindo que se processe uma mensagem. Por exemplo, se um parâmetro usado pelo subsistema smtpd (que recebe mensagens com protocolo SMTP) estiver errado, o smtpd não iniciam, ou termina abruptamente, abortando a recepção de mensagens.

Passo a passo para criar uma aliases (apelidos/grupos):

  1. Adicione as diretivas para criação de grupos:

vi /etc/postfix/main.cf

    alias_maps = hash:/etc/postfix/aliases
    alias_database = hash:/etc/postfix/aliases</syntaxhighlight>
  1. Crie os grupos e adicione os respectivos usuários, por exemplo:

vi /etc/postfix/aliases

    todos: root, aluno
    batman: aluno</syntaxhighlight>
  1. Execute o comando para criação da base de grupos:

postalias /etc/postfix/aliases</syntaxhighlight>

  1. Reinicie o serviço:

service postfix reload </syntaxhighlight>

  1. Teste os apelidos enviando email para todos e batman e verifique quais usuários (root e/ou aluno) receberam as respectivas mensagens.

06/12: Etapa 3: integração com E-mail

Aula 34
  • Instalação de Webmail para funcionários da empresa;
  • Integrar servidor de e-mail com o Voicemail do Asterisk;
  • Integrar servidor de e-mail com a câmera IP.

Instalação do Webmail

O objetivo é instalar o Webmail RoundCube.

Pré-requisitos: DNS e Postfix rodando.

Pré-configuração:

  1. Atualize a base apt: apt-get update
  2. Instale o Apache:
     apt-get install apache2
    
  3. Para facilitar a configuração instale o servidor ssh em sua máquina:
    apt-get install ssh
    
  4. Na máquina real abra um terminal e faça uma conexão ssh com sua máquina virtual:
    ssh aluno@192.168.2.X
    

Assim pode-se usar este terminal para configurar seu servidor. Neste terminal é possível usar os comando copy (CTRL + SHIFT + C) e paste (CTRL + SHIFT + V).


Instalando o RoundCube

  1. Vá para o diretório html: cd /var/www/html
  2. Baixar o pacote do RoundCube: wget http://downloads.sourceforge.net/project/roundcubemail/roundcubemail/1.1.1/roundcubemail-1.1.1.tar.gz
  3. Desempacote: tar -zxvf roundcubemail-1.1.1.tar.gz
  4. Renomeie para webmail: mv roundcubemail-1.1.1 webmail
  5. Instalar o Dovecot. Dovecot é um MDA de fácil instalação que suporta acessos com IMAP e POP3. As caixas de entrada podem ser armazenadas nos formatos mailbox ou Maildir.: apt-get install -y dovecot-imapd dovecot-pop3d. Nas janelas: SIM, nome da máquina: mail.redesX.edu.br.
  6. Configurar o Dovecot: vi /etc/dovecot/dovecot.conf e ajustar/criar os seguintes parâmetros:
    protocols = pop3 pop3s imap imaps
    pop3_uidl_format = %08Xu%08Xv
    mail_location = maildir:~/Maildir
    
  7. Force a releitura do arquivo de configuração: dovecot reload
  8. Reconfigurar a conta do aluno com os comandos (isto deve ser feito a todos os usuários do sistema aos quais deseja-se usar o webmail, evidentemente trocando aluno pelo nome equivalente):
    maildirmake.dovecot /home/aluno/Maildir
    maildirmake.dovecot /home/aluno/Maildir/.Drafts
    maildirmake.dovecot /home/aluno/Maildir/.Sent
    maildirmake.dovecot /home/aluno/Maildir/.Trash
    maildirmake.dovecot /home/aluno/Maildir/.Templates
    chown -R aluno.aluno /home/aluno/Maildir/
    chmod -R go-rwx /home/aluno/Maildir
    
  9. Reconfigure o Postfix: vi /etc/postfix/main.cf acrescentando a diretiva:
    home_mailbox = Maildir/
    
  10. Reinicie os serviços: service dovecot restart e service postfix restart
  11. Instale os pacotes e dependências necessárias: apt-get install -y php5 sqlite php5-sqlite php-net-smtp php-mail-mime php-mdb2
  12. Modifique o dono e grupo dono da pasta webmail para o Apache (www-data): chown -R www-data:www-data /var/www/html/webmail
  13. Dentro de /var/www/html/webmail mudar as permissões: chmod 777 temp/ logs/ SQL/
  14. Mude as permissões: chmod 755 /var/www/html/webmail
  15. Atribua o nome de máquina no servidor Apache, acrescentando ao final do arquivo /etc/apache2/apache2.conf:

ServerName www.redesX.edu.br</syntaxhighlight>

  1. Reinicie o Apache2: service apache2 restart
  2. Acesso com um navegador a página: http://192.168.2.X/webmail/installer/
  3. Instale pacotes extras necessários:

pear install Mail_mimeDecode pear install Net_IDNA2-0.1.1 </syntaxhighlight>

  1. Verifique se há alguma pendência NÃO opcional (procure pela string optional nos cabeçalhos das seções), se houver resolva!
  2. Clique em Next.
  3. Na seção (quadro) Database setup ajuste exatamente assim:
     SQLite Database type
     "em branco"                           Database server (omit for sqlite)
     /var/www/html/webmail/SQL/sqlite.db   DataBase name (use absolute path and filename for sqlite)
     "em branco"                           Database user name (omit for sqlite)
     "em branco"                           Database password (omit for sqlite)
    
  4. Clique em CREATE CONFIG. Por padrão o sistema se auto-configura mas caso apresente erro no config.php ou esteja sugerindo a copia, copie ou baixe a conteúdo da configuração apresentada para /var/www/html/webmail/config/config.inc.php. Clique em CONTINUE.
  5. Tenha CERTEZA que tudo esteja correto.
  6. Acesse a página http://192.168.2.X/webmail/ e forneça o login e senha do aluno.
  7. Na página do RounCube acesse a opção: Configurações > Identidades, clique em aluno@servidor e na estabeleça a opção E-mail: aluno@redesX.edu.br > Salvar.
  8. Faça testes enviando mensagens aos colegas. É possível enviar também para contas externas desde que não haja bloqueio por domínio inválido

Integração com Asterisk


A forma mais evidente de integração do Asterisk com um serviço de email envolve a aplicação Voicemail. Um aviso por email pode ser enviado para cada mensagem de voz gravada pelo voicemail. Esses avisos podem incluir ou não o arquivo de audio da mensagem gravada. Assim, realize essa integração entre seu Asterisk e o serviço de email.

Um exemplo de configuração do arquivo voicemail.conf

[general]

Formats for writing Voicemail. Note that when using IMAP storage for
voicemail, only the first format specified will be used.
format= wav

format = wav49|gsm|wav serveremail = shyju@epillars.com attach = yes fromstring=The Asterisk PBX sendvoicemail = yes ; emailonly = no emailsubject = You have a New Voicemail from ${VM_CALLERID} emailbody = Dear ${VM_NAME} ,\n \t\t\t You have received a new voicemail from ${VM_CALLERID} \non ${VM_DATE}. \n Find attached.\n\n----\nAsterisk PBX maxgreet = operator = no maxmsg = 25 maxmessage = 300 minmessage = 0 saycid = no sayduration = no envelope = no review = no </syntaxhighlight>

  • Demais configurações necessárias para o Voicemail estão na Aula 13

12/12: Etapa 3: alertas com mensagem instantânea

Aula 35


Serviços de mensagem instantânea (ou IM, de Instant Messaging) proporcionam o envio e recepção de mensagens entre usuários em um tempo curto, o que possibilita uma conversação. Tais serviços são populares desde a difusão da Internet, citando-se o velho talk existente em sistemas Unix, ICQ, MSN, chat do Skype, Gtalk, Facebook Messenger, o pouco conhecido SIMPLE e, finalmente, o agora dominante Whatsapp (e seu similar Telegram). Uma grande diferença entre tais serviços e e-mail está no sincronismo na troca de mensagens. E-mail envia mensagens sem compromisso com o tempo que levará para que sejam entregues, podendo ser segundos ou mesmo dias (há um limite de 5 dias, por convenção). IM entrega mensagens tipicamente em segundos, possibilitando mensagens em ambos sentidos para formar uma conversa. E assim como e-mail pode ser usado por outros serviços para enviar notificações (ex: Voicemail), IM também pode ser usado para notificar usuários sobre eventos de interesse.


Na etapa 3 do projeto procuram-se integrar os serviços de telefonia e vigilância eletrônica com serviços de comunicação típicos da Internet. Na aula de hoje deve-se investigar, em particular, o uso de IM para envio de notificações de vigilância eletrônica. A função de detecção de movimento pode se beneficiar desse tipo de integração, ao usar IM para enviar alertas para um ou mais usuários de forma mais ágil e direta do que por e-mail. Assim, o objetivo do uso de IM no projeto é proporcionar esse tipo de notificação para detecção de movimento.


A integração com IM envolve usar a infraestrutura existente (telefonia e câmeras), e acrescentar funcionalidade para ter o novo serviço. Assim, o primeiro passo é identificar tecnologias IM que podem ser integradas a essa infraestrutura, em específico ao Asterisk. Duas opções se apresentam:

  1. XMPP: um protocolo para IM e notificação de presença (usado pelo Gtalk, por exemplo)
  2. SIMPLE: uma extensão ao protocolo SIP para mensagem instantânea

Essas duas tecnologias são alvo de comparações, como se pode ler neste artigo. A 1a opção é mais difundida, porém implica implantar uma nova infraestrutura para o serviço de IM. Quer dizer, torna-se necessário ter um servidor XMPP para efetuar o intercâmbio de mensagens, entre outros detalhes. Esse servidor, uma vez implantado, deve ser integrado ao Asterisk. Além disso, os contatos a serem notificados devem instalar um aplicativo em seus dispositivos móveis para receberem as mensagens (se bem que Zoiper consegue se comunicar com XMPP). A 2a opção é menos difundida, por ter funcionalidade muito mais restrita que XMPP, porém já está disponível tanto no Asterisk quanto em muitos softphones usados em dispositivos móveis. Por isso ela prescinde de implantar uma nova infraestrutura para o serviço de IM, e assim pode ser implantada mais facilmente.


Nesta etapa 2 do projeto será implantado um serviço de IM com SIMPLE. Isso implica o seguinte:

  1. Preparar o PBX Asterisk para o envio de mensagens com SIMPLE: isso envolve a correção de um bug no Asterisk e a configuração do plano de discagem para o envio de mensagens.
  2. Ativar a detecção de movimento nas câmeras IP com notificação via SIP: essas notificações serão encaminhadas pelo Asterisk como mensagens instantâneas para os contatos configurados.
  3. Configuração dos softphones usados nos dispositivos móveis: isso se faz necessário para que possam receber mensagens SIMPLE.

SIMPLE

SIMPLE estende o protocolo SIP para que possam ser enviadas mensagens instantâneas. Ele define um novo método SIP chamado MESSAGE, usado para representar uma mensagem instantânea. Mensagens SIP do tipo MESSAGE são enviadas fora-de-banda, o que significa que não dependem de se estabelecer um diálogo para que sejam enviadas. Em outras palavras, não há necessidade da sequência INVITE, 200 OK, ACK para que uma mensagem instantânea possa ser enviada para um contato. Assim, mensagens podem ser enviadas a qualquer momento. O diagrama a seguir ilustra o envio de uma mensagem com intermdiação de um proxy.

.
           |  F1 MESSAGE          |                         |
           |--------------------> |  F2 MESSAGE             |
           |                      | ----------------------->|
           |                      |                         |
           |                      |  F3 200 OK              |
           |                      | <-----------------------|
           |  F4 200 OK           |                         |
           |<-------------------- |                         |
           |                      |                         |
           |                      |                         |
           |                      |                         |
       Usuário 1                Proxy                   Usuário 2
Exemplo de envio de mensagem com SIMPLE. Fonte: RFC 3428


O conteúdo de uma mensagem é descrito no cabeçalho Content-type, e sua quantidade de octetos está no cabeçalho Content-length. Com isso, mensagens em princípio podem conter qualquer tipo de dado: texto simples, texto html, arquivos de midia ou documentos, entre outras possibilidades. O caso mais simples é o envio de mensagens de texto simples, como mostrado neste exemplo:

MESSAGE sip:user2@domain.com SIP/2.0
   Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse
   Max-Forwards: 70
   From: sip:user1@domain.com;tag=49583
   To: sip:user2@domain.com
   Call-ID: asd88asd77a@1.2.3.4
   CSeq: 1 MESSAGE
   Content-Type: text/plain
   Content-Length: 36

   Daqui do morro da pra ver as tainha.

A confirmação de recepção de mensagens com respostas 200 OK possibilita que o usuário que enviou a mensagem saiba se ela foi entregue. No caso da mensagem de exemplo mostrada anteriormente, a resposta poderia ser esta:

SIP/2.0 200 OK
Via: SIP/2.0/TCP user1pc.domain.com;branch=z9hG4bK776sgdkse;received=1.2.3.4
From: sip:user1@domain.com;;tag=49394
To: sip:user2@domain.com;tag=ab8asdasd9
Call-ID: asd88asd77a@1.2.3.4
CSeq: 1 MESSAGE
Content-Length: 0

Preparação do Asterisk

Asterisk versão 11 ou anterior (e talvez versão 12 também !) possui um bug que impede explorar o potencial do envio de mensagens instantâneas. Esse bug existe na função SIPPEER do plano de discagem, a qual fornece informações sobre um contato SIP, tais como seu endereço IP e port. O bug, mais especificamente, está na obtenção do endereço IP, cujo valor fornecido pela função é truncado nos dois primeiros octetos (ex: se o IP do contato for 172.18.20.123, a função retorna 172.18). Para corrigi-lo deve-se fazer o seguinte:

  1. Entre no subdiretório asterisk-11.1.1 do código-fonte do Asterisk 1.11.1 (aquele que foi compilado em seus computadores)
  2. Baixe este arquivo com este comando:
    wget http://tele.sj.ifsc.edu.br/~msobral/pji4/bugfix.tgz
    
  3. Descompacte-o:
    tar xzf bugfix.tgz
    
  4. Recompile e reinstale o Asterisk:
    make
    sudo service asterisk stop
    sudo cp main/asterisk /usr/local/sbin/
    sudo service asterisk stop
    

Configuração do plano de discagem

O envio de mensagens instantâneas no Asterisk envolve o plano de discagem, e implica o uso destas aplicações:

Assim, uma possível extensão que envie uma mensagem instantânea pode ser esta:

exten=>555,1,noop(demo do envio de mensagem)
same=>n,Set(MESSAGE(body)=hello world)
same=>n,MessageSend(sip:$[SIPPEER(1000, ip)]:$[SIPPEER(1000, port)])
same=>n,hangup()

Atividade

  1. Implemente o envio de mensagem instantânea com SIMPLE em seu PBX, e teste-o de forma a receber mensagens em seu dispositivo móvel.
  2. Configure sua câmera IP para que envie alarmes de detecção de movimento via SIP, de forma que sejam encaminhadas em seguida como mensagens instantâneas pelo PBX.

13/12: Etapa 3: alertas com mensagem instantânea (continuação)

Aula 36

19 e 20: Conclusão e apresentação

Na aula de 28/11 foram apresentados os cenários explorados nas etapas de projeto, e o que seria feito na etapa final, mostrada na figura a seguir. O tema dessa última etapa é a integração de serviços da Internet com os serviços de telefonia e vigilância eletrônica implantados nas duas etapas iniciais. Assim, nas últimas semanas foram revisados os serviços de DNS, WWW, e-mail e IM, e algumas considerações foram feitas sobre benefícios de integrá-los à rede corporativa já existente.

Cenário-etapa3.jpeg


Ao final da disciplina, um conjunto de cenários, técnicas e soluções foram experimentados para uma pequena rede corporativa. O resultado do projeto pode ser descrito por estes elementos:

  • Um serviço de telefonia IP baseado no modelo SIP e capaz de se integrar com as redes telefônicas convencional (PSTN) e móvel, com voice-mail integrado a e-mail
  • Um sistema de vigilância eletrônica composto por câmeras IP acessíveis via web e SIP, e capazes de detectar movimentos e gerar alertas via e-mail, SIP e IM.
  • Um serviço de webmail para acesso a caixas postais dos usuários.
  • Um serviço DNS que, além de traduzir nomes para endereços IP no domínio da rede corporativa, informa quem são os servidores de email e SIP do domínio


Desta forma a avaliação da etapa final envolve a preparação da rede corporativa para demonstrar suas capacidades e funcionalidades, conforme os elementos acima descritos. A tabela abaixo é uma lista de verificação das tarefas da avaliação:


Requisito Thiago Lucas Luciano Victor
PBX IP capaz de comutar chamadas entre usuários SIP SIM SIM SIM
PBX IP capaz de comutar chamadas por meio de tronco SIP
para usuários em outro PBX IP
SIM SIM SIM
Câmeras IP acessíveis via web por meio de seus nomes DNS SIM
(domínio DNS equivocado)
SIM
falha na definição de registro CNAME
SIM
Câmeras IP acessíveis via chamada SIP SIM SIM SIM
Câmeras IP acessíveis via RTSP SIM SIM
Alertas de movimento de câmeras IP via SIP SIM SIM SIM
Alertas de movimento de câmeras IP via IM SIM SIM NÃO
PBX IP localizável via domínio DNS SIM SIM SIM
Obs: faltou explicar registro SRV
PBX IP com voice-mail integrado a e-mail SIM SIM SIM
Webmail SIM SIM SIM

Recuperação

A recuperação envolve implantar um cenário relacionado ao que foi realizado nas etapas 1 e 2.

Cada aluno será responsável por um Asterisk. Cada central IP deverá atender os seguintes pontos:


  1. As contas SIP da central deverão ser criadas nas faixas 2XXX até 5XXX
  2. Chamadas entre quaisquer contas da central devem poder ser realizadas
  3. Chamadas para contas não registradas devem ser encaminhadas para Voicemail
  4. Chamadas para contas registradas devem ser atendidas em até 15 segundos. Passado esse limite de tempo, ou se ramal estiver ocupado, a chamada deve ser encaminhada para a telefonista (ramal 9).
  5. Chamadas para telefonista (ramal 9) devem ser encaminhadas para os canais SIP 5000 e 5001 (o primeiro que atender captura a chamada).
  6. Cada central deverá ter um contexto chamado INTERNO, o qual será usado para que as chamadas internas em cada central sejam completadas;
  7. Todo o áudio das chamadas deverá passar por dentro da central. Isto deve ser demonstrado via análise de protocolos.
  8. Cada central deverá ter um tronco SIP para a central dos professores. Deve-se usar o usuário SIP equipe1 com senha senha1 para estabelecer o tronco (PBX dos professores: 192.168.1.101). Chamadas vindas por esse tronco SIP devem utilizar o contexto SIP-EXT;
  9. Chamadas para ramais da central dos professores, ou para números externos, devem ter o prefixo 0 (DDD).
  10. Deve ser criado o contexto DDD;
  11. Deve ser dada a permissão para que todos os ramais utilizem o contexto INTERNO. No entanto, apenas alguns devem ter a permissão para acessar o contexto DDD;
  12. Ramais que acessam o contexto DDD também devem acessar o contexto INTERNO;
  13. Chamadas para números de celulares devem ser recusadas com uma mensagem de audio indicando que não são permitidas.