[英]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.