【发布时间】:2018-03-21 10:42:46
【问题描述】:
我是 Arduino 新手。我正在尝试将 ID 写入我的 NFC 卡。我使用了示例中的 PN532 库和代码。我不能比authenticateBlock() 更进一步。还有哪个块正在尝试进行身份验证?我在输出中看不到它。
输出:
- 找到 1 个标签
- 感应响应:0x44
- 选择响应:0x0
- 0x4 0xB9 0xC9 0xBA 0x20 0x4B 0x80
- 读卡#3122678656
代码是:
// This example writes a MIFARE memory block 0x08. It is tested with a new MIFARE 1K cards. Uses default keys.
// Note: Memory block 0 is readonly and contains manufacturer data. Do not write to Sector Trailer block
// unless you know what you are doing. Otherwise, the MIFARE card may be unusable in the future.
//Contributed by Seeed Technology Inc (www.seeedstudio.com)
#include <PN532.h>
#include <SPI.h>
/*Chip select pin can be connected to D10 or D9 which is hareware optional*/
/*if you the version of NFC Shield from SeeedStudio is v2.0.*/
#define PN532_CS 10
PN532 nfc(PN532_CS);
uint8_t written = 0;
#define NFC_DEMO_DEBUG 1
void setup(void) {
#ifdef NFC_DEMO_DEBUG
Serial.begin(9600);
Serial.println("Hello!");
#endif
nfc.begin();
uint32_t versiondata = nfc.getFirmwareVersion();
if (! versiondata) {
#ifdef NFC_DEMO_DEBUG
Serial.print("Didn't find PN53x board");
#endif
while (1); // halt
}
#ifdef NFC_DEMO_DEBUG
// Got ok data, print it out!
Serial.print("Found chip PN5");
Serial.println((versiondata >> 24) & 0xFF, HEX);
Serial.print("Firmware ver. ");
Serial.print((versiondata >> 16) & 0xFF, DEC);
Serial.print('.');
Serial.println((versiondata >> 8) & 0xFF, DEC);
Serial.print("Supports ");
Serial.println(versiondata & 0xFF, HEX);
#endif
// configure board to read RFID tags and cards
nfc.SAMConfig();
}
void loop(void) {
uint32_t id;
// look for MiFare type cards
id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);
if (id != 0) {
#ifdef NFC_DEMO_DEBUG
Serial.print("Read card #");
Serial.println(id);
Serial.println();
#endif
uint8_t keys[] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
uint8_t writeBuffer[16];
for (uint8_t i = 0; i < 16; i ++) {
writeBuffer[i] = i; //Fill buffer with 0,1,2....F
}
if (nfc.authenticateBlock(1, id , 0x08, KEY_A, keys)) {
//authenticate block 0x08
//if authentication successful
if (written == 0) {
//Not written
written = nfc.writeMemoryBlock(1, 0x08, writeBuffer); // Write writeBuffer[] to block 0x08
if (written)
#ifdef NFC_DEMO_DEBUG
Serial.println("Write Successful");
#endif
}
uint8_t block[16];
//read memory block 0x08
if (nfc.readMemoryBlock(1, 0x08, block)) {
#ifdef NFC_DEMO_DEBUG
Serial.println("Read block 0x08:");
//if read operation is successful
for (uint8_t i = 0; i < 16; i++) {
//print memory block
Serial.print(block[i], HEX);
Serial.print(" ");
}
Serial.println();
#endif
}
}
}
delay(500);
}
【问题讨论】:
-
您使用的 PN532 的库版本是多少?我认为问题可能出在身份验证命令中。在我在互联网上查看的库中,我在 authenticateBlock 函数中看到了这些参数:“uint8_t * uid,uint8_t uidLen,uint32_t blockNumber,uint8_t keyNumber,uint8_t * keyData”。在您的情况下,卡的 uid 是一个 uint32_t 变量,也许您需要检索 uid 或在 uint8_t 变量中重新转换,您能否分享您正在使用的 authenticateBlock 函数定义?
标签: authentication arduino nfc iot arduino-uno