__Witheart__ 2022-08-31 22:45 采纳率: 0%
浏览 78

请问如何使用ESP32和PN532模块,在Arduino IDE框架下使用PN532模拟ID卡,可以在刷卡机上刷卡使用

问题遇到的现象和发生背景

请问如何使用ESP32和PN532模块,在Arduino IDE框架下使用PN532模拟ID卡,可以在刷卡机上刷卡使用

我使用的是Adafruit_PN532库,其中示例代码的iso14443as_target.ino文件中的ppse 以及apdu指令理解不了


```c
uint8_t ppse[] = {0x8E, 0x6F, 0x23, 0x84, 0x0E, 0x32, 0x50, 0x41, 0x59, 0x2E, 0x53, 0x59, 0x53, 0x2E, 0x44, 0x44, 0x46, 0x30, 0x31, 0xA5, 0x11, 0xBF, 0x0C, 0x0E, 0x61, 0x0C, 0x4F, 0x07, 0xA0, 0x00, 0x00, 0x00, 0x03, 0x10, 0x10, 0x87, 0x01, 0x01, 0x90, 0x00};

希望得到指点,不尽感激!

以下是完整示例代码


```c
/**************************************************************************/
/*! 
    @file     iso14443as_target.pde
    @original Adafruit Industries
    @modified Salvador Mendoza(@Netxing)
    @license  BSD (see license.txt)

    This example will attempt to mimic an ISO14443A smart card
    and retrieve some basic information from a PoS or terminal,
    this can be used to establish a communication process.   
   
    Note that you need the baud rate to be 115200 because we need to print
    out the data and read from the card at the same time!

This is an example sketch for the Adafruit PN532 NFC/RFID breakout boards
This library works with the Adafruit NFC breakout 
  ----> https://www.adafruit.com/products/364
 
Check out the links above for our tutorials and wiring diagrams 
These chips use SPI or I2C to communicate.

Adafruit invests time and resources providing this open source code, 
please support Adafruit and open-source hardware by purchasing 
products from Adafruit!

*/
/**************************************************************************/
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_PN532.h>

// If using the breakout with SPI, define the pins for SPI communication.
#define PN532_SCK  (2)
#define PN532_MOSI (3)
#define PN532_SS   (4)
#define PN532_MISO (5)

// If using the breakout or shield with I2C, define just the pins connected
// to the IRQ and reset lines.  Use the values below (2, 3) for the shield!
#define PN532_IRQ   (2)
#define PN532_RESET (3)  // Not connected by default on the NFC Shield

// Uncomment just _one_ line below depending on how your breakout or shield
// is connected to the Arduino:

// Use this line for a breakout with a SPI connection:
Adafruit_PN532 nfc(PN532_SCK, PN532_MISO, PN532_MOSI, PN532_SS);

// Use this line for a breakout with a hardware SPI connection.  Note that
// the PN532 SCK, MOSI, and MISO pins need to be connected to the Arduino's
// hardware SPI SCK, MOSI, and MISO pins.  On an Arduino Uno these are
// SCK = 13, MOSI = 11, MISO = 12.  The SS line can be any digital IO pin.
//Adafruit_PN532 nfc(PN532_SS);

// Or use this line for a breakout or shield with an I2C connection:
//Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET);

void setup(void) {
  Serial.begin(115200);
  while (!Serial) delay(10); // for Leonardo/Micro/Zero

  Serial.println("Hello!");

  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    Serial.print("Didn't find PN53x board");
    while (1); // halt
  }
  
  // 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);
  
  // Set the max number of retry attempts to read from a card
  // This prevents us from waiting forever for a card, which is
  // the default behaviour of the PN532.
  nfc.setPassiveActivationRetries(0xFF);
  
  // configure board to read RFID tags
  nfc.SAMConfig();
  
  Serial.println("As Target... Approach the NFC PN532 Board to a PoS or terminal!");
  delay(200);
}

void loop(void) {
  boolean success;
  uint8_t apdubuffer[255] = {}, apdulen;
  uint8_t ppse[] = {0x8E, 0x6F, 0x23, 0x84, 0x0E, 0x32, 0x50, 0x41, 0x59, 0x2E, 0x53, 0x59, 0x53, 0x2E, 0x44, 0x44, 0x46, 0x30, 0x31, 0xA5, 0x11, 0xBF, 0x0C, 0x0E, 0x61, 0x0C, 0x4F, 0x07, 0xA0, 0x00, 0x00, 0x00, 0x03, 0x10, 0x10, 0x87, 0x01, 0x01, 0x90, 0x00};
  nfc.AsTarget();
  success = nfc.getDataTarget(apdubuffer, &apdulen); //Read initial APDU
  if (apdulen>0){
    for (uint8_t i = 0; i < apdulen; i++){
      Serial.print(" 0x"); Serial.print(apdubuffer[i], HEX);
    }
    Serial.println("");
  }
  nfc.setDataTarget(ppse, sizeof(ppse));   //Mimic a smart card response with a PPSE APDU
  nfc.getDataTarget(apdubuffer, &apdulen); //Read respond from the PoS or Terminal
  if (apdulen>0){
    for (uint8_t i = 0; i < apdulen; i++){
      Serial.print(" 0x"); Serial.print(apdubuffer[i], HEX);
    }
    Serial.println("");
  }
  delay(1000);
}


```

  • 写回答

1条回答 默认 最新

  • qllaoda 2022-08-31 23:05
    关注

    建议先学习一下这种rfid的基础理论知识后再研究代码。

    评论

报告相同问题?

问题事件

  • 修改了问题 8月31日
  • 创建了问题 8月31日

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog