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

React Native(非Expo):用react-native-nfc-manager实现NTAG216密码管控

React Native 中 NTAG216 NFC 标签密码保护实现方案

1. 使用 react-native-nfc-manager 实现密码保护

可以实现,该库支持发送原始NFC指令,NTAG216的密码保护依赖写入特定配置寄存器和执行密码验证命令,无需库提供封装好的API,直接通过底层通信即可完成。

核心原理

NTAG216的密码保护依赖三个关键部分:

  • PWD:4字节密码,存储在标签的0x2C-0x2F页
  • PACK:2字节验证响应码,存储在0x30-0x31页
  • 配置寄存器:控制哪些操作需要密码验证(比如写入特定页、读取敏感数据等)

具体实现步骤

步骤1:初始化NFC管理器

确保完成库的基础配置(权限申请、原生项目配置)后,初始化管理器:

import NfcManager, { NfcTech } from 'react-native-nfc-manager';

NfcManager.start();

步骤2:设置密码与保护配置

先连接标签,再发送写入指令配置PWD、PACK和访问控制寄存器:

async function setNtagPassword(password, pack) {
  try {
    await NfcManager.requestTechnology(NfcTech.IsoDep);
    // 写入4字节PWD到地址0x2C(0xA2是写单页命令)
    const writePwdCmd = [0xA2, 0x2C, ...password];
    await NfcManager.transceive(writePwdCmd);
    // 写入2字节PACK到地址0x30,剩余2字节填0(单页共4字节)
    const writePackCmd = [0xA2, 0x30, ...pack, 0x00, 0x00];
    await NfcManager.transceive(writePackCmd);
    // 配置访问控制:设置CFG1寄存器(0x2B),示例为所有写操作需密码验证
    const writeCfgCmd = [0xA2, 0x2B, 0x00, 0x00, 0x07, 0x00];
    await NfcManager.transceive(writeCfgCmd);
    console.log("密码配置成功");
  } catch (err) {
    console.error("配置失败:", err);
  } finally {
    NfcManager.cancelTechnologyRequest();
  }
}

// 使用示例:密码设为[0x12,0x34,0x56,0x78],PACK设为[0xAB,0xCD]
setNtagPassword([0x12,0x34,0x56,0x78], [0xAB,0xCD]);

步骤3:验证密码并执行受保护操作

执行受保护的写入/读取操作前,先发送密码验证命令:

async function authenticateNtag(password, expectedPack) {
  try {
    await NfcManager.requestTechnology(NfcTech.IsoDep);
    // 发送密码验证命令(0x1B)+ 4字节密码
    const authCmd = [0x1B, ...password];
    const response = await NfcManager.transceive(authCmd);
    // 验证响应是否匹配预设的PACK
    if (response.slice(0,2).toString() === expectedPack.toString()) {
      console.log("密码验证成功");
      // 执行受保护操作
      await writeProtectedPage();
    } else {
      console.error("密码验证失败");
    }
  } catch (err) {
    console.error("验证出错:", err);
  } finally {
    NfcManager.cancelTechnologyRequest();
  }
}

async function writeProtectedPage() {
  // 写入受保护的0x04页示例
  const writeCmd = [0xA2, 0x04, 0x4E, 0x46, 0x43, 0x01];
  await NfcManager.transceive(writeCmd);
}

提示:不同访问控制需求需修改CFG寄存器配置,具体参数参考NTAG216官方 datasheet。


2. 替代方案与策略

如果react-native-nfc-manager无法满足需求,可考虑以下方案:

方案1:自定义原生模块

直接基于Android的NfcAdapter和iOS的CoreNFC开发原生桥接模块,完全控制NFC通信流程:

  • Android:使用IsoDep.transceive()发送原始指令
  • iOS:使用NFCISO7816Tag发送APDU命令

方案2:其他第三方库

  • react-native-nfc:部分版本支持更底层的NFC操作,社区活跃度略低
  • react-native-nfc-pwd:针对NTAG系列标签密码保护封装的小型库(需确认版本兼容性)

方案3:直接发送APDU命令

无论使用哪个库,核心都是发送符合NTAG216协议的APDU命令,关键命令包括:

  • 写单页:0xA2 [页地址] [4字节数据]
  • 密码验证:0x1B [4字节密码]
  • 读单页:0x30 [页地址]

注意事项

  1. 确保设备支持NFC,且应用已获取NFC权限
  2. 操作前需唤醒标签并建立有效连接
  3. 不同NTAG型号的寄存器地址可能略有差异,需参考对应官方文档

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 22:30:30