*** Presente de natal **** Rotinas de Bina para Clipper

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

*** Presente de natal **** Rotinas de Bina para Clipper

Mensagem por vagucs »

Presenteando os amigos foristas (achei essa palavra bonita), estou postando tudo o que sei relativo as rotinas de bina para clipper que criei.


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
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 telefonica.

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 resistor
Rotina de BINA (CODIGO FONTE)

Có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
Repare que é um exemplo bem simples que abre a linha telefonica e espera o numero 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 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.
Sem mais
Wagner Nunes
www.vagucs.com.br
Stanis Luksys
Colaborador
Colaborador
Mensagens: 1329
Registrado em: 18 Jun 2005 03:04
Localização: São Paulo
Contato:

Mensagem por Stanis Luksys »

Poxa...

Legal hein!! Parabéns aí pela iniciativa... Quem trabalha com sistemas de delivery vai gostar muito!

Isso aí... Este é o espírito natalino no fórum.... rsrs


Eu estava lendo aí e gostei da parte eletrônica, essas experiências são bacanas mesmo, minha formação é em mecatrônica e na escola a gente trabalhava bastante com isso, recebendo sinais que vinham da porta serial do PC... Claro que minha parte nos projetos era sempre a de fazer o soft, q eu ja gostava... e era sermpre em C ou Pascal... hehe

Quanto ao lance do resistor, não tem nada demais ele esquentar, afinal isso é só o que ele faz, dissipar energia em forma de calor.

Enfim, gostei muito realmente, quando tiver um tempinho vou até fazer mesmo este experimento.

Valeu aí pelas dicas, acho que todo mundo pode se aproveitar muito disso!
Stanis Luksys
sites.google.com/hblibs

Apoiar e se utilizar de projetos opensource não é uma questão de boicote, mas sim de liberdade.
Utilize, aprimore e distribua.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Mensagem por fladimir »

Parabéns Vagner, é isso ai!!!! Gostei do Presente vc nos presenteou com certeza primeiro q muita gente.. hehe



Até + +


Sucesso a Todos!!!!!
And
Usuário Nível 3
Usuário Nível 3
Mensagens: 163
Registrado em: 25 Set 2005 18:31
Localização: São Paulo/SP

Mensagem por And »

:))

:)Pos


Valeu,
Anderson
Clipper 52e/Clipper 53b/Blinker 7/Vlib/Fglib/DBFNTX
_______________________________________________
Migrando para [x]Harbour 0.99.60 (SimpLex) + MiniGUI 1.2 Exp. (Build 22)
_______________________________________________
Assine o manifesto dos artistas pela preservação da amazônia.
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

postei so para o topico subir e os amigos que nao viram poderem pegar esta rotina.
Sem mais
Wagner Nunes
www.vagucs.com.br
Danielzão
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 27 Nov 2006 14:28

Quero tentar

Mensagem por Danielzão »

Gostaria de tentar fazer essa bina mas não tenho e não sei como conseguir essa OSLIB, se alguem puder me informar, agradeço.
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

Você tá falando a IOLIB? se for, como disse no tutorial acima, ela está disponivel no meu site, tem tambem um tutorial ensinando como usar todos os recursos dela.
Editado pela última vez por vagucs em 27 Nov 2006 18:24, em um total de 1 vez.
Sem mais
Wagner Nunes
www.vagucs.com.br
Danielzão
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 27 Nov 2006 14:28

Mensagem por Danielzão »

Perdão, eu quis dizer IOLIB. eu vejo que em um momento do seu código vc dá um #INCLUDE "IOLIB.CH" e eu não tenho é esse IOLIB.CH.

no começo do prog vc dá um outchr(at,etc) de onde vem essa função ???
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

a função citada é da IOLIB no meu site tem ela e o arquivo INCLUDE junto.
Sem mais
Wagner Nunes
www.vagucs.com.br
Danielzão
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 27 Nov 2006 14:28

Mensagem por Danielzão »

Já baixei. muito obrigado
Danielzão
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 27 Nov 2006 14:28

Mensagem por Danielzão »

Perdão.

Eu baixei um arquivo iolibtut.txt.

você pode me dizer mais exatamente onde no seu site eu acho essa lib ?
ou qual o nome exato do arquivo .zip que contem ela.

Obrigado.
Danielzão
Usuário Nível 1
Usuário Nível 1
Mensagens: 32
Registrado em: 27 Nov 2006 14:28

Mensagem por Danielzão »

Já encontrei. IOLIB.ZIP em downloads

Obrigado :D
Avatar do usuário
momente
Usuário Nível 3
Usuário Nível 3
Mensagens: 496
Registrado em: 03 Mar 2005 11:53
Localização: São Carlos-SP
Contato:

Mensagem por momente »

Grande Wagner!!!

Muito legal sua iniciativa!!!

Parabéns!!!

:{
Rogerio L. Momenté
Nada é tão perfeito que não possamos melhorar.
Nunca se explique. Seus amigos não precisam e seus inimigos não vão acreditar.
www.looksystem.com.br
clebermano
Usuário Nível 3
Usuário Nível 3
Mensagens: 187
Registrado em: 03 Out 2004 12:39
Contato:

Mensagem por clebermano »

Funciona com PABX?
Vastec - Automacao Comercial Ltda - Ribeirao Preto - SP. (16)3968-2299-(16)8154-7828 (16)8121-4139
msn: suporte@clebermano.com.br - email: clebermanorp@yahoo.com.br
Quem nao vive pra servir nao serve pra viver !
Avatar do usuário
vagucs
Membro Master
Membro Master
Mensagens: 1480
Registrado em: 10 Jul 2004 10:45
Localização: Ipanema - MG
Contato:

Mensagem por vagucs »

Não, pois o PABX nao deixa o sinal de linha passar, ele contem e controla os pulsos da linha, para este caso vc tem que fazer uma extensão antes do aparelho de PABX para o computador e colocar o resistor nesta extensão.
Sem mais
Wagner Nunes
www.vagucs.com.br
Responder