1 頁 (共 1 頁)

電梯卡之複製(讀卡篇)

發表於 : 2025年 3月 16日, 15:57
admin
今天想要利用單晶片的力量來複製電梯卡,

不過電梯卡有可複製及不可以複製的卡片,

本篇旨在琢磨技術,不再破解,供有興趣DIY的朋友參考。

所需材料:ESP32 *1、RFID-RC522 *1、要被複製的卡片 *1、杜邦線 *少許
電路圖:
圖檔

程式列表:

代碼: 選擇全部

//RST  RST          14           
// SPI SDA          21
// SPI MOSI         23
// SPI MISO         19
// SPI SCK          18

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN 21
#define RST_PIN 14
 
MFRC522 rfid(SS_PIN, RST_PIN); 

MFRC522::MIFARE_Key key; 

// Init array that will store new NUID 
byte nuidPICC[4];

void setup() 
{ 
  Serial.begin(9600);
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522 

  for (byte i = 0; i < 6; i++) 
    key.keyByte[i] = 0xFF;
  Serial.println();
  Serial.println(F("這程式碼將掃描 MIFARE Classsic NUID."));
  Serial.println(F("請放入卡片......"));
}
 
void loop() 
{

  // Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
  if ( ! rfid.PICC_IsNewCardPresent())
    return;

  // Verify if the NUID has been readed
  if ( ! rfid.PICC_ReadCardSerial())
    return;

  Serial.print(F("PICC 型式: "));
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  Serial.println(rfid.PICC_GetTypeName(piccType));

  // Check is the PICC of Classic MIFARE type
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&  
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("你的卡片不是經典的MIFARE型式."));
    return;
  }

  if (rfid.uid.uidByte[0] != nuidPICC[0] || 
    rfid.uid.uidByte[1] != nuidPICC[1] || 
    rfid.uid.uidByte[2] != nuidPICC[2] || 
    rfid.uid.uidByte[3] != nuidPICC[3] ) {
    Serial.println(F("卡片已被偵測到."));

    // Store NUID into nuidPICC array
    for (byte i = 0; i < 4; i++) {
      nuidPICC[i] = rfid.uid.uidByte[i];
    }
   
    Serial.print(F("卡片NUID是:"));
    printHex(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
  }
  else Serial.println(F("卡片已讀過."));

  // Halt PICC
  rfid.PICC_HaltA();

  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
}


/**
 * Helper routine to dump a byte array as hex values to Serial. 
 */
void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

/**
 * Helper routine to dump a byte array as dec values to Serial.
 */
void printDec(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(' ');
    Serial.print(buffer[i], DEC);
  }
}

然後紀錄NUID後,繼續下一篇的寫入新卡即可完成複製了。