Mudanças entre as edições de "PJI011104 - Projeto Integrador IV - 2022-1"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(30 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 7: Linha 7:
 
*Acesse o sigaa bucando a disciplina '''PJI011104 - PROJETO INTEGRADOR IV (2021.2 - T01)'''
 
*Acesse o sigaa bucando a disciplina '''PJI011104 - PROJETO INTEGRADOR IV (2021.2 - T01)'''
  
==Aulas síncronas não presenciais==
+
==Aulas síncronas presenciais==
  
* Horários
+
*[[Hor%C3%A1rios_dos_Cursos_do_IF-SC_Campus_S%C3%A3o_Jos%C3%A9|Horários]]   
** segundas e terças-feiras das 19:00 às 22:00
+
**Segundas e terças-feiras das 19:00 às 22:00
** sábados letivos serão com atividades assíncronas.
+
**Local: Laboratório de Sistemas Digitais (LabSiDi)
** Mais informações ver [https://sigaa.ifsc.edu.br/ SIGAA]
+
**Mais informações ver [https://sigaa.ifsc.edu.br/ SIGAA]
  
==Aulas presenciais==
+
==Aulas não presenciais==
*[[Hor%C3%A1rios_dos_Cursos_do_IF-SC_Campus_S%C3%A3o_Jos%C3%A9|Horários]]   
+
 
*Em condições de aulas presenciais: Sala 05, Laboratório Interativo e Meios de transmissão
+
*Sábados letivos serão com atividades assíncronas
  
 
=Organização curricular=
 
=Organização curricular=
Linha 191: Linha 191:
  
 
<code>
 
<code>
CREATE TABLE cdr_table ( <br/>
+
CREATE TABLE cdr_table (<br>
calldate datetime NOT NULL default CURRENT_TIMESTAMP, <br/>
+
calldate datetime NOT NULL default CURRENT_TIMESTAMP, <br>
clid varchar(80) NOT NULL default "", <br/>
+
clid varchar(80) NOT NULL default "", <br>
src varchar(80) NOT NULL default "", <br/>
+
src varchar(80) NOT NULL default "", <br>
dst varchar(80) NOT NULL default "", <br/>
+
dst varchar(80) NOT NULL default "", <br>
dcontext varchar(80) NOT NULL default "", <br/>
+
dcontext varchar(80) NOT NULL default "", <br>
channel varchar(80) NOT NULL default "", <br/>
+
channel varchar(80) NOT NULL default "", <br>
dstchannel varchar(80) NOT NULL default "", <br/>
+
dstchannel varchar(80) NOT NULL default "", <br>
lastapp varchar(80) NOT NULL default "", <br/>
+
lastapp varchar(80) NOT NULL default "", <br>
lastdata varchar(80) NOT NULL default "", <br/>
+
lastdata varchar(80) NOT NULL default "", <br>
duration int(11) NOT NULL default "0", <br/>
+
duration int(11) NOT NULL default "0", <br>
billsec int(11) NOT NULL default "0", <br/>
+
billsec int(11) NOT NULL default "0", <br>
disposition varchar(45) NOT NULL default "", <br/>
+
disposition varchar(45) NOT NULL default "", <br>
amaflags int(11) NOT NULL default "0", <br/>
+
amaflags int(11) NOT NULL default "0", <br>
accountcode varchar(20) NOT NULL default "", <br/>
+
accountcode varchar(20) NOT NULL default "", <br>
uniqueid varchar(32) NOT NULL default "", <br/>
+
uniqueid varchar(32) NOT NULL default "", <br>
peeraccount varchar(20) NOT NULL default "", <br/>
+
peeraccount varchar(20) NOT NULL default "", <br>
linkedid varchar(32) NOT NULL default "", <br/>
+
linkedid varchar(32) NOT NULL default "", <br>
sequence int(11) NOT NULL default "0", <br/>
+
sequence int(11) NOT NULL default "0", <br>
userfield varchar(255) NOT NULL default "", <br/>
+
userfield varchar(255) NOT NULL default "", <br>
monitor varchar(255) NOT NULL default "" <br/>
+
monitor varchar(255) NOT NULL default "" <br>
 
);
 
);
 
</code>
 
</code>
Linha 238: Linha 238:
  
 
<code>
 
<code>
[mysql] </br>
+
[mysql]<br>
usegmtime=yes </br>
+
usegmtime=yes<br>
loguniqueid=yes </br>
+
loguniqueid=yes<br>
loguserfield=yes </br>
+
loguserfield=yes<br>
accountlogs=yes </br>
+
accountlogs=yes<br>
 
</code>
 
</code>
  
Linha 256: Linha 256:
  
 
<code>
 
<code>
[global] </br>
+
[global]<br>
hostname=127.0.0.1 </br>
+
hostname=127.0.0.1<br>
dbname=cdr </br>
+
dbname=cdr<br>
table=cdr_table </br>
+
table=cdr_table<br>
password=1234 </br>
+
password=1234<br>
user=cdr_user </br>
+
user=cdr_user<br>
port=3306 </br>
+
port=3306<br>
sock=/var/run/mysqld/mysqld.sock </br>
+
sock=/var/run/mysqld/mysqld.sock<br>
timezone=UTC </br>
+
timezone=UTC<br>
 
</code>
 
</code>
  
Linha 298: Linha 298:
 
Deve ser exibido que Logging está habilitado e o mysql está listado no backend.
 
Deve ser exibido que Logging está habilitado e o mysql está listado no backend.
  
==Passo 6: Configurando o primeiro ramal sip no arquivo sip.conf==
+
==Passo 6: Adição dos arquivos de som em Português Brasil==
 +
 
 +
1) Baixe o arquivo <code>Asterisk-sounds-pt_BR.tar.gz</code>.
 +
 
 +
Este arquivo está compactando a pasta <code>sounds</code> que contém arquivos de áudio com dígitos, letras entre outros sons em português.
 +
 
 +
2) No terminal, vá até a pasta em que o arquivo foi baixado (provavelmente <code>~/Downloads</code>) e descompacte o arquivo com o seguinte comando:
 +
 
 +
<code>
 +
<nowiki>#</nowiki> tar -zxvf Asterisk-sounds-pt_BR.tar.gz
 +
</code>
 +
 
 +
3) Mova a pasta original de sons do Asterisk para uma pasta backup:
 +
 
 +
<code>
 +
<nowiki>#</nowiki> mv /var/lib/asterisk/sounds /var/lib/asterisk/sounds_backup
 +
</code>
 +
 
 +
4) Mova os sons descompactados para a pasta sounds do Asterisk:
 +
 
 +
<code>
 +
<nowiki>#</nowiki> mv sounds /var/lib/asterisk/
 +
</code>
 +
 
 +
5) Abra o arquivo <code>sip.conf</code> para edição:
 +
 
 +
<code>
 +
<nowiki>#</nowiki> vim /etc/asterisk/sip.conf
 +
</code>
 +
 
 +
6) Na linha 344, descomente a instrução (removendo o <code>;</code> no início da linha) e altere para o idioma pt_BR. Portanto, deve ficar assim:
 +
 
 +
<code>
 +
language=pt_BR
 +
</code>
 +
 
 +
7) Salve o arquivo <code>sip.conf</code>.
 +
 
 +
8) Recarregue as configurações sip do asterisk:
 +
 
 +
<code>
 +
CLI> sip reload
 +
</code>
 +
 
 +
=Explorando as configurações de utilização do Asterisk=
 +
 
 +
==Passo 1: Configurando o primeiro ramal sip no arquivo sip.conf==
  
 
1) Abra o arquivo <code>sip.conf</code> para edição
 
1) Abra o arquivo <code>sip.conf</code> para edição
Linha 341: Linha 387:
 
</code>
 
</code>
  
==Passo 7: Configurando o segundo ramal sip no arquivo sip.conf==
+
==Passo 2: Configurando o segundo ramal sip no arquivo sip.conf==
  
1) No fim do arquivo, adicione o ramal 2000 com permissão para realizar e receber chamadas (friend) e senha 1234
+
1) No fim do arquivo, adicione o ramal 1001 com permissão para realizar e receber chamadas (friend) e senha 1234
  
 
<code>
 
<code>
[2000]<br/>  
+
[1001]<br/>  
 
type=friend<br/>
 
type=friend<br/>
 
secret=1234<br/>  
 
secret=1234<br/>  
Linha 372: Linha 418:
  
 
6) Da máquina hospedeira, abra um softphone como o Zoiper utilizando como parâmetros (substitua o endereço de IP pelo correto):
 
6) Da máquina hospedeira, abra um softphone como o Zoiper utilizando como parâmetros (substitua o endereço de IP pelo correto):
*Usuário: <code>2000</code> ou <code>2000@192.168.0.2</code>
+
*Usuário: <code>1001</code> ou <code>1001@192.168.0.2</code>
 
*Senha: <code>1234</code>
 
*Senha: <code>1234</code>
 
*Domínio/SIP Server: <code>192.168.0.2</code>
 
*Domínio/SIP Server: <code>192.168.0.2</code>
Linha 379: Linha 425:
  
 
<code>
 
<code>
-- Registered SIP '2000' at 127.0.0.1:47844
+
-- Registered SIP '1001' at 127.0.0.1:47844
 
</code>
 
</code>
  
7) Tente realizar uma chamada, por exemplo do 1000 ligando para o 2000, no cliente rasterisk você deve ver a seguinte mensagem indicando que não pode realizar a chamada:
+
7) Tente realizar uma chamada, por exemplo do 1000 ligando para o 1001, no cliente rasterisk você deve ver a seguinte mensagem indicando que não pode realizar a chamada:
  
 
<code>
 
<code>
NOTICE[5906][C-00000003]: chan_sip.c:26602 handle_request_invite: Call from '1000' (127.0.0.1:47843) to extension '2000' rejected because extension not found in context 'public'.
+
NOTICE[5906][C-00000003]: chan_sip.c:26602 handle_request_invite: Call from '1000' (127.0.0.1:47843) to extension '1001' rejected because extension not found in context 'public'.
 
</code>
 
</code>
  
Esta mensagem diz que a chamada do ramal 1000 para 2000 foi rejeitada pois não foi encontrada uma extensão no contexto 'public'. Uma extensão ou plano de discagem é um conjunto de ações que o Asterisk executa quando um ramal está ligando para outro em específico. Para que o 1000 possa ligar para o 2000 é necessário haver uma extensão indicando como se dará esta conexão. Atualmente esta extensão não existe, por isso a chamada foi rejeitada. Além disso, a mensagenm indica que o Asterisk tentou achar esta extensão no contexto 'public'. De fato, os ramais 1000 e 2000 não foram cadastrados em nenhum contexto específico, por isso, por padrão, estão no 'public'.
+
Esta mensagem diz que a chamada do ramal 1000 para 1001 foi rejeitada pois não foi encontrada uma extensão no contexto 'public'. Uma extensão ou plano de discagem é um conjunto de ações que o Asterisk executa quando um ramal está ligando para outro em específico. Para que o 1000 possa ligar para o 1001 é necessário haver uma extensão indicando como se dará esta conexão. Atualmente esta extensão não existe, por isso a chamada foi rejeitada. Além disso, a mensagenm indica que o Asterisk tentou achar esta extensão no contexto 'public'. De fato, os ramais 1000 e 1001 não foram cadastrados em nenhum contexto específico, por isso, por padrão, estão no 'public'.
  
==Passo 8: Criando uma extensão para identificação do ramal==
+
==Passo 3: Criando uma extensão para identificação do ramal==
  
 
1) Abra o arquivo <code>extensions.conf</code> para edição
 
1) Abra o arquivo <code>extensions.conf</code> para edição
Linha 405: Linha 451:
  
 
3) Abaixo desta linha comentada (e também abaixo da chave <code>[public]</code>) copie as seguintes instruções:
 
3) Abaixo desta linha comentada (e também abaixo da chave <code>[public]</code>) copie as seguintes instruções:
 +
 
<code>
 
<code>
exten => 655,1,NoOp("Identifica Ramal")<br/>
+
exten => 655,1,NoOp(Identifica Ramal)<br/>
 
exten => 655,2,Answer()<br/>
 
exten => 655,2,Answer()<br/>
 
exten => 655,3,Wait(1)<br/>
 
exten => 655,3,Wait(1)<br/>
Linha 424: Linha 471:
 
#Encerra a ligação (Hangup)
 
#Encerra a ligação (Hangup)
  
4) Salve o arquivo extensions.conf
+
4) Salve o arquivo <code>extensions.conf</code>
  
 
5) Recarregue os planos de discagem do asterisk:
 
5) Recarregue os planos de discagem do asterisk:
Linha 432: Linha 479:
 
</code>
 
</code>
  
6) Do softphone realize uma chamada para o número <code>655</code>, você deve ouvir uma mensagem informando o número do ramal que originou a ligação.
+
6) Do softphone realize uma chamada para o número <code>655</code>.
 +
 
 +
Você deve ouvir uma mensagem informando o número do ramal que originou a ligação.
 +
 
 +
==Passo 4: Testando a declaração de um novo contexto==
 +
 
 +
1) No arquivo <code>extensions.conf</code>, digite <code>[funcionarios]</code> abaixo de <code>[public]</code>.
 +
 
 +
2) Salve o arquivo <code>extensions.conf</code> e recarregue os planos de discagem do asterisk <code>CLI> dialplan reload</code>.
 +
 
 +
3) Do softphone realize uma chamada para o número <code>655</code>
 +
 
 +
A chamada não deve funcionar, encerrando logo após a discagem.
 +
 
 +
No rasterisk você deve ver a seguinte mensagem:
 +
<code>
 +
NOTICE[5906][C-00000006]: chan_sip.c:26602 handle_request_invite: Call from '1000' (127.0.0.1:47843) to extension '655' rejected because extension not found in context 'public'.
 +
</code>
 +
 
 +
Isso está ocorrendo pois a extensão criada para o número <code>655</code> está dentro do contexto <code>[funcionarios]</code>, e o ramal que está tentando ligar para esta extensão está em outro contexto (no caso, está em <code>[public]</code>). Observe que o conteúdo de um contexto inicia logo após o nome do contexto entre colchetes e terminal quando há outro nome de contexto entre colchetes.
 +
 
 +
==Passo 5: Adicionando contexto aos ramais==
 +
 
 +
No passo anterior, o plano de discagem para o número <code>655</code> foi colocado dentro de um contexto chamado <code>[funcionarios]</code>, porém os ramais existentes <code>1000</code> e <code>1001</code>, não estão configurados para nenhum contexto específico, portando são <code>[public]</code>, e neste momento o <code>[public]</code> não possui planos de discagem. Portanto, vamos colocar os ramais dentro do contexto <code>[funcionarios]</code> para fazer o plano para o número <code>655</code> voltar a funcionar.
 +
 
 +
1) No arquivo <code>sip.conf</code>, edite os ramais <code>1000</code> e <code>1001</code> para que sejam incluídos no contexto <code>[funcionarios]</code>, o resultado deve ficar assim:
 +
 
 +
<code>
 +
[1000]<br/>
 +
type=friend<br/>
 +
secret=1234<br/>
 +
host=dynamic<br/>
 +
qualify=yes<br/>
 +
context=funcionarios<br/>
 +
<br/>
 +
[1001]<br/>
 +
type=friend<br/>
 +
secret=1234<br/>
 +
host=dynamic<br/>
 +
qualify=yes<br/>
 +
context=funcionarios<br/>
 +
</code>
 +
 
 +
2) Recarregue o asterisk com as novas configurações do arquivo <code>sip.conf</code>:
 +
 
 +
<code>
 +
CLI> sip reload
 +
</code>
 +
 
 +
==Passo 6: Incluindo um contexto dentro de outro==
 +
No passo anterior configuramos os ramais <code>1000</code> e <code>1001</code> para pertencerem ao contexto <code>[funcionarios]</code>, pois o plano de discagem para o número <code>655</code> estava configurado neste contexto. Agora vamos devolver o plano de discagem para o número <code>655</code> para o contexto <code>[public]</code> e em seguida faremos o contexto <code>[funcionarios]</code> herdar os planos de <code>[public]</code>.
 +
 
 +
1) No arquivo <code>extensions.conf</code>, deixe o plano de discagem para o número <code>655</code> dentro do contexto <code>[public]</code>, deixando o contexto <code>[funcionarios]</code> vazio:
 +
 
 +
<code>
 +
[public]</br>
 +
exten => 655,1,NoOp(Identifica Ramal)</br>
 +
exten => 655,2,Answer()</br>
 +
exten => 655,3,Wait(1)</br>
 +
exten => 655,4,Playback(number&is)</br>
 +
exten => 655,5,SayDigits(${CALLERID(num)})</br>
 +
exten => 655,6,Wait(2)</br>
 +
exten => 655,7,Hangup()</br>
 +
</br>
 +
[funcionarios]</br>
 +
</br>
 +
</code>
 +
 
 +
2) Recarregue o asterisk com as novas configurações do arquivo <code>extensions.conf</code>:
 +
 
 +
<code>
 +
CLI> dialplan reload
 +
</code>
 +
 
 +
3) Do softphone realize uma chamada para o número <code>655</code>.
 +
 
 +
A chamada não deve funcionar, encerrando logo após a discagem.
 +
 
 +
4) No arquivo <code>extensions.conf</code>, vamos incluir os planos de discagem do contexto <code>[public]</code> no contexto <code>[funcionarios]</code>, para isso logo abaixo do nome <code>[funcionarios]</code> digite o include. Deve ficar assim:
 +
 
 +
<code>
 +
[funcionarios]</br>
 +
include => public</br>
 +
</code>
 +
 
 +
5) Recarregue o asterisk com as novas configurações do arquivo <code>extensions.conf</code>:
 +
 
 +
<code>
 +
CLI> dialplan reload
 +
</code>
 +
 
 +
6) Do softphone realize uma chamada para o número <code>655</code>.
 +
 
 +
Você deve ouvir uma mensagem informando o número do ramal que originou a ligação.
 +
 
 +
==Passo 7: Separando planos de discagem em diferentes arquivos==
 +
 
 +
O Asterisk busca os planos de chamadas no arquivo <code>extensions.conf</code>, porém, é possível adicionar configurações de ramais e de planos de chamada em outros arquivos, bastando incluí-lo através da diretiva <code><nowiki>#</nowiki>include</code>. Vamos a um exemplo:
 +
 
 +
1) No arquivo <code>extensions.conf</code>, apague a declaração do contexto <code>[funcionarios]</code> e coloque um <code><nowiki>#</nowiki>include</code> para um outro arquivo, deve ficar assim:
 +
 
 +
<code>
 +
[public]</br>
 +
exten => 655,1,NoOp(Identifica Ramal)</br>
 +
exten => 655,2,Answer()</br>
 +
exten => 655,3,Wait(1)</br>
 +
exten => 655,4,Playback(number&is)</br>
 +
exten => 655,5,SayDigits(${CALLERID(num)})</br>
 +
exten => 655,6,Wait(2)</br>
 +
exten => 655,7,Hangup()</br>
 +
</br>
 +
<nowiki>#</nowiki>include extensions_custom.conf</br>
 +
</code>
 +
 
 +
2) Crie um novo arquivo, chamado de <code>extensions_custom.conf</code>, abra-o para edição e cole o contexto <code>[funcionarios]</code>, ficando assim:
 +
<code>
 +
[funcionarios]</br>
 +
include => public</br>
 +
</code>
 +
 
 +
3) Recarregue o asterisk com as novas configurações do arquivo <code>extensions.conf</code>:
 +
 
 +
<code>
 +
CLI> dialplan reload
 +
</code>
 +
 
 +
4) Do softphone realize uma chamada para o número <code>655</code>.
 +
 
 +
Você deve ouvir uma mensagem informando o número do ramal que originou a ligação.
 +
 
 +
==Passo 8: Utilizando macros==
 +
 
 +
Uma macro é um conjunto de operações que pode ser reaproveitado em diferentes contextos e planos de chamada. A macro auxilia a reduzir a quantidade de linhas de código pois pode-se criar uma macro de trechos de código que se repetem. Além disso, quando vários planos de chamada estão invocando uma mesma macro, caso se queira modificar algum detalhe destas operações, basta alterar unicamente a macro pois fazendo isso todos os trechos de código que invocam estava macro já serão contemplados por esta modificação. Vamos usar como exemplo uma macro que reproduz áudio dos dígitos do ramal que originou a ligação.
 +
 
 +
1) No arquivo <code>extensions.conf</code>, abaixo do contexto <code>[public]</code>, adicione a macro a seguir:
 +
 
 +
<code>
 +
[macro-identifica]</br>
 +
exten => s,1,NoOp(Identifica Ramal)</br>
 +
exten => s,n,Playback(number&is)</br>
 +
exten => s,n,SayDigits(${ARG1})</br>
 +
</code>
 +
 
 +
Esta macro reproduz o áudio dos dígitos enviados como primeiro argumento da macro (ARG1). O nome das macros sempre ficam entre colchetes e começam com <code>macro-</code>. Observe que estamos utilizando um nome de extensão pré-definido <code>s</code>. Esta predefinição indica para o asterisk utilizar o nome da extensão da operação que invocou esta macro. Ou seja, <code>s</code> é uma variável, logo abaixo quando invocado será equivalente a <code>655</code>. Observe também que estamos utilizando a ordem de prioridade <code>n</code> que diz ao Asterisk para utilizar o pŕoximo número da sequencia, ou seja, na linha abaixo de <code>1</code>, <code>n</code> será substituído por <code>2</code>, e assim por diante. Observe também que a primeira linha do plano de discagem inicia com prioridade igual a <code>1</code>.
 +
 
 +
2) Vamos agora editar o contexto <code>[public]</code> para que ele passe a chamar a <code>[macro-identifica]</code>:
 +
 
 +
<code>
 +
[public]</br>
 +
exten => 655,1,Answer()</br>
 +
exten => 655,n,Wait(1)</br>
 +
exten => 655,n,Macro(identifica,${CALLERID(num)})</br>
 +
exten => 655,n,Wait(2)</br>
 +
exten => 655,n,Hangup()</br>
 +
</br>
 +
<nowiki>#</nowiki>include extensions_custom.conf</br>
 +
</code>
 +
 
 +
Observe que a prioridade <code>n</code> foi novamente utilizada e que o comando Macro está sendo invocado na 4 linha deste trecho de código. O primeiro argumento do comando Macro é o nome da macro. Deve-se considerar o nome entre colchetes, menos o prefixo <code>macro-</code>, portanto <code>[macro-identifica]</code> é chamada simplesmente de <code>identifica</code>. No segundo argumento do comando Macro, após a vírgula, colocamos a tag <code>${CALLERID(num)}</code> que retorna o número que realizou a chamada. Esta informação é enviada à macro e como é o argumento logo após o nome da macro, se chamará <code>${ARG1}</code>. Se houvessem outros argumentos neste comando Macro (separados por vírgulas), estes poderiam ser utilizados pela Macro conforma a posição na invocação seguindo a sequencia <code>${ARG2}</code>, <code>${ARG3}</code>, ...
 +
 
 +
3) Recarregue o asterisk com as novas configurações do arquivo <code>extensions.conf</code>:
 +
 
 +
<code>
 +
CLI> dialplan reload
 +
</code>
 +
 
 +
4) Do softphone realize uma chamada para o número <code>655</code>.
 +
 
 +
Você deve ouvir uma mensagem informando o número do ramal que originou a ligação.
 +
 
 +
5) Para saber mais sobre a aplicação Macro, digite:
 +
 
 +
<code>
 +
CLI> core show application Macro
 +
</code>
 +
 
 +
==Passo 9: Verificando registros de chamadas no banco de dados==
 +
 
 +
Cada chamada realizada é registrada na base de dados cdr que foi criada no MySQL. Os registros são gerados como linhas da tabela cdr_table. Cdr (Call Details Record) é um recurso do Asterisk que permite o registro de informações como a data/hora da chamada, sua duração, número originador da chamada, número de destino, etc.
 +
 
 +
1) Para verificar os registros, acessamos o banco de dados que foi criado, seguindo a sequência abaixo:
 +
 
 +
<code>
 +
<nowiki>#</nowiki> mysql cdr -u cdr_user -p
 +
</code>
 +
 
 +
A senha definida para o usuário cdr_user foi <code>1234</code>.
 +
 
 +
2) Para verificar os registros, acessamos o banco de dados que foi criado, seguindo a sequência abaixo:
 +
<code>
 +
mysql> select * from cdr_table\G
 +
</code>
 +
 
 +
==Passo 10: Gravando e reproduzindo o áudio de chamadas==
 +
 
 +
1) No arquivo <code>extensions.conf</code>, vamos editar a macro para que esta passe a gravar o áudio da chamada utilizando a aplicação MixMonitor do Asterisk:
 +
 
 +
<code>
 +
[macro-identifica]<br>
 +
exten => s,1,NoOp(Identifica Ramal)<br>
 +
exten => s,n,MixMonitor(/var/spool/asterisk/monitor/${STRFTIME($EPOCH,,%Y%m%d)}/CHANNEL-${CALLERID(num)}-${STRFTIME($EPOCH,,%Y%m%d-%H%M%S)}-${UNIQUEID}.wav)<br>
 +
exten => s,n,Set(CDR(monitor)=CHANNEL-${CALLERID(num)}-${STRFTIME($EPOCH,,%Y%m%d-%H%M%S)}-${UNIQUEID}.WAV)<br>
 +
exten => s,n,Playback(number&is)<br>
 +
exten => s,n,SayDigits(${ARG1})<br>
 +
</code>
 +
 
 +
Obs.: O diretório padrão de gravações de chamadas no Asterisk é <code>/var/spool/asterisk/monitor</code> e ali são criados diretórios com as datas das ligações, dentro dos quais, as gravações ficam salvas, geralmente em formato <code>.wav</code>
 +
 
 +
2) Recarregue o asterisk com as novas configurações do arquivo <code>extensions.conf</code>:
 +
 
 +
<code>
 +
CLI> dialplan reload
 +
</code>
 +
 
 +
3) Do softphone realize uma chamada para o número <code>655</code>.
 +
 
 +
4) Vá ao diretório <code>/var/spool/asterisk/monitor</code> e localize a gravação realizada.
 +
 
 +
5) Observe no registro do banco de dados que o campo Monitor se refere ao arquivo de áudio gerado:
 +
 
 +
<code>
 +
mysql> select * from cdr_table\G
 +
</code>
 +
 
 +
6) Para saber mais sobre esta aplicação MixMonitor do Asterisk, digite:
 +
 
 +
<code>
 +
CLI> core show application MixMonitor
 +
</code>
 +
 
 +
==Passo 11: Realizando chamadas entre ramais==
 +
 
 +
No arquivo <code>sip.conf</code> já temos declarados dois ramais (<code>1000</code> e <code>1001</code>), porém não há nenhum plano de discagem que permita que um possa chamar o outro. Ambos os ramais pertencem ao contexto <code>funcionarios</code> declarado no arquivo <code>extensions_custom.conf</code>. Será necessário abrir dois softphones, um cadastrado como <code>1000</code> e outro <code>1001</code>. Para isso, você pode usar um softphone da máquina host e outro na virtual. Outra possibilidade é instalar um outro softphone na máquina virtual (além do Zoiper5), podendo ser um software de outro fabricante ou uma versão antiga do Zoiper.
 +
 
 +
1) Edite o arquivo <code>extensions_custom.conf</code>, para que fique conforme a seguir:
 +
 
 +
<code>
 +
[funcionarios]<br>
 +
include => public<br>
 +
<br>
 +
exten => _1XXX,1,NoOp(Ligação para um ramal de funcionário)<br>
 +
exten => _1XXX,n,Dial(SIP/${EXTEN},30)<br>
 +
exten => _1XXX,n,HangUp<br>
 +
</code>
 +
 
 +
2) Recarregue o asterisk com as novas configurações do arquivo <code>extensions.conf</code>:
 +
 
 +
<code>
 +
CLI> dialplan reload
 +
</code>
 +
 
 +
3) Do softphone que está configurado com o número <code>1000</code> realize uma chamada para o número <code>1001</code>.
 +
 
 +
Você deve um softphone deve chamar o outro, podendo atender a chamada falar e ouvir de cada um deles. O mesmo deve ocorrer ligando de <code>1001</code> para <code>1000</code>.
 +
 
 +
==Passo 12: Criando uma URA==
 +
 
 +
A URA (Unidade de Resposta Audível) pode ser definida através de planos de discagem, com isso é possível realizar atendimento automático de chamadas, reproduzir áudios e receber comandos enviados pelo usuário. Como exemplo inicial, digamos que deseja-se dar acesso aos ramais internos apenas através da URA, ou seja, alguém que está chamando precisa discar para a URA e na URA selecionar a pessoa que deseja falar.
 +
 
 +
1) Edite o arquivo <code>extensions.conf</code>, adicionando um novo planoa de discagem no contexto <code>[public]</code> para que fique assim:
 +
 
 +
<code>
 +
[public]<br>
 +
<nowiki>#</nowiki>include extensions_custom.conf<br>
 +
<br>
 +
exten => 655,1,Answer()<br>
 +
exten => 655,n,Wait(1)<br>
 +
exten => 655,n,Macro(identifica,${CALLERID(num)})<br>
 +
exten => 655,n,Wait(2)<br>
 +
exten => 655,n,Hangup()<br>
 +
<br>
 +
exten => 9100,1,NoOp(URA - Exemplo)<br>
 +
exten => 9100,n,Answer()<br>
 +
exten => 9100,n,Set(TIMEOUT(digits)=2)<br>
 +
exten => 9100,n(audioURA),BackGround(press-1&to-call-this-number)<br>
 +
exten => 9100,n,WaitExten(5)<br>
 +
<br>
 +
exten => 0,1,NoOp(Opção 0 selecionada - encaminhando ligação para ramal 1000)<br>
 +
exten => 0,n,Dial(SIP/1000)<br>
 +
exten => 0,n,HangUp()<br>
 +
<br>
 +
exten => 1,1,NoOp(Opção 1 selecionada - encaminhando ligação para ramal 1001)<br>
 +
exten => 1,n,Dial(SIP/1001)<br>
 +
exten => 1,n,HangUp()<br>
 +
<br>
 +
exten => i,1,NoOp(Opção inválida)<br>
 +
exten => i,n,GoTo(9100,audioURA)<br>
 +
<br>
 +
exten => t,1,NoOp(Timeout atingido)<br>
 +
exten => t,n,Playback(vm-goodbye)<br>
 +
exten => t,n,HangUp()<br>
 +
</code>
 +
 
 +
2) Recarregue o asterisk com as novas configurações do arquivo <code>extensions.conf</code>:
 +
 
 +
<code>
 +
CLI> dialplan reload
 +
</code>
 +
 
 +
3) Do softphone que está configurado com o número <code>1000</code> realize uma chamada para o número <code>9100</code>.
 +
 
 +
Você deve ouvir a frase "pressione 1 para chamar esse número", depois digite <code>1</code>. Você deve um softphone deve chamar o outro, podendo atender a chamada falar e ouvir de cada um deles. Desligue e teste novamente sem digitar nada, após 5 segundos você deve ouvir "até logo" e a ligação será encerrada.
 +
 
 +
4) Vamos agora estudar mais atentamente as linhas de comando:
 +
 
 +
O trecho a seguir é o plano de discagem para o número <code>9100</code>, comença com um texto de debug (NoOp), depois a chamada é atendida pelo Asterisk, depois é reproduzido dois áudios, um chamado "press-1" e outro "to-call-this-number" (áudios padrão já previamente gravados), finalmente o comando WaitExten determina que após ouvir o áudio o usuário tem 5 segundos para digitar algo, ou a chamada será encerrada por timeout.
 +
 
 +
<code>
 +
exten => 9100,1,NoOp(URA - Exemplo)<br>
 +
exten => 9100,n,Answer()<br>
 +
exten => 9100,n(audioURA),BackGround(press-1&to-call-this-number)<br>
 +
exten => 9100,n,WaitExten(5)<br>
 +
</code>
 +
 
 +
Observe que ao lado do número da terceira linha há o código <code>(audioURA)</code>. Esse código funciona como um apelido para este linha. Isso será útil no trecho do plano para opção inválida que está definido mais adiante e deseja-se que caso uma opção inválida seja digitada o Asterisk volte para o início do menu, porém sem precisar atender novamente a chamada (Answer) pois a chamada já está sendo atendida.
 +
 
 +
O trecho a seguir determina o que será feito caso o usuário digite <code>0</code>. O Asterisk simplesmente chama (Dial) o número <code>1000</code> e a chamada posteriormente será encerrada (HangUp).
 +
 
 +
<code>
 +
exten => 0,1,NoOp(Opção 0 selecionada - encaminhando ligação para ramal 1000)<br>
 +
exten => 0,n,Dial(SIP/1000)<br>
 +
exten => 0,n,HangUp()<br>
 +
</code>
 +
 
 +
A opção <code>1</code> funciona da mesma maneira.
 +
 
 +
No trecho a seguir é processada a opção inválida, ou seja, quando é digitada uma opção que não está prevista no plano de discagem. Neste caso o Asterisk retorna ao início da URA, no momento em que o áudio das opções do menu é reproduzido.
 +
 
 +
<code>
 +
exten => i,1,NoOp(Opção inválida)<br>
 +
exten => i,n,GoTo(9100,audioURA)<br>
 +
</code>
 +
 
 +
Finalmente no trecho a seguir é processado o timeout, ou seja, quando o usuário não digitou nada e esgotou seu tempo. Neste caso o áudio "vm-goodbye" é reproduzido e depois a chamada é necerrada.
 +
 
 +
<code>
 +
exten => t,1,NoOp(Timeout atingido)<br>
 +
exten => t,n,Playback(vm-goodbye)<br>
 +
exten => t,n,HangUp()<br>
 +
</code>
 +
 
 +
Observe que neste plano duas aplicações diferentes para reproduzir sons foram utilizadas, a aplicação <code>BackGround</code> e a aplicação <code>Playback</code>. A diferença entre elas é que <code>BackGround</code> reproduz um áudio ao mesmo tempo em que o Asterisk fica esperando que algo seja digitado, enquanto no Playback o Asterisk não realiza outra operação enquanto não concluir o áudio.
 +
 
 +
Para saber mais sobre BackGround e Playback digite:
 +
<code>
 +
CLI> core show application BackGround
 +
CLI> core show application Playback
 +
</code>
 +
 
 +
Para saber mais sobre TIMEOUT digite:
 +
 
 +
<code>
 +
CLI> core show function TIMEOUT
 +
</code>
 +
 
 +
Para saber mais sobre TIMEOUT digite
 +
<code>
 +
CLI> core show function TIMEOUT
 +
</code>
 +
 
 +
==Passo 13: Criando uma URA com sub-URAS==
 +
 
 +
Para criar uma URA com sub-URAs utiliza-se o mesmo conceito de contextos, bastando colocar a URa e cada sub-URA em um contexto próprio. Vamos editar a URA implementada no passo anterior para que fique em um contexto.
 +
 
 +
1) Edite o arquivo <code>extensions.conf</code>, adicionando um novo plano de discagem no contexto <code>[public]</code> para que fique assim:
 +
 
 +
<code>
 +
[public]<br>
 +
<nowiki>#</nowiki>include extensions_custom.conf<br>
 +
<br>
 +
exten => 655,1,Answer()<br>
 +
exten => 655,n,Wait(1)<br>
 +
exten => 655,n,Macro(identifica,${CALLERID(num)})<br>
 +
exten => 655,n,Wait(2)<br>
 +
exten => 655,n,Hangup()<br>
 +
<br>
 +
exten => 9100,1,NoOp(Chamando contexto URA-Geral)<br>
 +
exten => 9100,n,GoTo(URA-Geral,${EXTEN},1)<br>
 +
<br>
 +
[URA-Geral]<br>
 +
<br>
 +
exten => s,1,NoOp(URA - Exemplo)<br>
 +
exten => s,n,Answer()<br>
 +
exten => s,n,Set(TIMEOUT(digits)=2)<br>
 +
exten => s,n(audioURA),BackGround(press-1&to-call-this-number)<br>
 +
exten => s,n,WaitExten(5)<br>
 +
<br>
 +
exten => 0,1,NoOp(Opção 0 selecionada - encaminhando ligação para ramal 1000)<br>
 +
exten => 0,n,Dial(SIP/1000)<br>
 +
exten => 0,n,HangUp()<br>
 +
<br>
 +
exten => 1,1,NoOp(Opção 1 selecionada - encaminhando ligação para ramal 1001)<br>
 +
exten => 1,n,Dial(SIP/1001)<br>
 +
exten => 1,n,HangUp()<br>
 +
<br>
 +
exten => i,1,NoOp(Opção inválida)<br>
 +
exten => i,n,GoTo(s,audioURA)<br>
 +
<br>
 +
exten => t,1,NoOp(Timeout atingido)<br>
 +
exten => t,n,Playback(vm-goodbye)<br>
 +
exten => t,n,HangUp()<br>
 +
</code>
 +
 
 +
Note agora que no contexto <code>[public]</code> há um GoTo para o contexto <code>[URA-Geral]</code> que possui o plano de discagem da URA. Com isso o código em <code>[public]</code> ficou mias limpo e o código da URA ficou melhor "encapsulado".
 +
 
 +
Na linha que faz o GoTo para o contexto <code>[URA-Geral]</code>, foi utilizada a [https://www.voip-info.org/asterisk-detailed-variable-list/ variável] <code>${EXTEN}</code> que é padrão do Asterisk e representa a extensão que foi chamada (neste exemplo, representa 9100). Alternativamente, poderia-se utilizar a extenção padrão <code>s</code> que representa a extenção enviada para o contexto. Portanto, a linho do GoTo poderia ser substituida pela linha abaixo:
 +
 
 +
<code>
 +
exten => 9100,n,GoTo(URA-Geral,s,1)
 +
</code>
 +
 
 +
2) Recarregue o asterisk com as novas configurações do arquivo <code>extensions.conf</code>:
 +
 
 +
<code>
 +
CLI> dialplan reload
 +
</code>
 +
 
 +
3) Do softphone que está configurado com o número <code>1000</code> realize uma chamada para o número <code>9100</code>.
 +
 
 +
Você deve ouvir a frase "pressione 1 para chamar esse número", depois digite <code>1</code>. Você deve um softphone deve chamar o outro, podendo atender a chamada falar e ouvir de cada um deles. Desligue e teste novamente sem digitar nada, após 5 segundos você deve ouvir "até logo" e a ligação será encerrada.
 +
 
 +
4) Para criar uma sub-URA utilizaremos a mesma lógica de encapsulamento que foi utilizada na URA. Vamos editar a opção <code>1</code> da <code>URA-Geral</code> para que chame a <code>subURA-1</code>, para isso, editando a opção <code>1</code>, o código fica assim:
 +
 
 +
<code>
 +
exten => 1,1,NoOp(Opção 1 selecionada - chamando a subURA-1)<br>
 +
exten => 1,n,GoTo(subURA-1,s,1)<br>
 +
</code>
 +
 
 +
5) Agora, criaremos a subURA-1 que conterá um as opções <code>1</code> e <code>9</code> para discar para o ramal <code>1001</code> ou para voltar ao menu URA-Geral:
 +
 
 +
<code>
 +
[subURA-1]<br>
 +
<br>
 +
exten => s,1,NoOp(subURA - Exemplo)<br>
 +
exten => s,n,Answer()<br>
 +
exten => s,n,Set(TIMEOUT(digits)=2)<br>
 +
exten => s,n(audiosubURA1),BackGround(transfer)<br>
 +
exten => s,n,WaitExten(5)<br>
 +
<br>
 +
exten => 1,1,NoOp(Opção 1 selecionada - encaminhando ligação para ramal 1001)<br>
 +
exten => 1,n,Dial(SIP/1001)<br>
 +
exten => 1,n,HangUp()<br>
 +
<br>
 +
exten => 9,1,NoOp(Opção 9 selecionada - retorna para URA-Geral)<br>
 +
exten => 9,n,GoTo(URA-Geral,s,audioURA)<br>
 +
<br>
 +
exten => i,1,NoOp(Opção inválida)<br>
 +
exten => i,n,GoTo(s,audiosubURA1)<br>
 +
<br>
 +
exten => t,1,NoOp(Timeout atingido)<br>
 +
exten => t,n,Playback(vm-goodbye)<br>
 +
exten => t,n,HangUp()<br>
 +
</code>
 +
 
 +
6) Recarregue o asterisk com as novas configurações do arquivo <code>extensions.conf</code>:
 +
 
 +
<code>
 +
CLI> dialplan reload
 +
</code>
 +
 
 +
7) Do softphone que está configurado com o número <code>1000</code> realize uma chamada para o número <code>9100</code>.
 +
 
 +
Agora ao digitar <code>1</code> na <code>URA-Geral</code> a ligação será direcionada para a <code>subURA-1</code>, se for digitado <code>1</code> novamente você deve ouvir o áudio <code>transfer.wav</code> que fala "por favor, aguarde um instante", digitando <code>9</code> você deve ouvir novamente o áudio da <code>URA-Geral</code>.
 +
 
 +
==Passo 14: Gravando áudio personalizado para a URA==
 +
 
 +
Nos testes que fizemos de URA utilizamos arquivos de áudio que já vem com o Asterisk. Porém, estes não representam exatamente o que está sendo oferecido de opções no menu e também faltou uma saudação, algo que cada usuário deseja fazer a seu modo. Vamos então gravar dois áudios, um para usar no menu da <code>URA-Geral</code> e outro para a <code>subURA-1</code>, para isso serão criados planos de chamada para os números <code>9101</code> e <code>9102</code>, para gravar os respectivos áudios da URA e sub-URA.
 +
 
 +
1) Edite o arquivo <code>extensions.conf</code>, adicionando novos planos de discagem no contexto <code>[public]</code> para que fique assim:
 +
 
 +
<code>
 +
exten => 9101,1,NoOp(Grava áudio da URA-Geral)<br>
 +
exten => 9101,n,Answer()<br>
 +
exten => 9101,n,Wait(2)<br>
 +
exten => 9101,n,Record(menuURA-Geral.gsm)<br>
 +
exten => 9101,n,Wait(2)<br>
 +
exten => 9101,n,Playback(menuURA-Geral)<br>
 +
exten => 9101,n,Wait(2)<br>
 +
exten => 9101,n,HangUp()
 +
 
 +
exten => 9102,1,NoOp(Grava áudio da URA-Geral)<br>
 +
exten => 9102,n,Answer()<br>
 +
exten => 9102,n,Wait(2)<br>
 +
exten => 9102,n,Record(menuSubURA-1.gsm)<br>
 +
exten => 9102,n,Wait(2)<br>
 +
exten => 9102,n,Playback(menuSubURA-1)<br>
 +
exten => 9102,n,Wait(2)<br>
 +
exten => 9102,n,HangUp()
 +
</code>
 +
 
 +
2) Recarregue o asterisk com as novas configurações do arquivo <code>extensions.conf</code>:
 +
 
 +
<code>
 +
CLI> dialplan reload
 +
</code>
 +
 
 +
3) Do softphone que está configurado com o número <code>1000</code> realize uma chamada para o número <code>9101</code>.
 +
 
 +
Aguarde 2 segundos e utilizando seu microfone fale "pressione 0 para chamar o ramal 1000 ou pressione 1 para outras opções", depois disso digite <code><nowiki>#</nowiki></code> no teclado do softphone. Você deverá ouvir o áudio com sua voz. Na sequencia grave o áudio para a <code>subURA-1</code> discando para <code>9102</code> e falando "pressione 1 para chamar o ramal 1001 ou pressione 9 para voltar ao menu anterior".
 +
 
 +
4) Edite a <code>URA-Geral</code> para que utilize o novo arquivo de áudio, modificando a linha que realiza o Playback para que fique assim:
 +
 
 +
<code>
 +
exten => s,n(audioURA),BackGround(menuURA-Geral)
 +
</code>
 +
 
 +
5) Edite a <code>subURA-1</code> para que utilize o novo arquivo de áudio, modificando a linha que realiza o Playback para que fique assim:
 +
 
 +
<code>
 +
exten => s,n(audiosubURA1),BackGround(menuSubURA-1)<br>
 +
</code>
 +
 
 +
6) Recarregue o asterisk com as novas configurações do arquivo <code>extensions.conf</code>:
 +
 
 +
<code>
 +
CLI> dialplan reload
 +
</code>
 +
 
 +
7) Do softphone que está configurado com o número <code>1000</code> realize uma chamada para o número <code>9101</code>, e verifique se os novos áudios estão sendo reproduzidos.
  
 
=Roteiro de instalação do Asterisk com freepbx utilizando docker=
 
=Roteiro de instalação do Asterisk com freepbx utilizando docker=
Linha 654: Linha 1 219:
 
Host:
 
Host:
 
*dynamic: utilizado quando o IP do ramal não é fixado (caso comum de utilização de DHCP)
 
*dynamic: utilizado quando o IP do ramal não é fixado (caso comum de utilização de DHCP)
 +
Context:
 +
*nome_do_contexto: um contexto pode conter diversos planos de discagem e o ramal que está neste contexto herda estes planos (os planos de discagem são declarados no arquivo extensions.conf).
  
 
===Arquivo extensions.conf===
 
===Arquivo extensions.conf===
 +
 +
====Contexto====
 +
*O contexto é uma subdivisão do arquivo dos planos de discagem.
 +
**Pode ser único por ramal ou compartilhado entre vários ramais.
 +
**É possível também criar contextos para casos específicos (por exemplo, ligações a cobrar, DDD, DDI, etc) e também inserir um contexto dentro de outro.
 +
**Um contexto inicia com a declaração de seu nome entre colchetes (Ex.: [public]) e termina quando um novo contexto é declarado.
 +
**No início do arquivo extensions.conf existe um contexto chamado [globals], onde as variáveis globais são definidas e podem ser utilizadas por todo o plano de discagem, e o contexto [general], utilizado para definição de alguns parâmetros gerais.
 +
**Você pode dar ao contexto qualquer nome, desde que sem
 
<code>
 
<code>
 
[nome_do_contexto]<br/>
 
[nome_do_contexto]<br/>
 
exten => nome_da_extensão, prioridade, aplicação()<br/>
 
exten => nome_da_extensão, prioridade, aplicação()<br/>
 
</code>
 
</code>
*O contexto é uma subdivisão do arquivo dos planos de discagem. Pode ser único por ramal ou compartilhado entre vários ramais. É possível também criar contextos para casos específicos (por exemplo, ligações a cobrar, DDD, DDI, etc) e também inserir um contexto dentro de outro.
 
 
*O nome_da_extensão corresponde aos dígitos que estão sendo discados.
 
*O nome_da_extensão corresponde aos dígitos que estão sendo discados.
 
*A prioridade indica a ordem de execução dos comandos, sempre seguindo da menor prioridade para a maior, em sequência.
 
*A prioridade indica a ordem de execução dos comandos, sempre seguindo da menor prioridade para a maior, em sequência.
 
*A aplicação é a ação que será tomada. O Asterisk possui um grande conjunto de aplicações para diferentes ações. Por exemplo: Answer() para atender a chamada, Wait(x) para esperar x segundos, Hangup() para desligar a chamada, entre outras.
 
*A aplicação é a ação que será tomada. O Asterisk possui um grande conjunto de aplicações para diferentes ações. Por exemplo: Answer() para atender a chamada, Wait(x) para esperar x segundos, Hangup() para desligar a chamada, entre outras.
 +
 +
====Nomes de extensões predefinidos====
 +
Os seguintes nomes são predefinidos já com funções específicas para o Asterisk:
 +
 +
*a: extensão Asterisk
 +
*h: Extensão hangup
 +
*i: opção inválida
 +
*o: operator de extensão que é utilizado para sair do correio de voz pressionando zero
 +
*s: inicio (start)
 +
*t: tempo máximo que a central espera por um comando (timeout)
 +
*T: tempo máximo que a central espera por um comando (AbsoluteTimeout)
 +
 +
====Macro====
 +
Conjuntos de instruções de discagem podem ser agrupados no que é chamado de macro. Isso ajuda a reduzir a quantidade de instruções do arquivo extensions.conf, facilita a manutenção do código e também pode simplificar o entendimento do arquivo. A declaração da macro se parece com a declaração do contexto, ou seja, seu nome fica entre colchetes, porém toda a macro deve começar com a palavra <code>macro-</code>. Exemplo:
 +
 +
<code>
 +
[macro-nome_da_macro]<br/>
 +
</code>
 +
 +
Logo abaixo do nome da macro, seguindo a mesma lógica do contexto, deve-se declarar os planos de discagem correspondentes.
 +
 +
Para invocar a macro de algum plano, ou mesmo de dentro de outra macro, deve-se declarar uma extensão que invoca a operação <code>Macro</code>, seguindo o formato abaixo:
 +
 +
<code>Macro(nome_da_macro, ARG1, ARG2, ..., ARGN)</code>
 +
Sendo:
 +
*Macro: operação que invoca uma Macro.
 +
*nome_da_macro: O nome da Macro que está sendo invocada.
 +
*ARG1, ARG2, ..., ARGN: Argumentos que serão passados para a Macro.
 +
 +
====Encaminhamento de chamadas====
 +
 +
Um Asterisk pode encaminhar chamadas para outro, criando uma rede de centrais. No extensions.conf, deve ficar assim:
 +
 +
<code>
 +
[iaxprovider]
 +
switch => IAX2/user:[key]@server/context
 +
</code>
 +
 +
O usuário precisa ser definido no arquivo iax.conf do servidor que é chamado ([https://www.voip-info.org/asterisk-dual-servers/ mais informações]).
 +
 +
====Máscaras de discagem====
 +
 +
As máscaras simplificam a elaboração de planos de discagem pois suportam as utilização de caracteres que representam números coringas. A máscara sempre comença com um underline (<code>_</code>). Máscaras podem ser formadas com os seguintes caracteres:
 +
 +
*<code>X</code>: Um dígito entre 0 e 9
 +
*<code>Z</code>: Um dígito entre 1 e 9
 +
*<code>N</code>: Um dígito entre 2 e 9
 +
*<code>.</code>: Um ou mais dígitos quaisquer
 +
*<code>[]</code>: Um digito dos que estão entre colchetes
 +
 +
Alguns exemplos:
 +
*<code>_[23]000</code>: representa 2000 ou 3000
 +
*<code>_[23]00X</code>: representa 2000 a 2009 (2000, 2001, 2002, 2003,...,2009), ou de 3000 a 3009 (3000, 3001, 3002, ... ,3009)
 +
*<code>_[2-4]000</code>: representa 2000 a 2009, ou 3000 a 3009, ou ainda de 4000 a 4009
 +
*<code>_0X.</code>: representa uma chamada para um DDD qualquer
 +
*<code>_048X.</code>: representa uma chamada para o DDD 48
 +
*<code>_00X.</code>: representa uma chamada DDI qualquer (internacional)
 +
*<code>_0800X.</code>: representa uma chamada gratuita (0800 alguma coisa)
 +
*<code>_19X</code>: representa um número de emergência (190, 191, ...)
  
 
==Comandos rasterisk==
 
==Comandos rasterisk==

Edição atual tal como às 20h45min de 26 de julho de 2022

Dados importantes

Professor

Turma virtual

  • Acesse o sigaa bucando a disciplina PJI011104 - PROJETO INTEGRADOR IV (2021.2 - T01)

Aulas síncronas presenciais

  • Horários
    • Segundas e terças-feiras das 19:00 às 22:00
    • Local: Laboratório de Sistemas Digitais (LabSiDi)
    • Mais informações ver SIGAA

Aulas não presenciais

  • Sábados letivos serão com atividades assíncronas

Organização curricular

Roteiro de instalação do Asterisk

Passo 0: Requisitos para instalação do Asterisk

1) Certifique-se de ter o Virtualbox ou VMware Workstation (ou outro programa de virtualização) instalado em seu computador

Obs.: Chamaremos a máquina física que está hospedando a máquina virtual de hospedeira e a máquina virtual será chamada de máquina virtual.

Obs.: A máquina hospedeira pode ter qualquer sistema operacional.

Obs.: Para facilitar a interação entra a hospedeira e virtual, é importante que a máquina hospedeira tenha os pacotes de integração. No caso da hospedeira ser Debian/Ubuntu certifique-se de ter os pacotes build-essential, module-assistant e dkms (sudo apt update && sudo apt install build-essential module-assistant dkms && sudo m-a prepare e da máquina virtual utilize a opção de instalação dos pacotes extras no menu Devices > Insert Guest Additions CD Image... e depois /media/seu_usuario/VBox_GAs_versao$ sudo ./VBoxLinuxAdditions.run).

2) Instale o sistema operacional Linux (testado com Ubuntu Mate 16.04 LTS e 22.04 LTS, este roteiro pode não funcionar para outras distribuições e versões) em uma máquina virtual.

3) Instale o programa para discagem Zoiper 5 (testado com Zoiper5_5.5.8_x86_64) na máquina hospedeira e na máquina virtual. Para instalar no Debian/Ubuntu você pode utilizar o comando sudo dpkg -i Zoiper5_5.5.8_x86_64.deb.

4) Faça o download dos arquivos para Asterisk de áudio em português (disponibilizado para download).

5) Instale Programa PBX Asterisk (testado com asterisk-13.38.3, esse roteiro pode não funcionar para outras versões) seguindo os passos descritos nesta página.

Passo 1: Preparando a máquina virtual que será o servidor Asterisk

Considerando a instalação do Asterisk em uma máquina virtual Ubuntu, as informações a seguir se referem ao que deve ser feito dentro da máquina virtual.

1) Certifique-se de ter uma máquina virtual linux para instalar o Asterisk (recomendável que tenha ao menos 20GB de espaço em disco - você pode criar uma máquina virtual vazia, baixar uma das versões testadas do linux no formato ISO e utilizar esse arquivo como um CDROM para fazer a instalação)

2) Como serão feitos vários comandos que requerem privilégio de administrador, realize o seguinte comando para chavear o terminal para o modo de administração (root):

$ sudo su

Obs.1: Digite a senha de seu usuário (que necessariamente precisa ser um usuário que tenha privilégio de se tornar super usuário - pertencente ao grupo sudoers).

Obs.2: No comando acima foi utilizando o símbolo $ que representava que o terminal estava no modo de usuário comum, após o chaveamento para o modo de administração será utilizado o símbolo #.

Obs.3: Como regra de ouro, procure sempre estar atento as mensagens impressas no terminal. Diversos problemas podem ocorrer e muitas vezes estes são fáceis de resolver apenas seguindo as orientações impressas em casos de falhas. Caso não consiga resolver o problemas pelas próprias informações dadas, copie o erro dado e cole no google para verificar se outros usuários já experimentaram este problema e se há orientações de como resolvê-lo.

3) Certifique-se de que o sistema operacional da máquina virtual esteja atualizado:

# apt update && apt upgrade

4) Instalando as bibliotecas requeridas pelo Asterisk:

# apt install make wget libssl-dev ncurses-dev libnewt-dev libxml2-dev linux-headers-generic g++ libsqlite3-dev uuid-dev libjansson-dev

5) Instalando o gerenciador de banco de dados MySQL:

# apt install mysql-server libmysqld-dev

Obs.: Será utilizada a senha 1234 no mysql.

Passo 2: Intalando o Asterisk e realizando a configuração inicial do Asterisk

1) Baixe o arquivo tar.gz do Asterisk disponibilizado (versão 13.38.3) e mova para a pasta /usr/src.

2) Certifique-se de estar na pasta /usr/src:

# cd /usr/src

3) Descompacte o arquivo tar.gz com o comando:

# tar -zxvf asterisk-13.38.3.tar.gz

4) Entre na pasta descompactada digitando:

# cd asterisk-13.38.3

5) Realize a compilação do Asterisk

# ./configure --libdir=/usr/lib64

6) Realize a configuração da instalação

# make menuselect

Na tela de configuração marque a opção cdr_mysql do menu Add-ons (See README-addons.txt) e depois pessione Save & Exit

7) Realize a instalação

# make

# make install

# make samples

# make config


8) Teste se o asterisk está funcionando # service asterisk start

# rasterisk

Se o serviço subiu e o rasterisk rodou bem, deu tudo certo, você pode sair da interface cliente.

CLI> quit


Passo 3: Configurando o banco de dados MySQL para o Asterisk

1) Inicializando o serviço MySQL

# service mysql start

Após a execução é possível verificar se o serviço está rodando com o comando # service mysql status

2) Entrar no cliente MySQL:

# mysql -u root -p

Digite a senha 1234

3) Verifique as bases de dados existentes com o comando:

mysql> SHOW databases;

Deve aparecer uma listagem contento as bases information_shema, mysql, performance_schema e sys.

4) Crie a base para armazenamento de gravações do Asterisk (cdr):

mysql> CREATE DATABASE cdr;

Executando novamente mysql> SHOW databases; deve exibir esta nova base entre as bases existentes.

5) Crie um usuário para o Asterisk:

mysql> CREATE USER "cdr_user"@"localhost" IDENTIFIED BY "1234"; mysql> GRANT ALL PRIVILEGES ON cdr.* to "cdr_user"@"localhost"; mysql> FLUSH PRIVILEGES;

6) Entre na base de dados cdr:

mysql> use cdr;

No momento a base de dados está vazia (pode-se verificar isso com o comando mysql>show tables;

7) Crie a tabela cdr_table

CREATE TABLE cdr_table (
calldate datetime NOT NULL default CURRENT_TIMESTAMP,
clid varchar(80) NOT NULL default "",
src varchar(80) NOT NULL default "",
dst varchar(80) NOT NULL default "",
dcontext varchar(80) NOT NULL default "",
channel varchar(80) NOT NULL default "",
dstchannel varchar(80) NOT NULL default "",
lastapp varchar(80) NOT NULL default "",
lastdata varchar(80) NOT NULL default "",
duration int(11) NOT NULL default "0",
billsec int(11) NOT NULL default "0",
disposition varchar(45) NOT NULL default "",
amaflags int(11) NOT NULL default "0",
accountcode varchar(20) NOT NULL default "",
uniqueid varchar(32) NOT NULL default "",
peeraccount varchar(20) NOT NULL default "",
linkedid varchar(32) NOT NULL default "",
sequence int(11) NOT NULL default "0",
userfield varchar(255) NOT NULL default "",
monitor varchar(255) NOT NULL default ""
);

O comando mysql>show tables; deve mostrar que há uma tabela, mais detalhes podem ser visualizados com o comando SHOW columns FROM cdr_table;.

8) Para sair do cliente MySQL digite:

mysql> exit;

Passo 4: Pré-configuração do gravador de chamadas do Asterisk

Está sendo utilizado o editor de textos vim que pode ser obtido com o comando # apt-get install vim, mas outro editor de texto qualquer pode ser utilizado.

1) Abra o arquivo cdr.conf para edição:

# vim /etc/asterisk/cdr.conf

2) Configure a forma de gravação de dados de chamadas:

No vim para entrar em modo de edição, digite i.

[mysql]
usegmtime=yes
loguniqueid=yes
loguserfield=yes
accountlogs=yes

Feche e salve o arquivo clicando emn ESC, depois digite :wq e tecle ENTER.

3) Abra o arquivo cdr_mysql.conf para edição

# vim /etc/asterisk/cdr_mysql.conf

4) Adicione a configuração para uso do banco MySQL para gravação de dados:

[global]
hostname=127.0.0.1
dbname=cdr
table=cdr_table
password=1234
user=cdr_user
port=3306
sock=/var/run/mysqld/mysqld.sock
timezone=UTC

Passo 5: Pré-configuração do Asterisk

1) Edite o arquivo asterisk.conf:

# vim /etc/asterisk/asterisk.conf

2) Ative o modo verboso do Asterisk para que ele exiba mensagens detalhadas em tela.

  • Procure a linha onde está escrito verbose = 3 e descomente esta linha apagando o caracter ; do início da linha.

3) Reinicie o serviço Asterisk

# service asterisk restart

4) Entre no console do Asterisk

# rasterisk

5) Verifique se o cdr está configurado

CLI> cdr show status

Deve ser exibido que Logging está habilitado e o mysql está listado no backend.

Passo 6: Adição dos arquivos de som em Português Brasil

1) Baixe o arquivo Asterisk-sounds-pt_BR.tar.gz.

Este arquivo está compactando a pasta sounds que contém arquivos de áudio com dígitos, letras entre outros sons em português.

2) No terminal, vá até a pasta em que o arquivo foi baixado (provavelmente ~/Downloads) e descompacte o arquivo com o seguinte comando:

# tar -zxvf Asterisk-sounds-pt_BR.tar.gz

3) Mova a pasta original de sons do Asterisk para uma pasta backup:

# mv /var/lib/asterisk/sounds /var/lib/asterisk/sounds_backup

4) Mova os sons descompactados para a pasta sounds do Asterisk:

# mv sounds /var/lib/asterisk/

5) Abra o arquivo sip.conf para edição:

# vim /etc/asterisk/sip.conf

6) Na linha 344, descomente a instrução (removendo o ; no início da linha) e altere para o idioma pt_BR. Portanto, deve ficar assim:

language=pt_BR

7) Salve o arquivo sip.conf.

8) Recarregue as configurações sip do asterisk:

CLI> sip reload

Explorando as configurações de utilização do Asterisk

Passo 1: Configurando o primeiro ramal sip no arquivo sip.conf

1) Abra o arquivo sip.conf para edição

# vim /etc/asterisk/sip.conf

2) No fim do arquivo, adicione o ramal 1000 com permissão para realizar e receber chamadas (friend) e senha 1234

[1000]
type=friend
secret=1234
host=dynamic
qualify=yes

3) Salve o arquivo sip.conf

4) Abra o rasterisk

# rasterisk

5) Como o arquivo sip.conf foi modificado, recarregue o serviço asterisk com esse novo conteúdo:

CLI> sip reload

6) De dentro da máquina virtual, abra um softphone como o Zoiper utilizando como parâmetros:

  • Usuário: 1000 ou 1000@127.0.0.1
  • Senha: 1234
  • Domínio/SIP Server: 127.0.0.1

Após se registrar com sucesso, no rasterisk deve aparece uma mensagem paracida com esta a seguir

-- Registered SIP '1000' at 127.0.0.1:47843

Passo 2: Configurando o segundo ramal sip no arquivo sip.conf

1) No fim do arquivo, adicione o ramal 1001 com permissão para realizar e receber chamadas (friend) e senha 1234

[1001]
type=friend
secret=1234
host=dynamic
qualify=yes

2) Salve o arquivo sip.conf

3) Recarregue o serviço asterisk com esse novo conteúdo:

CLI> sip reload

4) Certifique-se de que a máquina virtual está com a configuração de rede no modo bridge

5) Obtenha o endereço IP da máquina virtual

# ip -4 a

Digamos que o IP da máquina virtual é 192.168.0.2

6) Da máquina hospedeira, abra um softphone como o Zoiper utilizando como parâmetros (substitua o endereço de IP pelo correto):

  • Usuário: 1001 ou 1001@192.168.0.2
  • Senha: 1234
  • Domínio/SIP Server: 192.168.0.2

Após se registrar com sucesso, no rasterisk deve aparece uma mensagem paracida com esta a seguir

-- Registered SIP '1001' at 127.0.0.1:47844

7) Tente realizar uma chamada, por exemplo do 1000 ligando para o 1001, no cliente rasterisk você deve ver a seguinte mensagem indicando que não pode realizar a chamada:

NOTICE[5906][C-00000003]: chan_sip.c:26602 handle_request_invite: Call from '1000' (127.0.0.1:47843) to extension '1001' rejected because extension not found in context 'public'.

Esta mensagem diz que a chamada do ramal 1000 para 1001 foi rejeitada pois não foi encontrada uma extensão no contexto 'public'. Uma extensão ou plano de discagem é um conjunto de ações que o Asterisk executa quando um ramal está ligando para outro em específico. Para que o 1000 possa ligar para o 1001 é necessário haver uma extensão indicando como se dará esta conexão. Atualmente esta extensão não existe, por isso a chamada foi rejeitada. Além disso, a mensagenm indica que o Asterisk tentou achar esta extensão no contexto 'public'. De fato, os ramais 1000 e 1001 não foram cadastrados em nenhum contexto específico, por isso, por padrão, estão no 'public'.

Passo 3: Criando uma extensão para identificação do ramal

1) Abra o arquivo extensions.conf para edição

# vim /etc/asterisk/extensions.conf

2) Próximo do fim do arquivo, localize a linha que contém a chave [public] e coloque um ; (ponto e vírgula) no início da linha que contém o a instrução include => demo. Portanto, deve ficar assim

;include => demo

3) Abaixo desta linha comentada (e também abaixo da chave [public]) copie as seguintes instruções:

exten => 655,1,NoOp(Identifica Ramal)
exten => 655,2,Answer()
exten => 655,3,Wait(1)
exten => 655,4,Playback(number&is)
exten => 655,5,SayDigits(${CALLERID(num)})
exten => 655,6,Wait(2)
exten => 655,7,Hangup()

Estas instruções estão declarando uma extensão. Quando um ramal que pertence ao contexto public tentar realizar uma chamada o Asterisk vai na chave [public] verificar se ele pode relizar esta chamada e como se dará esta ligação. Neste exemplo, um ramal do contexto public está ligando para o ramal 655. O que está sendo feito em cada linha está descrito a seguir:

  1. Imprime uma mensagem no rasterisk. Isso é util apenas para fins de verificação do comportamento do sistema (debug).
  2. O Asterisk atende a chamada (answer)
  3. Aguarda 1 segundo (wait)
  4. Reproduz (playback) um som que diz "o número é"
  5. Fala os números (SayDigits) do ramal que está realizando esta chamada
  6. Aguarda 2 segundos (wait)
  7. Encerra a ligação (Hangup)

4) Salve o arquivo extensions.conf

5) Recarregue os planos de discagem do asterisk:

CLI> dialplan reload

6) Do softphone realize uma chamada para o número 655.

Você deve ouvir uma mensagem informando o número do ramal que originou a ligação.

Passo 4: Testando a declaração de um novo contexto

1) No arquivo extensions.conf, digite [funcionarios] abaixo de [public].

2) Salve o arquivo extensions.conf e recarregue os planos de discagem do asterisk CLI> dialplan reload.

3) Do softphone realize uma chamada para o número 655

A chamada não deve funcionar, encerrando logo após a discagem.

No rasterisk você deve ver a seguinte mensagem: NOTICE[5906][C-00000006]: chan_sip.c:26602 handle_request_invite: Call from '1000' (127.0.0.1:47843) to extension '655' rejected because extension not found in context 'public'.

Isso está ocorrendo pois a extensão criada para o número 655 está dentro do contexto [funcionarios], e o ramal que está tentando ligar para esta extensão está em outro contexto (no caso, está em [public]). Observe que o conteúdo de um contexto inicia logo após o nome do contexto entre colchetes e terminal quando há outro nome de contexto entre colchetes.

Passo 5: Adicionando contexto aos ramais

No passo anterior, o plano de discagem para o número 655 foi colocado dentro de um contexto chamado [funcionarios], porém os ramais existentes 1000 e 1001, não estão configurados para nenhum contexto específico, portando são [public], e neste momento o [public] não possui planos de discagem. Portanto, vamos colocar os ramais dentro do contexto [funcionarios] para fazer o plano para o número 655 voltar a funcionar.

1) No arquivo sip.conf, edite os ramais 1000 e 1001 para que sejam incluídos no contexto [funcionarios], o resultado deve ficar assim:

[1000]
type=friend
secret=1234
host=dynamic
qualify=yes
context=funcionarios

[1001]
type=friend
secret=1234
host=dynamic
qualify=yes
context=funcionarios

2) Recarregue o asterisk com as novas configurações do arquivo sip.conf:

CLI> sip reload

Passo 6: Incluindo um contexto dentro de outro

No passo anterior configuramos os ramais 1000 e 1001 para pertencerem ao contexto [funcionarios], pois o plano de discagem para o número 655 estava configurado neste contexto. Agora vamos devolver o plano de discagem para o número 655 para o contexto [public] e em seguida faremos o contexto [funcionarios] herdar os planos de [public].

1) No arquivo extensions.conf, deixe o plano de discagem para o número 655 dentro do contexto [public], deixando o contexto [funcionarios] vazio:

[public]
exten => 655,1,NoOp(Identifica Ramal)
exten => 655,2,Answer()
exten => 655,3,Wait(1)
exten => 655,4,Playback(number&is)
exten => 655,5,SayDigits(${CALLERID(num)})
exten => 655,6,Wait(2)
exten => 655,7,Hangup()

[funcionarios]

2) Recarregue o asterisk com as novas configurações do arquivo extensions.conf:

CLI> dialplan reload

3) Do softphone realize uma chamada para o número 655.

A chamada não deve funcionar, encerrando logo após a discagem.

4) No arquivo extensions.conf, vamos incluir os planos de discagem do contexto [public] no contexto [funcionarios], para isso logo abaixo do nome [funcionarios] digite o include. Deve ficar assim:

[funcionarios]
include => public

5) Recarregue o asterisk com as novas configurações do arquivo extensions.conf:

CLI> dialplan reload

6) Do softphone realize uma chamada para o número 655.

Você deve ouvir uma mensagem informando o número do ramal que originou a ligação.

Passo 7: Separando planos de discagem em diferentes arquivos

O Asterisk busca os planos de chamadas no arquivo extensions.conf, porém, é possível adicionar configurações de ramais e de planos de chamada em outros arquivos, bastando incluí-lo através da diretiva #include. Vamos a um exemplo:

1) No arquivo extensions.conf, apague a declaração do contexto [funcionarios] e coloque um #include para um outro arquivo, deve ficar assim:

[public]
exten => 655,1,NoOp(Identifica Ramal)
exten => 655,2,Answer()
exten => 655,3,Wait(1)
exten => 655,4,Playback(number&is)
exten => 655,5,SayDigits(${CALLERID(num)})
exten => 655,6,Wait(2)
exten => 655,7,Hangup()

#include extensions_custom.conf

2) Crie um novo arquivo, chamado de extensions_custom.conf, abra-o para edição e cole o contexto [funcionarios], ficando assim: [funcionarios]
include => public

3) Recarregue o asterisk com as novas configurações do arquivo extensions.conf:

CLI> dialplan reload

4) Do softphone realize uma chamada para o número 655.

Você deve ouvir uma mensagem informando o número do ramal que originou a ligação.

Passo 8: Utilizando macros

Uma macro é um conjunto de operações que pode ser reaproveitado em diferentes contextos e planos de chamada. A macro auxilia a reduzir a quantidade de linhas de código pois pode-se criar uma macro de trechos de código que se repetem. Além disso, quando vários planos de chamada estão invocando uma mesma macro, caso se queira modificar algum detalhe destas operações, basta alterar unicamente a macro pois fazendo isso todos os trechos de código que invocam estava macro já serão contemplados por esta modificação. Vamos usar como exemplo uma macro que reproduz áudio dos dígitos do ramal que originou a ligação.

1) No arquivo extensions.conf, abaixo do contexto [public], adicione a macro a seguir:

[macro-identifica]
exten => s,1,NoOp(Identifica Ramal)
exten => s,n,Playback(number&is)
exten => s,n,SayDigits(${ARG1})

Esta macro reproduz o áudio dos dígitos enviados como primeiro argumento da macro (ARG1). O nome das macros sempre ficam entre colchetes e começam com macro-. Observe que estamos utilizando um nome de extensão pré-definido s. Esta predefinição indica para o asterisk utilizar o nome da extensão da operação que invocou esta macro. Ou seja, s é uma variável, logo abaixo quando invocado será equivalente a 655. Observe também que estamos utilizando a ordem de prioridade n que diz ao Asterisk para utilizar o pŕoximo número da sequencia, ou seja, na linha abaixo de 1, n será substituído por 2, e assim por diante. Observe também que a primeira linha do plano de discagem inicia com prioridade igual a 1.

2) Vamos agora editar o contexto [public] para que ele passe a chamar a [macro-identifica]:

[public]
exten => 655,1,Answer()
exten => 655,n,Wait(1)
exten => 655,n,Macro(identifica,${CALLERID(num)})
exten => 655,n,Wait(2)
exten => 655,n,Hangup()

#include extensions_custom.conf

Observe que a prioridade n foi novamente utilizada e que o comando Macro está sendo invocado na 4 linha deste trecho de código. O primeiro argumento do comando Macro é o nome da macro. Deve-se considerar o nome entre colchetes, menos o prefixo macro-, portanto [macro-identifica] é chamada simplesmente de identifica. No segundo argumento do comando Macro, após a vírgula, colocamos a tag ${CALLERID(num)} que retorna o número que realizou a chamada. Esta informação é enviada à macro e como é o argumento logo após o nome da macro, se chamará ${ARG1}. Se houvessem outros argumentos neste comando Macro (separados por vírgulas), estes poderiam ser utilizados pela Macro conforma a posição na invocação seguindo a sequencia ${ARG2}, ${ARG3}, ...

3) Recarregue o asterisk com as novas configurações do arquivo extensions.conf:

CLI> dialplan reload

4) Do softphone realize uma chamada para o número 655.

Você deve ouvir uma mensagem informando o número do ramal que originou a ligação.

5) Para saber mais sobre a aplicação Macro, digite:

CLI> core show application Macro

Passo 9: Verificando registros de chamadas no banco de dados

Cada chamada realizada é registrada na base de dados cdr que foi criada no MySQL. Os registros são gerados como linhas da tabela cdr_table. Cdr (Call Details Record) é um recurso do Asterisk que permite o registro de informações como a data/hora da chamada, sua duração, número originador da chamada, número de destino, etc.

1) Para verificar os registros, acessamos o banco de dados que foi criado, seguindo a sequência abaixo:

# mysql cdr -u cdr_user -p

A senha definida para o usuário cdr_user foi 1234.

2) Para verificar os registros, acessamos o banco de dados que foi criado, seguindo a sequência abaixo: mysql> select * from cdr_table\G

Passo 10: Gravando e reproduzindo o áudio de chamadas

1) No arquivo extensions.conf, vamos editar a macro para que esta passe a gravar o áudio da chamada utilizando a aplicação MixMonitor do Asterisk:

[macro-identifica]
exten => s,1,NoOp(Identifica Ramal)
exten => s,n,MixMonitor(/var/spool/asterisk/monitor/${STRFTIME($EPOCH,,%Y%m%d)}/CHANNEL-${CALLERID(num)}-${STRFTIME($EPOCH,,%Y%m%d-%H%M%S)}-${UNIQUEID}.wav)
exten => s,n,Set(CDR(monitor)=CHANNEL-${CALLERID(num)}-${STRFTIME($EPOCH,,%Y%m%d-%H%M%S)}-${UNIQUEID}.WAV)
exten => s,n,Playback(number&is)
exten => s,n,SayDigits(${ARG1})

Obs.: O diretório padrão de gravações de chamadas no Asterisk é /var/spool/asterisk/monitor e ali são criados diretórios com as datas das ligações, dentro dos quais, as gravações ficam salvas, geralmente em formato .wav

2) Recarregue o asterisk com as novas configurações do arquivo extensions.conf:

CLI> dialplan reload

3) Do softphone realize uma chamada para o número 655.

4) Vá ao diretório /var/spool/asterisk/monitor e localize a gravação realizada.

5) Observe no registro do banco de dados que o campo Monitor se refere ao arquivo de áudio gerado:

mysql> select * from cdr_table\G

6) Para saber mais sobre esta aplicação MixMonitor do Asterisk, digite:

CLI> core show application MixMonitor

Passo 11: Realizando chamadas entre ramais

No arquivo sip.conf já temos declarados dois ramais (1000 e 1001), porém não há nenhum plano de discagem que permita que um possa chamar o outro. Ambos os ramais pertencem ao contexto funcionarios declarado no arquivo extensions_custom.conf. Será necessário abrir dois softphones, um cadastrado como 1000 e outro 1001. Para isso, você pode usar um softphone da máquina host e outro na virtual. Outra possibilidade é instalar um outro softphone na máquina virtual (além do Zoiper5), podendo ser um software de outro fabricante ou uma versão antiga do Zoiper.

1) Edite o arquivo extensions_custom.conf, para que fique conforme a seguir:

[funcionarios]
include => public

exten => _1XXX,1,NoOp(Ligação para um ramal de funcionário)
exten => _1XXX,n,Dial(SIP/${EXTEN},30)
exten => _1XXX,n,HangUp

2) Recarregue o asterisk com as novas configurações do arquivo extensions.conf:

CLI> dialplan reload

3) Do softphone que está configurado com o número 1000 realize uma chamada para o número 1001.

Você deve um softphone deve chamar o outro, podendo atender a chamada falar e ouvir de cada um deles. O mesmo deve ocorrer ligando de 1001 para 1000.

Passo 12: Criando uma URA

A URA (Unidade de Resposta Audível) pode ser definida através de planos de discagem, com isso é possível realizar atendimento automático de chamadas, reproduzir áudios e receber comandos enviados pelo usuário. Como exemplo inicial, digamos que deseja-se dar acesso aos ramais internos apenas através da URA, ou seja, alguém que está chamando precisa discar para a URA e na URA selecionar a pessoa que deseja falar.

1) Edite o arquivo extensions.conf, adicionando um novo planoa de discagem no contexto [public] para que fique assim:

[public]
#include extensions_custom.conf

exten => 655,1,Answer()
exten => 655,n,Wait(1)
exten => 655,n,Macro(identifica,${CALLERID(num)})
exten => 655,n,Wait(2)
exten => 655,n,Hangup()

exten => 9100,1,NoOp(URA - Exemplo)
exten => 9100,n,Answer()
exten => 9100,n,Set(TIMEOUT(digits)=2)
exten => 9100,n(audioURA),BackGround(press-1&to-call-this-number)
exten => 9100,n,WaitExten(5)

exten => 0,1,NoOp(Opção 0 selecionada - encaminhando ligação para ramal 1000)
exten => 0,n,Dial(SIP/1000)
exten => 0,n,HangUp()

exten => 1,1,NoOp(Opção 1 selecionada - encaminhando ligação para ramal 1001)
exten => 1,n,Dial(SIP/1001)
exten => 1,n,HangUp()

exten => i,1,NoOp(Opção inválida)
exten => i,n,GoTo(9100,audioURA)

exten => t,1,NoOp(Timeout atingido)
exten => t,n,Playback(vm-goodbye)
exten => t,n,HangUp()

2) Recarregue o asterisk com as novas configurações do arquivo extensions.conf:

CLI> dialplan reload

3) Do softphone que está configurado com o número 1000 realize uma chamada para o número 9100.

Você deve ouvir a frase "pressione 1 para chamar esse número", depois digite 1. Você deve um softphone deve chamar o outro, podendo atender a chamada falar e ouvir de cada um deles. Desligue e teste novamente sem digitar nada, após 5 segundos você deve ouvir "até logo" e a ligação será encerrada.

4) Vamos agora estudar mais atentamente as linhas de comando:

O trecho a seguir é o plano de discagem para o número 9100, comença com um texto de debug (NoOp), depois a chamada é atendida pelo Asterisk, depois é reproduzido dois áudios, um chamado "press-1" e outro "to-call-this-number" (áudios padrão já previamente gravados), finalmente o comando WaitExten determina que após ouvir o áudio o usuário tem 5 segundos para digitar algo, ou a chamada será encerrada por timeout.

exten => 9100,1,NoOp(URA - Exemplo)
exten => 9100,n,Answer()
exten => 9100,n(audioURA),BackGround(press-1&to-call-this-number)
exten => 9100,n,WaitExten(5)

Observe que ao lado do número da terceira linha há o código (audioURA). Esse código funciona como um apelido para este linha. Isso será útil no trecho do plano para opção inválida que está definido mais adiante e deseja-se que caso uma opção inválida seja digitada o Asterisk volte para o início do menu, porém sem precisar atender novamente a chamada (Answer) pois a chamada já está sendo atendida.

O trecho a seguir determina o que será feito caso o usuário digite 0. O Asterisk simplesmente chama (Dial) o número 1000 e a chamada posteriormente será encerrada (HangUp).

exten => 0,1,NoOp(Opção 0 selecionada - encaminhando ligação para ramal 1000)
exten => 0,n,Dial(SIP/1000)
exten => 0,n,HangUp()

A opção 1 funciona da mesma maneira.

No trecho a seguir é processada a opção inválida, ou seja, quando é digitada uma opção que não está prevista no plano de discagem. Neste caso o Asterisk retorna ao início da URA, no momento em que o áudio das opções do menu é reproduzido.

exten => i,1,NoOp(Opção inválida)
exten => i,n,GoTo(9100,audioURA)

Finalmente no trecho a seguir é processado o timeout, ou seja, quando o usuário não digitou nada e esgotou seu tempo. Neste caso o áudio "vm-goodbye" é reproduzido e depois a chamada é necerrada.

exten => t,1,NoOp(Timeout atingido)
exten => t,n,Playback(vm-goodbye)
exten => t,n,HangUp()

Observe que neste plano duas aplicações diferentes para reproduzir sons foram utilizadas, a aplicação BackGround e a aplicação Playback. A diferença entre elas é que BackGround reproduz um áudio ao mesmo tempo em que o Asterisk fica esperando que algo seja digitado, enquanto no Playback o Asterisk não realiza outra operação enquanto não concluir o áudio.

Para saber mais sobre BackGround e Playback digite: CLI> core show application BackGround CLI> core show application Playback

Para saber mais sobre TIMEOUT digite:

CLI> core show function TIMEOUT

Para saber mais sobre TIMEOUT digite CLI> core show function TIMEOUT

Passo 13: Criando uma URA com sub-URAS

Para criar uma URA com sub-URAs utiliza-se o mesmo conceito de contextos, bastando colocar a URa e cada sub-URA em um contexto próprio. Vamos editar a URA implementada no passo anterior para que fique em um contexto.

1) Edite o arquivo extensions.conf, adicionando um novo plano de discagem no contexto [public] para que fique assim:

[public]
#include extensions_custom.conf

exten => 655,1,Answer()
exten => 655,n,Wait(1)
exten => 655,n,Macro(identifica,${CALLERID(num)})
exten => 655,n,Wait(2)
exten => 655,n,Hangup()

exten => 9100,1,NoOp(Chamando contexto URA-Geral)
exten => 9100,n,GoTo(URA-Geral,${EXTEN},1)

[URA-Geral]

exten => s,1,NoOp(URA - Exemplo)
exten => s,n,Answer()
exten => s,n,Set(TIMEOUT(digits)=2)
exten => s,n(audioURA),BackGround(press-1&to-call-this-number)
exten => s,n,WaitExten(5)

exten => 0,1,NoOp(Opção 0 selecionada - encaminhando ligação para ramal 1000)
exten => 0,n,Dial(SIP/1000)
exten => 0,n,HangUp()

exten => 1,1,NoOp(Opção 1 selecionada - encaminhando ligação para ramal 1001)
exten => 1,n,Dial(SIP/1001)
exten => 1,n,HangUp()

exten => i,1,NoOp(Opção inválida)
exten => i,n,GoTo(s,audioURA)

exten => t,1,NoOp(Timeout atingido)
exten => t,n,Playback(vm-goodbye)
exten => t,n,HangUp()

Note agora que no contexto [public] há um GoTo para o contexto [URA-Geral] que possui o plano de discagem da URA. Com isso o código em [public] ficou mias limpo e o código da URA ficou melhor "encapsulado".

Na linha que faz o GoTo para o contexto [URA-Geral], foi utilizada a variável ${EXTEN} que é padrão do Asterisk e representa a extensão que foi chamada (neste exemplo, representa 9100). Alternativamente, poderia-se utilizar a extenção padrão s que representa a extenção enviada para o contexto. Portanto, a linho do GoTo poderia ser substituida pela linha abaixo:

exten => 9100,n,GoTo(URA-Geral,s,1)

2) Recarregue o asterisk com as novas configurações do arquivo extensions.conf:

CLI> dialplan reload

3) Do softphone que está configurado com o número 1000 realize uma chamada para o número 9100.

Você deve ouvir a frase "pressione 1 para chamar esse número", depois digite 1. Você deve um softphone deve chamar o outro, podendo atender a chamada falar e ouvir de cada um deles. Desligue e teste novamente sem digitar nada, após 5 segundos você deve ouvir "até logo" e a ligação será encerrada.

4) Para criar uma sub-URA utilizaremos a mesma lógica de encapsulamento que foi utilizada na URA. Vamos editar a opção 1 da URA-Geral para que chame a subURA-1, para isso, editando a opção 1, o código fica assim:

exten => 1,1,NoOp(Opção 1 selecionada - chamando a subURA-1)
exten => 1,n,GoTo(subURA-1,s,1)

5) Agora, criaremos a subURA-1 que conterá um as opções 1 e 9 para discar para o ramal 1001 ou para voltar ao menu URA-Geral:

[subURA-1]

exten => s,1,NoOp(subURA - Exemplo)
exten => s,n,Answer()
exten => s,n,Set(TIMEOUT(digits)=2)
exten => s,n(audiosubURA1),BackGround(transfer)
exten => s,n,WaitExten(5)

exten => 1,1,NoOp(Opção 1 selecionada - encaminhando ligação para ramal 1001)
exten => 1,n,Dial(SIP/1001)
exten => 1,n,HangUp()

exten => 9,1,NoOp(Opção 9 selecionada - retorna para URA-Geral)
exten => 9,n,GoTo(URA-Geral,s,audioURA)

exten => i,1,NoOp(Opção inválida)
exten => i,n,GoTo(s,audiosubURA1)

exten => t,1,NoOp(Timeout atingido)
exten => t,n,Playback(vm-goodbye)
exten => t,n,HangUp()

6) Recarregue o asterisk com as novas configurações do arquivo extensions.conf:

CLI> dialplan reload

7) Do softphone que está configurado com o número 1000 realize uma chamada para o número 9100.

Agora ao digitar 1 na URA-Geral a ligação será direcionada para a subURA-1, se for digitado 1 novamente você deve ouvir o áudio transfer.wav que fala "por favor, aguarde um instante", digitando 9 você deve ouvir novamente o áudio da URA-Geral.

Passo 14: Gravando áudio personalizado para a URA

Nos testes que fizemos de URA utilizamos arquivos de áudio que já vem com o Asterisk. Porém, estes não representam exatamente o que está sendo oferecido de opções no menu e também faltou uma saudação, algo que cada usuário deseja fazer a seu modo. Vamos então gravar dois áudios, um para usar no menu da URA-Geral e outro para a subURA-1, para isso serão criados planos de chamada para os números 9101 e 9102, para gravar os respectivos áudios da URA e sub-URA.

1) Edite o arquivo extensions.conf, adicionando novos planos de discagem no contexto [public] para que fique assim:

exten => 9101,1,NoOp(Grava áudio da URA-Geral)
exten => 9101,n,Answer()
exten => 9101,n,Wait(2)
exten => 9101,n,Record(menuURA-Geral.gsm)
exten => 9101,n,Wait(2)
exten => 9101,n,Playback(menuURA-Geral)
exten => 9101,n,Wait(2)
exten => 9101,n,HangUp()

exten => 9102,1,NoOp(Grava áudio da URA-Geral)
exten => 9102,n,Answer()
exten => 9102,n,Wait(2)
exten => 9102,n,Record(menuSubURA-1.gsm)
exten => 9102,n,Wait(2)
exten => 9102,n,Playback(menuSubURA-1)
exten => 9102,n,Wait(2)
exten => 9102,n,HangUp()

2) Recarregue o asterisk com as novas configurações do arquivo extensions.conf:

CLI> dialplan reload

3) Do softphone que está configurado com o número 1000 realize uma chamada para o número 9101.

Aguarde 2 segundos e utilizando seu microfone fale "pressione 0 para chamar o ramal 1000 ou pressione 1 para outras opções", depois disso digite # no teclado do softphone. Você deverá ouvir o áudio com sua voz. Na sequencia grave o áudio para a subURA-1 discando para 9102 e falando "pressione 1 para chamar o ramal 1001 ou pressione 9 para voltar ao menu anterior".

4) Edite a URA-Geral para que utilize o novo arquivo de áudio, modificando a linha que realiza o Playback para que fique assim:

exten => s,n(audioURA),BackGround(menuURA-Geral)

5) Edite a subURA-1 para que utilize o novo arquivo de áudio, modificando a linha que realiza o Playback para que fique assim:

exten => s,n(audiosubURA1),BackGround(menuSubURA-1)

6) Recarregue o asterisk com as novas configurações do arquivo extensions.conf:

CLI> dialplan reload

7) Do softphone que está configurado com o número 1000 realize uma chamada para o número 9101, e verifique se os novos áudios estão sendo reproduzidos.

Roteiro de instalação do Asterisk com freepbx utilizando docker

Pré-requisitos

Ter o Docker instalado na máquina hospedeira

Instalação básica do Asterisk com freepbx para testes

Instalação básica via docker com banco de dados MySQL embutido.

Obs.: Há diferentes imagens docker que trazem o Asterisk já previamente configurado, neste tutorial utilizaremos a imagem disponibilizada em [1].

1) Baixando a imagem docker tiredofit/freepbx:

$ docker pull tiredofit/freepbx:latest

Obs.: No lugar de latest, pode-se utilizar outra tag. Este tutorial foi realizado com a versão 15, portanto, para baixar a exata imagem que foi utilizada neste tutorial utilize o comando $ docker pull tiredofit/freepbx:15

Aguarde a realização do download completo.

Verifique se a imagem baixada está aparecendo na lista de imagens disponíveis no docker local.

$ docker image ls

2) Subindo um contêiner baseado na imagem tiredofit/freepbx:

Antes de subir o contêiner, podemos verificar se já há algum contêiner rodando. Espera-se que neste momento ainda não haja nenhum contêiner baseado na imagem tiredofit/freepbx, já que o comando para subir o contêiner ainda não foi executado:

$ docker ps

Para subir o contêiner, rode (esse contêiner está sendo apelidado de test-freepbx):

$ docker run --name test-freepbx tiredofit/freepbx

Este comando pode demorar alguns minutos (até 30). O terminal deve apresentar uma série de procedimentos de inicialização que são executados dentro do contêiner que incluem s6-init, fix-attrs, cont-init e a criação dos arquivos padrão para freepbx, utilização de "embedded db" no CDR, além da inicialização do WebServer para a interface freepbx. O último comando deve ser a inicialização do zabbix e do cron.

3) Acessando a interface Web do freepbx.

Para acessar a interface, é necessário saber o endereço IP do sistema que roda dentro do contêiner, para isso:

3.1) Abra um outro terminal

3.2) Verifique se o contêiner está rodando com o comando 'docker ps' (a seguir um exemplo de resposta):

$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

bca6826ffaea tiredofit/freepbx "/init" 53 minutes ago Up 53 minutes 80/tcp, 443/tcp, 4445/tcp, 4569/tcp, 5060/udp, 5061/tcp, 5161/tcp, 8001/tcp, 8003/tcp, 8008-8009/tcp, 8025/tcp, 5160/udp, 10050/tcp, 18000-20000/udp test-freepbx

3.3) Conecte este novo terminal ao contêiner que foi apelidado de test-freepbx:

$ docker exec -it test-freepbx bash

3.4) Obtenha o endereço IP do contêiner com o comando ip -4 a (a seguir um exemplo de resposta):

# ip -4 a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 19: eth0@if20: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link-netnsid 0 inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0 valid_lft forever preferred_lft forever

Portanto, neste exemplo, o IP do contêiner é 172.17.0.2.

3.5) Para acessar a interface Web do freepbx, abra o browser e digite http://<IP do contêiner>/admin. Neste exemplo ficou http://172.17.0.2/admin

Obs.: Para desconectar o terminal do contêiner, digite exit.

4) Daqui em diante as configurações devem seguir a interface do freepbx que permite inclusive adicionar idiomas e arquivos de áudio.

Obs.: Os arquivos de configuração do Asterisk podem ser consultados em /etc/asterisk e os arquivos binários incluindo arquivos de sons ficam em /var/lib/asterisk, porém, não é recomendável modificar os arquivos manualmente. Para realizar configurações, deve-se utilizar a interface gráfica do freepbx.

5) Para encerrar o contêiner, pressional Ctrl+C no terminal que subiu o contêiner

6) Para reiniciar o contêiner que foi criado anteriormente

$ docker start -ai test

ATENÇÃO: Após derrubar o contêiner, se for dado novo comando $ docker run ... será criado um contêiner completamente novo.

Para aplicações finais (em ambiente de produção), a utilização do banco de dados embutido no contêiner docker do Asterisk não é recomendada pois no caso de perda deste contêiner, as informações do bando de dados também serão perdidas. Para evitar isso, utiliza-se um arquivo de banco de dados externo ao contêiner, além de que uma instalação profissional também deve estar associada a configurações extra de segurança tanto de acesso ao sistema quanto de backup de dados.

Instalação de um abiente de produção do Asterisk com freepbx

A instalação via docker apresentada para testes utiliza banco de dados embutido no container, o que é ruim pois a perda do container acarreta em perda dos dados do banco e também não trata de backup dos dados do banco. Nesta instalação para ambiente de produção, estes problemas são solucionados. Para isso está sendo utilizada a ferramente docker-compose, um orquestrador de contêineres, que concorre, em termos de funcionalidades, com a conhecida ferramenta kubernetes.

No docker-compose um arquivo no formato yml descreve os contêineres que deve ser carregados, suas configurações entre outros parâmetros como a configuração de rede a qual os contêineres estão conectados.

Para este tutorial será utilizado o exemplo dado por [2] na pasta example onde um arquivo docker-compose.yml é disponibilizado. No exemplo dado, três contêineres são criados:

  • freepbs-app: que sobe o serviço Asterisk e a interface Web freepbx. Este contêiner mapeia 4 volumes que são acessíveis da máquina hospedeira (./certs, ./data, ./log e ./data/www).
  • freepbx-db: sobe o serviço mariadb e mapeia a pasta ./db
  • freepbx-db-backup: realiza backup do banco de dados, mapeando a pasta ./dbbackup.

Todos os contêineres estão sob o "guarda-chuva" de um proxy reverso provido por uma rede chamada nginx-proxy. Na prática, o proxy reverso é um "guarda-chuva" do lado servidor. O nginx é um servidor web, que neste caso está sendo utilizado como "porta de entrada" para serviços providos por este conjunto de contêineres.

Procedimento:

1) Para subir esse conjunto de contêineres exemplo, é necessário baixar o arquivo docker-compose.yml em uma pasta qualquer.

2) Crie a rede nginx-proxy:

$ docker network create nginx-proxy

3) Para carregar o conjunto de contêineres, estando na pasta onde está o arquivo docker-compose.yml basta digitar:

$ docker-compose up

Ao subir os multiplos contêineres, deve ser possível observar as mensagens de carregamento de serviços nestes diferentes contêineres (freepbx-db, freepbx-db-backup e free-pbx-app)

4) Para verificar se os contêineres estão rodando, em um outro terminal digite:

$ docker ps

Deve ser possível ver três contêineres ativos.

4) Para conectar o terminal a um contêiner, por exemplo o freepbx-app, digite:

$ docker exec -it freepbx-app bash

Obtenha o IP da máquina da aplicação freepbx utilizando a mesma lógica apresentada no ambiente de testes.

Para desconectar, digite $ exit

Roteiro de instalação do Asterisk (apenas) utilizando docker

Pré-requisitos

Ter o Docker instalado na máquina hospedeira

Instalação do Asterisk de demonstração

1) Clonando o repositório https://github.com/mlan/docker-asterisk:

$ git clone https://github.com/mlan/docker-asterisk.git

Aguarde a realização do download completo.

2) Entre na pasta demo do repositório baixado

$ cd docker-asterisk/demo

3) De dentro da pasta demo, para subir o contêiner de teste digite:

$ docker-compose up -d

4) De dentro da pasta demo, para conectar com o console do Asterisk que está dentro do contêiner de teste digite:

$ docker-compose exec tele asterisk -rvvvddd

5) Do console do Asterisk pode-se executar diversos comandos, por exemplo, para listar os endpoints configurados, digite (observe que esse contêiner utiliza a bibioteca pjsip):

> pjsip show endpoints

Obs.: Para sair do console digite exit

6) Para conectar o terminal com o contêiner, de dentro da pasta demo, digite:

$ docker-compose exec tele bash

6.1) Para entrar no console do Asterisk digite:

# rasterisk

Informações adicionais

Descrição da tabela cdr_table

Alguns dos campos da tabela cdr_table são:

  • calldate: data e hora da chamada
  • clid: identificador único da chamada
  • src (source): quem fez a chamada (de onde originou a chamada)
  • dst (destino): destino da chamada
  • monitor: nome do arquivo de áudio que contém a gravação da chamada

Pastas do asterisk

  • /usr/src: Pasta utilizada neste tutorial para armazenar o asterisk-13.38.3.zip e os arquivos descompactados.
  • /var/lib/asterisk: Para com binários, incluindo arquivos de áudio
  • /etc/asterisk: Para com arquivos de configuração

Entendendo os parâmetros de configuração do Asterisk

Arquivo sip.conf

Tipos de SIP:

  • peer: Entidade SIP a qual o Asterisk envia chamadas (exemplo: um telefone ou central que que só recebe chamadas).
  • user: Entidade SIP a qual executa chamadas através do Asterisk (exemplo: um telefone que só faz chamadas).
  • friend: Entidade SIP que pode fazer e receber chamadas.

Qualify:

  • yes: O Asterisk testa de tempos em tempos se o dispositivo (terminal) está acessível (por padrão a cada 2 segundos)

Host:

  • dynamic: utilizado quando o IP do ramal não é fixado (caso comum de utilização de DHCP)

Context:

  • nome_do_contexto: um contexto pode conter diversos planos de discagem e o ramal que está neste contexto herda estes planos (os planos de discagem são declarados no arquivo extensions.conf).

Arquivo extensions.conf

Contexto

  • O contexto é uma subdivisão do arquivo dos planos de discagem.
    • Pode ser único por ramal ou compartilhado entre vários ramais.
    • É possível também criar contextos para casos específicos (por exemplo, ligações a cobrar, DDD, DDI, etc) e também inserir um contexto dentro de outro.
    • Um contexto inicia com a declaração de seu nome entre colchetes (Ex.: [public]) e termina quando um novo contexto é declarado.
    • No início do arquivo extensions.conf existe um contexto chamado [globals], onde as variáveis globais são definidas e podem ser utilizadas por todo o plano de discagem, e o contexto [general], utilizado para definição de alguns parâmetros gerais.
    • Você pode dar ao contexto qualquer nome, desde que sem

[nome_do_contexto]
exten => nome_da_extensão, prioridade, aplicação()

  • O nome_da_extensão corresponde aos dígitos que estão sendo discados.
  • A prioridade indica a ordem de execução dos comandos, sempre seguindo da menor prioridade para a maior, em sequência.
  • A aplicação é a ação que será tomada. O Asterisk possui um grande conjunto de aplicações para diferentes ações. Por exemplo: Answer() para atender a chamada, Wait(x) para esperar x segundos, Hangup() para desligar a chamada, entre outras.

Nomes de extensões predefinidos

Os seguintes nomes são predefinidos já com funções específicas para o Asterisk:

  • a: extensão Asterisk
  • h: Extensão hangup
  • i: opção inválida
  • o: operator de extensão que é utilizado para sair do correio de voz pressionando zero
  • s: inicio (start)
  • t: tempo máximo que a central espera por um comando (timeout)
  • T: tempo máximo que a central espera por um comando (AbsoluteTimeout)

Macro

Conjuntos de instruções de discagem podem ser agrupados no que é chamado de macro. Isso ajuda a reduzir a quantidade de instruções do arquivo extensions.conf, facilita a manutenção do código e também pode simplificar o entendimento do arquivo. A declaração da macro se parece com a declaração do contexto, ou seja, seu nome fica entre colchetes, porém toda a macro deve começar com a palavra macro-. Exemplo:

[macro-nome_da_macro]

Logo abaixo do nome da macro, seguindo a mesma lógica do contexto, deve-se declarar os planos de discagem correspondentes.

Para invocar a macro de algum plano, ou mesmo de dentro de outra macro, deve-se declarar uma extensão que invoca a operação Macro, seguindo o formato abaixo:

Macro(nome_da_macro, ARG1, ARG2, ..., ARGN) Sendo:

  • Macro: operação que invoca uma Macro.
  • nome_da_macro: O nome da Macro que está sendo invocada.
  • ARG1, ARG2, ..., ARGN: Argumentos que serão passados para a Macro.

Encaminhamento de chamadas

Um Asterisk pode encaminhar chamadas para outro, criando uma rede de centrais. No extensions.conf, deve ficar assim:

[iaxprovider] switch => IAX2/user:[key]@server/context

O usuário precisa ser definido no arquivo iax.conf do servidor que é chamado (mais informações).

Máscaras de discagem

As máscaras simplificam a elaboração de planos de discagem pois suportam as utilização de caracteres que representam números coringas. A máscara sempre comença com um underline (_). Máscaras podem ser formadas com os seguintes caracteres:

  • X: Um dígito entre 0 e 9
  • Z: Um dígito entre 1 e 9
  • N: Um dígito entre 2 e 9
  • .: Um ou mais dígitos quaisquer
  • []: Um digito dos que estão entre colchetes

Alguns exemplos:

  • _[23]000: representa 2000 ou 3000
  • _[23]00X: representa 2000 a 2009 (2000, 2001, 2002, 2003,...,2009), ou de 3000 a 3009 (3000, 3001, 3002, ... ,3009)
  • _[2-4]000: representa 2000 a 2009, ou 3000 a 3009, ou ainda de 4000 a 4009
  • _0X.: representa uma chamada para um DDD qualquer
  • _048X.: representa uma chamada para o DDD 48
  • _00X.: representa uma chamada DDI qualquer (internacional)
  • _0800X.: representa uma chamada gratuita (0800 alguma coisa)
  • _19X: representa um número de emergência (190, 191, ...)

Comandos rasterisk

Mostra lista de comandos:

CLI> help , ou executando: $ asterisk -r -x "help"

Sair da interface cliente:

CLI> quit

Recarrega configurações SIP:

CLI> sip reload

Recarrega todas as configurações:

CLI> reload

Mostra status dos terminais cadastrados:

CLI> sip show peers

Resolução de problemas

PROBLEMA: Não está sendo possível acessar o servidor Asterisk de uma outra máquina

Solução: Liberação de portas do firewall para funcionamento do Asterisk

# iptables -A INPUT -p udp -m udp --dport 10000:20000 -j ACCEPT

# iptables -A INPUT -p udp -m udp --dport 5060 -j ACCEPT

PROBLEMA: Asterisk não está mais subindo depois que a máquina foi reiniciada

Solução: reinstalar o Asterisk (sem modificar os arquivos de configuração que já tenham sido editados)

Tente subir o serviço manualmente

$ sudo su

# service asterisk start

# service asterisk status

Se pelo comando status o serviço não subiu, tente reinstalar o Asterisk:

$ sudo su

# cd /usr/src/asterisk-13.38.3/

# make install

# service asterisk start

PROBLEMA: O áudio da máquina virtual não está funcionando

Solução: Nas configurações do cliente de virtualização, habilite a saída e entrada de áudio para sua máquina virtual

PROBLEMA: O softphone não está conectando, exibindo Request Timeout (code 408)

Solução: Certificar que o Asterisk está acessível ao cliente softphone

Os principais motivos de o softphone não estar alcançando o serviço Asterisk, pode ser por um problema de rede, erro na configuração do domínio/servidor SIP e também pode ser que o serviço Asterisk não esteja ativo. Dentre as ações:

  • Revise as configurações de IP do servidor e no softphone
  • Pingue a máquina servidora da máquina cliente
  • Verifique se o serviço Asterisk está rodando adequadamente
  • Verifique se o firewall não está bloqueando o serviço Asterisk

PROBLEMA: O softphone não está conectando, exibindo Forbidden (code 403)

Solução: Checar arquivo sip.conf e certificar que foi o Asterisk está com o sip.conf atualizado

Se o softphone não está conectando é possível que não exista um ramal com o identificação utilizada no softphone e também pode ser que o Asterisk não está atualizado com o sip.conf mais atual. Dentre as ações:

  • Revise as configurações no arquivo sip.conf
  • No rasterisk, verifique se sip.conf
  • No rasterisk, recarregue o sip CLI> sip reload