我正在尝试用nfc库读取一个ISO15693射频识别标签:
下面是关于标签的更多信息:http://img42.com/gw07d+
标记ID被正确读取,但标记中的数据没有读取。
onCreate方法:
// initialize NFC
nfcAdapter = NfcAdapter.getDefaultAdapter(this);
nfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, this.getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);onNewIntent方法:
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction()) || NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) {
currentTag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
byte[] id = currentTag.getId();
Tag_data_TextDisplay.setText("TagId:" + Common.getHexString(id));
for (String tech : currentTag.getTechList()) {
if (tech.equals(NfcV.class.getName())) {
NfcV nfcvTag = NfcV.get(currentTag);
try {
nfcvTag.connect();
txtType.setText("Hello NFC!");
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "Could not open a connection!", Toast.LENGTH_SHORT).show();
return;
}
try {
byte[] cmd = new byte[]{
(byte) 0x00, // Flags
(byte) 0x23, // Command: Read multiple blocks
(byte) 0x00, // First block (offset)
(byte) 0x04 // Number of blocks
};
byte[] userdata = nfcvTag.transceive(cmd);
userdata = Arrays.copyOfRange(userdata, 0, 32);
txtWrite.setText("DATA:" + Common.getHexString(userdata));
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "An error occurred while reading!", Toast.LENGTH_SHORT).show();
return;
}
}
}
}userdata包含一个值为0x02 ({ 0x02 })的字节,就在收发信方法完成之后。
发布于 2015-02-09 16:03:50
因此,您从{ 0x02 }方法接收到一个值。正如在this thread中所发现的,当您使用未寻址的命令时,可能会发生这种情况。因此,您应该始终通过NfcV发送寻址命令(因为这似乎在Android设备上的所有NFC芯片组都支持)。在您的示例中,您可以使用类似的方法生成一个地址读取多个块命令:
int offset = 0; // offset of first block to read
int blocks = 1; // number of blocks to read
byte[] cmd = new byte[]{
(byte)0x60, // flags: addressed (= UID field present)
(byte)0x23, // command: READ MULTIPLE BLOCKS
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, // placeholder for tag UID
(byte)(offset & 0x0ff), // first block number
(byte)((blocks - 1) & 0x0ff) // number of blocks (-1 as 0x00 means one block)
};
System.arraycopy(id, 0, cmd, 2, 8);
byte[] response = nfcvTag.transceive(cmd);https://stackoverflow.com/questions/28405558
复制相似问题