[AsteriskBrasil] Sobre identificador de chamadas DTMF no X100P e clones
Paulino Kenji Sato
pksato em gmail.com
Terça Maio 9 01:31:19 BRT 2006
Alguem sabe como esta o suporte ao identificador de chamadas basendo
em tons DTMF?
Como o Brasileiro (BINA), que pelo que vi, e iqual ao Filandes ou
Sueco(Sweden), ou seja, antes do primeiro toque, inicando com A e
terminando com C.
Independente do status de como anda isso oficialmente, a um tempo
atraz sugeri uma 'gambiarra', que consistia em usar uma placa de som
para escutar a linha e um software para decodificar o DTMF.
Na epoca e ainda hoje, não tenho a indentificação de chama ativa na
linha da BrasilTelecom.
Só que, recentemente comprei um ATA Linksys PAP2, que gera CALLERID
em varios formatos, bellcore (FSK) e os em DTMF, resolvi testar na
prática a ideia, configurei o PAP2 para gerar o CALLID em DTMF
(Finland/Sweden).
Primeria coisa a fazer e interface com a linha telefonica, isso foi
facilmente conseguido usando um optoacloplador e mais alguns
componentes.
O esquema se encontra no link abaixo.
http://img204.imageshack.us/my.php?image=callerid0yb.png
Não sei se a impendância do circuito esta alto o suficiente para não
interferir no funcionamento normal do telefone.
A saida do circuito e ligado na entrade de microfone da placa de som,
essa entrada fornece uma tensão de polarização para o microfone de
eletreto, nem todas as placas de som tem esse sinal, caso a placa não
tenha, precisará ligar uma fonte de 5 a 9v (bateria) entre o pino 4 do
Optoacloplador eo Resistor R2 no ponto onde deveria estar ligado oa
plug.
O próximo passo e arranjar um software para fazer a decodificação do
DTMF, para isso usei o dtmfkit
http://www.sephail.net/projects/dtmfkit/
Fiz um patch nele para só mostrar o número identificado.
A identificação as vezes falha, pegando só uma parte de número.
Próximo passo a integrar isso de alguma forma ao Asterisk.
*** patch ***
--- dtmf_decode.c.orig 2006-05-09 00:59:09.000000000 -0300
+++ dtmf_decode.c 2006-05-09 01:03:14.000000000 -0300
@@ -240,9 +240,10 @@
int dtmf_decode_main(int fd, int sample_rate, int bits, int channels, int mode,
int pct, int reqtwo) {
- unsigned char *buffer, *gbuffer;
+ unsigned char *buffer, *gbuffer, *callid;
int bsize, ch, dch = ',', i, j, lch = ',', goertzel_n = -1,
goertzel_rate = -1, pflag;
- int rlen, val;
+ int rlen, val, it;
+ it=0;
/* Pre-compute goertzel constants based on best N for the sample rate */
for(i = 0; goertzel_N[i][RATE] != -1; i++) {
@@ -283,7 +284,14 @@
perror("malloc()");
return(ERR_MALLOC_FAILED);
}
-
+
+/* inicio */
+ if((callid = malloc(256)) == NULL) {
+ perror("malloc()");
+ return(ERR_MALLOC_FAILED);
+ }
+/* fim */
+
/* Process each read sample */
while((rlen = read(fd, buffer, bsize))) {
@@ -321,14 +329,28 @@
/* Check dupe rule */
if((lch == ch && (mode & MODE_PRINT_DUPES)) || lch != ch) {
-
+ /*
printf("%c", ch);
+ */
pflag = 1;
-
+/* inicio */
+ if (ch=='A') {
+ callid[0]=ch;
+ it=1;
+ } else {
+ if (ch=='C') {
+ callid[it]=ch;
+ it++;
+ callid[it]='\0';
+ printf("CALLERID:%s\n", callid);
+ } else {
+ callid[it]=ch;
+ it++;
+ }
+ }
+/* fim */
}
-
- }
-
+ }
}
/* Print newline (or not) if a character was printed */
@@ -345,13 +367,14 @@
}
dch = ch;
pflag = 0;
-
}
/* Free buffer memory */
free(buffer);
free(gbuffer);
-
+
+ free(callid);
+
return(0);
}
*** fim ***
--
Paulino Kenji Sato
http://www.nobel.com.br
Mais detalhes sobre a lista de discussão AsteriskBrasil