電梯卡之複製(讀卡篇)
發表於 : 2025年 3月 16日, 15:57
今天想要利用單晶片的力量來複製電梯卡,
不過電梯卡有可複製及不可以複製的卡片,
本篇旨在琢磨技術,不再破解,供有興趣DIY的朋友參考。
所需材料:ESP32 *1、RFID-RC522 *1、要被複製的卡片 *1、杜邦線 *少許
電路圖:

程式列表:
然後紀錄NUID後,繼續下一篇的寫入新卡即可完成複製了。
不過電梯卡有可複製及不可以複製的卡片,
本篇旨在琢磨技術,不再破解,供有興趣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);
}
}