BINA EM COMPUTADOR


COMO FUNCIONA


O sinal de bina em uma linha telefonica nada mais é do que dados binários enviados da operadora telefonica para a linha local, a BINAGEM só funciona em telefones que tem linhas digitais, os testes que fiz obtive os resultados esperados usando a prestadora TELEMAR e sinal de bina DTMF, se sua prestadora usa algum outro tipo de sinal diferente tem que se fazer os testes, eu usei a TELEMAR, claro, por ser a única que atende minha cidade que fica no interior de minas, muito pequena por sinal.

Quando você abre o MODEM (Pensando do ponto de vista da programação) está simplesmente com um canal para envio e recebimento de dados, isto sempre foi assim desde os principios da informática, todo equipamento que vc tem acesso, vc precisa apenas de um canal para envio e recebimento de informação, com o MODEM não seria diferente. O problema é que, vc só consegue manter este canal aberto se conseguir fazer ou receber uma chamada e fazer uma conexão bem sucedida, correto?

NÃO, ERRADO...

Se você for analisar, como faria então para receber o número telefônico que vem via linha telefonica até sua casa antes mesmo da chamada ser concluída?

Ai entra a questão de que maioria dos modens mais novos (Acho que acima de V80) podem trabalhar no modo chamado de NULL MODEM ou MODEM NULO, ou seja, vc pode abrir o canal de comunicação com o MODEM e manter ele aberto mesmo sem receber ou fazer uma ligação. Nunca testei, mas pela logica, vc pode ter um modem ligado diretamente a outro modem em outro computador captando estes mesmos dados mesmo sem ter uma chamada em curso, como se fosse uma placa de rede, isso to falando de teoria, nunca testei.

Então o primeiro ponto do mistério foi solucionado.

COMO FAZER O MODEM FUNCIONA NULO?

Bom, os modens, como sabemos respondem a comandos, podemos imaginar como se fosse um linha de comando dos DOS, claro, os comandos são próprios de um padrão que é conhecido por padrão "AT", logo abaixo indico um tutorial que criei ensinando como usar a IOLIB e os testes foram feitos com base em alguns destes comandos, é uma literatura indispensável, apesar dos diversos erros de "purtuguês" que prometo num futuro consertar. Continuando, logo, para ativar o modem nulo, também conhecido por CLASSE 80 temos que enviar um determinado comando para o modem, cada modem pode ter este comando de uma forma diferente, para isto criei 4 combinações destes comandos que funcionaram em todos os modem' s que eu testei.

Sabemos que quando enviamos um comando para o modem ele nos retorna [ERROR] quando houver algum erro ou [OK] quando o comando foi aceito com sucesso, com base nisto, eu envio os comandos um por um até que o modem possa aceitar um destes como abaixo. Para receber as respostas do momdem como string, o modo X3 deve estar ativado, veja na linha de ativação do modem que ele está lá.

Código:

outchr("AT &C0 V1 S40=2 S41=1 X3 #CLS=8"+chr(13))
? "Ativando Classe 8/80..."
// Verificação dos tipos mais comuns de comandos para ativação da
// Classe 8/80
if !resposta()
   outbufclr()
   inbufclr()
   outchr("AT &C0 V1 S40=2 S41=1 X3 +FCLASS=8"+chr(13))
   if !resposta()
    outbufclr()
   inbufclr()
     outchr("AT &C0 V1 S40=2 S41=1 X3 #CLS=80"+chr(13))
     if !resposta()
         outbufclr()
         inbufclr()
         outchr("AT &C0 V1 S40=2 S41=1 X3 +FCLASS=80"+chr(13))
         if !resposta()
            return .f.
         end if
      end if
   end if
end if

Com isto temos o modem já ativado com padrão CLASSE 80, como o modem vai continuar aberto sem que caia o canal I/O com o PC, podemos na logica, captar qualquer coisa que chegue pela linha telefônica.

Porem ai vem outro problema, a linha telefonica trabalha com 2 tipos de voltagens, uma para o telefone em modo de espera e outra voltagem para CHAMADA EM CURSO. Não tenho certeza dos valores usados, faz muito tempo que me passaram isso e acho que não são tão importantes aqui, logo, então, apesar do modem estar aberto e em estado nulo, ele não vai captar nenhum pulso da linha telefônica pois ela vai estar na mesma voltagem em que o modem opera na transmissão de dados. Logo deveriamos então de alguma forma, regular esta tensão de entrada para que sempre seja igual a tensão obtida quando uma chamada estiver em curso, para isto é usado um resistor muito barato que pode ser achado em qualquer lugar, até em minha cidade no interior de minas tem pra vender.

Para quem não sabe para o que serve um resistor e tiver interessado em aprender mais pode usar este link:

http://pt.wikipedia.org/wiki/Resistor

Assim, fiz os teste com o resistor 3k3 5% 5 watts, segundo a experiência de um tio meu, que me ajudou muito neste caso. Com este resistor obtive um resultado um tanto inesperado e creio que os amigos obterão o mesmo, obviamente, quando digitamos algo no telefone, tudo é enviado bináriamente para a prestadora telefônica, com este resistor, consegui captar todas as teclas que são digitadas no aparelho telefonico local, ou mesmo da extensão, isto é outro ponto importante, faça uma extensão para colocar no computador com este resistor, de outra forma seu telefone vai parar de funcionar como se a linha tivesse em uma ligação, pois com o resistor você coloca a voltagem num nível obtido em "UMA CHAMADA EM CURSO", o teste que fiz logo em sequência foi o que já deu certo, com um Resistor 3k9 5 Watts 5%, no caso deste resistor esquentar muito, pode usar um 10%, um amigo disse que testou com um destes e deu certo, porém ele não esquentou tanto quando o de 5%, porém isto não dá defeito, o custo de um resistor deste é apenas 1 real na minha cidade, mas você pode obter um facilmente em uma TV ou Rádio, só não deixem suas mães sem assistir a novela.

Assim, este resistor deve ser colocado em uma das pernas da linha telefonica, qualquer uma, ele vai fazer uma especie de bloqueio e para o computador a voltagem vai estar reduzida a uma voltagem identica a obtida durante uma CHAMADA EM CURSO, assim o modem aberto e com a classe 80 ativada, vai conseguir obter tudo que chegar pela linha telefonica.

COMO NÃO PODERIA SER DIFERENTE TEMOS NESTE PONTO MAIS UM PROBLEMA

Bom, com o modem aberto, o resistor na linha, você pode criar um pequeno programa para receber os dados do modem, eu usei no exemplo que postarei abaixo usando a IOLIB, é a melhor lib para comunicação serial disponível , por causa da grande praticidade de uso, apesar de ser para DOS e para modo real (Não funciona em modo protegido, para isto use a CTCOM), voltando ao assunto, você verá que receberá o número telefônico com um lixo no meio tipo

#1#1#1#7#7#8#8#9#9#0#0

Este lixo pode variar, não achei um padrão nem logica para o mesmo, logo, você poderá ver no exemplo que é capturado do modem apenas caracteres NUMERICOS que são os caracteres que nos interessa, assim o numero acima ficaria assim:

11177889900

O primeiro dígito é o tipo de chamada, na época que fiz as rotinas a TELEMAR me passou uma tabela dos tipos de chamadas, mas não estava operacionalmente correta e até hoje não está, então é um dado irrelevante que não postarei aqui, só sei que se o primeiro digito for 1 me parece que é chamada local, 2 para celular o restante só testando mesmo para saber.

Assim o telefone acima seria:
1 (11) 77889900

Ou seja 1 representando uma chamada local do DDD 11 do numero 7788-9900

A string obtida pode ter diversos tamanhos, dependendo de região, pais, etc...

É um teste interessante, vale você manter sempre no seu programa o campo telefone cadastrado sem mascaras, ai pode usar a rotina para abrir diretamente o cadastro dos clientes que estão chamando.

Bom amigos, a tão misteriosa rotina de bina é apenas isto

O esquema seria basicamente este

Linha:

 |--|------------------------------------|-\--------------|---------|
 |  |Linha telefônica   --------           |              \OPERADORA/
 |PC|-------------------|3k9 5W|---------|-/--------------|---------|
_|__|_                  --------         ^
                                         Aparelho telefônico
                                         Antes do resistor

 

Rotina de BINA (CODIGO FONTE)

Código:

/*
Rotina para sistemas clipper trabalharem como Bina Por Wagner Nunes da Silva
Acompanhe documentação em LEIAME.TXT

$ Aqui você verá como identificar números telefônicos e formatá-los
$ de acordo com a necessidade de seu sistema.

A rotina TELEFONE retorna o TIPO de ligação o telefone sem formatação
Abaixo dela neste PRG tem uma pequena rotina que formata alguns tipos.

A rotina DIGITO verifica qual digito foi digitado ou recebido pela linha.

Vagucs Home Page
www.vagucs.com.br
E-mail: vagucs@bol.com.br
vagucs@vagucs.com.br

Programa de teste criado por Wagner Nunes da Silva
Rua Dom Bosco, 23
Ipanema - Minas Gerais, Cep: 36.950-000
Tel/Fax: (0xx33) 3314-1578 / 3314-2242 / 8412-1570
*/

#include "iolib.ch"
public DDD_local:="33",a_tipos,a_segundos:=5
/*
DDD_local - > Para números telefônicos de mesmo DDD
A_TIPOS - > Tipos de ligação de acordo com a Telemar
A_SEGUNDOS - > Segundos que o sistema deve esperar resposta do Modem
*/
a_tipos={{"1","Local "},;
         {"2","DDD "},;
         {"3","Celular "},;
         {"4","DDI "}}

if !init_port(COM4,BPS57600,EIGHT_DATA_BITS,NO_PARITY,;
              ONE_STOP_BIT,IRQ3,8192)
   smsg("A porta não pode ser iniciada...")
   sair()
end if
clear
set color to gr+/b
@ 24,0 say repl(" ",80)
@ 0,0 say repl(" ",80)
centra(24,"www.vagucs.hpg.com.br - E-mail: vagucs@bol.com.br")
centra(0,"Vagucs On-Line - Teste de Bina com o Clipper")
set color to w/n
? "Aguarde enquanto o modem é iniciado..."
if !inicia_bina()
   smsg("Algum erro ocorreu na iniciação dos comandos de Bina...")
   sair()
end if
set color to gr+/b
mak(5,55,8,72)
@ 6,56 say "Aguardando"
inkey(2)
outbufclr()
inbufclr()
tecla=0
do while tecla#27
   tecla=inkey()
   if inbufsize()>0
      tel=telefone()
      formatado=""
      tel=alltrim(tel)
      if !empty(tel)
         tipo=left(tel,1)
         @ 6,56 say "Indefinido"
         for i=1 to len(a_tipos)
            if a_tipos[i][1]=tipo
               @ 6,56 say a_tipos[i][2]
            end if
         next
         // Formatação dos tipos mais comuns de números
         if len(tel)=8 // AT1234567C
            formatado="("+DDD_local+") "+substr(tel,2,3)+"-"+substr(tel,5,4)
         elseif len(tel)=9 // AT12345678C
            formatado="("+DDD_local+") "+substr(tel,2,4)+"-"+substr(tel,6,4)
         elseif len(tel)=10 // AT123456789C
            formatado="("+substr(tel,2,2)+") "+substr(tel,4,3)+"-"+substr(tel,7,4)
         elseif len(tel)=11 // AT1234567890C
            formatado="("+substr(tel,2,2)+") "+substr(tel,4,4)+"-"+substr(tel,8,4)
         else
            formatado=tel
         end if
         @ 7,56 say formatado
      end if
   end if
enddo
sair()

function inicia_bina
? "Iniciando modem..."
outbufclr()
inbufclr()
outchr("ATZ"+chr(13))
if !resposta()
   return .f.
end if
outbufclr()
inbufclr()
outchr("AT&F"+chr(13))
? "Restaurando configuração..."
if !resposta()
   return .f.
end if
outbufclr()
inbufclr()
outchr("AT &C0 V1 S40=2 S41=1 X3 #CLS=8"+chr(13))
? "Ativando Classe 8/80..."
// Verificação dos tipos mais comuns de comandos para ativação da
// Classe 8/80
if !resposta()
   outbufclr()
   inbufclr()
   outchr("AT &C0 V1 S40=2 S41=1 X3 +FCLASS=8"+chr(13))
   if !resposta()
      outbufclr()
      inbufclr()
      outchr("AT &C0 V1 S40=2 S41=1 X3 #CLS=80"+chr(13))
      if !resposta()
         outbufclr()
         inbufclr()
         outchr("AT &C0 V1 S40=2 S41=1 X3 +FCLASS=80"+chr(13))
         if !resposta()
            return .f.
         end if
      end if
   end if
end if
outbufclr()
inbufclr()
outchr("ATDT000"+chr(13))
? "Ativando..."
return .t.

function resposta
local entra,string,wag
entra=time()
string=""
do while val(substr(elaptime(entra,time()),7,2))<a_segundos .and. inkey()#27
   if inbufsize()>0
      wag=inchr(1)
      if !wag=NIL
         string+=wag
         if "OK"$string
            return .t.
         end if
         if
"ERROR"$string
            return .f.

         end if
      end if
   end if
enddo
return .f.

procedure telefone
local entra,string,wag
entra=time()
string=""
do while val(substr(elaptime(entra,time()),7,2))<a_segundos .and. inkey()#27
   if inbufsize()>0
      wag=inchr(1)
      if wag="C"
         return string
      end if
      if !wag=NIL
         if wag$"0123456789"
            string+=wag
         end if
      end if
   end if
enddo
return string

function smsg
local mt,col,row
parameters texto
save screen to mt
col=col()
row=row()
oldc=setcolor()
set color to n/bg
mak(9,6,15,74)
centra(12,texto)
tone(1800,1)
tone(1700,4)
inkey(0)
clear typeahead
keyboard chr(0)+chr(0)
set color to &oldc
restore screen from mt
@ row,col say ""

function mak
local i, resbv, resbh, reh, rev
parameters reli,reci,relf,recf
resbh=savescreen(relf+1,reci+2,relf+1,recf+2)
resbv=savescreen(reli+1,recf+1,relf,recf+2)
reh=(recf-reci+1)*2
rev=(relf-reli)*4
for i=2 to max(reh,rev) step 2
   resbh=iif(reh>=i,stuff(resbh,i,1,chr(4)),resbh)
   resbv=iif(rev>=i,stuff(resbv,i,1,chr(4)),resbv)
next
restscreen(relf+1,reci+2,relf+1,recf+2,resbh)
restscreen(reli+1,recf+1,relf,recf+2,resbv)
@ reli,reci,relf,recf box '+-+¦+-+¦ '

function centra
parameters linha,texto
@ linha,(80-len(texto))/2 say texto

function sair
outchr("ATH0"+chr(13))
unint_port()
set color to w/n,,n/n
clear
? "[ Bina com clipper ]"
?
? "Vagucs Home Page"
? "www.vagucs.com.br"
? "E-mail: vagucs@bol.com.br"
? " vagucs@vagucs.com.br"
?
? "Programa de teste criado por Wagner Nunes da Silva"
? "Rua Dom Bosco, 23"
? "Ipanema - Minas Gerais, Cep: 36.950-000"
? "Tel/Fax: (0xx33) 3314-1578 / 3314-2242 / 8412-1570"
?
quit

function digito
local entra,string,in
entra=time()
string=""
do while val(substr(elaptime(entra,time()),7,2))<a_segundos .and. inkey()#27
   if inbufsize()>0
      in=inchr(1)
      if !in=NIL
         if in$"0123456789"
            return in
         end if
      end if
   end if
enddo
return ""

Para compilar o exemplo faça apenas:

Código:

clipper bina
rtlink fi bina lib iolib


Repare que é um exemplo bem simples que abre o modem e espera o número exibindo ele na tela.


PROBLEMAS COM MODEM

Por favor, não entre em contato que não irei dar suporte para o caso do seu modem não funcionar em DOS, se você garantir que ele funciona, ai pode ser que ele precise de uma string diferentes das que tenho para ativar classe 80, ai é ler o manual do modem ou entrar em contato com o fabricante.


Modem do tipo WINMODEM' S dificilmente terão suporte para DOS.

Modem do tipo HSP geralmente funcionam para DOS na porta COM4 independente da porta que estiverem instalados para o Windows .

Modem EXTERNOS são os melhores pois tem que ser ligados a uma serial física, isso quando não são USB´s.

Por favor, tente você mesmo instalar seu modem, se ele não funcionar em DOS tente comprar uma placa PCI ou um modem externo, eu mesmo comprei um modem externo USB ROBOTICs no mercado livre por meros 30 reais, tá funcionando até hoje apesar de não usar mais.

Portar estas rotinas para xHarbour ou qualquer linguagem é coisa simples, podem funcionar em Windows ou Linux. Se alguém fizer, visto que isto se torna hoje uma espécie de dominio público, peço que contribuam com o feito para com os amigos, pois você mesmo saberá no futuro que você apenas implementou a idéia tornando ela extensiva, é contribuindo que faremos isto crescer.


Voltar