Mudanças entre as edições de "Redes Multimídia (diário 2017-1)"
Linha 960: | Linha 960: | ||
{{collapse bottom | Aula 9}} | {{collapse bottom | Aula 9}} | ||
+ | |||
+ | == 21/03: Funções de PABX== | ||
+ | |||
+ | {{collapse top | Aula 910}} | ||
+ | |||
+ | === 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. | ||
+ | * [http://www.voip-info.org/wiki/view/Asterisk+-+documentation+of+application+commands Lista completa de aplicações do Asterisk] | ||
+ | |||
+ | ===== [http://www.voip-info.org/wiki/view/Asterisk+cmd+Dial Dial] ===== | ||
+ | |||
+ | Encaminha a chamada para um destino. | ||
+ | |||
+ | Exemplo: | ||
+ | |||
+ | <syntaxhighlight lang=text> | ||
+ | exten=>_1XXXX,1,Dial(SIP/${EXTEN}) | ||
+ | same=>n,hangup | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===== [http://www.voip-info.org/wiki/view/Asterisk+cmd+BackGround 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: | ||
+ | |||
+ | <syntaxhighlight lang=text> | ||
+ | exten=>666,1,Answer | ||
+ | same=>n,Background(hello-world) | ||
+ | same=>n,Hangup | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===== [http://www.voip-info.org/wiki/view/Asterisk+cmd+Playback 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: | ||
+ | |||
+ | <syntaxhighlight lang=text> | ||
+ | exten=>666,1,Answer | ||
+ | same=>n,Playback(hello-world) | ||
+ | same=>n,Hangup | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===== [http://www.voip-info.org/wiki/view/Asterisk+cmd+Wait Wait] ===== | ||
+ | |||
+ | Força uma espera durante o processamento da chamada. | ||
+ | |||
+ | Exemplo: | ||
+ | |||
+ | <syntaxhighlight lang=text> | ||
+ | exten=>666,1,Answer | ||
+ | same=>n,Playback(hello-world) | ||
+ | same=>n,Wait(1) | ||
+ | same=>n,Playback(beep) | ||
+ | same=>n,Hangup | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===== [http://www.voip-info.org/wiki/view/Asterisk+cmd+Answer Answer] e [http://www.voip-info.org/wiki/view/Asterisk+cmd+Hangup Hangup] ===== | ||
+ | |||
+ | Answer atende uma chamada. Hangup termina uma chamada. | ||
+ | |||
+ | Exemplo: | ||
+ | |||
+ | <syntaxhighlight lang=text> | ||
+ | exten=>666,1,Answer | ||
+ | same=>n,Playback(hello-world) | ||
+ | same=>n,Hangup | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===== [http://www.voip-info.org/wiki/view/Asterisk+cmd+GoTo GoTo] ===== | ||
+ | |||
+ | Pula para um contexto (opcional), extensão, prioridade específica. Exemplo: | ||
+ | <syntaxhighlight lang=text> | ||
+ | exten=>100,1,GoTo(vendas,s,1) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===== [http://www.voip-info.org/wiki/view/Asterisk+cmd+GoToIf GoToIf] ===== | ||
+ | |||
+ | * [http://www.voip-info.org/wiki/view/Asterisk+Expressions Expressões no Asterisk] | ||
+ | |||
+ | 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: | ||
+ | <syntaxhighlight lang=text> | ||
+ | [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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===== [http://www.voip-info.org/wiki/view/Asterisk+cmd+Set Set] ===== | ||
+ | |||
+ | Modifica o valor de uma variável. | ||
+ | |||
+ | Exemplo: | ||
+ | |||
+ | <syntaxhighlight lang=text> | ||
+ | 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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===== [http://www.voip-info.org/wiki/view/Asterisk+cmd+Log Log] ===== | ||
+ | |||
+ | Grava um texto qualquer no log do Asterisk. | ||
+ | |||
+ | Exemplo: | ||
+ | |||
+ | <syntaxhighlight lang=text> | ||
+ | exten=>666,1,Log(DEBUG,"Chamada para 666") | ||
+ | same=>n,Dial(SIP/666,10) | ||
+ | same=>n,Hangup | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ===== [http://www.voip-info.org/wiki/view/Asterisk+cmd+NoOp NoOp] ===== | ||
+ | |||
+ | Não faz nada, sendo útil para depurar o plano de discagem. Exemplo: | ||
+ | <syntaxhighlight lang=text> | ||
+ | exten=>100,1,NoOp(${CONTEXT}) | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== Padrões de extensões ==== | ||
+ | *[http://www.voip-info.org/wiki/view/Asterisk+Dialplan+Patterns Tutorial sobre padrões de extensões no plano de discagem] | ||
+ | |||
+ | 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: | ||
+ | |||
+ | <syntaxhighlight lang=text> | ||
+ | exten=>_1XX,1,Dial(SIP/${EXTEN}) | ||
+ | same=>n,Hangup | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 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: | ||
+ | |||
+ | {| border="1" cellpadding="2" | ||
+ | !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 | ||
+ | |- | ||
+ | |<nowiki>!</nowiki>||Qualquer sequência de zero ou mais dígitos | ||
+ | |} | ||
+ | |||
+ | ==== Variáveis ==== | ||
+ | * [http://www.voip-info.org/wiki/view/Asterisk+variables Variáveis do Asterisk] | ||
+ | |||
+ | 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 [http://manpages.ubuntu.com/manpages/hardy/man1/bsd-csh.1.html 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: | ||
+ | |||
+ | <syntaxhighlight lang=text> | ||
+ | [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 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | ==== 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 === | ||
+ | |||
+ | # Faça com que chamadas para números externos à sua central recebam o prefixo ''048''.<!--<code>exten=>_NXXXXXXX,1,Dial(SIP/qualquer_tronco_externo/048${EXTEN})</syntaxhighlight>--> | ||
+ | # 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.<code>exten=>_0ZZZZZXXXXXXX,1,Dial(SIP/qualquer_tronco_externo/066${EXTEN:3})</syntaxhighlight>--> | ||
+ | # Façam com que chamada para celulares, que têm primeiro dígito entre 6 e 9, sejam sempre encaminhados por um determinado tronco.<!--<code>exten=>_[6-9]XXXXXXX,1,Dial(SIP/qualquer_tronco_gsm/${EXTEN})</syntaxhighlight>--> | ||
+ | # 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''. [http://www.voip-info.org/wiki/view/Setting+Callerid Dica]<!--<code> | ||
+ | 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>--> | ||
+ | # 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 [http://www.voip-info.org/wiki/view/Asterisk+cmd+Dial Dial] e [http://www.voip-info.org/wiki/view/Asterisk+cmd+Playback Playback].<!--<code>exten=>_2XXX,1,Dial(SIP/${EXTEN},15) | ||
+ | same=>n,Playback(audio_qualquer)</syntaxhighlight>--> | ||
+ | # Crie outra extensão que, se não for atendida em 15 segundos, seja encaminhada para outro ramal (ex: telefonista).<!--<code>exten=>2001,1,Dial(SIP/2001,15) | ||
+ | same=>n,Dial(SIP/2000)</syntaxhighlight>--> | ||
+ | # 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 [http://www.voip-info.org/wiki/view/Asterisk+cmd+Dial Dial]<!--<code>exten=>_2XXX,1,Dial(SIP/${EXTEN},15,L(60000)) | ||
+ | same=>n,Playback(beep) | ||
+ | same=>n,wait(1) | ||
+ | same=>n,Playback(beep)</syntaxhighlight>--> | ||
+ | # Modifique o exercício anterior para que os dois beeps sejam apresentados 10 segundos antes da chamada exceder o tempo limite de 60 segundos.<!--<code>exten=>_2XXX,1,Dial(SIP/${EXTEN},15,L(60000:50000:2000))</syntaxhighlight>--> | ||
+ | # 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 [http://www.voip-info.org/wiki/view/Asterisk+cmd+GoToIf GotoIf]<!--<code><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>--> | ||
+ | # 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 <!--<code>exten=>999,1,Dial(SIP/2000&SIP/2001) | ||
+ | exten=>999,n,Hangup</syntaxhighlight>--> | ||
+ | # 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.<!--<code>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>--> | ||
+ | # 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).<!--<code>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>--> | ||
+ | # 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''.<!--<code> exten=> 995,1,Answer | ||
+ | same=>n,SayUnixTime(dBAHMS) | ||
+ | same=>n,Hangup</syntaxhighlight>--> | ||
+ | # 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 [http://www.voip-info.org/wiki/view/Asterisk+cmd+GotoIfTime GotoIfTime] | ||
+ | # Crie uma extensão que, enquanto se espera que a chamada seja atendida, o chamador escute uma música. ''Dica:'' ver a [http://www.voip-info.org/wiki/view/Asterisk+cmd+MusicOnHold funcionalidade de música em espera (''music on hold'')]. | ||
+ | <!--# 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 [http://www.voip-info.org/wiki/view/Asterisk+cmd+ChanIsAvail ChanIsAvail]''.--> | ||
+ | # 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). | ||
+ | |||
+ | {{collapse bottom | Aula 10}} | ||
<!-- | <!-- |
Edição das 09h25min de 21 de março de 2017
Endereço encurtado: http://bit.ly/rmu20171
Presença
Redes Multimidia: Diário de Aula 2017-1
Professora: Simara Sonaglio
E-mail: simara.sonaglio@ifsc.edu.br
Encontros:
Atendimento paralelo:
Bibliografia
- Livros sobre Redes de Computadores (por ordem de preferência):
- KUROSE, James F. e ROSS, Keith W. Redes de computadores e a Internet, Uma abordagem Top-Down. 5a edição. Editora Addison Wesley SP, 2010.
- Sérgio Colcher, Antônio Tadeu Azevedo Gomes, e Anderson Oliveira da Silva. VoIP: Voz sobre IP. Campus, 1a edição, 2005.
- STALLINGS, W. Redes e sistemas de comunicação de dados. Editora Elsevier RJ, 2005.
- TANENBAUM, Andrew S. Redes de Computadores, tradução da quarta edição. Editora Campus RJ, 2003
- FOROUZAN, Behrouz. Comunicação de Dados e Redes de Computadores, 3a/4a edicão. Editora Bookman, 2004.
Softwares
Avaliações
- Trabalho 1: trabalho prático para ser apresentado;
- Trabalho 2: trabalho prático complementar a Trabalho 1 para ser apresentado;
- Trabalho 3: trabalho prático complementar a Trabalho 2 para ser apresentado.
Diário das aulas
13/02 - Apresentação da disciplina
Aula 1 |
---|
Apresentação da disciplina: conteúdo, bibliografia e avaliação, laboratório. Instalação do Asterisk
|
14/02 - Etapa Asterisk: Introdução, plano de discagem e contas SIP
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.
PBX IP Asterisk
Características Básicas: faz tudo que um PABX pequeno e simples faz e pouco mais
Instalação do Asterisk
|
20/02 - Continuação Aula 2
Aula 3 |
---|
21/02: 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.
Tronco SIPEm 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. A ativação de um entroncamento SIP entre dois PBX Asterisk pode ser feita seguindo o exemplo abaixo:
Atividade: estabelecendo chamadas entre diferentes PBX AsteriskNesta 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:
|
06/03: O protocolo SIP
Aula 5 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
O protocolo SIPO 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 SIPO 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):
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.
Tabela de métodos SIP (não exaustiva ... apenas os principais métodos)
Tabela de cabeçalhos SIP (não exaustiva ... apenas os principais cabeçalhos)
Tabela com as classes de respostas Diagramas de chamadasAlguns tipos de chamadas VoIP com SIP são recorrentes, estando representadas nas subseções a seguir. Registro de agente SIP em um proxy SIPEsta 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 SIPUma 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 SIPA 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 mediaEste 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-INVITEO 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 wiresharkO 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.
AtividadesNas análises pedidas a seguir, faça o seguinte:
|
07/03: O transporte do audio nas chamadas VoIP
Aula 6 | ||||
---|---|---|---|---|
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:
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:
Protocolo RTP
RTCPAlé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:
Os cinco tipos de relatórios são:
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. AtividadeEssa atividade busca ilustrar os fluxos RTP com um exemplo:
|
13/03: Continuação das atividades da Aula 6
Aula 7 |
---|
14/03: VoIP e NAT
Aula 8 |
---|
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:
Para entendermos os problemas causados pelo NAT na telefonia IP, iremos primeiramente fazer uma investigação utilizando como base para isso todo o conhecimento sobre os protocolos SIP, SDP e RTP previamente adquiridos. Assim, iremos implementar os cenários descritos na Atividade 1 e posteriormente Atividade 2, fazer chamadas de teste, capturar os pacotes destas chamadas utilizando o Wireshark e posterior análise destes.
Atividade 1- Softphone atrás de NAT
Solução utilizando o AsteriskO 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.
Atividade 2- Asterisk atrás de NAT
Solução utilizando o Asterisk
Para fazermos o redirecionamento de um fluxo entrante para outro servidor, devemos executar o seguinte:
|
20/03: Continuação das atividades da Aula 8
Aula 9 |
---|
21/03: Funções de PABX
Aula 910 | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Funções usando o plano de discagemPara 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çõesAs 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. DialEncaminha a chamada para um destino. Exemplo: exten=>_1XXXX,1,Dial(SIP/${EXTEN})
same=>n,hangup
BackgroundToca 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
PlaybackToca 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
WaitForç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 HangupAnswer atende uma chamada. Hangup termina uma chamada. Exemplo: exten=>666,1,Answer
same=>n,Playback(hello-world)
same=>n,Hangup
GoToPula para um contexto (opcional), extensão, prioridade específica. Exemplo: exten=>100,1,GoTo(vendas,s,1)
GoToIfTrata-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
SetModifica 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
LogGrava 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
NoOpNão faz nada, sendo útil para depurar o plano de discagem. Exemplo: exten=>100,1,NoOp(${CONTEXT})
Padrões de extensõesExtensõ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:
VariáveisO 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.
Existem três tipos de variáveis:
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 especiaisAlém das extensões criadas pelo usuário, o Asterisk apresenta algumas extensões especiais, tais como:
Atividades
|