[AsteriskBrasil] RES: Sobre identificador de chamadas DTMF no X100P e clones

Ciro ciro em sntbsb.com.br
Terça Maio 9 12:25:03 BRT 2006


Pra te dar uma idéia...
Independente das opções possíveis, que vc vai ler dos amigos que
responderam...
Se vc quiser mesmo implementar, acho que vc pode usar o seguinte.

Um CI para decodificar o DTMF, e passá-lo para um microcontrolador.
Esse microcontrolador liga-se através de sua SERIAL, à serial do micro.
Pronto.. Agora vc pode criar um programa pra ler a serial, e fazer o que
quizer com os números.


Se vc quiser mais de uma linha a ser decodificada, vc pode modularizar,
pois se não me engano o número decodificado é passado com 4 bits, o que
usaria apenas 4 portas do microcontrolador.

Assim vc faria uma interface central, com o PIC e o software que roda
nele, e com a serial para ligar no asterisk.
E várias plaquinhas com o decodificador para cada linha que vc quiser.

É uma visão bem simplória, mas talvez uma opção melhor que usar a placa
de som.

Uma idéia seria criar uma plaquinha com um encaixe para se ligar à placa
de modem com uma solda direto na linha de entrada, e a saída para o PIC
padronizada, com um flatcable.

É isso aí... Mas acho pouco prático.

Ciro

-----Mensagem original-----
De: asteriskbrasil-bounces em listas.asteriskbrasil.org
[mailto:asteriskbrasil-bounces em listas.asteriskbrasil.org] Em nome de
Paulino Kenji Sato
Enviada em: terça-feira, 9 de maio de 2006 01:31
Para: A Comunidade Brasileira do PBX OpenSource
Assunto: [AsteriskBrasil] Sobre identificador de chamadas DTMF no X100P
e clones


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 _______________________________________________
LIsta de discussões AsteriskBrasil.org
AsteriskBrasil em listas.asteriskbrasil.org
http://listas.asteriskbrasil.org/mailman/listinfo/asteriskbrasil

_______________________________________________
Acesse o  wiki AsteriskBrasil.org: http://www.asteriskbrasil.org



-- 
No virus found in this incoming message.
Checked by AVG Free Edition.
Version: 7.1.392 / Virus Database: 268.5.5/334 - Release Date: 8/5/2006


-- 
No virus found in this outgoing message.
Checked by AVG Free Edition.
Version: 7.1.392 / Virus Database: 268.5.5/334 - Release Date: 8/5/2006
 



Mais detalhes sobre a lista de discussão AsteriskBrasil