使用Arduino发送APDU命令时出错更改模块上下文

问题描述

我尝试使用Arduino Uno和PN532发送APDU命令。 PN532找到EMV卡,但是当我尝试发送命令时,我得到了:

状态码表示错误

响应转储显示此结果(前8个字节):

0x00 0x00 0xFF 0x03 0xFD 0xD5 0x41 0x27

我发送的命令(SELECT PPSE):

00 A4 04 00 0E 32 50 41 59 2E 53 59 53 2E 44 44 46 30 31 00

根据文档,代码0x27(8字节)表示:

由于PN532的当前上下文(发起方与目标,未知目标编号,目标未处于良好状态,...),因此此命令不可接受

如何将上下文更改为发送命令所需的上下文?

我的代码

void loop(void) {
  uint8_t success;
  uint8_t uid[] = {0,0};
  uint8_t uidLength;

  // EMV card
  bool apdusuccess;
  uint8_t apdu[255];
  uint8_t berBuffer[255];
  uint8_t berLength = 255;

  success = nfc.readPassiveTargetID(PN532_mifare_ISO14443A,uid,& uidLength);

  if (success && uid && (uidLength == 4)) {
    uint8_t apdu[] = {0x00,0xA4,0x04,0x00,0x0e,0x32,0x50,0x41,0x59,0x2e,0x53,0x44,0x46,0x30,0x31,0x00};
    apdusuccess = nfc.inDataExchange(apdu,sizeof(apdu),berBuffer,&berLength);
    Serial.print("APDU Success: ");
    Serial.println(apdusuccess);
  }  
}

解决方法

我找到了一个解决方案,它可以与inListPassiveTarget一起使用:

void loop(void) {
  uint8_t success;
  uint8_t uid[] = {0,0};
  uint8_t uidLength;

  // EMV card
  bool apdusuccess;
  uint8_t apdu[255];
  uint8_t berBuffer[255];
  uint8_t berLength = 255;

  success = nfc.inListPassiveTarget();

  if (success) {
    uint8_t apdu[] = {0x00,0xA4,0x04,0x00,0x0e,0x32,0x50,0x41,0x59,0x2e,0x53,0x44,0x46,0x30,0x31,0x00};
    apdusuccess = nfc.inDataExchange(apdu,sizeof(apdu),berBuffer,&berLength);
    Serial.print("APDU Success: ");
    Serial.println(apdusuccess);
  }  
}