我正在尝试让我的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数据包)
答案 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。