繁体   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