Arduino NFC车门开锁
我正在尝试使用一个带有NFC屏蔽的arduino板来解锁我的车门 董事会:Arduino UNO第3版 NFC盾:2.0b版由Seeed Studio制作 因此,当NFC标签出现时,一个信号将伺服旋转180度以解锁车门。目前的问题是,我希望只有一个NFC标签能够解锁/锁定门,而不仅仅是任何一个 目前,任何NFC标签都可以转动伺服 是否有人知道调用哪个函数只返回NFC标记的UID,然后可以将其与已知的NFC标记进行比较Arduino NFC车门开锁,arduino,nfc,uniqueidentifier,serial-number,unlock,Arduino,Nfc,Uniqueidentifier,Serial Number,Unlock,我正在尝试使用一个带有NFC屏蔽的arduino板来解锁我的车门 董事会:Arduino UNO第3版 NFC盾:2.0b版由Seeed Studio制作 因此,当NFC标签出现时,一个信号将伺服旋转180度以解锁车门。目前的问题是,我希望只有一个NFC标签能够解锁/锁定门,而不仅仅是任何一个 目前,任何NFC标签都可以转动伺服 是否有人知道调用哪个函数只返回NFC标记的UID,然后可以将其与已知的NFC标记进行比较 #包括 #包括“PN532_SPI.h” #包括“PN532.h” #包括“
#包括
#包括“PN532_SPI.h”
#包括“PN532.h”
#包括“NfcAdapter.h”
字符串常量myUID=“1B B3 C6 EF”;//用NFC标签的UID替换此UID
int const greenLedPin=3;//绿色led用于正确的钥匙通知
int const redLedPin=4;//红色led用于错误的钥匙通知
PN532_SPI接口(SPI,10);//使用数字引脚10处的SPI CS端子为屏蔽创建SPI接口
NfcAdapter nfc=NfcAdapter(接口);//创建NFC适配器对象
作废设置(作废){
Serial.begin(115200);//开始串行通信
Serial.println(“NDEF阅读器”);
begin();//开始nfc通信
//使LED引脚输出
引脚模式(绿色引脚,输出);
引脚模式(红色引脚,输出);
//关闭LED
数字写入(绿色,低电平);
数字写入(红色引脚,低电平);
}
无效循环(无效){
Serial.println(“扫描…”);
if(nfc.tagPresent())//检查天线区域上是否存在nfc标记
{
NfcTag tag=nfc.read();//读取nfc标记
String scannedUID=tag.getUidString();//获取NFC标记的UID
if(myUID.compareTo(scannedud)==0)//将NFC标记的UID与正确标记的UID进行比较(当compareTo返回0时存在匹配项)
{
//使用了正确的NFC标签
Serial.println(“正确的密钥”);
//闪烁绿色LED并确保红色LED熄灭
数字写入(绿色,高);
数字写入(红色引脚,低电平);
延迟(500);
数字写入(绿色,低电平);
延迟(500);
数字写入(绿色,高);
延迟(500);
数字写入(绿色,低电平);
//将鼠标放在此处以触发解锁机构(例如电机、传感器)
}否则{
//使用了不正确的NFC标签
Serial.println(“不正确的密钥”);
//闪烁红色LED并确保绿色LED熄灭
数字写入(绿色,低电平);
数字写入(红色,高);
延迟(500);
数字写入(红色引脚,低电平);
延迟(500);
数字写入(红色,高);
延迟(500);
数字写入(红色引脚,低电平);
//不要解锁!使用了不正确的NFC标记。
//将代码放在此处以触发警报(如buzzard、扬声器)或执行其他操作
}
}
延迟(2000年);
}
此代码有效。我相信您可以使用:
readPassiveTargetID(PN532_MIFARE_ISO14443A)
要获取id。您指出,在检测到任何标签时,您当前正在解锁。因此,您必须已经在轮询标记。如果您使用的是原始seeedstudio库,则可以使用
inListPassiveTarget()
方法或(如前面所述)readPassiveTargetID()方法对任何被动目标执行轮询
虽然inListPassiveTarget()
只返回一个布尔值,指示是否存在任何目标,但readPassiveTargetID()
方法为您提供了一组配置参数,还允许您检索防冲突标识符(例如ISO 14443类型a的UID):
您可以使用如下方法:
uint8_t uid[16] = { 0 };
uint8_t uidLen = 0;
if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLen)) {
// uid will now contain uidLen bytes of the anti-collision identifier
}
如果要轮询ISO 14443 A型以外的其他卡,可以使用以下定义,而不是PN532\u MIFARE\u ISO14443A
:
// ISO 14443 Type B
#define PN532_BAUD_ISO14443B (0x03)
// FeliCa 212 kbps
#define PN532_BAUD_FELICA212 (0x01)
// FeliCa 424 kbps
#define PN532_BAUD_FELICA424 (0x02)
// Jewel Tag (NFC Forum Type 1)
#define PN532_BAUD_JEWEL (0x04)
最后,关于使用标签的UID进行访问控制,我通常会说:不要这样做!事实证明,在许多现有系统中,这是一个非常糟糕的想法。有关更多信息,请参见这些帖子:
Serial.println("\nScan electronic key\n");
if (nfc.tagPresent())
{
NfcTag tag = nfc.read();
Serial.println(tag.getTagType());
String idnumber = tag.getUidString();
Serial.print("UID: ");Serial.println(idnumber);
例如,Mifare经典“药丸”标签上的30 5C 6F 80。经过一点分析后,它以格式化字符串11的形式从库中返回,因此我将其与
String valid = ("30 5C 6F 80") ;
这种比较有效:
if (valid == idnumber) {
Serial.println("Yes") ;
// simulate door open by turning LED on
digitalWrite(lockopen, HIGH);
delay(lockopen_interval);
digitalWrite(lockopen, LOW);
} else {
Serial.println("No") ;
}
谢谢你提供的信息和警告。我知道NFC标签可以被克隆,但是没有人知道我的车可以通过这种方式解锁。这是一辆1992年的车;)我明天会试试代码。
String valid = ("30 5C 6F 80") ;
if (valid == idnumber) {
Serial.println("Yes") ;
// simulate door open by turning LED on
digitalWrite(lockopen, HIGH);
delay(lockopen_interval);
digitalWrite(lockopen, LOW);
} else {
Serial.println("No") ;
}