为什么支持NFC的android手机';什么在改变?
我正在尝试使用支持NFC的android手机作为钥匙卡,构建一个支持NFC的智能门。 我使用的是NodeMcu和RC522 NFC阅读器。下面的代码可以很好地读取经典的RFID卡。当我读取手机的RFID时,手机的RFID会不断变化为什么支持NFC的android手机';什么在改变?,android,nfc,iot,esp8266,rfid,Android,Nfc,Iot,Esp8266,Rfid,我正在尝试使用支持NFC的android手机作为钥匙卡,构建一个支持NFC的智能门。 我使用的是NodeMcu和RC522 NFC阅读器。下面的代码可以很好地读取经典的RFID卡。当我读取手机的RFID时,手机的RFID会不断变化 为什么手机的RFID会不断变化 如果这是无法避免的,我可以使用NFC从android手机向RC522发送诸如“hello world”之类的消息吗 #include <SPI.h> //SPI kütüp
#include <SPI.h> //SPI kütüphanemizi tanımlıyoruz.
#include <MFRC522.h> //MFRC522 kütüphanemizi tanımlıyoruz.
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
int RST_PIN = 9; //RC522 modülü reset pinini tanımlıyoruz.
int SS_PIN = 10; //RC522 modülü chip select pinini tanımlıyoruz.
int buzzerPin = 8; //Buzzer motor pinini tanımlıyoruz.
MFRC522 rfid(SS_PIN, RST_PIN); //RC522 modülü ayarlarını yapıyoruz.
void setup() {
Serial.begin(9600); //Seri haberleşmeyi başlatıyoruz.
SPI.begin(); //SPI iletişimini başlatıyoruz.
rfid.PCD_Init(); //RC522 modülünü başlatıyoruz.
pinMode(buzzerPin,OUTPUT);
lcd.begin(16, 2);
lcd.print("CARD READER!");
}
void array_to_string(byte array[], unsigned int len, char buffer[])
{
for (unsigned int i = 0; i < len; i++)
{
byte nib1 = (array[i] >> 4) & 0x0F;
byte nib2 = (array[i] >> 0) & 0x0F;
buffer[i*2+0] = nib1 < 0xA ? '0' + nib1 : 'A' + nib1 - 0xA;
buffer[i*2+1] = nib2 < 0xA ? '0' + nib2 : 'A' + nib2 - 0xA;
}
buffer[len*2] = '\0';
}
void loop() {
if ( ! rfid.PICC_IsNewCardPresent()) //Yeni kartın okunmasını bekliyoruz.
return;
if ( ! rfid.PICC_ReadCardSerial()) //Kart okunmadığı zaman bekliyoruz.
return;
char cardInput[32] = "";
rfid.PICC_DumpDetailsToSerial(&(rfid.uid)); //dump some details about the card
array_to_string(rfid.uid.uidByte, 4, cardInput); //Insert (byte array, length, char array for output)
printCardToScreen(cardInput);
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print(cardInput);
digitalWrite(buzzerPin,HIGH);
delay(1000);
digitalWrite(buzzerPin,LOW);
delay(5000);
lcd.print(" ");
lcd.setCursor(0,0);
lcd.print("CARD READER!");
rfid.PICC_HaltA();
}
void printCardToScreen(String cardInput){
Serial.print("ID Numarasi: ");
Serial.print(cardInput);
Serial.print(" ");
Serial.println("");
}
#包括//SPI kütüphanemizi tanımlıyoruz。
#包括//MFRC522 kütüphanemizi tanımlıyoruz。
#包括
液晶显示器(7,6,5,4,3,2);
int RST_引脚=9//RC522 modülüreset pinini tanımlıyoruz。
int SS_引脚=10//RC522 modülüchip选择pinini tanımlıyoruz。
int蜂鸣器pin=8//蜂鸣器电机pinini tanımlıyoruz。
MFRC522射频识别(SS_引脚、RST_引脚)//RC522 modülüayarlarınıyapıyoruz。
无效设置(){
Seri haberleşmeyi başlatıyoruz。
SPI.begin();//SPI-iletişimini-başlatıyoruz。
rfid.PCD_Init();//RC522 modülünübaşlatıyoruz。
pinMode(蜂鸣器输入,输出);
lcd.begin(16,2);
打印(“读卡器!”);
}
无效数组\u到\u字符串(字节数组[],无符号整数len,字符缓冲区[])
{
for(无符号整数i=0;i>4)&0x0F;
字节nib2=(数组[i]>>0)&0x0F;
缓冲区[i*2+0]=nib1<0xA?'0'+nib1:'A'+nib1-0xA;
缓冲区[i*2+1]=nib2<0xA?'0'+nib2:'A'+nib2-0xA;
}
缓冲区[len*2]='\0';
}
void循环(){
如果(!rfid.PICC_IsNewCardPresent())//Yeni kartın okunmasınıbekliyoruz。
返回;
如果(!rfid.PICC_ReadCardSerial())//Kart Okumbadıızaman bekliyoruz。
返回;
char cardInput[32]=“”;
rfid.PICC_DumpDetailsToSerial(&(rfid.uid));//转储有关卡的一些详细信息
数组到字符串(rfid.uid.uidByte,4,cardInput);//插入(字节数组,长度,字符数组用于输出)
打印卡片至屏幕(cardInput);
lcd.setCursor(0,0);
lcd.打印(“”);
lcd.setCursor(0,0);
lcd.打印(cardInput);
数字写入(蜂鸣器输入,高);
延迟(1000);
数字写入(蜂鸣器输入,低电平);
延迟(5000);
lcd.打印(“”);
lcd.setCursor(0,0);
打印(“读卡器!”);
rfid.PICC_HaltA();
}
无效打印卡至屏幕(字符串卡输入){
串行打印(“ID Numarasi:”);
连续打印(cardInput);
连续打印(“”);
Serial.println(“”);
}
在任何安全应用程序中使用RFID UID都是一个非常糟糕的主意,因为它不能保证唯一性,特别是当您似乎在寻找4字节的UID时 由于4字节中没有足够的组合,许多卡类型已移动到7字节UID。有些卡类型的UID是用户可编程的,有些卡类型(如Mifare Classic类型卡)的UID应该在工厂编程,有中文克隆,允许更改UID。
使用Android手机正在使用的模拟卡,返回的UID可以轻松编程为任何值 当读卡器的范围内同时有多张卡时,UID仅用于帮助区分一张卡和另一张卡,因此可能多张卡具有不同的UID,而手机中的随机数字很可能会实现这些UID。即使这样,2个UID相同的结果也很小,这只是读卡失败
这就使我明白了为什么缺省改变UID,这可能是一个隐私特性,所以它不能用来跟踪电话,因为NFC被认为是不需要其他类型的保护的非危险设施。 对于安全应用程序来说,更好的方法是使用存储在卡存储器(或模拟卡存储器)上的数据加密来进行标识