【问题标题】:Write to specified sector on tag using react-native-nfc-manager使用 react-native-nfc-manager 写入标签上的指定扇区
【发布时间】:2021-08-09 19:01:31
【问题描述】:

我正在使用 NTAG I2C plus 2k 内存标签并使用 react-native-nfc-manager 库与标签交互。

有没有办法指定您打算写入的扇区?

我知道有一个 API 可以指定要写入的页面偏移量,但是如何指定页面偏移量所在的扇区?

(更新为包含以下代码示例)

let tech = Platform.OS === 'ios' ? NfcTech.MifareIOS : NfcTech.NfcA;
  await NfcManager.requestTechnology(tech, {
    alertMessage: 'Hold your phone close to the NFC tag.',
  });

  let fullLength = data.length + 7;
  let payloadLength = data.length + 3;

  let cmd =
    Platform.OS === 'ios'
      ? NfcManager.sendMifareCommandIOS
      : NfcManager.transceive;

  // select sector 2 prior to writing data
  await cmd([0xc2, 0xff]);
  await cmd([0x02, 0x00, 0x00, 0x00]);

  await cmd([
    0xa2,
    MEMORY_MAPPING[`${chunkToWriteTo}`][1],
    0x03,
    fullLength,
    0xd1,
    0x01,
  ]);
  await cmd([
    0xa2,
    MEMORY_MAPPING[`${chunkToWriteTo}`][2],
    payloadLength,
    0x54,
    0x02,
    0x65,
  ]);

  let currentPage = MEMORY_MAPPING[`${chunkToWriteTo}`][0] + 2;
  let currentPayload = [0xa2, currentPage, 0x6e];

  for (let i = 0; i < data.length; i++) {
    currentPayload.push(parseInt(data[i]));
    if (currentPayload.length == 6) {
      try {
        await cmd(currentPayload);
      } catch (error) {
        console.log(error);
      }
      currentPage += 1;
      currentPayload = [0xa2, currentPage];
    }
  }

提前致谢。

【问题讨论】:

    标签: nfc react-native-nfc-manager


    【解决方案1】:

    所以“NTAG I2C plus 2k”似乎是使用 NfcA 通信的 Certified Type 2 标签。

    我是datasheet

    此标签具有超过 2 类标准的附加命令来选择扇区,因为 2 类标签通常没有扇区。

    因此阅读数据表第 10.12 节,您将收发以下命令字节示例

    C2h FFh - 选择部门

    03h 00h 00h 00h - 扇区 3

    然后使用A2h 命令字节正常写入页面地址

    react-native-nfc-manage 提供nfcAHandlertransceive 方法来向NFC 芯片发送和接收这些低级命令。

    更新:

    对于 iOS,它将 Type 2 标签视为 Mifare Ultralight 的标签,因此来自 API 的sendMifareCommandIOS 发送相同的命令。

    (Android 和 iOS 都有nfcAHandler

    注意我没试过,我只是用普通的 Type 2 标签做事

    【讨论】:

    • 听起来上面的方法可以在 Android 上完成......你知道如何通过 react-native-nfc-manager 在 iOS 上实现同样的效果吗?
    • 我更新了问题以包含我的代码示例。添加await cmd([0xc2, 0xff]); await cmd([0x02, 0x00, 0x00, 0x00]); 切换扇区后,我没有得到预期的结果,数据被写入扇区2。有什么建议吗?
    • 如果我正确阅读了数据表的内存组织部分,那么在 2k 标签上,您在扇区 2 中没有可以写入或读取的内容,它应该始终返回无效访问 NAK。您要写入第二个扇区吗?因为它们是零索引的,所以扇区 1
    • ? 呃......不错的收获。我现在可以成功写了。非常感谢!
    • iOS 运行良好,但我在 Android 上通过此命令得到以下错误 await cmd([0x01, 0x00, 0x00, 0x00]); ... this issue 似乎相似,但该解决方法对我不起作用。尝试设置超时也没有成功。 Error: transceive fail
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    相关资源
    最近更新 更多