ID TECH
Contato
Todos os posts técnicos

Post Técnico

Conecte-se a Leitores de Cartão USB com Websockets

É possível conectar qualquer leitor de cartão USB a qualquer navegador web usando Websockets e NodeJS. Isso significa que você pode realizar transações EMV a partir de um Terminal Virtual. Saiba como a seguir.

Da última vez, mostrei como configurar a conectividade USB via JavaScript usando NodeJS e um módulo chamado node-hid. O resultado foi que conseguimos acesso programático a dispositivos USB, via JavaScript, em apenas cerca de 75 linhas de código. Nosso script implementou detecção e conexão automática de dispositivos, e nos forneceu um identificador de dispositivo para leitura e gravação de dados USB.

Tudo isso é suficiente, caso sua única necessidade seja o acesso programático a dados USB dentro de um script Node.

Mas e se você precisar comunicar esses dados a outro processo? E se, por exemplo, quiser enviar dados USB para um navegador web? Ou transmiti-los a um servidor?

Sem problema. É possível fazer isso. É simples!

Websockets ao Resgate

O Protocolo Websocket (especificação IETF aqui) é um dos padrões Web mais incrivelmente úteis a surgir em muito, muito tempo. E, felizmente, é implementado por todos os navegadores modernos. Além disso, está disponível para scripts Node — o que significa que seu código Node pode se comunicar com seus scripts de navegador com bastante facilidade, bastando criar uma conexão de socket que faça a ponte entre os dois mundos.

No lado do Node, você precisará abrir um console do sistema operacional e executar npm install socket.io -g (apenas uma vez) para instalar o módulo amplamente utilizado e merecidamente popular socket.io . Após isso, seus scripts poderão chamar require("socket.io") para aproveitar o incrível poder desse módulo. (Mais detalhes sobre isso em instantes.)

No lado do navegador, você precisa apontar para o arquivo socket.io.slim.js script, para que sua página web possa receber dados via Websocket. (Não tente usar a API padrão de Websocket do navegador para isso, pois o módulo socket.io mencionado utiliza seu próprio esquema de keep-alive, que não é reconhecido pelo navegador. Para evitar conflitos, use o script do lado do cliente socket.io.slim.js. Como benefício adicional, o script inclui polyfills que garantem compatibilidade com Websocket em navegadores mais antigos.) A maneira mais fácil de obter o script do lado do cliente é baixá-lo de um servidor de borda (CDN), inserindo o seguinte trecho em sua página web:

Com esse script instalado, sua página web está pronta para se conectar aos sockets servidos pelo seu próprio servidor de socket.

Servindo Websockets

Vamos falar sobre como configurar um servidor de socket em modo loopback (ou seja, em ws://localhost). O processo é incrivelmente simples e extremamente útil para a comunicação entre processos.

Você precisará do Node, claro, e também do módulo socket.io (conforme descrito acima). Em seguida, será necessário iniciar o Node e fazê-lo executar um script como o seguinte:

Desconsiderando os comentários, estamos olhando para apenas cerca de 30 linhas de código. Conceitualmente, o que acontece é que require('http')para que possamos configurar uma instância de servidor HTTP fictício. Em seguida, require('socket.io').listen(server) para que o módulo socket.io possa atualizar as requisições HTTP recebidas para conexões Websocket.

Por padrão, as conexões Websocket permitem a comunicação full-duplex, baseada em mensagens e ponto a ponto entre as partes conectadas. No entanto, comunicação ponto a ponto não significa que as mensagens são automaticamente transmitidas para outras conexões. Para habilitar a transmissão em broadcast, registramos um listener de evento personalizado, o on.('echo') listener na linha 58, que reencaminha as mensagens "echo" recebidas para todas as conexões de socket, como uma nova mensagem do tipo 'message'. A regra aqui é: para enviar mensagens ponto a ponto, use o tipo de evento 'message'; mas para garantir que o servidor de socket repasse sua mensagem a todos os listeners, use o tipo de mensagem 'echo'. (Esta é uma convenção própria nossa, diga-se de passagem, e não algo imposto pelo socket.io.)

O último ponto a observar é que o código acima, por si só, não faz nada, pois trata-se de uma definição de classe. É necessário instanciá-la em tempo de execução para utilizá-la. Mas isso é bastante simples. Os comentários no início do código explicam como usar a classe. Além disso, veremos como utilizá-la nas próximas publicações do blog.

Não perca as próximas publicações desta série, pois em breve estaremos realizando transações sem contato em um gateway ativo — tudo diretamente do navegador, usando JavaScript! Volte em breve!