【发布时间】:2014-03-24 08:34:25
【问题描述】:
我正在尝试在我的 LG G2 上使用 HCE,并通过 Elechouse NFC 模块 2.0 向 Arduino Uno 发送一些数据。
问题是nfc.inDataExchange(selectApdu, sizeof(selectApdu), response, &responseLength) 总是返回false。怎么了?
在Arduino forums 上, MisterFrench 让它工作起来,我正在使用完全相同的原则做事。我从 Android HCE 示例中获取了以下内容,只是发送了一些垃圾数据:
@Override
public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
Log.i(TAG, "Received APDU: " + ByteArrayToHexString(commandApdu));
// If the APDU matches the SELECT AID command for this service,
// send the loyalty card account number, followed by a SELECT_OK status trailer (0x9000).
if (Arrays.equals(SELECT_APDU, commandApdu)) {
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(Build.MANUFACTURER);
stringBuilder.append("#");
stringBuilder.append(Build.MODEL);
stringBuilder.append(((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId());
String data = stringBuilder.toString();
Log.i(TAG, "Data send");
return ConcatArrays(data.getBytes(), SELECT_OK_SW);
} else {
return UNKNOWN_CMD_SW;
}
}
在 Arduino 方面,我从 Arduino 论坛获取代码并稍作修改。现在看起来像
void loop(void) {
bool success;
Serial.println("Waiting for an ISO14443A card");
success = nfc.inListPassiveTarget();
if(success) {
Serial.println("Found something!");
uint8_t selectApdu[] = {
0x00, /* CLA */
0xA4, /* INS */
0x04, /* P1 */
0x00, /* P2 */
0x05, /* Length of AID */
0xF2, 0x22, 0x22, 0x22, 0x22,
0x00 /* Le */};
uint8_t response[256];
uint8_t responseLength = sizeof(response);
success = nfc.inDataExchange(selectApdu, sizeof(selectApdu), response, &responseLength);
if(success) {
Serial.print("RAW: ");
for (int i = 0; i < responseLength; ) {
Serial.print(response[i++]);
Serial.print(" ");
}
Serial.println(" ");
for (int i = 0; i < responseLength; i++) {
Serial.print((char)response[i]);
Serial.print(" ");
}
Serial.println(" ");
}
else{
Serial.println("Failed sending SELECT AID");
}
}
else {
Serial.println("Didn't find anything!");
}
delay(1000);
}
我正在使用来自https://github.com/elechouse/PN532 的 Arduino UNO、NFC 库“PN532”
【问题讨论】:
-
您的 SELECT 命令 APDU 不包含 Le 字段,但是您返回的响应 APDU 的数据长度大于零字节。在您的情况下,将命令 APDU 中的 Le 字段设置为 0x00 是有意义的。不确定这是否会导致问题。
-
@MichaelRoland 我已经添加了 Le 字段,但没有任何变化,不断收到“等待 ISO14443A 卡找到一些东西!发送 SELECT AID 失败”消息
标签: android arduino nfc apdu hce