Asterisk - Monitorando ligações gravadas através de página em PHP

Neste artigo mostrarei como monitorar ligações gravadas pelo Asterisk através de uma página em PHP. Além de escutar as gravações, você poderá filtrá-las e exportar os registros para uma planilha.

[ Hits: 9.713 ]

Por: Hudson Moreira Guimaraes dos Santos em 03/09/2016


O que precisamos



Para que tudo funcione, é necessário ter um servidor Asterisk funcionando. Além disso, vamos precisar:
  • Um banco de dados MySQL;
  • Um servidor Apache;
  • Alterar o nome dos arquivos de áudio salvos pelo Asterisk;
  • Criar um Script que alimente o banco de dados.

Não mostrarei como configurar nenhum servidor, somente instalaremos o MonitorAsterisk e modificar algumas configurações para que o mesmo funcione.

Vamos começar clonando o MonitorAsterisk no seu servidor Apache:

git clone https://github.com/hudymoreira/MonitorAsterisk/

Edite o arquivo DbHelper.php para conficurar o acesso ao banco de dados MySQL:

vi ~/MonitorAsterisk/app/DbHelper.php

Na string de conexão, altere para que funcione com o seu banco de dados e usuário.

$this->con = new PDO("mysql:host=localhost;dbname=SeuBancoDeDados", "usuario", "senha");

Criando Tabelas

Criaremos agora duas tabelas no seu banco de dados, que serão alimentadas pelo script que é consumado pelo PHP:

Tabela "Ligacoes"  contem todos os dados pertinentes a cada ligação, incluindo o nome do arquivo de áudio, e a duração de cada um.

CREATE TABLE `Ligacoes` (
    `id_ligacao` INT(11) NOT NULL AUTO_INCREMENT,
    `ramal` INT(11) NULL DEFAULT NULL,
    `data_ligacao` DATETIME NULL DEFAULT NULL,
    `arquivo` VARCHAR(254) NULL DEFAULT NULL,
    `numero` VARCHAR(20) NULL DEFAULT NULL,
    `duracao` DOUBLE NULL DEFAULT NULL,
    `bk` BIT(1) NULL DEFAULT NULL,
    PRIMARY KEY (`id_ligacao`)
)

Tabela  "Usuario" contem somente os usuários que você deseja associar a cada ligação:

CREATE TABLE `Usuario` (
    `id_usuario` INT(11) NOT NULL AUTO_INCREMENT,
    `nome` VARCHAR(254) NULL DEFAULT NULL,
    `ramal` INT(11) NULL DEFAULT NULL,
    PRIMARY KEY (`id_usuario`)
)

Asterisk, string de salvamento e link simbólico para o PHP (Apache)

Agora, vamos ligar com a forma que o áudio é salvo pelo Asterisk.

adiante, iremos montar um script que depende da nomenclatura do arquivo de áudio para alimentar o banco de dados. No extensions.conf do seu Asterisk, altere suas configurações, para se adequar a algo parecido com isso:

exten => _XX.,1,Set(MONITOR_FILENAME=${STRFTIME(${EPOCH},,%Y-%m-%d_%H.%M.%S)}_${CDR(src)}_${CDR(dst)}_${CDR(billsec)})
exten => _XX.,n,Mixmonitor(${MONITOR_FILENAME}.wav)
exten => _XX.,n,Dial(SIP/${EXTEN}@tronco-que-centraliza-todas-ligacoes,50)

O arquivo gerado terá o seguinte formato:

[data]_[hora]_[ramal]_[numro do telefone].wav

O script usará o delimitador "_" para extrair as informações que precisa do nome do arquivo.

E, por fim, vamos criar um link simbólico na pasta raiz da nossa página MonitorAsterisk, apontando o diretório onde se encontram as ligações. Ex.:

cd /var/www/html/MonitorAsterisk
sudo ln -s /var/spool/asterisk/monitor/ audio

Chamei o link de 'audio', porém você pode mudar, desde que você edite os arquivos PHP correspondentes a essa alteração, onde fica a instrução que carrega os arquivos na página.

No arquivo /MonitorAsterisk/views/ligacoes.tpl.php, você pode mudar o "src" para o que quiser, desde que o link seja o mesmo.

<source src="audio/<?php echo $ligacao->getArquivo();?>" type="audio/wav">

Script que alimenta as tabelas

O script a seguir varre o diretório /var/spool/asterisk/monitor/ e testa cada arquivo, divide os delimitadores no nome e preenche as variáveis. E com o 'sox', extrai a duração de cada áudio em segundos. Com as variáveis preenchidas, ele verifica se a ligação não foi registrada. Caso não, ele grava a informação no banco.

#!/bin/bash
local="/var/spool/asterisk/monitor"
cd $local
for i in `ls`; do
    ramal=`cut  -d_ -f 3 <<< $i`
     data=`cut  -d_ -f 1 <<< $i`
     hora=`cut  -d_ -f 2 <<< $i`
   numero=`cut  -d_ -f 4 <<< $i`
    dataL="$data $(sed "s/./:/g" <<< $hora)"
  arquivo=$i
    query=`echo  "select ramal from Ligacoes where arquivo = '$arquivo'  " | mysql MeuBandoDeDados -u usuario -pSenha`
    if [ ${#query} -lt 4 ];then
        sox $i -n stat 2>/tmp/Mtmp.txt
        tmp=`cat /tmp/Mtmp.txt | grep Len`
        duracao=`echo $tmp | cut -d: -f2`
        rm /tmp/Mtmp.txt
    echo "insert into Ligacoes (ramal,data_ligacao,arquivo,numero,duracao,bk) values ($ramal,'$dataL','$arquivo','$numero',$duracao,0)"  | mysql MLigacao -u root -pmaster
    fi
done

Neste ponto, você deve criar por conta própria uma melhor forma de automatizar esse script.

Utilização - filtro

Se tudo estiver ok, você poderá, através do seu navegador, acessar a página de monitoramento. Óbvio que se não tiver ligações, ou caso tenha e o Script não for rodado nenhuma vez, não terá nada para ver.

Caso já tenha massa crítica para testar, você pode filtrar as ligações que deseje escutar. Seguem alguns screenshots:
Linux: Monitorar ligações gravadas pelo Asterisk através de uma pagina em PHP. Linux: Monitorar ligações gravadas pelo Asterisk através de uma pagina em PHP.

Utilização - Ligações

Nessa lista, temos o áudio a ser escutado e os detalhes da ligação:
Linux: Monitorar ligações gravadas pelo Asterisk através de uma pagina em PHP.

Utilização - Exportar para o Excel

Você pode exportar o resultado das pesquisa para o Excel, caso precise:
Linux: Monitorar ligações gravadas pelo Asterisk através de uma pagina em PHP. Linux: Monitorar ligações gravadas pelo Asterisk através de uma pagina em PHP.

Utilização - Usuário

Caso queira associar o nome de usuário à um ramal ,você pode fazer isso por aqui.
Linux: Asterisk - Monitorando ligações gravadas através de página em PHP
Bom é isso.
Obrigado...

   

Páginas do artigo
   1. O que precisamos
Outros artigos deste autor

Controle do PS3 no Android

Leitura recomendada

Consultando servidores SNMP com PHP

Montando um velocímetro de internet com PHP e GD

Script PHP/MySQL - Controle de Máquinas via MAC Address no IPtables

Verificando integridade de servidores POP com PHP/sockets

Criando um painel de rede em PHP

  
Comentários
[1] Comentário enviado por VitorMazuco em 12/09/2016 - 14:47h

ola amigo, ele está dando erro ao executar o scrpit.

root@asterisk13:~# bash /sbin/mixmonitor.sh
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0)' at line 1


[2] Comentário enviado por hudyFX em 12/09/2016 - 23:48h

ola @VitorMazuco esta dando erro de sintax SQL no seu script, posta ele ai pra tentarmos encontrar o erro, ta dizendo "syntax to use near '0)' at line 1" o erro esta proximo a '0)' pode estar faltando uma virgula ou algo parecido

[3] Comentário enviado por thaaesk em 27/09/2016 - 16:25h

O meu script da o mesmo erro! :(

[4] Comentário enviado por thaaesk em 27/09/2016 - 16:38h

Se puder me ajudar @VitorMazuco.

O Banco está criado como sitou acima e o script que estou tentando executar é esse :

#!/bin/bash
local="/var/spool/asterisk/monitor"
cd $local
for i in `ls`; do
ramal=`cut -d_ -f 3 <<< $i`
data=`cut -d_ -f 1 <<< $i`
hora=`cut -d_ -f 2 <<< $i`
numero=`cut -d_ -f 4 <<< $i`
dataL="$data $(sed "s/./:/g" <<< $hora)"
arquivo=$i
query=`echo "select ramal from Ligacoes where arquivo = '$arquivo' " | mysql MLigacoes -u root -pXXX`
if [ ${#query} -lt 4 ];then
sox $i -n stat 2>/tmp/Mtmp.txt
tmp=`cat /tmp/Mtmp.txt | grep Len`
duracao=`echo $tmp | cut -d: -f2`
rm /tmp/Mtmp.txt
echo "insert into Ligacoes (ramal,data_ligacao,arquivo,numero,duracao,bk) values ($ramal,'$dataL','$arquivo','$numero',$duracao,0)" | mysql MLigacoes -uroot -pXXX
fi
done


OBS: Não preciso estar em um diretorio especifico pra que funcione né ?
Atenciosamente,


Thales Henrique

[5] Comentário enviado por hudyFX em 27/09/2016 - 17:32h

echo "insert into Ligacoes (ramal,data_ligacao,arquivo,numero,duracao,bk) values ($ramal,'$dataL','$arquivo','$numero',$duracao,0)" | mysql MLigacao -u root -pmaster
alinha acima é responsável por adicionar os dados no banco,
suponhamos que o meu banco se chame "VivaOLinuxDB" e meu usuario e senha seja respectivamente "hudy" e "senha123"
tente abrir o termina e inserir diretamente os dados na mão, somente para testar
$ echo "insert into Ligacoes (ramal,data_ligacao,arquivo,numero,duracao,bk) values (2001,'2016-09-27','arquivo.wav','01123232323',443.3,0)" | mysql VivaOLinuxDB -u hudy -psenha123
pode ser problemas comas as "aspas" nesse ponto vc tem que ajustar o script até acertar

[6] Comentário enviado por thaaesk em 28/09/2016 - 14:27h

@hudyFX

Rodou o script, porém não está mostrando duração e nem hora da chamada.
Se eu precisar "comparar" com uma informação de outro banco de dados, será que é possivel ?
Gostaria de colocar o nome do arquivo na frente das informações do banco CDR!

[7] Comentário enviado por hudyFX em 29/09/2016 - 17:58h


[6] Comentário enviado por thaaesk em 28/09/2016 - 14:27h

@hudyFX

Rodou o script, porém não está mostrando duração e nem hora da chamada.
Se eu precisar "comparar" com uma informação de outro banco de dados, será que é possivel ?
Gostaria de colocar o nome do arquivo na frente das informações do banco CDR!


verifique se o "sox" esta instalado corretamente, ele que verificar a duração do audio.
vá na pasta de arquivos de audio e teste um arquivo na mão mesmo.
$ sox 2016-07-18_14.46.36_6605_3589388_0.wav -n stat

vc tera uma saida parecida com isso

Samples read: 554240
Length (seconds): 69.280000
Scaled by: 2147483647.0
Maximum amplitude: 0.876465
Minimum amplitude: -0.822754
Midline amplitude: 0.026855
Mean norm: 0.074087
Mean amplitude: 0.000371
RMS amplitude: 0.137018
Maximum delta: 0.852783
Minimum delta: 0.000000
Mean delta: 0.030210
RMS delta: 0.063090
Rough frequency: 586
Volume adjustment: 1.141

e o script pega os dados com base no nome dos arquivos, verifica se no extensions.conf as string de salvamento do arquivo esteja como no procedimento mostrado acima.

[8] Comentário enviado por dimatrix em 17/11/2016 - 14:16h

Paz e bem!

O erro: root@asterisk13:~# bash /sbin/mixmonitor.sh
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0)' at line 1

É devido a falta de aspas simples nas variaveis, no meu corrigi deste jeito:

echo "insert into Ligacoes (ramal,data_ligacao,arquivo,numero,duracao,bk) values ('$ramal','$dataL','$arquivo','$numero','$duracao',0)" | mysql MeubancoDB -u root -pjMeuPassword

Espero ter ajudado!

[9] Comentário enviado por hudyFX em 17/11/2016 - 16:31h


[8] Comentário enviado por dimatrix em 17/11/2016 - 14:16h

Paz e bem!

O erro: root@asterisk13:~# bash /sbin/mixmonitor.sh
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0)' at line 1

É devido a falta de aspas simples nas variaveis, no meu corrigi deste jeito:

echo "insert into Ligacoes (ramal,data_ligacao,arquivo,numero,duracao,bk) values ('$ramal','$dataL','$arquivo','$numero','$duracao',0)" | mysql MeubancoDB -u root -pjMeuPassword

Espero ter ajudado!


Não coloquei aspas simples na variavel $duaracao e nem em $ramal por se tratar de números, porem pelo visto deu problema pra muita gente. Só que o engraçado é que comigo funciona numa boa sem aspas, procurarei saber o motivo.

[10] Comentário enviado por thaaesk em 14/12/2016 - 20:27h

Boa noite meu amigo.
Poderia me dar um suporte??

Só não consegui fazer o script funcionar mostrando a hora da gravação.
É como se o cut não estivesse funcionando no diretório. Dentro dele ( /var/spool/asterisk/monitor ) os arquivos estão todos em .wav, não consigo usar a função do cut nesses arquivos .wav..

[11] Comentário enviado por hudyFX em 14/12/2016 - 23:38h


[10] Comentário enviado por thaaesk em 14/12/2016 - 20:27h

Boa noite meu amigo.
Poderia me dar um suporte??

Só não consegui fazer o script funcionar mostrando a hora da gravação.
É como se o cut não estivesse funcionando no diretório. Dentro dele ( /var/spool/asterisk/monitor ) os arquivos estão todos em .wav, não consigo usar a função do cut nesses arquivos .wav..


o script considera o delimitador "_" (underline) que separa obtidas no nome do arquivo...
posta um nome do arquivo para ver se ele está salvando corretamente...

[12] Comentário enviado por hiperphone em 12/01/2018 - 16:54h

boa tarde! Testei gravando ligações wav49 mas o mesmo nao ler. Este script nao funcionaria para gravações wav49 ?

[13] Comentário enviado por hudyFX em 24/01/2018 - 10:35h


[12] Comentário enviado por hiperphone em 12/01/2018 - 16:54h

boa tarde! Testei gravando ligações wav49 mas o mesmo nao ler. Este script nao funcionaria para gravações wav49 ?


boa pergunta... nunca tentei... mas posso tentar... esse wav49 é melhor ???


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts