0

我目前正在尝试使用我的 arduino uno 设备运行 HCE,该设备安装有 Seeed NFC Shield V 2.0

我正在使用来自https://github.com/Seeed-Studio/PN532/blob/master/PN532/examples/android_hce/android_hce.ino的示例代码

#include <SPI.h>
#include <PN532_SPI.h>
#include <PN532Interface.h>
#include <PN532.h>

PN532_SPI pn532spi(SPI, 10);
PN532 nfc(pn532spi);


void setup()
{
    Serial.begin(115200);
    Serial.println("-------Peer to Peer HCE--------");

    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();
}

void loop()
{
  bool success;

  uint8_t responseLength = 32;

  Serial.println("Waiting for an ISO14443A card");

  // set shield to inListPassiveTarget
  success = nfc.inListPassiveTarget();

  if(success) {

     Serial.println("Found something!");

    uint8_t selectApdu[] = { 0x00, /* CLA */
                              0xA4, /* INS */
                              0x04, /* P1  */
                              0x00, /* P2  */
                              0x07, /* Length of AID  */
                              0xF0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, /* AID defined on Android App */
                              0x00  /* Le  */ };

    uint8_t response[32];

    success = nfc.inDataExchange(selectApdu, sizeof(selectApdu), response, &responseLength);

    if(success) {

      Serial.print("responseLength: "); Serial.println(responseLength);

      nfc.PrintHexChar(response, responseLength);

      do {
        uint8_t apdu[] = "Hello from Arduino";
        uint8_t back[32];
        uint8_t length = 32;

        success = nfc.inDataExchange(apdu, sizeof(apdu), back, &length);

        if(success) {

          Serial.print("responseLength: "); Serial.println(length);

          nfc.PrintHexChar(back, length);
        }
        else {

          Serial.println("Broken connection?");
        }
      }
      while(success);
    }
    else {

      Serial.println("Failed sending SELECT AID");
    }
  }
  else {

    Serial.println("Didn't find anything!");
  }

  delay(1000);
}

void printResponse(uint8_t *response, uint8_t responseLength) {

   String respBuffer;

    for (int i = 0; i < responseLength; i++) {

      if (response[i] < 0x10)
        respBuffer = respBuffer + "0"; //Adds leading zeros if hex value is smaller than 0x10

      respBuffer = respBuffer + String(response[i], HEX) + " ";
    }

    Serial.print("response: "); Serial.println(respBuffer);
}

void setupNFC() {

  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);

  // configure board to read RFID tags
  nfc.SAMConfig();
}

我的 android 代码取自 HCE 开发指南,我还尝试了代码形式https://github.com/grundid/host-card-emulation-sample

我的问题是,arduino 代码甚至无法识别标签。所以我得到的是:

Waiting for an ISO14443A card
Didn't find anything!
Waiting for an ISO14443A card
Didn't find anything!
Waiting for an ISO14443A card 

事实上,在 Android 端,我没有收到任何数据包,也没有播放花哨的 NFC 声音,这通常表明至少发生了一些事情。所以我的问题是,是否有人尝试将 Galaxy S3 与 cyanogenmod 10 以及 HCE 支持一起使用。我真的没有任何想法,我对我的代码进行了三次检查,在这里阅读了很多关于 SO 的问题,但所有人都至少从 NFC Shield 收到了一些东西。

我知道常见的 NFC 模式可以正常工作,因为我有一个在“正常”模式下使用 NFC 的应用程序。当我在我的 arduino 上运行这个 NFC 协议时,所有应用程序都会收到一个数据包,(尽管它们无法正确路由它们,因为它们不是 adpu 数据包)

4

2 回答 2

3

Android 4.4 HCE 无法在配备 NXP 芯片的三星 Galaxy S3 上运行。我测试过 Galaxy Nexus、Nexus 7(2012) 和 Galaxy S3。所有这 3 款设备都无法在 Kitkat 上运行 HCE。

您可以检查设备是否支持 HCE:

boolean isHceSupported = getPackageManager().hasSystemFeature("android.hardware.nfc.hce");

于 2014-07-21T10:31:48.783 回答
2

CyanogenMod 10.* 不支持Android HCE(由Android 4.4 HCE API提供)。该 API 仅从 CyanogenMod 11 开始可用,即便如此,我也不确定 Android HCE API 的 CyanogenMod 实现是否适用于配备 NXP 芯片组的设备(例如 Galaxy S3)。

CyanogenMod 10.* 具有不同的 HCE API。有关如何使用该 API的示例,请参阅Nikolay 的博客。

基本上,要使您的 Arduino 程序正常工作,您必须基于该IsoPcdA技术实施 HCE。

另请注意,如果您曾经从 CyanogenMod HCE 切换到 Android HCE,则必须使用符合 ISO 7816-4 的 APDU。因此,像您在上面的代码中使用它的“APDU”,

apdu[] = "Hello from Arduino";

行不通。然而,CyanogenMod HCE 不需要在 ISO 14443-4 传输协议之上使用 ISO 7816-4 APDU,因此会很乐意接受这个字符串而不是 APDU。

于 2014-03-27T17:00:54.007 回答