React Native HCE模拟Type4 NFC标签后APDU指令返回69:86求助
关于react-native-hce模拟NFC Type4标签后指令返回69:86的问题
问题详情
使用react-native-hce库在React Native中模拟NFC Type4标签,核心代码如下:
const startEmulation = useCallback(async () => { try { const session = await HCESession.getInstance(); // 创建标签内容 const efContent = 'HOLA'; // 创建模拟的NFC标签 const emulatedTag = new NFCTagType4({ type: NFCTagType4NDEFContentType.Text, content: efContent, writable: true, }); // 设置模拟应用 await session.setApplication(emulatedTag); // 启用会话 await session.setEnabled(true); // 处理状态更新 await session.handleStateUpdate(HCESession.Events.HCE_STATE_WRITE_FULL); // 获取标签内容 setTagContent(emulatedTag.content.content); } catch (error) { console.error('模拟出错:', error); } }, []);
标签已成功模拟,支持IsoDep和NfcA技术。发送SELECT应用指令00:A4:04:00:07:D2:76:00:00:85:01:01可返回90:00,但后续几乎所有指令都返回69:86,参考NFC Forum T4T规范仍无法解决问题。
排查与解决建议
- 检查NDEF文件结构完整性:T4T规范要求标签必须包含NDEF文件控制TLV、指定的NDEF文件(EF ID通常为0x0001)及正确的访问控制配置。确认react-native-hce生成的模拟标签是否完整包含这些结构,必要时手动构造符合规范的文件系统。
- 确保后续指令前先选中EF:
69:86错误表示"无当前选中的EF,指令不被允许"。在执行读/写等后续指令前,必须先发送SELECT EF指令,例如选中NDEF文件的APDU:00:A4:00:0C:02:00:01,收到90:00响应后再执行其他操作。 - 修正状态处理逻辑:代码中提前主动调用
handleStateUpdate(HCESession.Events.HCE_STATE_WRITE_FULL)会导致会话状态异常,该方法应在实际接收到写操作完成的事件回调中触发,而非手动提前调用。 - 验证库版本兼容性:检查react-native-hce是否存在T4T模拟相关的已知bug,尝试升级到最新版本,或查看项目issue列表获取同类问题的解决方案。
- 捕获完整交互日志:使用NFC调试工具记录完整的APDU交互流程,确认后续指令的格式是否符合T4T规范,以及模拟标签对EF选择指令的响应是否正常。
内容的提问来源于stack exchange,提问作者Jandry Nexia
相关产品推荐
相关产品推荐

