theo Geschrieben March 28, 2019 at 19:12 Geschrieben March 28, 2019 at 19:12 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 Zitieren
borg Geschrieben May 15, 2019 at 08:09 Geschrieben May 15, 2019 at 08:09 Sorry für die späte Antwort, ich hatte den Post irgendwie übersehen. Das abgeänderte Beispiel könnte so aussehen: 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. Zitieren
theo Geschrieben May 15, 2019 at 19:21 Autor Geschrieben May 15, 2019 at 19:21 Super, vielen Dank. Ich werde das mal mit dem openHAB-Binding ausprobieren. Zitieren
andiikaa Geschrieben May 21, 2019 at 09:17 Geschrieben May 21, 2019 at 09:17 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: 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? Zitieren
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.