Jump to content

Recommended Posts

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

 

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...