请,我需要任何帮助来解决我的问题。
我无法使用HCE在Android(4.4.2)手机和Arduino之间通过NFC模块正常交换数据。
我从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,
有什么问题?也许有人遇到过这个问题?也许库存在一些问题,或者我做错了什么?
我正在使用:
答案 0 :(得分:1)
我终于开始工作了。首先要说的是问题出现是因为我在Android编程中无能(我完全是新手)。
responseLength
必须手动设置,理想情况下,必须等于响应缓冲区大小(感谢来自arduino论坛的Traveller99)
如果屏幕关闭,HCE将无效(这是有趣的部分:))
当设备的屏幕关闭时,当前的Android实施方案会完全关闭NFC控制器和应用程序处理器。因此,当屏幕关闭时,HCE服务将不起作用。但是,HCE服务可以在锁定屏幕上运行。
感谢Michael尝试提供帮助!