[英]Comunicazione NDEF
我正在开发一个移动应用程序,我的目的是让 Arduino 与智能手机通信。 到目前为止,当应用程序未激活时,我只能读取 arduino 发送的第一条消息。
我正在使用 react-native-nfc-manager 库的 function :
getLaunchTagEvent ()
在此事件之后,我无法再阅读其他 NDEF 消息。 我该如何解决?
代码如下:
componentDidMount(){
NfcManager.isSupported()
.then(supported => {
this.setState({ supported });
if (supported) {
this._startNfc();
}
})
}
_startNfc() {
if (Platform.OS === 'android') {
NfcManager.getLaunchTagEvent()
.then(tag => {
console.log('launch tag', tag);
if (tag) {
this.setState({ tag });
}
})
.catch(err => {
console.log(err);
})
}
}
我也在尝试在应用程序打开的情况下读取标签,但 arduino 上的操作失败。 解决方案? 代码如下:
readData = async () => {
NfcManager.registerTagEvent(
tag => {
console.log('Tag Discovered', tag);
},
'Hold your device over the tag',
{
readerModeFlags:
NfcAdapter.FLAG_READER_NFC_A | NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK,
readerModeDelay: 2,
},
);
}
Arduino代码如下:
#include "SPI.h"
#include "PN532_SPI.h"
#include "snep.h"
#include "NdefMessage.h"
PN532_SPI pn532spi(SPI, 10);
SNEP nfc(pn532spi);
uint8_t ndefBuf[128];
void setup() {
Serial.begin(9600);
Serial.println("NFC Peer to Peer-Send Message");
}
void loop() {
Serial.println("Send a message to Peer");
NdefMessage message = NdefMessage();
message.addTextRecord("Hello");
int messageSize = message.getEncodedSize();
if (messageSize > sizeof(ndefBuf)) {
Serial.println("ndefBuf is too small");
while (1) {
}
}
message.encode(ndefBuf);
if (0 >= nfc.write(ndefBuf, messageSize)) {
Serial.println("Failed");
} else {
Serial.println("Success");
}
delay(3000);
}
SNEP
(和 LLCP)的使用使事情变得复杂,因为这是一个点对点协议,并且点对点在 Android 10 中已被弃用,并且在 iOS 中不受支持,我对它不太熟悉。
我不确定是否可以使用enableReaderMode
读取SNEP
消息(这是您要求 react-native-nfc-manager 库使用的)。
这是因为SNEP
和 (LLCP) 不是TYPE A
技术类型
如果您查看https://pdfslide.net/documents/divnfc0804-250-nfc-standards-v18.html的 NFC 标准图
它可能是TYPE F
技术类型,所以我会尝试而不是NfcAdapter.FLAG_READER_NFC_A
我会使用NfcAdapter.FLAG_READER_NFC_F
或启用所有技术以确保安全(尽管我认为这可能不起作用)
但是,如果这不起作用,通常使用 Android 点对点它只希望发送NDEF
消息,并且您已禁用系统 NFC 应用程序使用NfcAdapter.FLAG_READER_SKIP_NDEF_CHECK
处理 NDEF 消息,所以我会尝试删除它并使用Ndef
标签技术类型。
但是我认为这些都没有帮助,接下来我要尝试的是不要将enableReaderMode
与react-native-nfc-manager
一起使用,而是通过指定NfcManager.registerTagEvent();
来使用底层的enableForgroundDispatch
方法; .
由于这与 Android 系统 NFC 应用程序在事件链的稍后点进行交互,Android 系统 NFC 应用程序正在创建Intents
以与其他应用程序共享以启动应用程序来处理Intent
或将其传递给正在运行的应用程序要求发送 NFC Intents
。
因为这看起来是 Android 系统 NFC 应用程序如何处理真正的 NFC 标签和点对点SNEP
消息之间的共同点,因为SNEP
消息可以启动您的应用程序。
但展望未来,我不会使用SNEP
(点对点),因为它已被弃用,而是让 Arduino 进行主机卡仿真以发送数据(然后你可以使用阅读器模式)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.