【问题标题】:Read data from NFC that is put after NDEF content?从 NDEF 内容之后的 NFC 读取数据?
【发布时间】:2014-12-03 11:22:28
【问题描述】:

假设我们有一个自定义芯片,其中包含存储为 NDEF 的数据以及存储在 标准 NDEF 数据之后的自定义数据。我们如何使用 Android 读取这些数据?

【问题讨论】:

    标签: android android-intent nfc ndef


    【解决方案1】:

    这在很大程度上取决于您使用的标签硬件类型。 NDEF 是一个抽象层,可让您在任何标签硬件上以相同的方式处理数据。在 NDEF 层之后,每个标签平台都有自己的内存组织和自己的一组命令来访问数据。

    您可以在NFC Forum's website 上购买每个标准化标签平台的规范作为“X 型标签操作规范”。


    例如,如果您有一个类型 2 的标签(它具有扁平的内存结构并使用简单的读/写命令来访问该内存),则将从第 4 页开始存储 NDEF 消息。您可以使用更高的页面来存储专有数据(例如从第 16 页开始)然后您可以使用 NfcA 标签技术从 Android 访问该标签:

    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
    NfcA nfcA = NfcA.get(tag);
    nfcA.connect();
    
    byte[] result = nfcA.transceive(new byte[] {
        (byte)0x30,  /* CMD = READ */
        (byte)0x10   /* PAGE = 16  */
    });
    

    【讨论】:

    • @Martin 感谢您的编辑。自 2014 年以来发生了很多事情,不幸的是,NFC 论坛退了一大步,决定通过将其规范置于付费墙后面来反对开放。
    • 遗憾的是,价格标签完全超出了单个开发人员的范围; NXP 有我想要的东西。代码0x30 与参数地址0x04 直到x0F 将是MIFARE Ultralight ® 的答案。
    【解决方案2】:

    是的,这是可能的。您可以使用transceive(byte[] data)方法向标签发送RFID命令。

    发送哪些命令取决于您使用的标签类型。您应该阅读您的标签类型(ISO14443 或 ISO15693)的命令结构。为了使用这样的命令,您可能需要更深入地研究标准以了解如何创建正确的命令序列。

    以 ISO15693 为例,读取单块,命令代码 0x20(未经测试):

    byte[] readSingleBlock(int block) throws IOException {
    
        byte[] command = new byte[3];
            command[0] = 0x12;          // flags
            command[1] = 0x20;          // read single block command
            command[2] = (byte) block;
    
        byte result[] = nfcv.transceive(command);
        return result;
    }
    

    【讨论】:

    • corvairjo,你能解释一下你所说的“阻止”是什么意思吗?我已经通过 intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 读取了数据以前不知道现在应该遵循什么方式(?)
    • 正如 Michael Roland 也提到的,具有简单结构的 RFID 标签以(通常)4 字节的块进行组织。您需要弄清楚您的 NDEF 消息在哪个块中结束,然后您可以使用以下块进行直接访问。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多