Mudanças entre as edições de "Usuário:Greicili.s"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
(Página substituída por 'Autora do Projeto Integrador: convergência de telefonia com Asterisk.')
 
(38 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 1: Linha 1:
== <font size=5> Projeto Integrador: Asterisk  </font> ==
+
Autora do [[Projeto Integrador: convergência de telefonia com Asterisk]].
 
 
Alunos: Greicili dos Santos Ferreira e João Pedro Menegali Salvan Bitencourt. <br/>
 
Curso: Integrado de Telecomunicações <br/>
 
Turma: 6080821 <br/>
 
Professores: Ederson Torresini e Jorge Henrique B. Casagrande
 
----
 
 
 
 
 
== <center> <font size=3> ''' INTRODUÇÃO ''' </font> </center> ==
 
<br/>
 
<p align="justify" > Este trabalho foi realizado para ajudar pessoas que queiram montar uma central Asterisk com algumas funções, são elas: transferência de chamadas, captura de chamadas, ligação entre ramais, URA (unidade de resposta audível), voicemail com a gravação sendo enviada por e-mail, e DAC (Distribuição automática de chamadas). A turma da 8a fase do curso Integrado de telecomunicações do Instituto Federal de Santa Catarina - Campus São José, teve o Projeto Integrador como finalização de curso. Este projeto tinha por finalidade criar uma solução/produto para uma determinada empresa. Optamos por criar uma central Asterisk (que é um software livre), sendo ela destinada para comunicações VoIP, com algumas funções que achamos importantes para uma empresa. Porém, tivemos dificuldades de compreender as configurações disponíveis na Internet. Então, decidimos compartilhar nosso projeto e orientar, de maneira mais explicativa, como configurar a central Asterisk. Oferecemos o conteúdo em texto e em vídeo, para que o interessado tenha opção de escolha levando em conta a sua preferência.
 
Criamos uma empresa fictícia para o projeto Integrador, a Merkki ([http://172.18.18.182/blog/]).
 
</p>
 
 
 
 
 
==  <center> <font size=3> ''' INSTALAÇÃO ''' </font> </center> ==
 
<br/>
 
<p align="justify" >
 
Primeiramente, abra um terminal como root. Optamos em utilizar a distribuição Debian 8 (Jessie) no projeto. Os comandos para instalar o Asterisk são: <br/>
 
''' apt-get install update ''' → Comando que atualiza os repositórios do sistema. <br/>
 
''' apt-get install asterisk ''' → Comando para instalar o asterisk.  <br/> <br/>
 
 
 
Agora temos o Asterisk! Podemos encontrar seus arquivos de configurações em “/etc/asterisk”. Precisamos ainda instalar um correio eletrônico (Postfix) para que possamos enviar mensagens de áudio gravadas para um ramal para o e-mail do dono desse ramal (será falado mais sobre isso quando chegarmos no voicemail). Os comandos são:  <br/> <br/>
 
 
 
''' apt-get install postfix ''' → Instalar o correio eletrônico. <br/><br/>
 
 
 
Aparecerá uma informação na tela que você precisará responder.  <br/>
 
 
 
-opção: local only <br/>
 
-nome: merkki.com.br → merkki é o nome da nossa empresa fictícia criada no projeto Integrador. Você pode colocar o que quiser nesse campo. <br/><br/>
 
 
 
Agora você terá que ir no arquivo main.cf que se encontra no “/etc/postfix”. Lá você irá
 
adicionar o caractere “#” nas seguintes linhas:
 
: #default_transport = error
 
: #relay_transport = error
 
Salve o arquivo e, em seguida, digite os seguintes comandos:  <br/>
 
''' service postfix restart ''' → habilita suas configurações.  <br/>
 
''' journalctl -l -u postfix ''' → mostra o status do postfix (logs do sistema).  <br/> <br/>
 
</p>
 
<p align="justify" >
 
Instalaremos também um softphone para podermos nos conectar à central. Utilizamos o Jitsi para os computadores e o Zoiper para os celulares (possui versões para Iphone, Android e Windows Phone). Descobrimos, mais tarde, que existe o Jitsi para android, porém ele está na versão instável.  <br/> <br/>
 
''' apt-get install jitsi '''
 
</p>
 
 
 
== <center> <font size=3> ''' CONCEITOS BÁSICOS ''' </font> </center> ==
 
<br/>
 
<p align="justify" >
 
Vamos agora olhar os arquivos de configuração do Asterisk ( vá para /etc/asterisk ). Usando o comando ''' ls ''' , veremos esses arquivos. Os utilizados por nós foram: </p><br/>
 
* sip.conf <br/>
 
* extensions.conf <br/>
 
* features.conf <br/>
 
* queues.conf <br/>
 
* agents.conf <br/>
 
* voicemail.conf <br/>
 
* confbridge.conf <br/><br/>
 
 
 
<p align="justify" >
 
Mostraremos o conteúdo deste arquivos e o auxiliaremos na configuração deles. Veremos
 
cada um deles a seguir:
 
</p><br/>
 
=== ARQUIVO: sip.conf ===
 
 
 
Neste arquivo criaremos os ramais, definiremos os codecs, as senhas dos usuários, os grupos, etc. <br/>
 
Exemplo:
 
<font size=3>
 
[general] → Tudo o que se encontra entre colchetes é o contexto, é por meio dele que criamos grupos.
 
Neste caso, o “general” indica que todas as configurações que se encontra abaixo dele serve para todos os ramais.
 
allowguest=no
 
srvlookup=no
 
canreinvite =no
 
dtmfmode=rfc2833
 
[ramal-voip](!) → Grupo ramais VoIP. Todas as configurações definidas abaixo serão utilizadas por todos
 
os ramais desse grupo.
 
type=friend → Configura a classe de conexão. ''' Friend ''': pode tanto receber como efetuar ligações;
 
'''peer ''': só recebe chamadas; ''' user ''': só faz chamadas).
 
context=INTERNO → esse contexto será utilizado em outros arquivos do asterisk. Então é necessário especificá-lo
 
para que os outros recursos do Asterisk encaminhe os ramais desse grupo para as funções desejadas. Mais adiante,
 
retomarei este conceito para que fique mais claro.
 
host=dynamic → atribui IP aos ramais automaticamente. Opção Dynamic é a mais usada.
 
allow=all → Allow: Permite que um determinado codec seja usado.
 
qualify=yes
 
videosupport=yes → Essa configuração permite ter videoconferência. Porém, alguns softphones
 
não suportam videoconferência.
 
textsupport=yes
 
nat=yes
 
bindport=6969 → Porta que o Asterisk deve esperar por conexões de entrada SIP. O padrão é 5060.
 
[100](ramal-voip) → Ramal 100
 
secret=senha100 → Essa é a senha utilizada para se cadastrar na central pelo seu softphone.
 
callerid="100" <100> → Aqui você coloca o nome do usuário do ramal para que a pessoa chamada
 
saiba quem está ligando. Ex: callerid="Maria" <100> → Aparecerá o nome Maria no ramal de  destino.
 
videosupport=yes → Como mencionado antes, para ter videoconferência. É necessário que todos os
 
ramais tenham essa configuração.
 
Call-limit=1 → Número máximo de “canais” simultâneos para um mesmo ramal. Então, quando estiver em  ligação e alguém te ligar,
 
a pessoa será informada que você está ocupado.
 
 
[101](ramal-voip)
 
secret=senha101
 
callerid="101" <101>
 
videosupport=yes
 
call-limit=1
 
</font>
 
<br/>
 
<p align="justify" >
 
Acesse o console do Asterisk digitando o seguinte comando no terminal:'''rasterisk '''
 
Agora que você está no console, digite: ''' reload '''. Isso fará com que as configurações que você fez nos arquivos sejam habilitadas no Asterisk. Sempre que você alterar algo nos arquivos do Asterisk, repita esse processo. Para sair do console, é só digitar: ''' exit '''
 
</p>
 
<br/>
 
 
 
=== ARQUIVO: extensions.conf ===
 
<p align="justify" >
 
Neste arquivo será atribuído aos ramais o plano de discagem, ou seja, o que cada ramal poderá ter e fazer. Algumas observações: você verá com frequência no arquivo o uso do caractere “;” (ponto e vírgula) , tudo o que vier depois deste, na mesma linha ,não será utilizado, ou seja, será apenas um comentário. <br/>
 
As extensões são responsáveis por disparar um evento no Asterisk, determinando o fluxo das chamadas. No arquivo de configuração, possuem basicamente o formato: </p><br/>
 
<center> ''' exten=> número (nome), prioridade, aplicação </center>
 
<br/>
 
Cuidado com as prioridades! Tem que ser sequencial. Para evitar erros, o bom é utilizar a letra “n” (next). <br/>
 
Ex: <br/>
 
: exten => 100,1, Dial (SIP/100,30) <br/>
 
: exten => 100, n,VoiceMail(100) <br/>
 
: exten => 100, n, Hangup() <br/><br/>
 
A letra “n” segue a ordem imposta por você no arquivo, mas é preciso começar com a prioridade “1”. Se você fizer como o modo abaixo, não funcionará. <br/>
 
Ex: <br/>
 
: exten => 100,n,Dial (SIP/100,30) <br/>
 
: exten => 100, n,VoiceMail(100) <br/>
 
: exten => 100, n, Hangup() <br/><br/>
 
<p align="justify" >
 
A seguir mostraremos um exemplo de arquivo de configuração: Não copie os comentários que se encontram após as setas para não ocorrer erros, mas se quiser deixar nos arquivos de configurações esses comentários, lembre-se de colocar o caractere “ ; ” antes das setas e também no começo da linha (se os comentários não couberam na linha anterior). </p>
 
<font size=3>
 
[general]
 
[INTERNO] → Lembra do contexto que falei? Cuidado com isso! O que você colocar lá no arquivo sip.conf tem que aparecer
 
aqui da mesma forma! Lá estava em maiúsculo e aqui também.
 
;
 
; RAMAL 100
 
;
 
exten => 100,1,Dial(SIP/${EXTEN},35,tT) → Nessa linha configuramos para esse ramal ter a  função transferência de chamada.
 
'''Dial''': Faz uma chamada; '''SIP/${EXTEN}''': É a sua extensão (número do seu ramal). É vantajoso utilizar isso para não
 
ter que em cada ramal digitar o número da sua extensão, como podemos ver no plano de discagem do ramal 101 (enumerar todos
 
ramais é uma tarefa cansativa) ; '''35''': é o tempo para transferir a ligação, em segundos; '''t''': habilita a transferência
 
para o lado destino da chamada; '''T''': habilita a transferência para o lado originador da chamada.
 
exten => 100,2,VoiceMail(100) → atribui um correio de voz a esse ramal, mas é necessário ainda configurar no arquivo voicemail.conf
 
para funcionar.
 
exten => 100,3,Hangup() → '''Hangup''': Encerra a chamada.
 
;
 
; RAMAL 101
 
;
 
exten => 101,1,Dial(SIP/101,30) → Neste caso, o ramal só faz chamada (Dial), mas não tem a possibilidade de transferir chamadas,
 
pois não tem “ tT ”. '''30''': É o tempo máximo que o telefone pode chamar/tocar.
 
exten => 101,2,VoiceMail(101)
 
exten => 101,3,Hangup()
 
</font>
 
<p align="justify" >
 
Até aqui, você tem apenas os ramais configurados que serão utilizados pelos usuários. Agora vamos para as funções. No próximo arquivo faremos a configuração da transferência. Já configuramos para os ramais, falta só habilitar essa função para que os mesmos possam utilizar.</p><br/><br/>
 
 
 
=== ARQUIVO: features.conf ===
 
<p align="justify" >
 
Vamos agora configurar a função de transferência. Temos dois tipos de transferência: Transferência cega e Assistida. </p><br/>
 
: <p align="justify" > '''Transferência cega''': É quando o usuário só transfere a ligação e não há interação. Para configurar, basta localizar no arquivo a seguinte informação “blindxfer”. Neste local, você colocará o dígito de sua preferência para que seja indicado que você quer transferir a chamada. O padrão é o caractere “#”. Então, quando você estiver ao telefone com alguém e deseja transferir a ligação, basta pressionar # e digitar o ramal para onde você quer encaminhar a ligação. </p><br/>
 
: <p align="justify" > '''Transferência Assistida''': Quando há interação do usuário que vai receber a ligação. Se configura essa transferência no “atxfer”. Neste caso, você pode também escolher o caractere. O padrão utilizado é “ *2 ”. </p><br/>
 
<p align="justify" >
 
No features.conf configuramos também a captura de chamadas, para isso temos que indicar o caractere no “ pickupexten”. O padrão utilizado é “ *8 ”. Esse recurso é utilizado quando se quer atender o telefone de um ramal que está tocando sem que haja alguém para atender. Para a função de captura funcionar temos que configurar o extension.conf e o sip.conf. </p><br/>
 
Exemplo de arquivo features.conf:
 
<font size=3>
 
[general]
 
;
 
pickupexten = *8 → Captura de chamadas
 
pickupsound = beep
 
pickupfailsound = beeperr
 
;
 
transferdigittimeout => 3
 
xfersound = beep
 
xferfailsound = beeperr
 
atxfernoanswertimeout = 15
 
atxferloopdelay = 10
 
atxfercallbackretries = 2
 
atxferdropcall = no
 
;
 
[featuremap]
 
blindxfer => # → transferência à cega
 
disconnect => *0
 
automon => *1
 
atxfer => *2 → transferência assistida
 
</font>
 
<p align="justify" >
 
Agora voltaremos para o sip.conf para configurar a captura de chamadas. Nesse arquivo vamos estabelecer quais ramais farão parte do mesmo grupo de captura de chamadas. Com isso, só ramais do mesmo grupo podem capturar chamadas entre si. Precisaremos colocar as seguintes
 
informações: <br/>
 
callgroup = xx → aqui você coloca um número para indicar o grupo. <br/>
 
pickupgroup = xx → aqui utilize o mesmo número. <br/>
 
No arquivo sip.conf, colocar nos ramais desejados as informações acima, como mostrado no exemplo abaixo: veja que eles pertencem a um mesmo grupo. </p>
 
<font size=3>
 
[100](ramal-voip)
 
secret=senha100
 
callerid="100" <100>
 
videosupport=yes
 
callgroup=1
 
pickupgroup=1
 
[101](ramal-voip)
 
secret=senha101
 
callerid="101" <101>
 
videosupport=yes
 
callgroup=1
 
pickupgroup=1
 
</font>
 
<p align="justify" >
 
Após isso, iremos para o arquivo extensions.conf e colocaremos a seguinte aplicação: '''PickUp'''. </p><br/>
 
<font size=3>
 
; RAMAL 100
 
;
 
exten => 100,1,Dial(SIP/${EXTEN},35,tT)
 
exten => 100,2,Pickup(${EXTEN},10,@INTERNO) → configuração para captura de chamadas. '''10''': tem 10 segundos para
 
ocupar o canal na tentativa de capturar a ligação. '''@INTERNO''': o contexto em que seus ramais estão, conforme o definido
 
no sip.conf e no próprio extensions.conf.
 
exten => 100,n,VoiceMail(100)
 
exten => 100,n,Hangup()
 
;
 
; RAMAL 101
 
;
 
exten => 101,1,Dial(SIP/${EXTEN},35,tT)
 
exten => 101,2,Pickup(${EXTEN},10,@INTERNO)
 
exten => 101,n,VoiceMail(101)
 
exten => 101,n,Hangup()
 
</font><p align="justify" >
 
'''Como usar a captura de chamadas''': <br/>
 
O ramal ao seu lado está tocando e seu colega não está. O combinado entre vocês é que, nessa situação, você tem a permissão de atender a ligação dele. Mas você não quer deixar o seu posto de trabalho, então você pode utilizar o recurso de captura de chamada. Basta pressiona “ *8 ” e efetuar a ligação. Automaticamente a ligação é repassada para você. </p><br/><br>
 
=== ARQUIVO: voicemail.conf ===
 
<p align="justify" >
 
Nesse arquivo criaremos o correio de voz dos usuários, ou seja, quando um ramal não atender, você tem a opção de deixar uma mensagem em forma de áudio para ele. </p><br/>
 
Exemplo:
 
<font size=3>
 
[general]
 
format=wav
 
maxmsg=100
 
maxsecs=60
 
minsecs=3
 
skipms=3000
 
maxsilence=1
 
silencethreshold=128
 
maxlogins=3
 
; You override the default program to send e-mail to use the script
 
mailcmd=/usr/sbin/sendmailmp3 → aqui é um script que converte o formanto wav para MP3 para que se possa enviar o áudio por e-mail.
 
attach=yes
 
[default]
 
100 => senha,Nome,e-mail → Na senha, usar somente números!
 
101 => 1234, Maria, maria@gmail.com
 
</font><p align="justify" >
 
Obs: se você optar por apagar os arquivos de áudio do correio de voz e ter os áudios apenas no e-mail, basta acrescentar “delete=yes”. Faça exatamente como o exemplo abaixo. <br/>
 
Ex: 101=> 1234, Maria, maria@gmail.com, , delete=yes </p><br/>
 
<center> ''' Criando o script para o envio dos áudios do correio de voz para o e-mail do usuário:''' </center><br/>
 
Primeiro, você precisará instalar os pacotes necessário para o script. Execute o seguinte comando: <br/>
 
<center> '''apt-get install dos2unix lame sox''' </center> <br/>
 
Em seguida, vá para “/usr/sbin” e crie um arquivo chamado “sendmailmp3”. Coloque nesse arquivo o conteúdo abaixo: <br/>
 
 
 
#!/bin/sh
 
# Asterisk voicemail attachment conversion script
 
# Revision history :
 
# 22/11/2010 - V1.0 - Creation by N. Bernaerts
 
# 07/02/2012 - V1.1 - Add handling of mails without attachment (thanks to Paul Thompson)
 
# 01/05/2012 - V1.2 - Use mktemp, pushd & popd
 
# 08/05/2012 - V1.3 - Change mp3 compression to CBR to solve some smartphone compatibility (thanks to Luca Mancino)
 
# 01/08/2012 - V1.4 - Add PATH definition to avoid any problem (thanks to Christopher Wolff)
 
# 16/07/2015 - V1.5 - Handle natively GSM WAV (thanks to Michael Munger)
 
 
# set PATH
 
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
 
 
# save the current directory
 
pushd .
 
 
 
# create a temporary directory and cd to it
 
TMPDIR=$(mktemp -d)
 
cd $TMPDIR
 
 
# dump the stream to a temporary file
 
cat >> stream.org
 
 
 
# get the boundary
 
BOUNDARY=$(grep "boundary=" stream.org | cut -d'"' -f 2)
 
 
 
# cut the file into parts
 
# stream.part - header before the boundary
 
# stream.part1 - header after the bounday
 
# stream.part2 - body of the message
 
# stream.part3 - attachment in base64 (WAV file)
 
# stream.part4 - footer of the message
 
awk '/'$BOUNDARY'/{i++}{print > "stream.part"i}' stream.org
 
 
 
# if mail is having no audio attachment (plain text)
 
PLAINTEXT=$(cat stream.part1 | grep 'plain')
 
if [ "$PLAINTEXT" != "" ]
 
then
 
 
 
# prepare to send the original stream
 
cat stream.org > stream.new
 
 
 
# else, if mail is having audio attachment
 
else
 
 
 
  # cut the attachment into parts
 
  # stream.part3.head - header of attachment
 
  # stream.part3.wav.base64 - wav file of attachment (encoded base64)
 
  sed '7,$d' stream.part3 > stream.part3.wav.head
 
  sed '1,6d' stream.part3 > stream.part3.wav.base64
 
 
  # convert the base64 file to a wav file
 
  dos2unix -o stream.part3.wav.base64
 
  base64 -di stream.part3.wav.base64 > stream.part3.wav
 
 
 
  # convert wave file (GSM encoded or not) to PCM wav file
 
  sox stream.part3.wav -s stream.part3-pcm.wav
 
 
 
  # convert PCM wav file to mp3 file
 
  # -b 24 is using CBR, giving better compatibility on smartphones (you can use -b 32 to increase quality)
 
  # -V 2 is using VBR, a good compromise between quality and size for voice audio files
 
  lame -m m -b 24 stream.part3-pcm.wav stream.part3.mp3
 
 
 
  # convert back mp3 to base64 file
 
  base64 stream.part3.mp3 > stream.part3.mp3.base64
 
 
  # generate the new mp3 attachment header
 
  # change Type: audio/x-wav or audio/x-WAV to Type: audio/mpeg
 
  # change name="msg----.wav" or name="msg----.WAV" to name="msg----.mp3"
 
  sed 's/x-[wW][aA][vV]/mpeg/g' stream.part3.wav.head | sed 's/.[wW][aA][vV]/.mp3/g' > stream.part3.mp3.head
 
 
  # generate first part of mail body, converting it to LF only
 
  mv stream.part stream.new
 
  cat stream.part1 >> stream.new
 
  cat stream.part2 >> stream.new
 
  cat stream.part3.mp3.head >> stream.new
 
  dos2unix -o stream.new
 
 
  # append base64 mp3 to mail body, keeping CRLF
 
  unix2dos -o stream.part3.mp3.base64
 
  cat stream.part3.mp3.base64 >> stream.new
 
 
  # append end of mail body, converting it to LF only
 
  echo "" >> stream.tmp
 
  echo "" >> stream.tmp
 
  cat stream.part4 >> stream.tmp
 
  dos2unix -o stream.tmp
 
  cat stream.tmp >> stream.new
 
 
fi
 
 
# send the mail thru sendmail
 
cat stream.new | sendmail -t
 
 
# go back to original directory
 
popd
 
 
# remove all temporary files and temporary directory
 
rm -Rf $TMPDIR
 
 
 
Disponível em: < http://bernaerts.dyndns.org/linux/179-asterisk-voicemail-mp3 >. <br/>
 
Depois de salvar, você apenas precisa reiniciar os Asterisk para que a configuração seja usada.
 
<center> '''/etc/init.d/asterisk restart''' </center><br/>
 
<p align="justify" >Precisamos atribuir um ramal ao voicemail para que o usuário possa acessar seu correio de voz, para isso, é necessário ir no extensions.conf e acrescentar as informações abaixo: </p>
 
<font size=3>
 
; RAMAL 803 - VoiceMail Menu
 
;
 
exten => 803,1,VoiceMailMain()
 
exten => 803,2,HangUp()
 
exten => 803,3,PlayBack(vm-goodbye)
 
exten => 803,4,HangUp()
 
;
 
</font><p align="justify" >
 
'''Exemplo''': o ramal 100 quer ver se há alguma mensagem para ele no seu correio de voz. Então, ele ligará para 803, digitará seu ramal e sua senha (a senha colocada no voicemail.conf). Será apresentado a ele instruções de como ouvir suas mensagens. <br/>
 
As mensagens gravadas estão localizadas no “/var/spool/asterisk/voicemail/default/”. Ao entrar na pasta “default”, execute o comando “ ls ” para ver o conteúdo dessa pasta. Você encontrará uma pasta para cada ramal, ou seja, se o ramal 100 tiver uma mensagem, terá uma pasta com o nome “100”. Entre nessa pasta e depois entre em “INBOX”, que é o local onde estão as mensagens do ramal 100.</p><br/><br/>
 
=== ARQUIVO: queues.conf ===
 
<p align="justify" >Neste arquivo é configurado a fila de espera do DAC (distribuição automática de chamadas). Caso você não saiba o que o DAC faz, darei um exemplo para que você entenda. O DAC é usado em callcenter. Então, você tem um grupo de ramais (que no arquivo é chamado de membros) que atenderão as chamadas. <br/>
 
No arquivo abaixo, dado como exemplo, vemos uma fila de atendentes que vai do ramal 181 até o 187. </p>
 
<font size=3>
 
[general]
 
;
 
persistentmembers=yes
 
keepstats=no
 
autofill=yes
 
monitor-type=MixMonitor
 
shared_lastcall=yes
 
;
 
[atendentes] → esse contexto será utilizado em outros arquivos!
 
;
 
musicclass=default
 
announce=queue-atendentes
 
strategy=rrmemory
 
timeout=30
 
retry=5
 
weight=0
 
autopause=no
 
maxlen=0
 
ringinuse=no
 
member => SIP/181
 
member => SIP/182
 
member => SIP/183
 
member => SIP/184
 
member => SIP/185
 
member => SIP/186
 
member => SIP/187
 
</font>
 
Obs: Esses ramais tem que estar no sip.conf e no extensions.conf para funcionar. <br/>
 
<p align="justify" >Depois de configurar a fila, temos que indicar os ramais acima no arquivo agents.conf, onde é colocado senha para o ramal poder se “logar” na fila. </p><br/><br/>
 
=== ARQUIVO: agents.conf ===
 
Como mencionado antes, neste arquivo será “autenticados” os membros da fila. <br/>
 
Exemplo do arquivo agents.conf:
 
<font size=3>
 
[general] → Configurações gerais
 
persistentagents=yes → define se o callbacklogin terá que ser armazenado em uma base de dados interna do Asterisk. Assim toda vez que
 
reiniciarmos o Asterisk esses dados serão recarregados automaticamente.
 
multiplelogin=no → define se é permitido que uma mesma extensão pode-se conectar com múltiplos agentes.
 
[agents] → aqui se inicia as configurações dos agentes.
 
Maxlogintries=3 → numero máximo de tentativas que tem um agente para conectar.
 
Autologoff=15 → se um agente não atende uma chamada dentro de 15 segundos ele será desconectado automaticamente.
 
autologoffunavail=yes → se a extensão que o agente se conecta estiver indisponível,
 
automaticamente, o agente é “deslogado”.
 
endcall=yes → um agente pode terminar uma chamada pressionando a tecla *.
 
musiconhold => default → é a classe da musica de espera que o agente escutará quando estiver logado.
 
;Definindo um grupo para os agentes que vamos configurar:
 
group=1
 
;Agentes da Fila de atendimento dos atendentes
 
;
 
agent => 181,senha, nome
 
agent => 182,,Maria → se deixar assim, não será pedido senha para se “logar” na fila.
 
agent => 183,1234,João
 
agent => 184,,
 
agent => 185,,
 
agent => 186,,
 
agent => 187,,
 
</font><p align="justify" >
 
Agora vamos indicar no extensions.conf, como o usuário poderá se encaminhar na fila de espera para ser atendido por um atendente. No extensions.conf, crie um ramal que, quando discado, encaminhará aos atendentes. Nesse ramal usaremos a aplicação “queues”. <br/>
 
Exemplo: o ramal que usarei é o 180. Quando alguém discar para esse número, será enviado para um atendente disponível configurado na fila de espera. </p>
 
Configuração no extensions.conf:
 
<font size=3>
 
; RAMAL 180 -FILA DE ESPERA ATENDENTES
 
;
 
exten => 180,1,Goto(atendentes,s,1) → quando você liga para o ramal 180, a aplicação Goto (vá para) te encaminha
 
para o contexto atendentes apresentado entre colchetes logo abaixo; '''s''' (start): Usado quando o Asterisk não recebe
 
o número de B. '''1''': indica para ser encaminhado a prioridade 1 desse contexto, que neste caso é atender (Answer).
 
;
 
[atendentes]
 
;
 
exten => s,1,Answer()
 
exten => s,n,Queue(atendentes) → te encaminha para fila de espera “atendentes”. Lembre-se que o contexto entre parêntese
 
tem que ser igual ao que está no queues.conf!
 
exten => s,n,Hangup()
 
;
 
[INTERNO] → o contexto atendentes acima (entre colchetes), “desabilita” os ramais seguintes do seu contexto do
 
arquivo sip.conf. Por isso, toda vez que você utilizar um contexto, sendo que você tem ramais que serão utilizados
 
por usuários logo em seguida, recoloque o contexto destes ramais, como mostrado neste exemplo.
 
;
 
; RAMAL 181 - AGENTE FILA DE ESPERA
 
;
 
exten => 181,1,Dial(SIP/${EXTEN},35,tT)
 
exten => 181,2,Hangup()
 
;
 
; RAMAL 182 - AGENTE FILA DE ESPERA
 
;
 
exten => 182,1,Dial(SIP/${EXTEN},35,tT)
 
exten => 182,2,Hangup()
 
</font><p align="justify" >
 
Existe outra forma de se habilitar um atendente na fila de espera, só que o número do seu ramal não será utilizado e, sim, o de um agente. Darei um exemplo para ficar mais claro. <br/>
 
Vamos novamente para o queues.conf. Abaixo do membro 187, colocaremos o seguinte: </p>
 
<font size=3>
 
member => agent/2000
 
member => agent/2001
 
</font>
 
Agora iremos para o agents.conf. Faremos a mesma coisa, porém com as seguintes informações:
 
<font size=3>
 
agent => 2000,1234,João
 
agent => 2001,4321,Greici
 
</font>
 
Em seguida iremos no extensions.conf e adicionaremos o seguinte conteúdo:
 
<font size=3>
 
exten => _200[0-1],1,Agentlogin(${EXTEN}) → para que o ramal possa se logar na fila de espera.
 
exten => _200[0-1],n,Hangup
 
</font><p align="justify" >
 
Neste caso, os ramais para os agentes vão do 2000 ao 2001. Para aumentar esse número, você pode fazer de várias maneiras: <br/>
 
: exten => _200[0-9] → vai do 2000 ao 2009
 
: exten => _20xx → vai do 2000 ao 2099
 
Conceitos: <br/>
 
x → vai de 0 a 9 </br>
 
n → vai de 2 a 9 <br/>
 
z → vai de 1 a 9 <br/>
 
'''Como fazer para o agente se logar''': o ramal 100, quer ser o agente 2000 para poder atender na fila de espera. Então, ele discará 2000 e ligará. Ao fazer isso, ele será encaminhado para o agentlogin, onde será pedido a senha (a senha que está no agents.conf), neste caso 1234, em seguida pressione “#” para finalizar, tornando-se o agente 2000 e, agora, está disponível para atender. Para “deslogar”, pressione “ * ”. </p><br/><br/>
 
 
 
=== ARQUIVO: confbridge.conf ===
 
<p align="justify" > Nesse arquivo é configurado a conferência. Temos dois tipos de conferência: conferência aberta e conferência fechada. </p>
 
* <p align="justify" > '''Conferência Aberta''': Este tipo de conferência não precisa de uma senha para entrar na sala de conferência. Só discar o ramal que equivale à conferência aberta e esperar as outras pessoas entrarem. Para isso, deixamos o espaço “PIN” em branco, como você verá no arquivo abaixo. </p>
 
* <p align="justify" > '''Conferência Fechada''': Neste caso, para participar da conferência é necessário de uma senha. O código para entrar na conferência fechada é “5555”, conforme o exemplo abaixo. </p>
 
Exemplo de arquivo confbridge.conf:
 
<font size=3>
 
[general]
 
[admin_user]
 
type=user
 
pin=5555
 
marked=yes
 
admin=yes
 
music_on_hold_when_empty=yes
 
announce_user_count=yes
 
[admin_user2]
 
type=user
 
pin=
 
marked=yes
 
admin=yes
 
music_on_hold_when_empty=yes
 
announce_user_count=yes
 
[default_bridge]
 
type=bridge
 
max_members=10 → no máximo, dez integrantes por sala de conferência. Pode mudar esse valor.
 
</font>
 
Com o arquivo confbridge.conf configurado, iremos para o extensions.conf para atribuir um ramal para a sala de conferência. <br/>
 
'''Exemplo''': Usei o ramal 800 para conferência aberta e 801 para conferência fechada.
 
<font size=3>
 
; RAMAL 800 - Conferência Aberta
 
;
 
exten => 800,1,Progress()
 
exten => 800,2,Wait(1)
 
exten => 800,3,ConfBridge(1,default_bridge,admin_user2) → lembre-se do contexto!
 
“admin_user2” deve aparecer exatamente igual ao que está no arquivo confbridge.conf!
 
;
 
; RAMAL 801- Conference Fechada
 
;
 
exten => 801,1,Progress()
 
exten => s,2,Wait(1)
 
exten => s,3,ConfBridge(1,default_bridge,admin_user) → checar o contexto!!
 
</font>
 
<p align="justify" >
 
Quando testamos a configuração acima, esperávamos que tivesse duas salas distintas, ou seja, se eu ligasse para o ramal 800 e outra pessoa ligasse para o ramal 801, não ocorreria interação entre nós. Porém, houve a junção das salas de conferência. Descobrimos que teríamos que especificar o “número de conferência”. Para entender, mostrarei abaixo a sintaxe do confbridge no plano de discagem: <br/>
 
<center> '''ConfBridge(confno,bridge_profile,user_profile,menu)''' </center><br/>
 
O que equivale ao “número de conferência” é o “confno” da sintaxe. Então, para ter duas salas de conferência, realmente, distintas é necessário fazer como o exemplo abaixo: </p>
 
<font size=3>
 
RAMAL 800 - Conferência Aberta
 
;
 
exten => 800,1,Progress()
 
exten => 800,2,Wait(1)
 
exten => 800,3,ConfBridge(1,default_bridge,admin_user2)
 
;
 
; RAMAL 801- Conference Fechada
 
;
 
exten => 801,1,Progress()
 
exten => s,2,Wait(1)
 
exten => s,3,ConfBridge(2,default_bridge,admin_user)
 
</font>
 
Para mais informações sobre a aplicação Confbridge acesse o site: < https://wiki.asterisk.org/wiki/display/AST/ConfBridge>.
 
<br/>
 
=== CONFIGURAR URA: Unidade de resposta audível ===
 
<p align="justify" > A URA é usada para recepcionar clientes, ou seja, são gravações que indicam como o cliente deve proceder. Quando se entra na URA, será apresentado uma série de informações, onde se pode escolher, por meio de dígitos, a opção referente ao que você deseja. A configuração da URA é feita, somente, no arquivo extensions.conf. </p><br/>
 
'''Exemplo1''': O ramal para entrar na URA é 666.
 
<font size=3>
 
[INTERNO]
 
exten => 666,1,Goto(ura,s,1) → encaminha para o contexto ura, que está entre colchetes abaixo.
 
[ura]
 
exten => s,1,Answer
 
exten => s,2,NoOp(Ligação entrou na URA) → '''NoOp''': mostra o que está acontecendo no console.
 
exten => s,n,Background(/var/lib/asterisk/sounds/welcome). '''Background''': tocar uma música; entre parênteses você coloca
 
o local onde o arquivo de áudio se encontra.
 
exten => s,n,NoOp(Digite a opção/1-suporte/2-comercial/3-financeiro) → Mostra, o que está entre parênteses, no console do Asterisk.
 
exten => s,n,WaitExten(6); caso nada tenha sido digitado durante a mensagem "welcome", espera mais 6 segundos no máximo pelos
 
dígitos do usuário.
 
exten => 1,1,NoOp(Chamada foi para Suporte) → Ao digitar 1, o usuário foi enviado para o setor
 
de suporte.
 
same => n,Dial(SIP/2402,60) → Nessa parte a chamada é encaminhada para o ramal 2402. '''60''': Tem 60 segundos para atender.
 
same => n, Hangup
 
exten => 2,1,NoOp(Chamada foi para Comercial) → Ao digitar 2, foi para o setor comercial.
 
same => n,Dial(SIP/2801,60)
 
same => n, Hangup
 
exten => 3,1,NoOp(Chamada foi para Financeiro)
 
same => n,Dial(SIP/2000,60)
 
same => n, Hangup
 
exten => i,1,NoOp(Extensão inválida)
 
same => n,Play(beep)
 
same => n,GoTo(s,3) → volta para o menu.
 
exten => t,1,NoOp(Tempo esgotado) → quando excede o tempo de 6 segundos estipulados no “WaitExten”, a chamada será encaminhada
 
para esta extensão.
 
same => n,Dial(SIP/3401,60)
 
same => n,Hangup
 
</font>
 
<p align="justify" >'''Exemplo2''': É para quem quer adicionar funções à URA, como por exemplo, encaminhar para uma fila de atendentes, ir para conferência, etc. No exemplo abaixo, para acessar a URA tem que discar para o ramal 900. Essa URA está totalmente pronta no final deste trabalho, na parte “arquivos originais do projeto integrador”. Peço que apenas observe a extensão dos atendentes, pois já foi mostrado anteriormente a configuração. Então, quando você digitar 3 na URA ou estourar o tempo de discagem, você será encaminhado para a fila de espera que está configurado no extensions.conf e no queues.conf. </p>
 
<font size=3>
 
[INTERNO]
 
;
 
; RAMAL 900 - URA
 
;
 
exten => 900,1,Goto(ura,s,1) → encaminha para o contexto ura, que está entre colchetes abaixo.
 
;
 
[ura]
 
exten => s,1,Answer
 
exten => s,2,NoOp(Ligação entrou na URA) → mostra o que está acontecendo no console.
 
exten => s,n,Background(/usr/share/asterisk/sounds/custom/uramenuprincipal)
 
exten => s,n,NoOp(Aguardando os dígitos do usuário)
 
exten => s,n,WaitExten(10) → 10 segundos para o usuário discar uma das opções apresentadas.
 
exten => 1,1,NoOp(Chamada foi para Setores)
 
same => n, Goto(ura2,s,1)
 
same => n, Hangup()
 
exten => 2,1,NoOp(Chamada foi para Serviços)
 
same => n, Goto(ura3,s,1)
 
same => n, Hangup()
 
exten => 3,1,NoOp(Chamada foi para Atendentes) → Ao digitar 3, foi para atendentes. Na URA do exemplo 1, somente um ramal
 
era chamado. Agora temos um fila de atendentes, que pode ter vários ramais.
 
same => n, Goto(atendentes,s,1) → Lembre-se do contexto!!! Tem que ser o mesmo que está no entre colchetes no arquivo
 
extensions.conf do ramal da fila que você deseja. Como configuramos anteriormente, em “ARQUIVOS: queues.conf”, o ramal da
 
fila de atendentes é o 180. OBS: Não funciona colocar “same => n, Dial (SIP/180,60)” nessa parte. O Asterisk não encaminha!
 
É necessário criar um contexto e usar “Goto”.
 
same => n, Hangup()
 
exten => 4,1,NoOp(Repetir)
 
same => n, Goto(ura,s,1)
 
same => n, Hangup()
 
exten => i,1,NoOp(Extensão inválida) → i (invalid): Quando um cliente pressiona uma tecla inválida dentro do comando
 
background() ou waitExten() é direcionado para esta extensão. Ou seja, você é direcionado para cá quando digita uma opção
 
que não existe, segundo o que foi configurado.
 
same => n,Play(beep)
 
same => n,GoTo(s,3)
 
exten => t,1,NoOp(Tempo esgotado)
 
same => n,Goto(atendentes,s,1)
 
same => n,Hangup()
 
</font>
 
'''Como ficou a URA do projeto:''' <br/>
 
Será disponibilizado, em seguida, os arquivos de configuração do Projeto Integrador. <br/>
 
# '''Menu Principal- opções''': <br/>
 
## Setores; <br/>
 
## Serviços; <br/>
 
## Atendentes; <br/>
 
## Informações sobre a empresa; <br/>
 
## Repetir; <br/>
 
# '''Menu Setores – opções''': <br/>
 
## Financeiro; <br/>
 
## Desenvolvimento; <br/>
 
## Relacionamento com o cliente; <br/>
 
## Marketing; <br/>
 
## Suporte; <br/>
 
## Repetir; <br/>
 
## Voltar ao menu anterior; <br/>
 
# Menu Serviços – opções: <br/>
 
## Conferência; <br/>
 
## Teste de áudio; <br/>
 
## Repetir; <br/>
 
## Voltar ao menu anterior; <br/>
 
# '''Menu Conferência – opções''': <br/>
 
## Conferência fechada; <br/>
 
## Conferência aberta; <br/>
 
## Repetir; <br/>
 
## Voltar ao menu anterior; <br/>
 
# '''Menu Teste – opções''': <br/>
 
## Músicas de jogos; <br/>
 
## Rock; <br/>
 
## Sertanejo; <br/>
 
## Pop; <br/>
 
## Pagode; <br/>
 
## Voltar ao menu anterior; <br/><br/>
 
== DETECTANDO ERROS: ==
 
<p align="justify" > Pode acontecer de você digitar algo errado nos arquivos de configuração. Com isso, pode ocorrer problemas no Asterisk por não saber interpretar a informação, ou seja, algumas funções podem não funcionar. Se tiver algo incorreto, na hora de executar a função, o Asterisk derrruba a ligação. Isso também pode ocorrer se estiver faltando um arquivo de áudio que o Asterisk solicita
 
quando está operando uma função. <br/>
 
Um modo de acompanhar os processos da central é utilizar o seguinte comando no console do Asterisk: '''core set verbose 99''' <br/>
 
Esse comando possibilita o monitoramento da central, mostrando os arquivos que ela executa, podendo também averiguar o que cada ramal está fazendo, etc. Abaixo há uma imagem de um erro que pode ocorrer e, por meio do comando acima, você pode fazer o diagnóstico e, também,
 
solucionar o problema. </p><br/>
 
<center> IMAGEM 1- Detecção de erros no Asterisk </center>
 
<center> [[Arquivo:Error1.png|900px]] </center>
 
<br/>
 
<p align="justify" > A parte demarcada por um retângulo, mostra a detecção de um erro no Asterisk. As duas linhas finais, onde aparece “warning”, indicam que o Asterisk não encontrou um arquivo que era necessário para a aplicação executada. Neste caso, o arquivo é o “pbx-transfer”, que é utilizado na transferência de chamadas. Esse erro pode ter duas causas: </p>
 
<p align="justify" > 1º) '''O arquivo não existe''': para averiguar se, realmente, não existe esse arquivo, basta ir ao “/usr/share/asterisk/sounds/en_US_f_Allison” e procurar pelo arquivo. Caso não tenha, você terá que fazer esse áudio, mas lembre-se de executar o comando abaixo para garantir que não ocorrerá a segunda opção também. No final deste trabalho, há uma lista dos arquivos de áudio do Asterisk, informando o que cada áudio reproduz. <br/>
 
2º) '''Permissão da pasta''': Se você encontrou o arquivo no local mostrado acima, então pode ser que o Asterisk não tenha permissão para executar o áudio. Para resolver isso, vamos voltar para “/usr/share/asterisk/sounds/” e digitaremos o seguinte comando: '''chmod -R 755 en_US_f_Allison''' </p><br/>
 
 
 
== GRAVAÇÃO DE CHAMADAS: ==
 
Para quem quiser gravar as ligações dos ramais, será apresentado duas configurações: gravar todas as chamadas e gravar quando quiser. <br/>
 
<p align="justify" > * '''Gravar todas as chamadas''': Para isso, basta ir para o arquivo extensions.conf e colocar a seguinte configuração nos ramais que você quer que as chamadas sejam gravadas. </p>
 
<font size=3>
 
exten => 101,1,Set(DIRNAME=${STRFTIME(${EPOCH},,%Y-%m-%d)}) → pasta que terá como nome o ano-mês-dia da gravação do áudio.
 
exten => 101,n,Set(FILENAME=${DIRNAME}/${CDR(uniqueid)}-101_${CALLERID(num)}_${STRFTIME(${EPOCH},,%Y-%m-%d)}_${STRFTIME(${EPOCH},,
 
%H:%M:%S)}) → aqui teremos o nome do arquivo: '''${CDR(uniqueid)}''' estabelece um número de identificação que será único para
 
cada gravação; '''101''': ramal de destino; '''${CALLERID(num)}''': identifica o número do ramal de origem; '''${STRFTIME(${EPOCH},,'''
 
'''%Y-%m-%d)}''': insere a data no nome do arquivo; '''${STRFTIME(${EPOCH},,%H:%M:%S)}''': insere a hora no nome do arquivo.
 
exten => 101,n,Set(OUTPUT=/var/www/html/gravacoes/${FILENAME})
 
exten => 101,n,System(/bin/mkdir -p /var/www/html/gravacoes/${DIRNAME}) → cria um diretório com o nome do que foi estipulado
 
em DIRNAME, que neste caso é a data em que o áudio foi criado.
 
exten => 101,n,MixMonitor(/var/www/html/gravacoes/${FILENAME}.wav,ba) → '''MixMonitor''': Grava áudios. Entre parênteses colocamos
 
o local onde queremos que o arquivo seja salvo e em qual formato que será gravado. '''b''': adiciona no final do arquivo a gravação
 
ao invés de sobrescrever o áudio . '''a''': grava o áudio depois da chamada ser atendida.
 
exten => 101,n,Dial(SIP/101,30,tT)
 
exten => 101,n,VoiceMail(101)
 
exten => 101,n,Hangup()
 
</font>
 
<p align="justify" > Como vemos acima, as gravações ficarão no “/var/www/html/gravacoes/” em uma pasta que tem como nome a data de criação do áudio. Ex: 2016-03-05, dentro dessa pasta há os áudios do dia 3 de março de 2016.<br/>
 
* '''Gravação quando quiser''': Nesse tipo de gravação usaremos dois arquivos de configuração do Asterisk: extensions.conf e features.conf. No features.conf estabeleceremos os dígitos que indicarão à central que você quer gravar a sua ligação. </p>
 
Features.conf: <br/>
 
<font size=3>
 
[applicationmap] → nesse contexto que se define a variável do canal DYNAMIC_FEATURES que aparecerá no extensions.conf.
 
;
 
grava => *1,callee,Macro,grava-ini
 
</font>
 
Explicando: <br/>
 
<p align="justify" > '''grava''' => É o nome da sua configuração, ou seja, no extensions.conf você verá especificado no ramal “ DYNAMIC_FEATURES=grava”, então você é encaminhado para a opção “grava” que está no contexto “ applicationmap”. <br/>
 
'''*1''': Dígitos que indicam que você quer gravar a chamada. <br/>
 
'''Callee''': Canal chamado pelo Dial, então somente o destino pode fazer gravações. Outras opções seriam: '''Both''': Tanto o chamador quanto o chamado podem gravar as chamadas. '''Caller''': Apenas o originador da chamada pode gravar. <br/>
 
'''Macro''': Quando você digitar “ *1 ” será enviado para uma Macro do extensions.conf. <br/>
 
'''Grava-ini''': Nome da Macro. </p>
 
Agora vamos para extensions.conf: <br/>
 
<font size=3>
 
exten => 101,1,Set(DYNAMIC_FEATURES=grava) → Set: aplicação que te encaminha para uma configuração presente em outro arquivo.
 
Lembra da configuração do features.conf? Certifique-se de que o nome esteja igual nos dois arquivos.
 
exten => 101,n,Dial(SIP/101,30,tTwW) → '''w''': habilita a gravação de chamada para o lado de destino. '''W''': habilita a gravação
 
de chamada para o lado originador.
 
exten => 101,n,VoiceMail(101)
 
exten => 101,n,Hangup()
 
[macro-grava-ini] → Contexto Macro. Na configuração do features.conf é estipulado que quando o ramal de destino discar “ *1 ”
 
durante a ligação, a central faça a gravação da chamada. A configuração de como será gravado essa chamada está presente nesse contexto.
 
exten => s,1,GotoIf($[ "${ARQGRAVA}" != "" ]?stoprec)
 
exten => s,n,Set(GRAVANDO=1)
 
exten => s,n,Playback(startmonitor)
 
exten => s,n,Set(ARQGRAVA=${CDR(uniqueid)}) → O nome do áudio gravado terá um número de identificação único.
 
exten => s,n,MixMonitor(${ARQGRAVA}.wav,ba)
 
exten => s,n,MacroExit()
 
exten => s,n(stoprec),StopMonitor() → Essa parte mostra que você pode parar a gravação, basta digitar “*1” novamente.
 
exten => s,n,Set(ARQGRAVA=)
 
exten => s,n,Playback(stopmonitor)
 
exten => s,n,MacroExit()
 
</font>
 
<p align="justify" > Essa configuração te permite parar e voltar a gravar quantas vezes você quiser, porém grava em áudios diferentes. Você disca “*1” durante uma ligação, ativa a gravação de chamadas. Quando digitar novamente “*1” a gravação será interrompida, mas se você digitar “*1” de novo, volta a gravar. <br/>
 
Neste caso, as gravações estarão em “/var/spool/asterisk/monitor/”. Colocamos essas gravações em nosso site, em um local que precisa de autenticação para poder acessar o conteúdo. Então se eu digitar no navegador “www.merkki.com.br/gravacoes”, aparecerá uma janela pedindo usuário e senha. Mostrarei, passo a passo, como fizemos isso: <br/>
 
Primeiro temos que ter um servidor web (apache2) e um servidor DNS (bind9) configurados. Não mostrarei como fazer isso, pois não é o foco deste trabalho. Tendo eles instalados, vamos para o arquivo “000-default.conf” que se encontra em “/etc/apache2/sites-enable/” e colocaremos, no final, o conteúdo abaixo: <br/>
 

Edição atual tal como às 23h58min de 27 de março de 2016