我正在尝试在Android手机(Nexus 4)上实施不同的NfcV命令。目前,我正在使用these标签。根据数据表,他们应该支持“Be Quiet”命令。
不幸的是,我无法让下面的源代码正常工作。我希望“Stay Quiet”命令之后的“Inventory”和“Read Single Block”命令失败,因为两个命令都是未解决的,这是Quiet状态中的一个标记应该忽略的。 但我仍然从标签中获得包含UID或有效负载的正确答案。
此外,我通过执行“保持安静”命令获得“标签丢失”异常。但是,根据ISO 15693-3,标签应该不对此命令作出响应,无论如何都可能导致此异常。
尽管如此,我猜这个代码中的“保持安静”命令有问题,但我无法弄清楚是什么。
感谢任何帮助。
源代码:
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};
}
答案 0 :(得分:2)
当您发送STAY QUITE命令时,您将标签从选定状态带到未选定状态。
然后你发送READ SINGLE BLOCK命令,标志值为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.
使用您在READ SINGLE BLOCK命令中使用的标志,即使未选择标记,您也已指示标记应答。这就是它起作用的原因。
对于您的用例,您希望Select_flag(位5)为1,Address_flag为零。
我建议你看一下ISO / IEC 15693-3标准。可以在此处在线找到它的副本:http://www.waazaa.org/download/fcd-15693-3.pdf
是的,你得到了#34;标签丢失了#34;例外,因为NFC服务不断检查标签的存在。在ISO15693的情况下,它可能通过发送背后的INVENTORY命令来实现,因为INVENTORY是所有ISO15693标签都能理解的少数命令之一。你无法控制这一点,因此它可能会干扰你试图使标记静音。