Android HCE与Arduino和Galaxy S3 cyanogenmod 11

时间:2014-03-27 15:54:19

标签: android arduino nfc cyanogenmod hce

我正在尝试让我的arduino uno设备安装HCE,并使用看到的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声音播放,这通常表明至少发生了一些事情。 所以我的问题是,有人试图使用带有cyanogenmod 10的Galaxy S3以及HCE支持。我真的没有任何想法,我在检查我的代码,在这里阅读了很多问题,但所有人都至少从NFC Shield那里得到了一些东西。

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

2 个答案:

答案 0 :(得分:3)

Android 4.4 HCE不能在带有恩智浦芯片的三星Galaxy S3上运行。 我曾测试过Galaxy Nexus,Nexus 7(2012)和Galaxy S3。所有这3个设备都无法在Kitkat上运行HCE。

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

  

boolean isHceSupported =   。getPackageManager()hasSystemFeature(&#34; android.hardware.nfc.hce&#34);

答案 1 :(得分: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's blog,请参阅example

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

另请注意,如果您从CyanogenMod HCE切换到Android HCE,则必须使用符合ISO 7816-4标准的APDU。因此,一个&#34; APDU&#34;就像你在上面的代码中使用它一样,

apdu[] = "Hello from Arduino";

无效。但是,CyanogenMod HCE不需要在ISO 14443-4传输协议之上使用ISO 7816-4 APDU,因此,很乐意接受此字符串而不是APDU。