Archive for Asterisk

Como criar uma pesquisa de satisfação – Asterisk

pesquisa

Uma pesquisa simples de ser feita com asterisk.

Vamos utilizar odbc, mysql, asterisk, queues.

Não irei abordar detalhes de como criar contextos, queues, etc. Somente resumidamente as configurações.

Seguem abaixo minhas confs:

/etc/asterisk/func_odbc.conf
[pesq_satisfacao]
dsn=asterisk
writesql=INSERT INTO asterisk.pesq_satisfacao (ID,Calldate,Origem,Destino,Nota1,Nota2,Nota3) VALUES (NULL , CURRENT_TIMESTAMP ,’${VAL1}’ ,’${VAL2}’,${VAL3},${VAL4},${VAL5});

/etc/asterisk/res_odbc.conf
[asterisk]
enabled => yes
dsn => asterisk-connector
pre-connect => yes
username => root
password => senha

/etc/odbc.ini
[asterisk-connector]
Description = MySQL connection to asterisk database
Driver = MySQL
Database = asterisk
Servername = localhost
UserName = root
Password = senha
Port = 3306
Option = 3

/etc/asterisk/extensions.conf
[pesquisa_satisfacao2]
exten => s,1,Queue(fila,cft,,,600)
same => n,Read(sol_atendida,pesquisa/primeirapergunta,1)
same => n,waitexten(1)
same => n,Read(nota,pesquisa/segundapergunta,1)
same => n,waitexten(1)
same => n,Read(atendida,pesquisa/ultimapergunta,1)
same => n,noop(${CDR(dstchannel)})
same => n,Set(ODBC_pesq_satisfacao()=${CALLERID(num)},${CDR(dstchannel)},${sol_atendida},${nota},${atendida})
same => n,System(echo ” ———– Pesquisa de Satisfacao ———– \n\n Horario Atendimento: ${STRFTIME(${EPOCH},,%d/%m/%Y as %H:%M:%S)} \n Origem: ${CALLERID(num)} \n Atendente: ${CDR(dstchannel)} :: 2307-Carlos | 2349-Cristiane | 2330-Priscila \n O problema foi solucionado? ${sol_atendida} :: (0 – Nao | 1 – Sim) \n Nota do atendimento: ${nota} :: (0 – Pessimo ate 5 – Excelente) \n Precisou mais de um contato? ${atendida} :: (0 – Nao | 1 – Sim) \n\n by IPBX \n\n ———– Pesquisa de Satisfacao ———–” | /bin/mail -s “Pesquisa de Satisfacao HelpDesk” -r origem@i-hunter.net destino@provedor.net)
same => n,playback(pesquisa/obrigado)
same => n,hangup()

Obs: O parâmetro cf envia automaticamente o cliente para a pesquisa quando o helpdesk realiza o hangup da chamada.
Alem de disponibilizar no banco de dados para criar uma aplicação posteriormente, nada impede enviarmos os resultados por email (como feito na linha system).

No mysql:
1 – Criar o database.
2 – Criar a tabela:

CREATE TABLE IF NOT EXISTS `pesq_satisfacao` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Calldate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`Origem` varchar(20) NOT NULL,
`Destino` varchar(20) NOT NULL,
`Nota1` int(11) NOT NULL,
`Nota2` int(11) DEFAULT NULL,
`Nota3` int(11) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;

Vejamos a imagem abaixo na qual ilustra as conexões para funcionamento da inserção de dados do dialplan no mysql.

Observamos que no asterisk precisamos configurar o func_odbc.conf e res_odbc.conf e no linux /etc/odbc.ini

ast2_1201

Dados inseridos no banco:
mysql> select * from pesq_satisfacao;
+—-+———————+————+———–+——-+——-+——-+
| ID | Calldate | Origem | Destino | Nota1 | Nota2 | Nota3 |
+—-+———————+————+———–+——-+——-+——-+
| 1 | 2014-08-19 17:12:47 | 3232893328 | 2198683214| 1 | 5 | 0 |
+—-+———————+————+———–+——-+——-+——-+
rows in set (0.00 sec)

Converter .mp3 para .wav e slinear sln para asterisk com sox e ffmpeg – Conversor

Script que converte .mp3 para .wav intepretado pelo asterisk.

Deve possuir instalado SOX e FFMPEG.

Para executar, copie este script para o diretorio que contem os arquivos .mp3.

vim converte.sh

#!/bin/bash
echo "** THIS SCRIPT REQUIRES FFMPEG AND SOX TO WORK!**"
for i in *.mp3; do
val=${i%.mp3}
echo "** Converting mp3 to wav files if they exist"
ffmpeg -i "$i" "$val.wav"
echo "** $i MP3 to WAV is complete"
done
echo "** THIS SCRIPT REQUIRES LAME AND SOX TO WORK!**"
for i in *.wav; do
val=${i%.wav}
echo "** Converting wav to wav files if they exist"
sox "$i" -t raw -r 8000 -c 1 "$val.sln"
echo "** $i MP3 to WAV is complete"
done

* Verifique se ao copiar e colar não ocasionou o problema de subsituição da aspas dupla por duas simples.

Após:
chmod +x converte.sh
./converte.sh

Analise de ECO com cancelador de eco ativo e antes de ativa-lo

Criar um diretório e realizar a gravação do áudio quando a chamada estiver no canal:
mkdir /usr/srv/gravacao
dahdi_monitor 65 -m -r streamrx65.raw -t streamtx65.raw -R streampreechorx65.raw -T streampreechotx65.raw

Onde – 65 eh a porta dahdi fxo

Após converter o áudio para .wav
sox -r 8000 –encoding signed-integer –endian little -b 16 -c 1 streamrx66.raw streamrx66.wav

Baixar o software audiocity e importar os quatro áudios e compara-los.

Veja uma comparação de áudio:
linha 69

linha porta 65

Reparar um banco em sqlite3 asterisk astdb

Ao tentar conectar no asterisk tenho a mensagem:
[root@ ~]# asterisk -r
Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)

Quando tendo acessar com asterisk -vvvvvvvvvvgc tenho a mensagem abaixo.

Erro deparado após um pique de energia:
[Mar 7 11:21:09] WARNING[2320]: db.c:135 init_stmt: Couldn’t prepare statement ‘CREATE TABLE IF NOT EXISTS astdb(key VARCHAR(256), value VARCHAR(256), PRIMARY KEY(key))': disk I/O error
[Mar 7 11:21:09] WARNING[2320]: db.c:210 db_create_astdb: Couldn’t create astdb table: disk I/O error

Solução:
Foi necessário reparar o bando de dados do asterisk utilizando

echo .dump | sqlite3 /var/lib/asterisk/astdb.sqlite3 > /var/lib/asterisk/astdb.sqlite3_DUMP

sqlite3 -init /var/lib/asterisk/astdb.sqlite3_DUMP /var/lib/asterisk/astdb.sqlite3_FIXED;

mv /var/lib/asterisk/astdb.sqlite3 /var/lib/asterisk/astdb.sqlite3_error

mv /var/lib/asterisk/astdb.sqlite3_FIXED /var/lib/asterisk/astdb.sqlite3

Exemplo de uma consulta na base antes do recebimento de uma chamada.

Exemplo de uma consulta na base antes do recebimento de uma chamada.
Aqui eu consulto se vem dos ddds 21,51,31 ou 11. Caso venha eu consulto na base se eh para eu aceitar ou não a chamada no 0800 dependendo da região.

[consulta]
exten => 667,1,NoOp(DDD do numero que estamos recebendo –> ${CALLERID(ANI):0:2})
same => n,noop(Numero que estamos recebendo –> ${CALLERID(ANI)})

same => n,GotoIf($[“${CALLERID(ANI):0:2}” = “11”]?verificabanco) ; SP
same => n,GotoIf($[“${CALLERID(ANI):0:2}” = “21”]?verificabanco) ; RJ
same => n,GotoIf($[“${CALLERID(ANI):0:2}” = “51”]?verificabanco) ; POA
same => n,GotoIf($[“${CALLERID(ANI):0:2}” = “31”]?verificabanco) ; BH
same => n,Noop( DDD ${CALLERID(ANI):0:2} aceito no 0800, nao consta na lista de excecoes)
same => n,Goto(call0800)

same => n(verificabanco),Noop(DDD possivelmente nao pode entrar no 0800, a verificar no banco de dados)
same => n,Noop(Consulta no banco de dados do prefixo –> ${CALLERID(ANI):0:6})
same => n,MYSQL(Connect connid localhost prefixo profit asterisk)
same => n,NoOp(connid = ${connid})
same => n,MYSQL(Query resultid ${connid} SELECT status FROM prefixos WHERE prefixo=”${CALLERID(ANI):0:6}”)
same => n,NoOp(resultid = ${resultid})
same => n,MYSQL(Fetch fetchid ${resultid} realizada)
same => n,NoOp(Variabili = ${fetchid},${realizada})
same => n,MYSQL(Clear ${resultid})
same => n,MYSQL(Disconnect ${connid})
same => n,noop(${realizada})
same => n,GotoIf($[“${realizada}” = “1”]?nocall:call0800)

same => n(nocall),Noop( Telefone ${CALLERID(ANI)} nao eh autorizado ligar no 0800 pois consta em uma das cidades atendidas pelo numero local da ihunter. Vamos verificar agora de qual localidade para tocar o audio em especifico.)
same => n,GotoIf($[“${CALLERID(ANI):0:2}” = “11”]?nocallSP)
same => n,GotoIf($[“${CALLERID(ANI):0:2}” = “21”]?nocallRJ)
same => n,GotoIf($[“${CALLERID(ANI):0:2}” = “51”]?nocallPOA)
same => n,GotoIf($[“${CALLERID(ANI):0:2}” = “31”]?nocallBH)
same => n,Goto(call0800)

same => n(nocallSP),Noop(playback dizendo o numero de Sao Paulo)
same => n,playback(numero_sao_paulo)
same => n,HangUP()
same => n(nocallRJ),Noop(playback dizendo o numero do Rio de Janeiro)
same => n,Playback(numero_rio_de_janeiro)
same => n,HangUP()
same => n(nocallPOA),Noop(playback dizendo o numero de Porto Alegre)
same => n,Playback(numero_porto_alegre)
same => n,HangUP()
same => n(nocallBH),Noop(playback dizendo o numero de Belo Horizonte)
same => n,playback(numero_belo_horizonte)
same => n,HangUP()

same => n(call0800),Noop(Verificando se o horario eh permitido)
same => n,GotoifTime(8:00-18:50|mon-fri|*|*?recebehelpdesk,s,1)
same => n,noop(Fora de horario de atendimento da ihunter!)
same => n,Playback(fora-horario)
same => n,Hangup()