一些背景知识:我正在使用带有PN532屏蔽的Arduino Uno向运行HCE应用的Android手机发送命令。
我尝试了两种方法来发送APDU以使用以下APDU数据执行SELECT FILE
操作。我正在使用I2C接口,因为我怀疑我试图使用的屏蔽不支持SPI。
下面的SELECT FILE
命令确实可以使用SPI接口使用不同的屏蔽,但我不能在我的生活中使用I2C与其他屏蔽一起工作。
uint8_t apdu[] = {
0x00, /* CLA */
0xA4, /* INS SELECT FILE command */
0x04, /* P1 - select by DF name */
0x00, /* P2 Get the first record*/
0x07, /* Length of AID */
0xF0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, /* AID */
0x00 /* Le */
};
发送NDEF格式的命令:
A)inListPassiveTarget
这有效,我看到了Android的UID / ncfid
B)inDataExchange,数据如上APDU缓冲区。
这将返回错误帧:
<00> 00 00 ff 01 ff 7f 81 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0
A)inListPassiveTarget
这很有效。逻辑号1被分配给检测到的无源RFID标签(即我的Android手机)。
B)inSelect命令
这很有效。我发送预期的NDEF格式字节:
0xD4 0x54 0x01
然后回来:
0xD5 0x55 0x00
C)使用inCommunicateThru
命令发送上面的SELECT FILE命令。
这不起作用。我收到一个表示超时的响应。
<00> 00 00 ff 03 fd d5 43 01 e7 00
总而言之,尝试inDataExchange会导致应用程序错误失败并尝试inSelect + inCommunicateThru会给出超时。
我尝试使用RF命令增加超时值,但这没有帮助。
非常感谢任何有关调试的帮助。
*****问题已解决******
当我使用较新的三星手机型号三星Galaxy S8尝试使用我的代码时,使用inDataExchange时出现的错误框架神秘地消失了。因此,它可能是新S8上的Android操作系统版本,也可能是旧手机和新手机之间的固件/硬件差异导致的早期错误。