Warum?
Mit dem UHF-Reader können Sie die Tags in einer Entfernung von 10 Metern steuern, was interessante Perspektiven für verschiedene Verwendungszwecke bietet. Am offensichtlichsten ist die Kontrolle des Durchgangs von Fahrzeugen. Sie können sich jedoch exotischere Optionen einfallen lassen: die Steuerung der Ausrüstung in der Garage / Scheune. Es ist für einen Dieb kaum möglich zu glauben, dass ein RFID-Tag an ein Fahrrad (einen Werkzeugkoffer) geklebt ist, und er kann seine Abreise außerhalb des beobachteten Bereichs melden.
NodeJS + RaspberryPI ist ein flexibler und kostengünstiger Server für die Datenverarbeitung und Peripherieverwaltung.
Ausrüstung
Ich habe CF-RU5109 (CHAFON) getestet, das RS232-, RS485-, Wiegand- und TCP-Verbindungen unterstützt.
(Ich benötige TCP nur, um Geräte bequem testen zu können.)
Modellseite -
CF-RU5109Tags - rfid gen2 uhf Papieretikett mit Alien H3 Chip
Lesereichweite. Experimente haben gezeigt, dass das Lesen von der Aktivität des Etiketts (seiner Bewegung im Raum) abhängt. Eine passiv liegende Marke wird in einer Entfernung von 3 Metern sicher gelesen und bewegt sich schwach - 5-5,5 Meter, in einer Entfernung von 8 Metern musste ich aktiv mit der Hand winken. Mein Leser hat eine eingebaute 9dbi Antenne.


Software
Der Reader wird mit einem SDK, einer detaillierten Beschreibung der Befehle und mehreren Testprogrammen für Windows geliefert. Ich verwende diese Software nur, um zu versuchen, mit dem Reader zu arbeiten. Wir brauchen nichts, um mit NodeJS zu arbeiten.
Verbindung zum Knoten herstellen
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); };
Aus dem Handbuch. Der Befehlsblock ist folgendermaßen aufgebaut:
Len, Adr, Cmd, Data [], LSB-CRC16, MSB-CRC16
Die letzten beiden Bytes sind die CRC16-Prüfsumme mit dem Polynom 0x8408 und der Startnummer 0xFFFF. Bytes werden in umgekehrter Reihenfolge angezeigt. Der Hersteller hat freundlicherweise den C-Code zur Berechnung bereitgestellt, und ich habe ihn in JS umgeschrieben (siehe unten).
Dementsprechend ist [0x04, 0xff, 0x21, 0x19, 0x95] ein Befehl, der den Status des Lesegeräts an der Standardadresse FF anfordert. 04-Länge, 21-Befehl, 19 und 95 - CRC16-Prüfsumme.
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; };
Befehlsbeispiele
Inventar - eine Anfrage zum Lesen einer einzelnen Karte. Handelt im Antwortmodus
req =[0x04, 0x00, 0x01, 0xdb, 0x4b]; tcpClient.Write(req);
Wenn die Marke in Sicht ist, erhalten wir die Antwort
UHF-Leser antworten:
<Puffer 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 ist das Tag-Tag.
Umschalten der Betriebsarten des Lesegeräts
Antwortmodus: [0x0a, 0x00, 0x35, 0x00, 0x02, 0x01, 0x00, 0x01, 0x00, 0x2a, 0x9f]
Scan / Aktiv-Modus : [0x0a, 0x00, 0x35, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x9b]. In diesem Modus fragt der Leser ständig Tags ab und gibt ihnen Tags.
Was weiter?
Wenn dann eine einfache Lösung erforderlich ist, schreiben wir entweder Code, der den Befehl 0x01 (Inventar) regelmäßig sendet. Beschriftungen in der Sichtbarkeitszone geben ihre Tags an, wir überprüfen sie mit der Datenbank und leiten die entsprechenden Aktionen ein. Oder wir schreiben einen Code, der im konstanten Scanmodus darauf wartet, dass das Tag in den Sichtbarkeitsbereich fällt, und mit einem Ereignis antwortet.