通过Android NFC读取ISO15693 RFID标签会导致不正确的数据输出

通过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");

我们有一些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");
    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 42310032333‌43500 363138310035303‌6 3400313630320032 303‌1360031363033 0032303‌136003136 30320032303‌13800 303031310038383‌9 3900303030320030 393‌​2300031360000 0000316561640031 3233340035363738 0035303030003030 42310032333‌43500 363138310035303‌6 3400313630320032 303‌1360031363033 0032303‌136003136 30320032303‌13800 303031310038383‌9 3900303030320030 393‌​2300031360000 现在,这部分数据是正确的,但我不确定为什么会出现这种情况。”�" 存在字符。标记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);