安卓手机如何读取ISO15693 RFID标签

10

我正尝试使用NFC Android库读取ISO15693 RFID标签:

以下是有关标签的更多信息: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;
                }
            }
        }
    }

userdatatransceive方法完成后包含一个值为0x02{ 0x02 })的单个字节。


和它应该读什么? - Randyka Yudhistira
@RandykaYudhistira 我在哪里读取标签 http://img42.com/mHBPa+ - yoshgoodman
如果您能展示 nfcvTag.transceive(cmd); 的实际结果(不需要填充到32个字节),那将非常有帮助。此外,请确保您的字节数组转换为十六进制时,每个字节都填充为两个十六进制数字(否则将很难解释该值)。 - Michael Roland
@MichaelRoland 我更新了问题,并加入了字节转十六进制的转换器:这里是.transceive的结果 http://img42.com/7c30r+ - yoshgoodman
请问您的Common类中正在发生什么?能否分享一下您的Common类的代码? - Osama Shakeel
1个回答

8

所以您从transceive方法中收到了一个值{ 0x02 }。在这个线程中发现,当您使用未寻址的命令时可能会发生这种情况。因此,您应该始终通过NfcV发送寻址的命令(因为这似乎在Android设备上支持所有NFC芯片组)。在您的情况下,您可以使用类似以下内容来生成一个寻址的READ MULTIPLE BLOCKS命令:

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);

System.arraycopy(id, 0, cmd, 2, 8); 是什么意思? - yoshgoodman
如Java文档所述:“从数组[id]的偏移量[0]开始,将[8]个元素复制到从偏移量[2]开始的数组[cmd]中”。 - Michael Roland
在这种情况下,它将标签的UID(地址)(您先前使用byte[] id = currentTag.getId();检索到的)复制到命令帧中(覆盖占位符字节)。 - Michael Roland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接