我正在尝试使用 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 库的问题?有人有办法解决这个问题吗?
可能与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];
也应该有相同的大小变化)
图书馆对此确实有一个问题
听起来很有趣,甚至在 Android 和 iPhone 上也可能有效吗?仅用于 HCE 文件传输?我想要你的答案