请,我需要任何帮助来解决我的问题。
我无法使用HCE在具有NFC模块的Android(4.4.2)手机和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
}


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

等待ISO14443A卡
找到了东西!
EX_RES:5
responseLength1:18
35、51、53、55、50、52、54、48、53、52、49、57、50、55、49、57、144、0,
========================
等待ISO14443A卡
找到了东西!
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,
========================
等待ISO14443A卡
找到了东西!
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,
========================
等待ISO14443A卡
找到了东西!
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
响应长度:18
11,219,13,51,8,187,181,0,2,54,1,1,1,2,140,0,7,72,1,
EX_RES:4
响应长度:18
1,72,1,2,37,0,4,228,4,160,4,168,7,236,2,138,50,0,


有什么问题?也许有人遇到了这个问题?也许图书馆有问题,或者我做错了什么?

我在用着:


Elechouse NFC模块v2.0
Arduino UNO贴片R3
https://github.com/elechouse/PN532中的NFC库

最佳答案

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


responseLength必须手动设置,并且理想情况下必须等于响应缓冲区的大小(感谢arduino论坛中的Traveller99)
如果屏幕关闭,HCE将无法工作(这是有趣的部分:))


  当前的Android实施会在关闭设备屏幕时完全关闭NFC控制器和应用处理器。因此,当屏幕关闭时,HCE服务将无法使用。但是,HCE服务可以从锁定屏幕运行。



感谢Michael的帮助!

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

10-12 06:19