Jump to content
jpcarvalho1992

Leitor MSR-1012BM + Eliminação de caracteres

Recommended Posts

jpcarvalho1992

Bom tarde amigos, estou com um problema que não consigo solucionar. Então é assim:

Tenho um leitor de cartões MSR-1012BM no qual já acabou todo o suporte a ele direcionado á muitos anos. ele funcionava correctamente, até que começamos a usar cartões novos. O que acontece é que parece que lê duas vezes. Um exemplo:

Equipamento que tenho:

Errado, o que me aparece: %00910202_ç00910202_

Correcto, o que deveria aparecer: ç00910202_

O que pensei para solucionar foi criar uma app em consola capaz de detectar a string introduzida errada toda a vez que esta aparecesse, mas o problema é que trabalha com uma aplicação de gestão.

Alguém me consegue idealizar uma forma de eliminar este erro?

Agradecido.

Cumprimentos.

Share this post


Link to post
Share on other sites
apocsantos

Boa noite,

O equipamento está ligado porque tipo de porta ? PS/2 USB ? Não consegui encontrar as especificações.

A parte errada da string é sempre a mesma ?

Em teoria deve ser possivel interceptar o input, retirar-lhe a "parte errada" e voltar a envia-lo para a app. Terá de ser feita uma app que esteja sempre em execução, tipo um service, que intercepte o input, faça o processamento e volte a dispobilizar no local correcto.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
jpcarvalho1992

Boa noite, também não encontrei especificações. O equipamento é PS/2. Sim é sempre a mesma:

Vou imprimir as linhas para aqui:

Banda 1: %00007196_ç00000325_

Banda 2: %00007196_ç00007196_

Banda 3: %00000325_ç00000325_

O correcto deveria ser somente:

ç00000325_ ou ç00007196_

Com cartões antigos:

ç99000011_

ç00910202_

Já pensei criar um serviço em C#, mas o mal é que tenho detectar o ctrl+v e verificar a string. Porque funciona como um "paste+enter".

Obrigado

Share this post


Link to post
Share on other sites
apocsantos

Boa noite,

Eu recordo-me de semelhante mas era em C++, na altura em Windows NT 4.0. Em C# nunca fiz nada para o efeito.

De qualquer das formas, em teoria com hooks consegues detectar a entrada de dados pela porta PS/2 como se fosse um conjunto de dados vindo de um teclado. Assim podes detectar, interceptar, processar e passar para a aplicação. Isto em teoria.

Como não tenho de memória a implementação disso, bastou pesquisar um pouco pelo conceito e encontrei algo que te pode ajudar, além de ter a source disponível no GitHub, mas não é C#, é C. Ficam os links:

http://www.oblita.com/interception.html

https://github.com/oblitum/Interception

A biblioteca parece interessante e promissora, para o efeito pretendido. Agora para limpar os dados, podes simplesmente retirar os primeiros 10 caracteres do input.

A ideia do serviço também me parece possivel mas creio que como é para interceptar um input, vá de uma forma ou de outra, dar ao mesmo efeito que a biblioteca de C que indiquei, vai.

Cordiais cumprimentos,

Apocsantos

Boa noite novamente,

Um pouco mais de pesquisa, porque certamente isto tinha de ser possivel de ser feito em C#, e cá fica o que encontrei, na MSDN, escrito por Stephen Toub.

http://blogs.msdn.com/b/toub/archive/2006/05/03/589423.aspx e o respectivo artigo de origem, completo: https://msdn.microsoft.com/pt-pt/magazine/cc163606%28en-us%29.aspx

using System;
using System.Diagnostics;
using System.Windows.Forms;
using System.Runtime.InteropServices;
class InterceptKeys
{
   private const int WH_KEYBOARD_LL = 13;
   private const int WM_KEYDOWN = 0x0100;
   private static LowLevelKeyboardProc _proc = HookCallback;
   private static IntPtr _hookID = IntPtr.Zero;
   public static void Main()
   {
    _hookID = SetHook(_proc);
    Application.Run();
    UnhookWindowsHookEx(_hookID);
   }
   private static IntPtr SetHook(LowLevelKeyboardProc proc)
   {
    using (Process curProcess = Process.GetCurrentProcess())
    using (ProcessModule curModule = curProcess.MainModule)
    {
	    return SetWindowsHookEx(WH_KEYBOARD_LL, proc,
		    GetModuleHandle(curModule.ModuleName), 0);
    }
   }
   private delegate IntPtr LowLevelKeyboardProc(
    int nCode, IntPtr wParam, IntPtr lParam);
   private static IntPtr HookCallback(
    int nCode, IntPtr wParam, IntPtr lParam)
   {
    if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
    {
	    int vkCode = Marshal.ReadInt32(lParam);
	    Console.WriteLine((Keys)vkCode);
    }
    return CallNextHookEx(_hookID, nCode, wParam, lParam);
   }
   [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
   private static extern IntPtr SetWindowsHookEx(int idHook,
    LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
   [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
   [return: MarshalAs(UnmanagedType.Bool)]
   private static extern bool UnhookWindowsHookEx(IntPtr hhk);
   [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
   private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
    IntPtr wParam, IntPtr lParam);
   [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
   private static extern IntPtr GetModuleHandle(string lpModuleName);
}

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
jpcarvalho1992

Muito obrigado Apocsantos, estive a estudar a solução em C# e é isso que queria. Agora quando finalizar posto aqui o código para futuros users.

Cumprimentos.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.