Android NFC读取ISO15693 RFID标签

Android NFC读取ISO15693 RFID标签,android,nfc,rfid,iso-15693,Android,Nfc,Rfid,Iso 15693,我正在尝试使用nfc android库读取ISO15693 RFID标签: 以下是有关标签的更多信息: 已正确读取标记ID,但标记中的数据未正确读取 onCreate方法: // initialize NFC nfcAdapter = NfcAdapter.getDefaultAdapter(this); nfcPendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, this.getClass()

我正在尝试使用nfc android库读取ISO15693 RFID标签:

以下是有关标签的更多信息:

已正确读取标记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
is包含一个值为
0x02
{0x02}
)的单字节,就在收发器方法完成后。

因此,您从
收发器
方法收到一个值为
{0x02}
。如中所示,当您使用未寻址的命令时,可能会发生这种情况。因此,您应该始终通过
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);

它应该读什么?@RandykaYudhistira,我在那里读过标签,如果你能给我们看一下
nfcvTag.transceive(cmd)的实际结果,那会很有帮助(不填充到32字节)。此外,您能否确保字节数组到十六进制的转换将每个字节填充为两个十六进制数字(否则很难解释值)。@MichaelRoland我用字节到十六进制的转换器更新了这个问题:这是的结果。transceive您能告诉我们在您的公共类中发生了什么吗?你能分享一下你的普通类的代码吗?
System.arraycopy(id,0,cmd,2,8)执行?如Java文档中所述:“将[8]个元素从数组[
id
],从偏移量[0]开始,复制到数组[
cmd
],从偏移量[2]开始。”在此上下文中,它将标记的UID(地址)(您以前使用
byte[]id=currentTag.getId();
)复制到命令框中(超过占位符字节)。