android - 无法使用 NFC 模块在 Android 手机和 Arduino 之间交换数据,使用 HCE

标签 android arduino nfc apdu hce

拜托,我需要任何帮助来解决我的问题。 我无法使用 HCE 在 Android (4.4.2) 手机和带有 NFC 模块的 Arduino 之间正常交换数据。
我从 Android 示例中获取示例,并稍作更改以仅返回 IMEI 号码。

public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
    if (Arrays.equals(SELECT_APDU, commandApdu)) {
        String data = ((TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId();
        return ConcatArrays(data.getBytes(), SELECT_OK_SW);
    } else {
        return UNKNOWN_CMD_SW;
    }
}

在Arduino这边,我的代码是:

void loop(){
    Serial.println("Waiting for an ISO14443A card");
    uint8_t success;

    success = nfc.inListPassiveTarget();
    if(success){
        Serial.println("Found something!");      
        uint8_t responseLength = 32;
        uint8_t response[32];
        uint8_t selectApdu[] = { 
             0x00, /* CLA */
             0xA4, /* INS */
             0x04, /* P1  */
             0x00, /* P2  */
             0x05, /* Length of AID  */
             0xF2, 0x22, 0x022, 0x22, 0x22, /* AID */
             0x00  /* Le  */};

        success = nfc.inDataExchange(selectApdu, sizeof(selectApdu), response, &responseLength);
        Serial.print("EX_RES:");
        Serial.println(success);

        if(success) {
            Serial.print("responseLength: "); 
            Serial.println(responseLength);
            for(int i=0; i<responseLength; i++){
                Serial.print(response[i]);
                Serial.print(", ");
            }
            Serial.println();
            Serial.println("========================");
        }
        else {
            Serial.println("Failed sending SELECT AID"); 
        }
    }
    else {
        Serial.println("Didn't find anything!");
    }

    delay(1000);
}

最初,我收到“发送 SELECT AID 失败”的消息,所以我试图找出原因。所以我在 PN532.cpp 文件中更新了 inDataExchange 的代码。所以现在它看起来像这样:

// initially function was returning bool
uint8_t PN532::inDataExchange(uint8_t *send, uint8_t sendLength, uint8_t *response, uint8_t *responseLength){

uint8_t i;
pn532_packetbuffer[0] = 0x40; // PN532_COMMAND_INDATAEXCHANGE;
pn532_packetbuffer[1] = inListedTag;

if (HAL(writeCommand)(pn532_packetbuffer, 2, send, sendLength)) {
    return 2; // initially was false
}

int16_t status = HAL(readResponse)(response, *responseLength, 1000);
if (status < 0) {
    return 3;  // initially was false
}

if ((response[0] & 0x3f) != 0) {
    DMSG("Status code indicates an error\n");
    return 4;  // initially was false
}

uint8_t length = status;
length -= 1;

if (length > *responseLength) {
    length = *responseLength; // silent truncation...
}

for (uint8_t i = 0; i < length; i++) {
    response[i] = response[i + 1];
}
*responseLength = length;

return 5;  // initially was true
}

现在,我收到这样的日志输出:

Waiting for an ISO14443A card
Found something!
EX_RES:5
responseLength1: 18
35, 51, 53, 55, 50, 52, 54, 48, 53, 52, 49, 57, 50, 55, 49, 57, 144, 0, 
========================
Waiting for an ISO14443A card
Found something!
EX_RES:4
responseLength1: 32
11, 51, 53, 55, 50, 52, 54, 48, 53, 52, 49, 57, 50, 55, 49, 57, 144, 0, 0, 36, 0, 0, 3, 5, 17, 2, 117, 0, 194, 1, 6, 7, 
========================
Waiting for an ISO14443A card
Found something!
EX_RES:4
responseLength1: 32
1, 51, 53, 55, 50, 52, 54, 48, 53, 52, 49, 57, 50, 55, 49, 57, 144, 0, 0, 36, 0, 0, 3, 5, 17, 2, 117, 0, 194, 1, 6, 7, 
========================
Waiting for an ISO14443A card
Found something!
EX_RES:4
responseLength1: 32
11, 51, 53, 55, 50, 52, 54, 48, 53, 52, 49, 57, 50, 55, 49, 57, 144, 0, 0, 36, 0, 0, 3, 5, 17, 2, 117, 0, 254, 0, 0, 0, 
========================

我知道这个结果是不正确的,并且值是不变的缓冲区(因为错误),除了第一个数字,它会不时改变。
有时我会收到这样奇怪的日志:

EX_RES:4
responseLength: 18
11, 219, 13, 51, 8, 187, 181, 0, 2, 54, 1, 1, 2, 140, 0, 7, 72, 1, 
EX_RES:4
responseLength: 18
1, 72, 1, 2, 37, 0, 4, 228, 4, 160, 4, 168, 7, 236, 2, 138, 50, 0, 

有什么问题?也许有人遇到过这个问题?也许图书馆有问题,或者我做错了什么?
我正在使用:

最佳答案

我终于让它工作了。首先想说的是,问题的出现是因为我在 Android 编程方面的无能(我是新手)。

  1. responseLength 必须手动设置,理想情况下,必须等于响应缓冲区大小(感谢来自 arduino 论坛的 Traveller99)

  2. 如果屏幕关闭,HCE 将无法工作(这是有趣的部分 :))

    Current Android implementations turn the NFC controller and the application processor off completely when the screen of the device is turned off. HCE services will therefore not work when the screen is off. HCE services can function from the lock-screen however.

感谢Michael感谢您的帮助!

关于android - 无法使用 NFC 模块在 Android 手机和 Arduino 之间交换数据,使用 HCE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22643294/

相关文章:

android - 线程 sleep 奇怪的行为

android - Android到底是如何判断是否在线的呢?

c# - 如何从 viewmodel 使用 iOS/Xamarin 扫描 NFC 标签

android - 为什么在我创建具有抽屉导航的应用程序时看到两个工具栏?

android - 如何使用Zxing Library生成二维码?

android - Arduino 和 Android 之间的蓝牙串口通信问题

java - 如何使用Java作为Arduino的编程语言?

c# - C#控制的步进电机

android - 将数据写入新 NFC 标签不起作用?

android - 在 Android Lollipop 上使用 NFC 激活设备所有者