【问题标题】:ISO15693 (NfcV) / Tag-it HF-I commands throw tag lost exceptionISO15693 (NfcV) / Tag-it HF-I 命令抛出标签丢失异常
【发布时间】:2015-04-27 18:17:31
【问题描述】:

当我尝试为 NFC-V Tag-it HF-I Plus Inlay 标签收发命令时,大多数命令都会收到 TagLostException。

从我经历过的链接来看,这个异常可能是由不正确的命令引起的。

如何为 Nfc V Tag-it HF-I Plus Inlay 创建正确的 ISO15693 命令字节[]?

数据表显示了支持的命令,但如何创建正确的命令来读取 NFC-V 标签?

文档中的命令是:

我要读取的标签是:

代码:

Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
Log.i(TAG, " tag "+tag );
if (tag != null) {
    NfcV tech = NfcV.get(tag);
    Log.i(TAG, " tech "+tech  );

    if (tech != null) {
    try {
        tech.connect();
        Log.i(TAG, " on connect" );
        byte[] data = tech.transceive(Nfcv.InventoryRequest());
        Log.i(TAG, "resp data " + data);
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < data.length; i++) {
            byte b = data[i];
            System.out.println(b);
            sb.append(String.format("%02X ", b));
        }
        System.out.println("response: " + sb.toString());
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            tech.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我经历了以下:

编辑

我尝试过的命令:

public class Nfcv {
    // texas get system info -> tag lost exception
    public static byte[] GET_SYSTEM_INFO = ReadNfcActivity.hexStringToByteArray("010A00030418002B0000");

    //read multiple blocks -> not working
    byte[] read_multiple_blocks= ReadNfcActivity.hexStringToByteArray("010C00030418002301020000");

    byte[] readSingleBlock = ReadNfcActivity.hexStringToByteArray("010B000304180020050000");

    // readUID generic command -> not working
    public static byte[] readUID = ReadNfcActivity.hexStringToByteArray("FFCA000000");

    public static  byte[] InventoryRequest(){
        //working response: 00 00 3A E5 00 04 00 00 07 E0
        // R/0 UID is E0 07 00 00 04 00 E5 3A 00 00 (reverse)
        return new byte[] { (byte) 0x24, (byte) 0x01, (byte) 0x00};
    }

    //-> not working
    private byte[] ReadSingleBlockUnadressed(byte blocknumber) {
        return new byte[] {(byte) 0x00, (byte) 0x20, blocknumber};
    }

    //-> response 03
    public static byte[] get_system_info = {0x00,(byte)0x2B};
}

【问题讨论】:

  • 如果您添加相关代码可能会有所帮助(例如Nfcv.InventoryRequest()是什么?)
  • @MichaelRoland 请看我的编辑

标签: android tags nfc rfid iso-15693


【解决方案1】:

Android NFC 堆栈会自动为您处理轮询(搜索各种标签技术/协议的标签)、防冲突(在一种标签技术/协议中枚举多个标签)和激活(启动与一个特定标签的通信)。因此,您不应该自己发送用于防碰撞和激活的命令。 Inventory 命令就是这样一种命令(用于发现范围内的标签)。

关于 Inventory 命令,通常不需要发送此命令。 Android NFC API 已经提供了您将从该命令获得的所有信息:

  • 您可以使用tag.getId() 获取UID。
  • 您可以使用tech.getDsfId() 获取DSFID。

此外,为了让您的应用能够在不同的 Android 设备平台(= 不同的 NFC 堆栈)上可靠运行,您应该始终使用指定版本的命令(即作为请求的一部分发送的 Address_flag 和 UID)。见Android NfcV get information command returns only one byte

如果要读取/写入标签,可以使用 READ_SINGLE_BLOCK 和 WRITE_SINGLE_BLOCK 命令:

byte[] tagUid = tag.getId();  // store tag UID for use in addressed commands
int blockAddress = 0; // block address that you want to read from/write to

READ_SINGLE_BLOCK:

byte[] cmd = new byte[] {
    (byte)0x20,  // FLAGS
    (byte)0x20,  // READ_SINGLE_BLOCK
    0, 0, 0, 0, 0, 0, 0, 0,
    (byte)(blockAddress & 0x0ff)
};
System.arraycopy(tagUid, 0, cmd, 2, 8);

byte[] response = tech.transceive(cmd);

WRITE_SINGLE_BLOCK:

byte[] cmd = new byte[] {
    (byte)0x60,  // FLAGS
    (byte)0x21,  // WRITE_SINGLE_BLOCK
    0, 0, 0, 0, 0, 0, 0, 0,
    (byte)(blockAddress & 0x0ff),
    ... // data block that you want to write (same length as the blocks that you read)
};
System.arraycopy(tagUid, 0, cmd, 2, 8);

byte[] response = tech.transceive(cmd);

【讨论】:

  • 作为数据点,即使使用寻址,我的 Moto X Play 仍然会抛出标签丢失异常。非常有用的答案。
猜你喜欢
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
  • 2015-07-10
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
相关资源
最近更新 更多