wbackup83 Posted August 7, 2018 at 11:04 AM Share Posted August 7, 2018 at 11:04 AM I don't understand why using a mifare tag using the provided code i can read the tag page without authenticating ...moreover the state page ready is never accessed... for this reason the page if i change the tag still remains the same... can you take a look at my code to understand if i m missing something or what? Tags are found, i can print the page content without authenticating it...(commented) public class ExampleScanForTags { private static final String HOST = "localhost"; private static final int PORT = 4223; // Change XYZ to the UID of your NFC/RFID Bricklet private static final String UID = "uqB"; private static short currentTagType = 0; // 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 // Note: Declare nr as final, so the listener can access it final BrickletNFCRFID nr = new BrickletNFCRFID(UID, ipcon); // Create device object ipcon.connect(HOST, PORT); // Connect to brickd // Don't use device before ipcon is connected // Add state changed listener nr.addStateChangedListener(new BrickletNFCRFID.StateChangedListener() { public void stateChanged(short state, boolean idle) { //System.out.println(state); try { if(idle) { currentTagType = 0; //(short)((currentTagType + 1) % 3); nr.requestTagID(currentTagType); } if(state == BrickletNFCRFID.STATE_REQUEST_TAG_ID_READY) { BrickletNFCRFID.TagID tagID = nr.getTagID(); String s = "Found tag of type " + tagID.tagType + " with ID [" + Integer.toHexString(tagID.tid[0]); for(int i = 1; i < tagID.tidLength; i++) { s += " " + Integer.toHexString(tagID.tid); } s += "]"; System.out.println(s); //added code short[] keys= {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //nr.authenticateMifareClassicPage(5, (short) 0,keys); short[] data=nr.getPage(); System.out.println(Arrays.toString(data)); } if(state == BrickletNFCRFID.STATE_AUTHENTICATING_MIFARE_CLASSIC_PAGE_READY) { System.out.println("Ready"); } if(state == BrickletNFCRFID.STATE_AUTHENTICATING_MIFARE_CLASSIC_PAGE_ERROR) { System.out.println("error"); } } catch(Exception e) { System.out.println(e); } } }); // Start scan loop nr.requestTagID(BrickletNFCRFID.TAG_TYPE_MIFARE_CLASSIC); System.out.println("Press key to exit"); System.in.read(); ipcon.disconnect(); } } Quote Link to comment Share on other sites More sharing options...
borg Posted August 7, 2018 at 07:53 PM Share Posted August 7, 2018 at 07:53 PM I think if you call getPage you will get the page from the last successful read. So if you call getPage in the REQUEST_TAG_ID_READY state, you will not actually read a new page. You have to first authenticate, then request the page and then you can call getPage. Quote Link to comment Share on other sites More sharing options...
wbackup83 Posted August 7, 2018 at 08:14 PM Author Share Posted August 7, 2018 at 08:14 PM Thanks for the reply...but it is the same: it always returns the same page with different tags and the other states are never accessed. nr.addStateChangedListener(new BrickletNFCRFID.StateChangedListener() { public void stateChanged(short state, boolean idle) { //System.out.println(state); try { if(idle) { currentTagType = 0; //(short)((currentTagType + 1) % 3); nr.requestTagID(currentTagType); } if(state == BrickletNFCRFID.STATE_REQUEST_TAG_ID_READY) { BrickletNFCRFID.TagID tagID = nr.getTagID(); String s = "Found tag of type " + tagID.tagType + " with ID [" + Integer.toHexString(tagID.tid[0]); for(int i = 1; i < tagID.tidLength; i++) { s += " " + Integer.toHexString(tagID.tid); } s += "]"; System.out.println(s); //added code short[] keys= {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; nr.authenticateMifareClassicPage(5, (short) 0,keys); nr.requestPage(5); short[] data=nr.getPage(); System.out.println(Arrays.toString(data)); } if(state == BrickletNFCRFID.STATE_AUTHENTICATING_MIFARE_CLASSIC_PAGE_READY) { System.out.println("Ready"); } if(state == BrickletNFCRFID.STATE_AUTHENTICATING_MIFARE_CLASSIC_PAGE_ERROR) { System.out.println("error"); } } catch(Exception e) { System.out.println(e); } } }); // Start scan loop nr.requestTagID(BrickletNFCRFID.TAG_TYPE_MIFARE_CLASSIC); System.out.println("Press key to exit"); System.in.read(); ipcon.disconnect(); Quote Link to comment Share on other sites More sharing options...
wbackup83 Posted August 7, 2018 at 08:17 PM Author Share Posted August 7, 2018 at 08:17 PM What i would expect it would be to access the STATE_AUTHENTICATING_MIFARE_CLASSIC_PAGE_READY state after calling authenticateMifareClassicPage(). But this does not happen... Quote Link to comment Share on other sites More sharing options...
borg Posted August 7, 2018 at 08:26 PM Share Posted August 7, 2018 at 08:26 PM If you comment in the "//System.out.println(state);", do you get any new state after you call authenticateMifareClassicPage()? Or no new state at all? Quote Link to comment Share on other sites More sharing options...
wbackup83 Posted August 8, 2018 at 05:56 AM Author Share Posted August 8, 2018 at 05:56 AM If you intend as it is reported there with the print of the state commented, NO, I do not get any state at all... Quote Link to comment Share on other sites More sharing options...
borg Posted August 8, 2018 at 07:17 AM Share Posted August 8, 2018 at 07:17 AM Strange, do you now what kind of mifare classic tag you have? Is it something special? Do you have a second one you could test with? Quote Link to comment Share on other sites More sharing options...
wbackup83 Posted August 8, 2018 at 07:26 AM Author Share Posted August 8, 2018 at 07:26 AM https://www.amazon.it/gp/product/B01FLOQNMI/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1 I have these... I tried with another tag of the same brand and it's the same... Quote Link to comment Share on other sites More sharing options...
borg Posted August 8, 2018 at 08:19 AM Share Posted August 8, 2018 at 08:19 AM Looking at your code, you do: nr.authenticateMifareClassicPage(5, (short) 0,keys); nr.requestPage(5); short[] data=nr.getPage(); System.out.println(Arrays.toString(data)); I think you should first call nr.authenticateMifareClassicPage(5, (short) 0,keys); then in the state STATE_AUTHENTICATING_MIFARE_CLASSIC_PAGE_READY call nr.requestPage(5); and then in the state STATE_REQUEST_PAGE_READY call short[] data=nr.getPage(); System.out.println(Arrays.toString(data)); Does it work when you do that? Quote Link to comment Share on other sites More sharing options...
wbackup83 Posted August 8, 2018 at 10:09 AM Author Share Posted August 8, 2018 at 10:09 AM Nope...it does not enter in the state ...never.. I attach the java file so you can try it if you want thanks again for the supportExampleScanForTags.java Quote Link to comment Share on other sites More sharing options...
borg Posted August 8, 2018 at 12:02 PM Share Posted August 8, 2018 at 12:02 PM Hi, it works after a few tweaks: olaf@pc2:~/build20/java$ javac -cp Tinkerforge.jar:. ExampleScanForTags.java olaf@pc2:~/build20/java$ java -cp Tinkerforge.jar:. ExampleScanForTags Press key to exit Found tag of type 0 with ID [6d b8 97 f7] Ready page ready [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] The Problem with your code is that you call "nr.requestTagID(currentTagType);" every time that the Bricklet is in idle state. But it goes into idle state after it reaches any of the new states. So you call requestTagID in a loop. For me it started to work immediately after i commented out the if(idle) {...} block. Quote Link to comment Share on other sites More sharing options...
wbackup83 Posted August 8, 2018 at 12:51 PM Author Share Posted August 8, 2018 at 12:51 PM can you please attach the code or paste it? Quote Link to comment Share on other sites More sharing options...
borg Posted August 8, 2018 at 01:22 PM Share Posted August 8, 2018 at 01:22 PM See attachment. Edit: Dont forget to change the UID back to yours.ExampleScanForTags.java Quote Link to comment Share on other sites More sharing options...
wbackup83 Posted August 8, 2018 at 01:35 PM Author Share Posted August 8, 2018 at 01:35 PM This works if I put the tag on the reader when i run the main... What i need is to scan and be active for other tags ... for this reason I don't understand where to put the loop ... Quote Link to comment Share on other sites More sharing options...
borg Posted August 8, 2018 at 01:48 PM Share Posted August 8, 2018 at 01:48 PM Well, if no tag is there you will get into the state STATE_REQUEST_TAG_ID_ERROR and you have to run requestTagID from there again. I attached a working program that runs in a loop. Please note: All of the steps can create an error. For example: What happens if someone removes the card after the authentication but before the page was read? In this case you probably want to scan for a tag again. You have to handle all of these states if you want it to be robust.ExampleScanForTags.java Quote Link to comment Share on other sites More sharing options...
wbackup83 Posted August 8, 2018 at 02:06 PM Author Share Posted August 8, 2018 at 02:06 PM It works like a charm! thanks again for your kind support...I really appreciated Quote Link to comment Share on other sites More sharing options...
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.