Equinox Geschrieben January 4, 2015 at 14:49 Geschrieben January 4, 2015 at 14:49 Hallo zusammen, ich habe das Beispielprogramm zum Schreiben/Lesen von RFID-Tags leicht abgeändert, sodass es nur noch liest. Mein Problem dabei ist, dass es immer Page 5 liest, egal was ich bei requestPage() als Parameter angebe. Selbst ohne den Aufruf requestPage() wird der Abschnitt unter "BrickletNFCRFID.STATE_REQUEST_PAGE_READY" ausgeführt. Was mache ich falsch? Wie lese ich die requestierte Seite aus? Wie funktioniert das Lesen und Schreiben von mehreren Seiten, d.h. mehr als 16 Bytes? Ist dies mit Callbacks sinnvoll machbar, da diese ja asynchron ausgeführt werden? Oder macht man das anders? Wie sieht hier die "Best Practice" aus? Könntet ihr dazu bitte ein Beispielprogramm posten (Lesen und Schreiben von mehr als 16 Bytes)? Und eins noch: In der Doku steht beim Lesen und Schreiben jeweils der Satz: "Rufe getTagID() auf und überprüfe ob Tag ID korrekt ist." Was ist damit gemeint? Ob die TagID dem requestierten Typ entspricht? Wenn ich das richtig sehe, fehlt dieser Schritt auch in den Beispielprogrammen. Vielen Dank. Hier mein Programm: import com.tinkerforge.BrickletNFCRFID; import com.tinkerforge.IPConnection; public class ReadTag { private static final String host = "localhost"; private static final int port = 4223; private static final String UID = "oBF"; // NFC Bricklet // Note: To make the example code cleaner we do not handle exceptions. Exceptions you // might normally want to catch are described in the commnents below public static void main(String args[]) throws Exception { IPConnection ipcon = new IPConnection(); // Create IP connection final BrickletNFCRFID nfc = new BrickletNFCRFID(UID, ipcon); // Create device object ipcon.connect(host, port); // Connect to brickd // Don't use device before ipcon is connected // Add and implement state changed listener (called if state changes) nfc.addStateChangedListener(new BrickletNFCRFID.StateChangedListener() { public void stateChanged(short state, boolean idle) { try { if(state == BrickletNFCRFID.STATE_REQUEST_TAG_ID_READY) { System.out.println("Tag found"); //System.out.println(nfc.getTagID()); System.out.println("Requesting data (pages 4-7) ..."); // Request pages 4-7 nfc.requestPage(4); } else if(state == BrickletNFCRFID.STATE_WRITE_PAGE_READY) { System.out.println("Write Page ready ... sollte nichts erscheinen"); } else if(state == BrickletNFCRFID.STATE_REQUEST_PAGE_READY) { // Get and print pages System.out.println("Data: "); short[] data = nfc.getPage(); String s = "Read data (Dezimal): [" + data[0]; String sHex = "Read data (hex): [" + Integer.toHexString(data[0] & 0xffff); for(int i = 1; i < data.length; i++) { s += " " + data[i]; sHex += " " + Integer.toHexString(data[i] & 0xffff); } s += "]"; sHex += "]"; System.out.println(s); System.out.println(sHex); } else if((state & (1 << 6)) == (1 << 6)) { // All errors have bit 6 set System.out.println("Error: " + state); } } catch(Exception e) { System.out.println(e); } } }); // Select NFC Forum Type 2 tag nfc.requestTagID(BrickletNFCRFID.TAG_TYPE_TYPE2); System.out.println("Press key to exit"); System.in.read(); ipcon.disconnect(); } } Wie gesagt: Selbst ohne die Zeile "nfc.requestPage(4);" erhalte ich eine Ausgabe. Zitieren
Equinox Geschrieben January 6, 2015 at 21:54 Autor Geschrieben January 6, 2015 at 21:54 Hallo zusammen, das Auslesen der richtigen Page funktioniert mittlerweile (bin mir nicht sicher an was es lag). Auch das Schreiben von mehr als 16 Bytes funktioniert, aber ich bin mir nicht sicher, ob das so der ideale Weg ist. Wie sieht denn hier die beste Vorgehensweise aus? Wäre es möglich, in der API eine Methode anzubieten, die ein Byte-Array beliebiger Länge entgegen nimmt und dies dann vollständig auf das Tag schreibt (und dabei nur einmal in den Zustand "WritePageReady" wechselt)? Ebenso zum Lesen: Startseite und Anzahl Bytes übergeben? Und was ist mit "Rufe getTagID() auf und überprüfe ob Tag ID korrekt ist." gemeint? Zielt das darauf ab, dass wenn zwischen Erkennen des Tags und dem Schreibvorgang ein größerer Zeitraum ist, das Tag inzwischen weg sein kann bzw. ein anderes aufliegen könnte? Danke! Zitieren
photron Geschrieben January 7, 2015 at 12:33 Geschrieben January 7, 2015 at 12:33 das Auslesen der richtigen Page funktioniert mittlerweile (bin mir nicht sicher an was es lag). Auch das Schreiben von mehr als 16 Bytes funktioniert, aber ich bin mir nicht sicher, ob das so der ideale Weg ist. Wie sieht denn hier die beste Vorgehensweise aus? Nach dem ersten WritePage, einfach weitere WritePage aufrufe machen. Also Schritt 4 und 5 wiederholen. Wäre es möglich, in der API eine Methode anzubieten, die ein Byte-Array beliebiger Länge entgegen nimmt und dies dann vollständig auf das Tag schreibt (und dabei nur einmal in den Zustand "WritePageReady" wechselt)? Ebenso zum Lesen: Startseite und Anzahl Bytes übergeben? Das unterliegende Protokoll verwendet Pakete mit fester Länger und daher haben alle Array Parameter auch immer feste Länge. Arrays beliebiger Länge sind nicht mögliche. Und was ist mit "Rufe getTagID() auf und überprüfe ob Tag ID korrekt ist." gemeint? Zielt das darauf ab, dass wenn zwischen Erkennen des Tags und dem Schreibvorgang ein größerer Zeitraum ist, das Tag inzwischen weg sein kann bzw. ein anderes aufliegen könnte? Die Dokumentation war da missverständlich und ist jetzt verbessert. Der GetTagID Aufruf ist optional und nur in dem Fall interessant, wenn du nur mit einem bestimmten Tag arbeiten und diesen an seiner Tag ID erkennen willst. Zitieren
Equinox Geschrieben January 7, 2015 at 13:54 Autor Geschrieben January 7, 2015 at 13:54 Hallo, danke für die Antwort. Noch eine Frage zur Vorgehensweise für das Schreiben von mehr als 16 Bytes: Nach dem ersten WritePage, einfach weitere WritePage aufrufe machen. Also Schritt 4 und 5 wiederholen. Das ist im Prinzip klar, die Frage für mich war, wo dies zu machen ist. Im Moment rufe ich das erste WritePage im Callback von "STATE_REQUEST_TAG_ID_READY" auf und alle weiteren WritePage-Aufrufe im Callback von "STATE_WRITE_PAGE_READY". Ist das so gedacht? Oder sollte man das außerhalb der Callbacks machen? Zitieren
photron Geschrieben January 7, 2015 at 14:39 Geschrieben January 7, 2015 at 14:39 Das kannst du innerhalb der Callback Funktion machen, das ist okay und kein Problem. Als alternative Möglichkeit kannst du dir die write_message Funktion (Zeile 260) im Python Beispiel ansehen (sorry, das Beispiel ist derzeit nur in Python vorhanden): http://www.tinkerforge.com/de/doc/Software/Bricklets/NFCRFID_Bricklet_Python.html#write-ndef-message Dort werden die StateChange Callbacks in eine Queue gepackt und die write_message wartet dann nach den jeweiligen Schritten bis der entsprechende StateChange aus der Queue genommen werden kann. Das ist jetzt prinzipiell nicht besser oder schlechter als dein Vorgehen, sonder einfach eine gleichwertige Alternative. Zitieren
Equinox Geschrieben January 7, 2015 at 15:45 Autor Geschrieben January 7, 2015 at 15:45 Super, vielen Dank! 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.