1
0
mirror of synced 2024-11-30 18:34:38 +01:00
Arduino-Aime-Reader/tools/ReaderTest/ReaderTest.ino
2024-03-05 04:02:13 +08:00

151 lines
4.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#if defined(__AVR_ATmega32U4__)
#pragma message "当前的开发板是 ATmega32U4"
#define SerialDevice SerialUSB
#define PN532_SPI_SS 10
// #define PN532_HSU_Device Serial1
// 32U4 使用 I2C 时,执行 ReadWithoutEncryption 会失败
// 需要修改 Wire BUFFER_LENGTH 和 TWI_BUFFER_LENGTH 为 64
#elif defined(ESP8266)
#pragma message "当前的开发板是 ESP8266"
#define SerialDevice Serial
#define PN532_SPI_SS D4
// ESP8266 没有完整的 Serial1无法使用 HSU
// I2C SDA=D2 SCL=D1
#elif defined(ESP32)
#pragma message "当前的开发板是 ESP32"
#define SerialDevice Serial
#define PN532_SPI_SS 5
// #define PN532_HSU_Device Serial2 // RX=16 TX=17
// ESP32 使用 I2C 时响应太慢,无法正常使用
#else
#error "未经测试的开发板,请检查串口和针脚定义"
#endif
#if defined(PN532_SPI_SS)
#pragma message "使用 SPI 连接 PN532"
#include <PN532_SPI.h>
PN532_SPI pn532(SPI, PN532_SPI_SS);
#elif defined(PN532_HSU_Device)
#pragma message "使用 HSU 连接 PN532"
#include <PN532_HSU.h>
PN532_HSU pn532(PN532_HSU_Device);
#else
#pragma message "使用 I2C 连接 PN532"
#include <PN532_I2C.h>
PN532_I2C pn532(Wire);
#endif
#include "PN532.h"
PN532 nfc(pn532);
typedef union {
uint8_t block[18];
struct {
uint8_t IDm[8];
uint8_t PMm[8];
union {
uint16_t SystemCode;
uint8_t System_Code[2];
};
};
} Card;
Card card;
uint8_t AimeKey[6] = { 0x57, 0x43, 0x43, 0x46, 0x76, 0x32 };
uint8_t BanaKey[6] = { 0x60, 0x90, 0xD0, 0x06, 0x32, 0xF5 };
uint8_t MifareKey[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
#define M2F_B 1 // 指定作为 Access Code 读取的 block 序号
uint16_t blockList[4] = { 0x8080, 0x8081, 0x8082, 0x8083 };
uint16_t serviceCodeList[1] = { 0x000B };
uint8_t blockData[1][16];
void setup() {
SerialDevice.begin(115200);
// Wire.setClock(800000);
while (!SerialDevice);
nfc.begin();
while (!nfc.getFirmwareVersion()) {
SerialDevice.println("Didn't find PN53x board");
delay(500);
}
SerialDevice.println("START!");
nfc.setPassiveActivationRetries(0x10);
nfc.SAMConfig();
}
void loop() {
uint8_t uid[4], uL;
if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uL) && nfc.mifareclassic_AuthenticateBlock(uid, uL, 1, 1, AimeKey)) {
SerialDevice.println("Aime card!");
SerialDevice.print("UID Value:");
nfc.PrintHex(uid, uL);
SerialDevice.print("Block 2 Data:");
if (nfc.mifareclassic_ReadDataBlock(2, card.block)) {
nfc.PrintHex(card.block, 16);
}
delay(2000);
return;
}
if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uL) && nfc.mifareclassic_AuthenticateBlock(uid, uL, 1, 0, BanaKey)) {
SerialDevice.println("Banapassport card!");
SerialDevice.print("UID Value:");
nfc.PrintHex(uid, uL);
SerialDevice.print("Block 2 Data:");
if (nfc.mifareclassic_ReadDataBlock(2, card.block)) {
nfc.PrintHex(card.block, 16);
}
delay(2000);
return;
}
if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uL) && nfc.mifareclassic_AuthenticateBlock(uid, uL, M2F_B, 0, MifareKey)) {
SerialDevice.println("Default Key Mifare!");
if (nfc.mifareclassic_ReadDataBlock(2, card.block)) {
SerialDevice.print("Fake IDm:");
nfc.PrintHex(card.IDm, 8);
SerialDevice.print("Fake PMm:");
nfc.PrintHex(card.PMm, 8);
}
delay(2000);
return;
}
if (nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uL)) {
SerialDevice.println("Unknown key Mifare.");
SerialDevice.print("UID Value:");
nfc.PrintHex(uid, uL);
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);
}