Dicas sobre tratamento de Qr Code
28 Setembro 2018
A fabricação de Blanks é iniciada através da requisição de um lote, via comunicação Fabricante → Serpro (/api-fabricante/lotes).
O Serpro devolve o QR Code do Blank em Base64 e também o Serial, sendo um alfanumérico contendo 15 caracteres AAMMFFSSSSSSSSS, onde:
AA = ano
MM = mês
FF = código do fabricante com dois caracteres
SSSSSSSSS = sequencial numérico
O QRCode é criptografado, de forma a evitar que fraudadores gerem um QRCode válido para um determinado veículo. Portanto, a obtenção do serial a partir do QRCode só é possível via o sistema de QRCodes seguros do Serpro, o Vio.
Nós utilizamos JSON para trafegarmos as mensagens, e por isso o QR Code é enviado em Base64, podendo ser facilmente convertido para binário. Cabe aos fabricantes gerarem a imagem a partir do conteúdo em Base64 convertendo para Binário (arquivo ".bin"). Imaginamos que os passos abaixo possam ajudar na execução do fluxo:
- Fabricante recebe e armazena no banco de dados o serial alfanumérico.
- Fabricante recebe e armazena no banco de dados o QR Code em base64.
- Fabricante converte de base64 para binário.
- Fabricante armazena o binário.
- Fabricante gera o hash sobre o binário do QR Code e armazena esse hash.
- Fabricante gera imagem a partir do binário armazenado.
- Fabricante envia a imagem para a impressora a laser.
- Fabricante executa controle de qualidade: uma câmera lê o binário do QR Code, gera o hash do conteúdo lido e compara com o hash do QR que estava no banco do fabricante.
Citamos também a importância do cumprimento dos padrões de qualidade, indicando inclusive a norma ISO/IEC 29158. A impressão é executada a laser e itens como resolução, borda, tempo de leitura, armazenamento devem ser considerados pelos fabricantes. Exemplo de código Java que gera uma imagem de QR Code
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Base64;
import javax.imageio.ImageIO;
import io.nayuki.qrcodegen.QrCode;
public class GeracaoQrcodeLince {
public static void main(String[] args) throws Exception {
String qrcodeEmBase64 = "NWJhY2Y1ZW..."; // Recebido do Emplaca WS
byte[] bytesDoQrcode = Base64.getDecoder().decode(qrcodeEmBase64);
QrCode qr = QrCode.encodeBinary(bytesDoQrcode, QrCode.Ecc.MEDIUM);
BufferedImage img = qr.toImage(10, 4);
File imgFile = new File("/tmp/qr-lince.png");
ImageIO.write(img, "png", imgFile);
}
}
Referências
-
Geração de imagem QR em Java utilizando a biblioteca nayuki: https://www.nayuki.io/page/qr-code-generator-library
-
Exemplo de QR Code Lince (produção) em base64:
NWJhY2Y1ZWMwMgALAAxFhBlBFBBBNNZVBIAo0umJVwKjr2BwgvPLtNhJZiOdDivIx3KJPnkPF1lB9xaLtCzsUlqIPMQUwU2JERj17HoJAPmHe72Xu3gsSeE+eUGwvng7ENFaVT1TD+J3DpYqcgKCJrB6yLqx16FPww0UB5jorey2RBT95yjGBRxMqK7rxpkEivWz7jhKvTfg5jcbkm5/HvvqR2arZP6WrGEkD0quEJr4u3OeC6Spw/Xmv2ZjDB7pFBj35VMvfYoggSYVa1Q6iRBREkm87E/oLPm3BPEY4WGk7cKLVRVOHLwVUaRlDNVb0LoGXvQEGhPO6boPmEwVTnn9GwfruBWsk7wCfqRppG9JZYpNAeKhgdKU
Atenção
ATENÇÃO: os trechos dos códigos citados são apenas exemplos, avaliar com cautela.
Criada: 10 de fevereiro de 2022