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 [页地址]
注意事项
- 确保设备支持NFC,且应用已获取NFC权限
- 操作前需唤醒标签并建立有效连接
- 不同NTAG型号的寄存器地址可能略有差异,需参考对应官方文档
内容的提问来源于stack exchange,提问作者Samarth Vaish
相关产品推荐
相关产品推荐

