全部博文(282)
分类: Java
2014-11-26 21:17:34
转载文章
源代码:
NfcV nfcv = NfcV.get(mtag); try{ nfcv.connect(); //Connect } catch(IOException e){ mUIDs = mUIDs + "\nConnection Error 1"; } byte[] response1 = {(byte) 0x00}; try{ byte[] UIDreq1 = InventoryRequest(); //Inventory Request response1 = nfcv.transceive(UIDreq1); } catch(IOException e){ mUIDs = mUIDs + "\nInventory Error 1"; } mUIDs = mUIDs +"\n" + bytesToHex(response1); byte[] UID = response2UID(response1); mUIDs = mUIDs + "\n" + bytesToHex(UID); try{ byte[] command = ReadSingleBlockUnadressed((byte) 0x04); //Reading Single Block byte[] data = nfcv.transceive(command); mUIDs = mUIDs +"\n"+bytesToHex(data); }catch(IOException e){ Log.e("Reading Single Block", e.getMessage()); mUIDs = mUIDs + "\nReading Error"; } try{ try{ byte[] command = StayQuiet(UID); //Stay Quiet, SHOULD FAIL nfcv.transceive(command); }catch(TagLostException e){ Log.e("Stay Quiet", e.getMessage()); mUIDs = mUIDs + "\nTag was lost."; } }catch(IOException x){ mUIDs = mUIDs + "\nStay Quiet Error"; } try{ byte[] command = ReadSingleBlockUnadressed((byte) 0x04); //Reading Single Block byte[] data = nfcv.transceive(command); mUIDs = mUIDs +"\n"+bytesToHex(data); }catch(IOException e){ Log.e("Reading Single Block", e.getMessage()); mUIDs = mUIDs + "\nReading Error"; } try{ byte[] UIDreq2 = InventoryRequest(); //Inventory Request, SHOULD FAIL byte[] response2 = nfcv.transceive(UIDreq2); mUIDs = mUIDs +"\n" + bytesToHex(response2); } catch(IOException e){ mUIDs = mUIDs + "\nInventory Error 2"; } try{ nfcv.close(); //Disconnect } catch(IOException x){ mUIDs = mUIDs + "\nDisconnection Error 1"; } mTagTextView.setText(mUIDs);
具有以下功能:
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray(); public static String bytesToHex(byte[] bytes) { char[] hexChars = new char[bytes.length * 2]; int v; for ( int j = 0; j < bytes.length; j++ ) { v = bytes[j] & 0xFF; hexChars[j * 2] = hexArray[v >>> 4]; hexChars[j * 2 + 1] = hexArray[v & 0x0F]; } return new String(hexChars); } private byte[] response2UID(byte[] response){ byte[] UID = new byte[response.length-2]; for(int i = 2; i < response.length; i++){ UID[i-2]=response[i]; } return UID; } private byte[] ReadSingleBlockUnadressed(byte blocknumber){ return new byte[] {(byte) 0x00, (byte) 0x20, blocknumber}; } private byte[] StayQuiet(byte[] UID){ byte[] beQuiet = new byte[] {(byte) 0x04, (byte) 0x02}; byte[] command = combine(beQuiet, UID); return command; } private byte[] InventoryRequest(){ return new byte[] { (byte) 0x24, (byte) 0x01, (byte) 0x00}; }
当你送的很呆命令你从选定为未选中状态带来了标记。
然后你送出的读取单个块标志值为 0x00 的命令。
根据 ISO/IEC 15693-3 标准这意味着 Select_flag (第 5 位) 是为零。该标准定义的用法此位,如下所示:
Bit 5 = 0: Request shall be executed by any VICC according to the setting of Address_flag Bit 5 = 1: Request shall be executed only by VICC in selected state
Address_flag 在此处定义 (它的值为零):
Bit 6 = 0: Request is not addressed. UID field is not present. It shall be executed by any VICC. Bit 6 = 1: Request is addressed. UID field is present. It shall be executed only by the VICC whose UID matches the UID specified in the request.
与您读取单个块命令中使用过的标志已指示要回答即使它不选定的标记。这就是为什么它的工作。
为您使用的情况您希望 Select_flag (位 5) 是一个和 Address_flag 为零。
我建议你看看 ISO/IEC 15693-3 标准。它的一个副本可以找到在线在这里:
Btw,你得到"丢失了标记"的异常,因为 NFC 服务正在不断地检查标记的存在。如 ISO15693 可能是通过发送库存命令你的背后,由于库存是所有 ISO15693 标签都了解的几个命令之一。
你有没有控制关于这一点,所以很可能它会干扰您尝试出标记保持沉默。