通过Android NFC读取ISO15693 RFID标签会导致不正确的数据输出
我们有一些ISO15693标签,我们使用RFID阅读器读取。今天,我开始在Android上开发一个示例应用程序,使用Android 6(API 23)的通过Android NFC读取ISO15693 RFID标签会导致不正确的数据输出,android,tags,nfc,rfid,iso-15693,Android,Tags,Nfc,Rfid,Iso 15693,我们有一些ISO15693标签,我们使用RFID阅读器读取。今天,我开始在Android上开发一个示例应用程序,使用Android 6(API 23)的NfcV读取相同的标签 我能够从标记中读取一些数据,但数据中有一些意外字符。这是我使用的代码: private void readTagData(Tag tag) throws Exception { byte[] id = tag.getId(); String strTag = new String(id, "UTF-8");
NfcV
读取相同的标签
我能够从标记中读取一些数据,但数据中有一些意外字符。这是我使用的代码:
private void readTagData(Tag tag) throws Exception {
byte[] id = tag.getId();
String strTag = new String(id, "UTF-8");
boolean techFound = false;
for (String tech : tag.getTechList()) {
if (tech.equals(NfcV.class.getName())) {
techFound = true;
NfcV nfcvTag = NfcV.get(tag);
try {
nfcvTag.connect();
} catch (IOException e) {
Toast.makeText(this, "IO Exception", Toast.LENGTH_LONG).show();
return;
}
try {
int offset = 0;
int blocks = 19;
byte[] cmd = new byte[]{
(byte)0x60,
(byte)0x23,
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, // placeholder for tag UID
(byte)(offset & 0x0ff),
(byte)((blocks - 1) & 0x0ff)
};
System.arraycopy(id, 0, cmd, 2, 8);
byte[] response = nfcvTag.transceive(cmd);
response = Arrays.copyOfRange(response, 0, 96);
String strData = new String(response, "UTF-8");
mTextView.setText("TAG:" + strTag + " DATA:" + strData);
} catch (IOException e) {
Toast.makeText(this, "An error occurred while reading", Toast.LENGTH_SHORT).show();
return;
}
try {
nfcvTag.close();
} catch (IOException e) {
Toast.makeText(getApplicationContext(), "Unable to close the connection!", Toast.LENGTH_SHORT).show();
return;
}
}
}
}
输出
标签ID(UTF-8解码):{��可湿性粉剂�
数据(UTF-8解码):����1ead��1234��5678��5000��00B1��2345��6181��5064��1602��2016��1603��2016��1602��2018��0011��8899��0002��0920��16����
十六进制表示的数据字节:
0000316561640031 3233340035363738
0035303030003030 4231003233343500
3631383100353036 3400313630320032
3031360031363033 0032303136003136
3032003230313800 3030313100383839
3900303030320030 3932300031360000
0000316561640031 3233340035363738
0035303030003030 4231003233343500
3631383100353036 3400313630320032
3031360031363033 0032303136003136
3032003230313800 3030313100383839
3900303030320030 3932300031360000
现在,这部分数据是正确的,但我不确定为什么会出现这种情况。”�" 存在字符。标记ID也不正确
我分别尝试将字节数组“response”和标记ID转换为十六进制字符串,然后转换为ASCII,结果相同。您收到的值是您发送的命令的预期响应: 您发送命令READ MULTIPLE BLOCKS(命令代码0x23),参数化为从偏移量0开始读取19个块。标记的块大小似乎为4字节 此外,您还指定了一个标志字节0x60,该字节转换为标志地址标志和选项标志。地址标志使命令寻址(即,您必须指定目标标记的UID,这是正确的)。选项_标志使标记除了返回块数据本身外,还返回块安全状态。因此,标记的响应如下所示: +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-...-+--------+-------+-------+-------+-------+ | FLAGS | BSS_0 | BLOCK_DATA_0 | BSS_1 | BLOCK_DATA_1 | ... | BSS_18 | BLOCK_DATA_18 | +-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-------+-...-+--------+-------+-------+-------+-------+ 然后,答复将是: +-------+-------+-------+-------+-------+-------+-------+-------+-------+-...-+-------+-------+-------+-------+ | FLAGS | BLOCK_DATA_0 | BLOCK_DATA_1 | ... | BLOCK_DATA_18 | +-------+-------+-------+-------+-------+-------+-------+-------+-------+-...-+-------+-------+-------+-------+
最后,将标签ID解码为UTF-8对于ISO/IEC 15693标签来说毫无意义。我不确定您期望的值是多少,但可能您只是想将ID的字节转换为十六进制表示形式。也许他们在不使用UTF-8的情况下将其写入RFID标签肯定旧RFID应用程序在rea上使用UTF-8下面是来自旧应用程序的代码:result=byteArray!=null?新字符串(byteBuf.array(),“UTF-8”):null;请尝试使用拉丁语-1而不是UTF-8。标记ID肯定不是您可以合理地解释为UTF-8字符串的内容。关于剩余数据:是否只有部分块以UTF-8编码?您是否确定数据从块0开始?您可能还希望显示这些字节arra的十六进制表示形式对我们来说是的,而且,由于您似乎拥有某个“旧应用程序”(一个似乎有效的应用程序)的代码,您也不希望显示其他应用程序的相关代码段(执行actaul读取和解释)…啊,当然,您希望删除响应的第一个字节(即标志字节)仅将响应的数据字段转换为UTF-8字符串。 +-------+-------+-------+-------+-------+-------+-------+-------+-------+-...-+-------+-------+-------+-------+ | FLAGS | BLOCK_DATA_0 | BLOCK_DATA_1 | ... | BLOCK_DATA_18 | +-------+-------+-------+-------+-------+-------+-------+-------+-------+-...-+-------+-------+-------+-------+
response = Arrays.copyOfRange(response, 1, 4 * blocks);