Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么支持NFC的android手机';什么在改变?_Android_Nfc_Iot_Esp8266_Rfid - Fatal编程技术网

为什么支持NFC的android手机';什么在改变?

为什么支持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

我正在尝试使用支持NFC的android手机作为钥匙卡,构建一个支持NFC的智能门。 我使用的是NodeMcu和RC522 NFC阅读器。下面的代码可以很好地读取经典的RFID卡。当我读取手机的RFID时,手机的RFID会不断变化

  • 为什么手机的RFID会不断变化

  • 如果这是无法避免的,我可以使用NFC从android手机向RC522发送诸如“hello world”之类的消息吗

    #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被认为是不需要其他类型的保护的非危险设施。 对于安全应用程序来说,更好的方法是使用存储在卡存储器(或模拟卡存储器)上的数据加密来进行标识