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 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 concluida?
Ai entra a questão de que maioria dos modens mais novos (Acho que acima de V80) podem trabalhar no molde 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 misterio 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.
Código: Selecionar todos
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
Porem ai vem outro problema, a linha telefonica trabalho 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 telefonica pois ela vai estar na mesma voltagem em que o modem capta como uma para transmissão de dados [/b](quero que o amigos entendam que eu posso estar falando abobrinha, tudo foi apenas uma experiencia "errante", não mecho com eletronica não é meu forte)[/b]. 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 experiencia 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 sequencia foi o que já deu certo, com um Resistor 3k9 5 Watts 5%, no caso deste resistor esquentar muito, pode usar um 10%, uma 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, kakakaka.
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 a IOLIB, é a melhor lib para comunicação serial disponivel pela grande praticidade que tem, 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 numero 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 digito é o tipo de chamada, na epoca que fiz as rotinas a TELEMAR me passou uma tabela dos tipos de chamadas, mas nenhum batia, então é um dados 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
Código: Selecionar todos
|--|------------------------------------|-\--------------|---------|
| |Linha telefônica -------- | \OPERADORA/
|PC|-------------------|3k9 5W|---------|-/--------------|---------|
_|__|_ -------- ^
Aparelho telefônico
Antes do resistorCódigo: Selecionar todos
/*
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 .or. "ERROR"$string
return .t.
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,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
if wag$"0123456789"
return wag
end if
end if
end if
enddo
return ""
Tutorial ensinando como usar todas as rotinas da IOLIB disponivel no meu site, juntamente com a IOLIB.
Para compilar o exemplo faça apenas:
Código: Selecionar todos
clipper bina
rtlink fi bina lib iolib
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 especie 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 ideia tornando ela extensiva, é contribuindo que faremos isto crescer.
É tudo... FELIZ NATAL para todos e que Deus nos abençoe sempre.



