Leitor RFID UHF conectado ao NodeJS

Porque


O UHF Reader permite que você controle as tags a uma distância de 10 metros, o que oferece perspectivas interessantes para vários usos. O mais óbvio é o controle da passagem de veículos. Mas você pode encontrar opções mais exóticas: controle de equipamentos na garagem / celeiro. Dificilmente é possível para um ladrão pensar que uma etiqueta RFID está colada a uma bicicleta (uma maleta de ferramentas) e ele é capaz de relatar sua partida fora do perímetro observado.
O NodeJS + RaspberryPI é um servidor flexível e barato para processamento de dados e gerenciamento de periféricos.

Equipamento


Levei o CF-RU5109 (CHAFON) para teste, que suporta conexão RS232, RS485, Wiegand, TCP. (Eu preciso do TCP apenas para a conveniência dos equipamentos de teste)
Página do Modelo - CF-RU5109

Tags - etiqueta de papel de rfid gen2 uhf com chip Alien H3

Alcance de leitura. Experimentos mostraram que a leitura depende da atividade do rótulo (seu movimento no espaço). Uma marca passivamente mentida é lida com confiança a uma distância de 3 metros, movendo-se fracamente - 5-5,5 metros, a uma distância de 8 metros. Eu tive que agitar minha mão ativamente. Meu leitor possui uma antena embutida de 9dbi.





De software


O leitor vem com um SDK, uma descrição detalhada dos comandos, vários programas de teste para Windows. Eu uso este software apenas para tentar trabalhar com o Reader - não precisamos de nada para trabalhar com o NodeJS.

Conectar ao nó


tcpclient.prototype.Start = function () { client = new net.Socket(); client.setEncoding('ascii'); client.connect(6000, '192.168.0.190', function() { }); client.on('connect', function(data) { console.log('UHF reader connected'); var bytes = Buffer.from([0x04, 0xff, 0x21, 0x19, 0x95], "ascii"); client.write(bytes); client.on('data', function(data) { console.log('UHF reader respond:'); var buffer = Buffer.from(data, "ascii"); console.log(buffer); }); }); client.on('close', function() { console.log('UHF reader - connection closed'); }); client.on('error', function(err) { console.log(err) }); }; tcpclient.prototype.Write = function (req) { var bytes = new Buffer(req, "ascii"); console.log(bytes); client.write(bytes); }; 

Do manual. O bloco de comando está estruturado da seguinte maneira:
Len, Adr, Cmd, Dados [], LSB-CRC16, MSB-CRC16

Os dois últimos bytes são a soma de verificação CRC16, com o polinômio 0x8408, o número inicial 0xFFFF. Os bytes são exibidos na ordem inversa. O fabricante gentilmente forneceu o código C para cálculo e eu o reescrevi em JS (veja abaixo).

Assim, [0x04, 0xff, 0x21, 0x19, 0x95] é um comando que solicita o status do leitor no endereço padrão FF. 04, 21, 19 e 95 - soma de verificação CRC16.

 var PRESET_VALUE = 0xFFFF; var POLYNOMIAL = 0x8408; var CRC16 = function (pucY) { var uiCrcValue = PRESET_VALUE; for(var i = 0; i < pucY.length; i++){ uiCrcValue = uiCrcValue ^ (pucY[i]); for(var j = 0; j < 8; j++){ if(uiCrcValue & 0x0001){ uiCrcValue = (uiCrcValue >> 1) ^ POLYNOMIAL; } else { uiCrcValue = (uiCrcValue >> 1); } } } var buf = Buffer.from(uiCrcValue.toString(16), 'hex'); buf = Buffer.from([buf[1], buf[0]], 'hex'); return buf; }; //CRC16([0x04, 0xff, 0x21]); //returns <Buffer 19 95> 

Exemplos de comando


Inventário - uma solicitação para uma única leitura de cartão. Atua no modo de resposta

 req =[0x04, 0x00, 0x01, 0xdb, 0x4b]; tcpClient.Write(req); 

Se a marca estiver à vista, obteremos a resposta
O leitor UHF responde:
<Tampão 13 00 01 01 01 0c 62 00 51 79 17 19 00 04 05 60 5b 28 2f 24>
62 00 51 79 17 19 00 04 05 60 5b 28 é a tag tag.

Alternando os modos de operação do leitor


Modo de resposta : [0x0a, 0x00, 0x35, 0x00, 0x02, 0x01, 0x00, 0x01, 0x00, 0x2a, 0x9f]
Digitalização / modo ativo : [0x0a, 0x00, 0x35, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x9b]. Nesse modo, o leitor pesquisa constantemente tags e fornece tags.

O que vem a seguir?


E então, se uma solução simples for necessária, escrevemos o código que envia o comando 0x01 (Inventário) periodicamente. Os rótulos na zona de visibilidade fornecem suas tags, as verificamos no banco de dados e iniciamos as ações apropriadas. Ou escrevemos um código que, no modo de varredura constante, espera que a tag caia na faixa de visibilidade e responde com um evento.

Source: https://habr.com/ru/post/pt423369/


All Articles