0

我是 NFC Android 新手,在设置密码后,我一直试图在 NTAG213 中写入数天,
但它失败了,我不知道会发生什么,任何人都可以帮助我更新有关代码的更多信息

    // write PACK:
    mifareUltralight
        .writePage(
            pageOffset: 44, data: Uint8List.fromList([pack[0], pack[1], 0, 0]))
        .then((value) {
      setState(() {
        messageTXT = 'write PACK';
      });
    });

    // write PWD:
    mifareUltralight
        .writePage(
            pageOffset: 43,
            data: Uint8List.fromList([pwd[0], pwd[1], pwd[2], pwd[3]]))
        .then((value) {
      setState(() {
        messageTXT = 'write PWD';
      });
    });
    //set PROT
    bool prot =
        false; // false = PWD_AUTH for write only, true = PWD_AUTH for read and write
    int authlim = 0;
    // value between 0 and 7
    mifareUltralight
        .transceive(
            data: Uint8List.fromList([
      0xA2, // WRITE
      42, // page address
      ((object[0] & 0x078) | (prot ? 0x080 : 0x000) | (authlim & 0x007)),
      object[1], object[2], object[3]
    ]))
        .then((value) {
      setState(() {
        messageTXT = 'PWD_AUTH for write only0';
      });
    });

    // set AUTH0
    int auth0 = 0x00;
    // value between 0 and 7

    mifareUltralight
        .writePage(
            pageOffset: 41,
            data: Uint8List.fromList([
              object1[0], // keep old value for byte 0
              object1[1], // keep old value for byte 1
              object1[2],
              auth0
            ]))
        .then((value) {
      setState(() {
        messageTXT = 'PWD_AUTH for write only2';
      });
    });
  }

mifareUltralight
        .transceive(
            data: Uint8List.fromList([0x1B, pwd[0], pwd[1], pwd[2], pwd[3]]))
        .then((value) {
      if ((value != null) && (value.length >= 2)) {
        Ndef ndef = Ndef.from(tag);

        try {
          NdefMessage message = NdefMessage([
            NdefRecord.createUri(Uri.parse(url)),
          ]);
          ndef.write(message).then((value) {
            print('write success');
          });
        } catch (e) {
          print(e.toString());
        }
      }
    });
4

1 回答 1

0

更新

现在我们看到了更多代码,首先要开始的是,所有这些transceive命令无论成功与否都会返回一个值。

因此,最好对发送到标签的所有这些命令进行错误检查,方法是检查回流阀以查看哪个位出错。

从标签的数据表中,ACKNAK值是

表 23.ACK 和 NAK 值代码(4 位) ACK/NAK
Ah 确认(ACK)
0h NAK 表示无效参数(即无效页面地址)
1h NAK 表示奇偶校验或 CRC 错误
4h NAK 表示无效认证计数器溢出
5h NAK 表示 EEPROM 写入错误

所以返回值应该总是Ah

原来的

默认情况下,仅在标签上设置密码不会保护任何内容。

您还需要设置AUTH0字节(ntag213 上第 0x29h 页的字节 3 - 有关详细信息,请参阅标签的数据表),因为默认情况下,您刚刚设置的密码不会保护任何内存页面。

您需要将值从保护页面0xFFh及以上(即无页面)更改为至少保护页面 0x04h(或 0x00h)及以上,以对访问 NDEF 数据产生任何影响。

更改页面 0x29h 的字节 3 的值是通过标准写入命令完成的,因此读取页面 0x29h,将读取的 4 个字节的最后一个字节更改回页面。

您还应该注意PROT访问字节内存地址的位在读取和写入之间更改以用于密码保护(默认为密码保护写入访问),这也可以通过标准写入命令更改为正确的内存页面。

于 2021-03-20T13:02:04.277 回答