Barcode Scanner Emulator
Como funcionam os leitores de códigos de barras
Uma leitura de código de barras parece imediata, mas entre o código físico e o carácter que entra na aplicação existem quatro fases distintas. Compreender cada fase torna os erros do leitor bastante mais fáceis de diagnosticar.
As quatro fases de uma leitura de código de barras
1. Iluminação e captura de imagem
Os leitores laser percorrem o código com um feixe e medem a intensidade da luz refletida. Os leitores por imagem (a maior parte dos leitores manuais atuais e das câmaras de telemóvel) captam uma imagem 2D do código com um pequeno sensor CMOS, semelhante a uma câmara de baixa resolução.
2. Descodificação
O firmware incorporado analisa as larguras das barras (ou a imagem 2D, no caso de QR e Data Matrix) e descodifica-as na carga digital original, segundo o algoritmo da simbologia em causa: Code 128, Code 39, EAN-13, QR e por aí adiante. Tudo isto ocorre no interior do leitor, antes de quaisquer dados chegarem ao computador.
3. Comunicação
A carga descodificada é transmitida ao computador anfitrião. O transporte é, regra geral, USB, e a esmagadora maioria dos leitores de consumo e industriais apresenta-se ao sistema operativo como um teclado USB HID, e não como uma classe USB à medida. Alguns leitores admitem modos alternativos, como série USB (emulação de porta COM) ou Bluetooth HID, mas a emulação de teclado é a predefinição em praticamente todos os leitores vendidos hoje.
4. Introdução na aplicação
Como o leitor atua como teclado, o sistema operativo entrega a carga como uma sequência de eventos de tecla à aplicação que detém o foco do teclado. A aplicação nunca fala diretamente com o leitor. Recebe apenas premidas de tecla, tal como se alguém as tivesse escrito muito depressa.
Porque é que a maioria dos leitores se comporta como um teclado
O modo de teclado HID é a configuração predefinida de quase todos os leitores comerciais de códigos de barras, porque dispensa a instalação de controladores. Qualquer sistema operativo que suporte um teclado USB suporta o leitor de imediato.
A emulação de teclado USB significa que o firmware do leitor associa cada carácter descodificado ao código de tecla USB HID que um teclado enviaria para esse carácter e transmite relatórios normalizados de teclado HID pelo ponto terminal de interrupção USB.
Relevância para os testes: na camada da aplicação, o leitor não se distingue de um teclado. Por isso, uma boa parte do comportamento comandado pelo leitor pode ser ensaiada escrevendo depressa num campo com foco, ou com uma ferramenta do navegador que inspecciona eventos de teclado (ver as ferramentas mais abaixo).
Sufixos ENTER e TAB
A maioria dos leitores está configurada para acrescentar uma premida de sufixo a seguir à carga descodificada, quase sempre ENTER (retorno de carro, 0x0D), por vezes TAB (0x09) ou uma sequência personalizada. Assim, a aplicação receptora sabe onde termina o valor lido sem recorrer a um tempo limite. O sufixo funciona como sinal de submissão, à semelhança de premir Enter depois de escrever num campo de texto.
Temporização do leitor
Um leitor transmite a carga completa do código em bastante menos de um segundo, muitas vezes com intervalos de poucos milissegundos entre caracteres. Uma pessoa a escrever a mesma cadeia tem, em regra, intervalos de 100–300 ms ou mais. Esta diferença temporal está na base da lógica de «detecção de leitor» em muitas aplicações de POS e de existências, que vigiam rajadas de introdução invulgarmente rápidas seguidas de imediato por uma tecla de sufixo.
Para a aplicação, a consequência é esta: para distinguir a introdução do leitor da escrita manual, mede-se o tempo entre premidas e não se procura uma marca especial, porque os eventos de teclado habituais do navegador não indicam a origem da introdução.
Experimente
Utilize o testador de introdução de códigos de barras para ler um código real e observar em tempo real o valor captado, a temporização e a detecção do sufixo. Para aprofundar o comportamento da cunha de teclado, prossiga para A cunha de teclado HID explicada.