1
0
mirror of synced 2025-02-17 11:08:36 +01:00

更新测试示例:添加FeliCa读取,添加ESP32支持。

This commit is contained in:
Sucareto 2022-04-28 11:57:10 +08:00
parent dcc9d1e551
commit fad512dd66

View File

@ -1,109 +1,137 @@
#include <Wire.h> #if defined(__AVR_ATmega32U4__) || defined(ARDUINO_SAMD_ZERO)
#include <PN532_I2C.h> #pragma message "当前的开发板是 ATmega32U4 或 SAMD_ZERO"
#include <PN532.h> #define SerialDevice SerialUSB
#define PN532_SPI_SS 10 //32U4 不使用 SPI 时,执行 ReadWithoutEncryption 会失败
#if defined(__AVR_ATmega32U4__) || defined(ARDUINO_SAMD_ZERO)
#pragma message "当前的开发板是 ATmega32U4 或 SAMD_ZERO" #elif defined(ARDUINO_ESP8266_NODEMCU_ESP12E)
#define SerialDevice SerialUSB #pragma message "当前的开发板是 NODEMCU_ESP12E"
#define SerialDevice Serial
#elif defined(ARDUINO_ESP8266_NODEMCU_ESP12E)
#pragma message "当前的开发板是 NODEMCU_ESP12E" #elif defined(ARDUINO_NodeMCU_32S)
#define SerialDevice Serial #pragma message "当前的开发板是 NodeMCU_32S"
#define SerialDevice Serial
#elif defined(ARDUINO_NodeMCU_32S) #define PN532_SPI_SS 5
#pragma message "当前的开发板是 NodeMCU_32S"
#define SerialDevice Serial #else
#error "未经测试的开发板,请检查串口和阵脚定义"
#else #endif
#error "未经测试的开发板,请检查串口和阵脚定义"
#endif #if defined(PN532_SPI_SS)
#pragma message "使用 SPI 连接 PN532"
#include <SPI.h>
PN532_I2C pn532i2c(Wire); #include <PN532_SPI.h>
PN532 nfc(pn532i2c); PN532_SPI pn532(SPI, PN532_SPI_SS);
#else
typedef union { #include <Wire.h>
uint8_t block[18]; #include <PN532_I2C.h>
struct { PN532_I2C pn532(Wire);
uint8_t IDm[8]; #endif
uint8_t PMm[8];
union { #include "PN532.h"
uint16_t SystemCode; PN532 nfc(pn532);
uint8_t System_Code[2];
}; typedef union {
}; uint8_t block[18];
} Card; struct {
Card card; uint8_t IDm[8];
uint8_t PMm[8];
uint8_t AimeKey[6] = {0x57, 0x43, 0x43, 0x46, 0x76, 0x32}; union {
uint8_t BanaKey[6] = {0x60, 0x90, 0xD0, 0x06, 0x32, 0xF5}; uint16_t SystemCode;
uint8_t MifareKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; uint8_t System_Code[2];
#define M2F_B 1 };
};
void setup() { } Card;
SerialDevice.begin(38400); Card card;
SerialDevice.setTimeout(0);
while (!SerialDevice); uint8_t AimeKey[6] = {0x57, 0x43, 0x43, 0x46, 0x76, 0x32};
nfc.begin(); uint8_t BanaKey[6] = {0x60, 0x90, 0xD0, 0x06, 0x32, 0xF5};
while (!nfc.getFirmwareVersion()) { uint8_t MifareKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
SerialDevice.println("Didn't find PN53x board"); #define M2F_B 1
delay(2000); uint16_t blockList[4] = {0x8080, 0x8081, 0x8082, 0x8083};
} uint16_t serviceCodeList[1] = {0x000B};
nfc.setPassiveActivationRetries(0x10); uint8_t blockData[1][16];
nfc.SAMConfig();
} void setup() {
SerialDevice.begin(115200);
void loop() { // Wire.setClock(800000);
uint8_t uid[4], uL; while (!SerialDevice);
delay(2000); nfc.begin();
while (!nfc.getFirmwareVersion()) {
if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uL) && nfc.mifareclassic_AuthenticateBlock(uid, uL, 1, 1, AimeKey)) { SerialDevice.println("Didn't find PN53x board");
SerialDevice.println("Aime card!"); delay(500);
SerialDevice.print("UID Value:"); }
nfc.PrintHex(uid, uL); SerialDevice.println("START!");
SerialDevice.print("Block 2 Data:"); nfc.setPassiveActivationRetries(0x10);
if (nfc.mifareclassic_ReadDataBlock(2, card.block)) { nfc.SAMConfig();
nfc.PrintHex(card.block, 16); }
}
return; void loop() {
} uint8_t uid[4], uL;
if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uL) && nfc.mifareclassic_AuthenticateBlock(uid, uL, 1, 0, BanaKey)) {
SerialDevice.println("Banapassport card!"); if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uL) && nfc.mifareclassic_AuthenticateBlock(uid, uL, 1, 1, AimeKey)) {
SerialDevice.print("UID Value:"); SerialDevice.println("Aime card!");
nfc.PrintHex(uid, uL); SerialDevice.print("UID Value:");
SerialDevice.print("Block 2 Data:"); nfc.PrintHex(uid, uL);
if (nfc.mifareclassic_ReadDataBlock(2, card.block)) { SerialDevice.print("Block 2 Data:");
nfc.PrintHex(card.block, 16); if (nfc.mifareclassic_ReadDataBlock(2, card.block)) {
} nfc.PrintHex(card.block, 16);
return; }
} delay(2000);
if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uL) && nfc.mifareclassic_AuthenticateBlock(uid, uL, M2F_B, 0, MifareKey)) { return;
SerialDevice.println("Default Key Mifare!"); }
if (nfc.mifareclassic_ReadDataBlock(2, card.block)) { if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uL) && nfc.mifareclassic_AuthenticateBlock(uid, uL, 1, 0, BanaKey)) {
SerialDevice.print("Fake IDm:"); SerialDevice.println("Banapassport card!");
nfc.PrintHex(card.IDm, 8); SerialDevice.print("UID Value:");
SerialDevice.print("Fake PMm:"); nfc.PrintHex(uid, uL);
nfc.PrintHex(card.PMm, 8); SerialDevice.print("Block 2 Data:");
} if (nfc.mifareclassic_ReadDataBlock(2, card.block)) {
return; nfc.PrintHex(card.block, 16);
} }
if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uL)) { delay(2000);
SerialDevice.println("Unknown key Mifare."); return;
SerialDevice.print("UID Value:"); }
nfc.PrintHex(uid, uL); if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uL) && nfc.mifareclassic_AuthenticateBlock(uid, uL, M2F_B, 0, MifareKey)) {
return; SerialDevice.println("Default Key Mifare!");
} if (nfc.mifareclassic_ReadDataBlock(2, card.block)) {
SerialDevice.print("Fake IDm:");
if (nfc.felica_Polling(0xFFFF, 0x01, card.IDm, card.PMm, &card.SystemCode, 200)) { nfc.PrintHex(card.IDm, 8);
SerialDevice.println("Felica card!"); SerialDevice.print("Fake PMm:");
SerialDevice.print("IDm:"); nfc.PrintHex(card.PMm, 8);
nfc.PrintHex(card.IDm, 8); }
SerialDevice.print("PMm:"); delay(2000);
nfc.PrintHex(card.PMm, 8); return;
SerialDevice.print("SystemCode:"); }
card.SystemCode = card.SystemCode >> 8 | card.SystemCode << 8; if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uL)) {
nfc.PrintHex(card.System_Code, 2); SerialDevice.println("Unknown key Mifare.");
return; SerialDevice.print("UID Value:");
} nfc.PrintHex(uid, uL);
SerialDevice.println("Didn't find card"); delay(2000);
} return;
}
if (nfc.felica_Polling(0xFFFF, 0x01, card.IDm, card.PMm, &card.SystemCode, 200)) {
SerialDevice.println("FeliCa card!");
SerialDevice.print("IDm:");
nfc.PrintHex(card.IDm, 8);
SerialDevice.print("PMm:");
nfc.PrintHex(card.PMm, 8);
SerialDevice.print("SystemCode:");
card.SystemCode = card.SystemCode >> 8 | card.SystemCode << 8;
nfc.PrintHex(card.System_Code, 2);
Serial.println("FeliCa Block:");
for (uint8_t i = 0; i < 4; i++) {
if (nfc.felica_ReadWithoutEncryption(1, serviceCodeList, 1, &blockList[i], blockData) == 1) {
Serial.println(blockList[i], HEX);
nfc.PrintHex(blockData[0], 16);
} else {
Serial.println("error");
}
}
delay(2000);
return;
}
SerialDevice.println("Didn't find card");
delay(500);
}