nfc.inDataExchange:状态代码表示错误

时间:2013-11-26 06:27:16

标签: c arduino nfc

尝试与我的Android应用进行通信。我的应用程序将一个32字节的md5哈希发送回Arduino。但是,当我收到响应apdu时,最后9个字节已损坏。

这是我的Arduino草图的相关部分:

        uint8_t response[32];

        uint8_t responseLength = sizeof(response);

        if (nfc.inDataExchange(message, sizeof(message), response, &responseLength)) {

            Serial.print("TYPECASTED RAW: ");
            for (int i = 0; i < sizeof(response); i++) {
                Serial.print((char)response[i]);
            }

            Serial.println(" ");

输出:

TYPECASTED RAW: e68d3f574009cbbe0111502ÿÿÿÿÿÿÿÿÿ

正如您所看到的,最后9个字节是错误的。现在,我打开了Adafruit NFC I2C库中的调试模式,它输出“状态码”表示错误&#39;当我发回apdu时。

这是推出状态代码的NFC库的相关部分:

if (pn532_packetbuffer[5]==PN532_PN532TOHOST && pn532_packetbuffer[6]==PN532_RESPONSE_INDATAEXCHANGE) {
      if ((pn532_packetbuffer[7] & 0x3f)!=0) {
        #ifdef PN532DEBUG
          Serial.println("Status code indicates an error");
        #endif
        return false;
      }

任何人都有任何关于为什么我的最后9个字节被破坏的想法?

提前致谢。

2 个答案:

答案 0 :(得分:0)

你的尺码错误。 sizeof(response)被声明为变量response的大小,32个字节。

inDataExchange使用responseLength返回填充的字节,因此不会使用全部32个。

for (int i = 0; i < responseLength; i++) {
    Serial.print((char)response[i]);
}

将打印刚才使用的字节。

答案 1 :(得分:0)

以下是我解决问题的方法。

首先,我在Android端正确构建了APDU。我的原始响应APDU只是散列的字节数组,没有所需的SW1和SW2字节。

然后在Arduino方面,这是我如何从中获取哈希:

        uint8_t response[64];

        uint8_t responseLength = sizeof(response);

        if (nfc.inDataExchange(message, sizeof(message), response, &responseLength)) {

            String respBuffer;

            for (int i = 0; i < 16; i++) {
                if (response[i] < 0x10) respBuffer = respBuffer + "0";
                respBuffer = respBuffer + String(response[i], HEX);                        
            }

            Serial.println(respBuffer);

        }

希望这有助于某人。