Jump to content

[Java] Problem beim RFID auslesen


Recommended Posts

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.

Link zu diesem Kommentar
Share on other sites

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!

Link zu diesem Kommentar
Share on other sites

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.

 

 

Link zu diesem Kommentar
Share on other sites

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?

Link zu diesem Kommentar
Share on other sites

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.

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...