我正在尝试使用以下代码擦除 NFC 标签中的数据。目标是用零覆盖所有用户内存页面(从第 4 页到第 39 页)。然而,即使运行代码后,标签上的数据仍然保持不变。
import 'package:nfc_manager/nfc_manager.dart';
import 'package:nfc_manager/platform_tags.dart';
import 'dart:typed_data';
class NfcService {
final NfcManager _nfcManager = NfcManager.instance;
bool _isScanning = false;
Future<void> eraseTag() async {
if (_isScanning) return;
_isScanning = true;
try {
await _nfcManager.startSession(
onDiscovered: (NfcTag tag) async {
try {
final nfca = NfcA.from(tag);
if (nfca != null) {
try {
for (int page = 4; page < 40; page++) {
await nfca.transceive(
data: Uint8List.fromList([0xA0, page, 0x00, 0x00, 0x00]),
);
}
} catch (e) {
print('Error erasing tag: ${e.toString()}');
}
}
} catch (e) {
print('Error accessing NFC tag: ${e.toString()}');
} finally {
_isScanning = false;
}
},
);
} catch (e) {
print('Error starting NFC session: ${e.toString()}');
_isScanning = false;
}
}
Future<void> startScanning(
Function(String) onDataRead,
Function(String) onError,
) async {
if (_isScanning) return;
_isScanning = true;
try {
await _nfcManager.startSession(
onDiscovered: (NfcTag tag) async {
try {
final nfca = NfcA.from(tag);
if (nfca != null) {
try {
const int startPage = 4; // Starting from page 4
const int maxPages = 12; // Adjust as needed
StringBuffer allData = StringBuffer();
for (int page = startPage; page < maxPages; page++) {
try {
final response = await nfca.transceive(
data: Uint8List.fromList([0x30, page]), // READ command
);
// Log raw data in hexadecimal format
String hexData = response
.map((byte) => byte.toRadixString(16).padLeft(2, '0'))
.join(' ');
print('Page $page raw data (hex): $hexData');
// Append the page data to the buffer
allData.writeln(hexData);
} catch (e) {
print('Error reading page $page: ${e.toString()}');
}
}
// Pass the concatenated data to onDataRead
onDataRead(allData.toString());
} catch (e) {
onError('Error in transceive operation: ${e.toString()}');
}
} else {
onError('NFC A tag not found.');
}
} catch (e) {
onError('Error reading NFC tag: ${e.toString()}');
}
},
);
} catch (e) {
onError('Error starting NFC session: ${e.toString()}');
} finally {
_isScanning = false;
}
}
void stopScanning() {
if (_isScanning) {
_nfcManager.stopSession();
_isScanning = false;
}
}
}
我尝试使用各种循环来确保所有页面均已寻址。
我检查了写零的命令,它的格式似乎正确。
eraseTag 方法旨在用零覆盖第 4 至 39 页,但数据保持不变。
NfcA 可以覆盖许多不同类型的标签,具有许多不同的内存访问方法,但当您尝试使用
0xA0
写入页面时,那么标签可能类似于 NTAG 系列。
NTAG系列标签有4字节内存页。
您的写入命令
data: Uint8List.fromList([0xA0, page, 0x00, 0x00, 0x00]),
仅提供 3 个字节,因此标签应响应“Not OK”响应。
尝试写入 4 个字节
例如
data: Uint8List.fromList([0xA0, page, 0x00, 0x00, 0x00, 0x00]),