问题
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;
}
}
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);
}
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
回答1:
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).
responseLength
must be set manually, and ideally, must be equal to response buffer size (thanks to Traveller99 from arduino forum)HCE will not work if the screen is off (here is the fun part :) )
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.
Thanks to Michael for trying to help!
来源:https://stackoverflow.com/questions/22643294/cant-exchange-data-between-android-phone-and-arduino-with-nfc-module-using-hce