如何用纯字节数组写入支持NfcV/Ndef的NFC标签(规避Ndef额外封装)
向支持NfcV/Ndef的NFC标签写入纯字节数组的解决方案
核心思路
既然你的标签支持NfcV(ISO 15693标准),直接跳过NDEF封装层,用NfcV的底层通信命令写入原始字节数组是唯一符合需求的方案——NDEF相关API(包括NdefRecord)都会自动添加TNF、类型字段等头部信息,无法写入纯数据。而MifareClassic返回null说明标签不属于MIFARE Classic系列,不用再尝试。
实现步骤
- 从Tag对象中获取
NfcV实例,这是操作ISO 15693标签的核心类 - 建立与标签的连接
- 构造ISO 15693标准的写入命令帧(包含目标块地址、要写入的纯字节数组)
- 通过
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
相关产品推荐
相关产品推荐

