为什么使用 HCE 通过 NFC 进行数据传输仅适用于 Android 12 版本以下?

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

我正在尝试使用 React Native 应用程序在两个 Android 设备之间发送数据(为了简单起见,首先只是一条 NDEF 文本消息)。为此,我使用

react-native-hce
库在一台设备上模拟 NFC 标签,并使用
react-native-nfc-manager
库在另一台设备上读取此标签。

这里是 NFC 相关代码:

  async function sendData() { 
    const tag = new NFCTagType4({
      type: NFCTagType4NDEFContentType.Text,
      content: 'Hello World',
      writable: true
    });
    session = await HCESession.getInstance();
    session.setApplication(tag);
    await session.setEnabled(true).catch((err) => console.log(err));
  }

  async function stopSending() {
    if(session)
       await session.setEnabled(false)
  }

  async function readNdef() {
    stopSending()
    NfcManager.requestTechnology(NfcTech.Ndef)
      .then(() => NfcManager.getTag())
      .then(tag => {
        if(tag) {
          let text = String.fromCharCode(...tag.ndefMessage[0].payload)
          Alert.alert("Message received", text)
        }
      })
      .catch(err => {
        console.warn(err)
      })
      .then(() => {NfcManager.cancelTechnologyRequest()})
  }

我用我得到的几台设备测试了我的应用程序:

旧版索尼 Xperia (Android 8)、三星 Galaxy A50 (Android 11)、华为 P30 Lite (Android 11): 工作完美。

摩托罗拉 Edge 30 Fusion (Android 12)、三星 Galaxy A41 (Android 12): 无法工作。 HCE 只是无法工作(没有任何错误)并且读取模拟标签基本上可以工作,但是 尽管存在 NDEF 消息,但没有读取该消息(App TagInfo 也能够读取 NDEF)。对于普通的非模拟标签,它可以正常工作。

Android 12 似乎在读取模拟标签和 HCE 方面存在问题。也许这是 React Native 库的问题?有人有办法解决这个问题吗?

android react-native nfc hce
2个回答
1
投票

可能与https://stackoverflow.com/a/75676725/2373819中的答案相关似乎Type 4 NFC规范尚不清楚,因为它应该是关于Ndef消息的最大大小。

我认为以前的很多代码都使用

FFFE
作为最大大小,而实际上根据规范的最大大小是
80FE
,现在 Android 可能会将具有无效最大大小的功能容器视为错误。

这是一个理论,因为我无法测试它(我无法访问 Android 12 或更高版本的设备)

更新

虽然根据规范,实际限制是

80FE
,但似乎
7FFF
(或 32K)是一个更合乎逻辑的限制,这与物理标签内存大小更可能的数字相匹配,并且评论显示了一些成功。

因此这条线

byte[] controlTlv = BinaryUtils.HexStringToByteArray("0406E104FFFE00" + (prefManager.getWritable() ? "00":"FF"));

图书馆应该是

byte[] controlTlv = BinaryUtils.HexStringToByteArray("0406E10480FE00" + (prefManager.getWritable() ? "00":"FF"));

(同一个文件中的行

public final byte[] ndefDataBuffer = new byte[0xFFFE];
也应该有相同的大小变化)

图书馆对此确实有一个问题


0
投票

听起来很有趣,甚至在 Android 和 iPhone 上也可能有效吗?仅用于 HCE 文件传输?我想要你的答案

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