我的名字是 Daniel Spierings,我代表我的项目组与您联系。我们目前正在开展第一年的一个学校项目,在我们的案例中包括 NFC 的使用。
我们已将 BBC Micro:bit 控制器与 PN532 NFC 模块 V3 (HW-147) 配对,并编写了一些代码,让我们的 NFC 扫描仪识别接触的 NFC 标签。我将为您提供在 Arduino IDE 中编写的代码。我们希望能够让 PN532 在我们的手机上显示弹出窗口。
我们希望您能够在将手机连接到 PN532 以显示弹出窗口时帮助我们,因为我们(经过大量谷歌搜索后)不知道如何让它工作.
理想情况下,弹出菜单应显示是/否选项按钮,但这不是绝对必须的。如果我们能够将手机靠在 PN532 上,以便屏幕上出现弹出窗口,那就太棒了。我们希望您能帮助我们解决这个问题。
感谢您的宝贵时间
#include <Wire.h>
#include <Adafruit_PN532.h>
#define SDA_PIN 20 // Define the SDA pin on the micro:bit
#define SCL_PIN 19 // Define the SCL pin on the micro:bit
Adafruit_PN532 nfc(SDA_PIN, SCL_PIN);
void setup(void) {
Serial.begin(115200);
Serial.println("Hello!");
nfc.begin();
uint32_t versiondata = nfc.getFirmwareVersion();
if (!versiondata) {
Serial.print("Didn't find PN53x board");
while (1);
}
nfc.SAMConfig();
Serial.println("Waiting for an NFC card ...");
}
void loop(void) {
uint8_t success;
uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
uint8_t uidLength;
success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
if (success) {
Serial.println("Found an NFC card!");
Serial.print("UID Length: "); Serial.print(uidLength, DEC); Serial.println(" bytes");
Serial.print("UID Value: ");
for (uint8_t i = 0; i < uidLength; i++) {
Serial.print(" 0x"); Serial.print(uid[i], HEX);
}
Serial.println("");
delay(1000);
}
}
这是一个非常大的问题,我只能给出一些建议,因为我并没有真正在微控制器上进行 NFC。
首先,NFC 硬件有 2 种主要操作模式 - 读/写模式(NFC 术语中的发起者)和(主机)卡模拟模式(NFC 术语中的目标)。
所有通信都是由充当发起者的硬件启动到充当目标的硬件。
通过正确的命令和软件,许多硬件都可以充当发起者或目标,幸运的是 PN532 可以充当两者。
因此,要实现您想要的目标,手机需要充当发起者,PN532 作为目标。 Android(我相信 iOS)安装了一些默认软件来读取目标设备的选定类型的数据,而无需其他软件,通常这些是 Ndef URL 或文本格式的数据。
否则你将不得不为手机编写一个应用程序来读取其他数据格式。
Ndef 数据格式的详细信息是这里
继续当前代码是为了让 PN532 充当 Initiator,这是没有用的,因为 2 个 Initiator 不会相互通信。
如果您阅读PN532数据表的第7.4和7.5节,其中给出了“ISO/IEC14443-4 PICC模式”的命令,这将允许PN532像NFC类型4标签一样存储Ndef数据。
总之,您需要编写 BBC Micro:bit 控制器代码,将 PN532 配置为目标模式,然后正确响应用于读取 Ndef 数据格式的 Type 4 命令,并响应一些 Ndef 文本/Url 数据。
快速谷歌显示了正确模式下的 Adafruit PN532 的一些示例代码这里以及基本的 APDU 解析和响应。您需要正确响应一系列 APDU,才能将 Ndef 数据发送到手机。
我希望对您有所帮助,并为您提供解决这个复杂问题的指导。