簡體   English   中英

通訊 NDEF

[英]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標簽技術類型。

但是我認為這些都沒有幫助,接下來我要嘗試的是不要將enableReaderModereact-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM