如何读取NFC标签的实际数据?NFC开发新手求助
读取NFC标签实际数据的方案
首先你打印的日志是NFC标签的基础技术元数据,不是实际存储的用户数据:
- 银行卡日志里的
isodep是它用的ISO-DEP协议参数(符合EMV支付标准),nfca是NFC-A类型标签的硬件参数(比如identifier是标签唯一ID,sak是标签应答标识) - 健身卡日志里的
mifareclassic说明它是MIFARE Classic卡,日志给出了卡的容量(1024字节)、扇区/块数量等硬件属性
要读取标签里的实际数据,需要根据卡的类型调用对应API处理:
一、读取MIFARE Classic健身卡数据
这类卡需要先验证扇区密钥,再读取对应块的存储内容,示例代码:
void _startNFCReading() async { try { bool isAvailable = await NfcManager.instance.isAvailable(); if (isAvailable) { NfcManager.instance.startSession( onDiscovered: (NfcTag tag) async { MifareClassic? mifareCard = MifareClassic.fromTag(tag); if (mifareCard != null) { try { await mifareCard.connect(); // 多数空白/民用MIFARE卡用默认密钥FFFFFFFFFFFF,若不行需联系卡发行方获取 bool authSuccess = await mifareCard.authenticateSectorWithKeyA(0, MifareClassic.keyDefault); if (authSuccess) { // 读取扇区0的块0数据(每个扇区最后一块是密钥块,请勿随意写入) Uint8List blockData = await mifareCard.readBlock(0); debugPrint('块0原始数据: $blockData'); // 若存储的是文本,转成字符串输出 debugPrint('文本内容: ${String.fromCharCodes(blockData)}'); } else { debugPrint('扇区验证失败,密钥不匹配'); } await mifareCard.close(); } catch (e) { debugPrint('读取MIFARE卡出错: $e'); } } await NfcManager.instance.stopSession(); }, ); } else { debugPrint('NFC不可用'); } } catch (e) { debugPrint('NFC初始化出错: $e'); } }
二、读取银行卡数据
银行卡属于EMV标准IC卡,需发送APDU指令交互,仅能读取公开基本信息(敏感数据需合法权限),示例代码:
void _startNFCReading() async { try { bool isAvailable = await NfcManager.instance.isAvailable(); if (isAvailable) { NfcManager.instance.startSession( onDiscovered: (NfcTag tag) async { IsoDep? bankCard = IsoDep.fromTag(tag); if (bankCard != null) { try { await bankCard.connect(); // 发送APDU指令选择EMV支付应用(以Visa为例) Uint8List selectApdu = Uint8List.fromList([0x00, 0xA4, 0x04, 0x00, 0x07, 0xA0, 0x00, 0x00, 0x00, 0x03, 0x10, 0x10, 0x00]); Uint8List response = await bankCard.transceive(selectApdu); debugPrint('应用选择响应: $response'); // 可根据EMV规范发送更多指令读取公开信息(如卡号片段) await bankCard.close(); } catch (e) { debugPrint('读取银行卡出错: $e'); } } await NfcManager.instance.stopSession(); }, ); } else { debugPrint('NFC不可用'); } } catch (e) { debugPrint('NFC初始化出错: $e'); } }
注意:未经授权读取他人银行卡敏感数据涉嫌违法,开发时仅可测试公开字段。
内容的提问来源于stack exchange,提问作者mana
相关产品推荐
相关产品推荐

