You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用纯字节数组写入支持NfcV/Ndef的NFC标签(规避Ndef额外封装)

向支持NfcV/Ndef的NFC标签写入纯字节数组的解决方案

核心思路

既然你的标签支持NfcV(ISO 15693标准),直接跳过NDEF封装层,用NfcV的底层通信命令写入原始字节数组是唯一符合需求的方案——NDEF相关API(包括NdefRecord)都会自动添加TNF、类型字段等头部信息,无法写入纯数据。而MifareClassic返回null说明标签不属于MIFARE Classic系列,不用再尝试。

实现步骤

  1. 从Tag对象中获取NfcV实例,这是操作ISO 15693标签的核心类
  2. 建立与标签的连接
  3. 构造ISO 15693标准的写入命令帧(包含目标块地址、要写入的纯字节数组)
  4. 通过transceive()方法发送命令,完成写入

修改后的Java代码

private void writeRawBytes(byte[] rawData, Tag tag) throws IOException {
    // 获取NfcV实例
    NfcV nfcV = NfcV.get(tag);
    if (nfcV == null) {
        throw new IOException("标签不支持NfcV技术");
    }

    try {
        nfcV.connect();

        // 构造ISO 15693写入命令:Flag(0x02) + Command(0x21) + 标签UID占位 + 块地址 + 数据
        // 块地址需根据标签实际可写入块调整,示例为写入第0块
        int blockAddress = 0x00;
        byte[] command = new byte[4 + rawData.length];
        command[0] = (byte) 0x02; // Flag:单标签访问,不加密
        command[1] = (byte) 0x21; // Command:Write Single Block
        command[2] = (byte) 0x00; // UID长度(0表示不发送UID,适用于单标签场景)
        command[3] = (byte) blockAddress; // 目标块地址
        System.arraycopy(rawData, 0, command, 4, rawData.length);

        // 发送命令并校验响应
        byte[] response = nfcV.transceive(command);
        if (response == null || response.length == 0 || response[0] != (byte) 0x00) {
            throw new IOException("写入失败,响应:" + Arrays.toString(response));
        }
    } finally {
        if (nfcV.isConnected()) {
            nfcV.close();
        }
    }
}

注意事项

  • 块地址与数据长度:不同NfcV标签的块大小、可访问块范围不同,需根据标签规格调整blockAddress,确保写入数据长度与块大小匹配(比如多数标签块大小为4/8字节,若数据超长需分块写入)
  • 命令参数适配:多标签场景需修改Flag字段并添加标签UID;加密标签需补充加密相关参数
  • 响应校验:不同厂商标签的响应格式可能略有差异,需参考标签技术手册确认成功响应标识

内容的提问来源于stack exchange,提问作者Mauricio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:50:29