尝试删除 nfcA 标签时出现问题

问题描述 投票:0回答:1

我正在尝试使用以下代码擦除 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 页,但数据保持不变。

flutter dart nfc
1个回答
0
投票

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]),

© www.soinside.com 2019 - 2024. All rights reserved.