无法使用HCE在具有NFC模块的Android手机和Arduino之间交换数据 [英] Can't exchange data between Android phone and Arduino with NFC module, using HCE

查看:94
本文介绍了无法使用HCE在具有NFC模块的Android手机和Arduino之间交换数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请,我需要任何帮助来解决我的问题. 我无法使用HCE在具有NFC模块的Android(4.4.2)手机和Arduino之间正常交换数据.
我以Android示例为例,并做了一些改动,仅返回IMEI号码.

Please, I need any help to solve my problem. I can't exchange data normally between Android (4.4.2) phone and Arduino with NFC module, using HCE.
I took example from Android samples, and slightly changed to return just IMEI number.

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方面,我的代码是:

On Arduino side, my code is:

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, I was receiving "Failed sending SELECT AID", so I tried to figure out why. So i updated code of inDataExchange in PN532.cpp file. So now it looks like this:

// 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
}

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

And now, I'm receiving such log output:


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, 
========================

我知道此结果是不正确的,并且缓冲区的值(由于错误)不变(除了第一位数字,该位会不时变化).
有时我会收到这样奇怪的日志:

I understand that this result is incorrect, and value is unchanged buffer (because of error), except first digit, which is changing from time to time.
Sometimes I receive such strange log:


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, 

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

What's the problem? Maybe someone encountered this problem? Maybe there is some problem with library, or I'm doing something wrong?
I'm using:

  • Elechouse NFC Module v2.0
  • Arduino UNO SMD R3
  • NFC library from https://github.com/elechouse/PN532

推荐答案

我终于使它工作了.首先要说这个问题是由于我在Android编程方面的能力不足(我是新手)而引起的.

I finally got it working. First of all want to say that the problem arose because of my incompetence in Android programming (I'm totally newbie).

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

  1. responseLength must be set manually, and ideally, must be equal to response buffer size (thanks to Traveller99 from arduino forum)

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

HCE will not work if the screen is off (here is the fun part :) )

当前的Android实施会在关闭设备屏幕时完全关闭NFC控制器和应用处理器.因此,当屏幕关闭时,HCE服务将无法使用.但是,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 试图提供帮助!

这篇关于无法使用HCE在具有NFC模块的Android手机和Arduino之间交换数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆