Author Topic: NFC Bricklet Reader  (Read 317 times)

theo

  • Sr. Member
  • ****
  • Posts: 315
    • View Profile
    • Twitter
NFC Bricklet Reader
« on: March 28, 2019, 20:12:01 »
Hallo Tinkerforger,

ich versuche das NFC Bricklet im Readermodus als Tag-Scanner zu verwenden.  Leider gelingt mir das Anhand des Beispielcodes aus der Doku nicht. Es kommt einfach kein Leseloop in Gang.
Ausserdem fehlt bei der readerStateChanged Methode die Doku für den "idle" Wert: readerStateChanged(int state, boolean idle)

Für das NFC/RFID Bricklet habe ich das Ganze analog zu eurem Beispiel hinbekommen. Dort wird der "idle" Wert verwendet um den Loop am Laufen zu halten.

Könnt ihr mir ein bisschen auf die Sprünge helfen.

Gruß,
Theo

borg

  • Tinkerforge Staff
  • Administrator
  • Hero Member
  • *****
  • Posts: 3.096
    • View Profile
Re: NFC Bricklet Reader
« Reply #1 on: May 15, 2019, 10:09:29 »
Sorry für die späte Antwort, ich hatte den Post irgendwie übersehen.

Das abgeänderte Beispiel könnte so aussehen:

Code: [Select]
import com.tinkerforge.IPConnection;
import com.tinkerforge.BrickletNFC;

public class ExampleScanForTags {
private static final String HOST = "localhost";
private static final int PORT = 4223;

// Change XYZ to the UID of your NFC Bricklet
private static final String UID = "nfc2";

// Note: To make the example code cleaner we do not handle exceptions. Exceptions
//       you might normally want to catch are described in the documentation
public static void main(String args[]) throws Exception {
IPConnection ipcon = new IPConnection(); // Create IP connection
BrickletNFC nfc = new BrickletNFC(UID, ipcon); // Create device object

ipcon.connect(HOST, PORT); // Connect to brickd
// Don't use device before ipcon is connected

// Add reader state changed listener
nfc.addReaderStateChangedListener(new BrickletNFC.ReaderStateChangedListener() {
public void readerStateChanged(int state, boolean idle) {
if (state == BrickletNFC.READER_STATE_IDLE) {
try {
nfc.readerRequestTagID();
}
catch (Exception e) {
return;
}
}
else if(state == BrickletNFC.READER_STATE_REQUEST_TAG_ID_READY) {
try{
int i = 0;
StringBuilder tag = new StringBuilder();
BrickletNFC.ReaderGetTagID ret = nfc.readerGetTagID();

for (int v : ret.tagID) {
if (i < ret.tagID.length - 1) {
tag.append(String.format("0x%X ", v));
}
else {
tag.append(String.format("0x%X", v));
}

i++;
}

System.out.format("Found tag of type %d with ID [%s]\n", ret.tagType, tag);
nfc.readerRequestTagID();
}
catch (Exception e) {
return;
}
}
else if (state == BrickletNFC.READER_STATE_REQUEST_TAG_ID_ERROR) {
try {
nfc.readerRequestTagID();
}
catch (Exception e) {
return;
}
}
}
});

// Enable reader mode
nfc.setMode(BrickletNFC.MODE_READER);

System.out.println("Press key to exit"); System.in.read();
ipcon.disconnect();
}
}

Im Grunde musst du nur zusehen das in jedem State in dem du landen kannst in dem das NFC Bricklet nicht irgendetwas durchführt oder auf irgendetwas wartet "nfc.readerRequestTagID()" nochmal aufgerufen wird, damit das Bricklet auch durchgängig nach Tags sucht.
Wir sind die Borg, Widerstand ist Spannung durch Stromstärke!

theo

  • Sr. Member
  • ****
  • Posts: 315
    • View Profile
    • Twitter
Re: NFC Bricklet Reader
« Reply #2 on: May 15, 2019, 21:21:25 »
Super, vielen Dank. Ich werde das mal mit dem openHAB-Binding ausprobieren.
 

andiikaa

  • Newbie
  • *
  • Posts: 4
    • View Profile
Re: NFC Bricklet Reader
« Reply #3 on: May 21, 2019, 11:17:03 »
Falls es dir etwas nützt, kannst du auch schauen, wie ich das im OH1 Binding gelöst habe, oder übernimmst es in das OH2 Binding.

Das funktioniert bisher ganz gut.

Der Idle Zustand müsste der erste Zustand sein, den man erreicht nachdem folgende Methode aufgerufen wurde:
Code: [Select]
tinkerforgeDevice.setMode(BrickletNFC.MODE_READER);
Den boolean Parameter "idle" habe ich gar nicht weiter benötigt. Den Loop kannst du über den jeweiligen State am Laufen halten.

Was ich leider nicht gefunden habe, war eine "einfache" Library, welche die Daten vom Tag lesen kann. Alles was ich irgendwo gefunden habe, hatte Dependencies zu irgendwelchen Android Libraries.
Darum habe ich das auslesen/dekodieren der Daten selber gemacht.

Hast du da evtl. etwas gefunden, was das Auslesen/Dekodieren der Daten übernimmt?