2016-06-20 4 views
0

поясню мой проект:NFC - Помощь для обмена данными между RC522 и Android HCE

У меня есть мой RC522 и дверь, подсоединенный моей Arduino UNO.

В настоящее время я открываю дверь с классикой MIFARE.

Но теперь я хочу открыть его с помощью своего смартфона Android, поэтому я разработал апплет HCE, чтобы принять хороший APDU с выбранной AID, затем мой телефон передаст данные, чтобы открыть дверь.

Но проблема:

Я не знаю, как отправить команду APDU с моим Arduino с использованием RC522.

В настоящее время для моих карт MIFARE я пользуюсь библиотекой https://github.com/miguelbalboa/rfid.

Мой тестовый код:

byte selectApdu[] = { 
    0x00, /* CLA */ 
    0xA4, /* INS */ 
    0x04, /* P1 */ 
    0x00, /* P2 */ 
    0x05, /* Length of AID */ 
    0xF2, 0x22, 0x22, 0x22, 0x22, 
}; 
byte * backData = (byte *)malloc(16*sizeof(byte)); 
byte * dataLen = (byte *)16; 

status = mfrc522.PCD_TransceiveData(selectApdu,10,backData,dataLen,NULL,0,false); 
if (status != MFRC522::STATUS_OK) { 
    Serial.print(F("PCD_TransceiveData() failed: ")); 
    Serial.println(mfrc522.GetStatusCodeName(status)); 
    return; 
} 
else 
{ 
    Serial.println(F("PICC_TransceiveData() success ")); 
} 

Neverless, он не работает («Тайм-аут в общении»), и я медленно нужно думать, что RC522 не совместимы ...

+0

Пожалуйста, постарайтесь улучшить этот вопрос, продемонстрировав нам вашу лучшую попытку доброй воли и задав гораздо более конкретный вопрос о том, что вас смущает. – abarisone

+0

Мой вопрос не может быть более конкретным: как отправить команду APDU на Arduino с RC522? Thx за помощью! :)) –

+0

Я не знаю языка C++, то же самое, чтобы передать значение 0 или null в значение validBits? Он используется как это: byte txLastBits = validBits? * validBits: 0; – LaurentY

ответ

0

Это (хорошо прокомментированный) проект с открытым исходным кодом. Просто посмотрите на исходный код, например, если вы используете MIFARE_Read функцию MFRC522.cpp

MFRC522::StatusCode MFRC522::MIFARE_Read( byte blockAddr,  ///< MIFARE Classic: The block (0-0xff) number. MIFARE Ultralight: The first page to return data from. 
              byte *buffer,  ///< The buffer to store the data in 
              byte *bufferSize ///< Buffer size, at least 18 bytes. Also number of bytes returned if STATUS_OK. 
             ) { 
    MFRC522::StatusCode result; 

    // Sanity check 
    if (buffer == NULL || *bufferSize < 18) { 
     return STATUS_NO_ROOM; 
    } 

    // Build command buffer 
    buffer[0] = PICC_CMD_MF_READ; 
    buffer[1] = blockAddr; 
    // Calculate CRC_A 
    result = PCD_CalculateCRC(buffer, 2, &buffer[2]); 
    if (result != STATUS_OK) { 
     return result; 
    } 

    // Transmit the buffer and receive the response, validate CRC_A. 
    return PCD_TransceiveData(buffer, 4, buffer, bufferSize, NULL, 0, true); 
} // End MIFARE_Read() 

Вы могли видеть, функция PCD_TransceiveData называется и проверить источник этой функции:

/** 
* Executes the Transceive command. 
* CRC validation can only be done if backData and backLen are specified. 
* 
* @return STATUS_OK on success, STATUS_??? otherwise. 
*/ 
MFRC522::StatusCode MFRC522::PCD_TransceiveData( byte *sendData,  ///< Pointer to the data to transfer to the FIFO. 
                byte sendLen,  ///< Number of bytes to transfer to the FIFO. 
                byte *backData,  ///< NULL or pointer to buffer if data should be read back after executing the command. 
                byte *backLen,  ///< In: Max number of bytes to write to *backData. Out: The number of bytes returned. 
                byte *validBits, ///< In/Out: The number of valid bits in the last byte. 0 for 8 valid bits. Default NULL. 
                byte rxAlign,  ///< In: Defines the bit position in backData[0] for the first bit received. Default 0. 
                bool checkCRC  ///< In: True => The last two bytes of the response is assumed to be a CRC_A that must be validated. 
           ) { 
    byte waitIRq = 0x30;  // RxIRq and IdleIRq 
    return PCD_CommunicateWithPICC(PCD_Transceive, waitIRq, sendData, sendLen, backData, backLen, validBits, rxAlign, checkCRC); 
} // End PCD_TransceiveData() 

Вы можете под названием PCD_TransceiveData или PCD_CommunicateWithPICC функции.

UPDATE

Вы кладете 0 значения параметров: "ретроспективный", "backLen" и "validBits". Действительные биты могут быть пустыми. backData и backLen должны быть определены как байты.

UPDATE2

Если посмотреть на библиотеку support protocols Он поддерживает ISO/IEC 14443-3 (тип А) и не поддерживает ISO/IEC 14443-4 (тип B).

Если вы посмотрите на Android HCE documentation:

В частности, Android 4.4 поддерживает имитирующие карты, основанные на с NFC-форум ISO-DEP спецификации (на основе стандарта ISO/IEC 14443-4) и (APDU), как определено в спецификации ISO/IEC 7816-4. Android-мандаты, имитирующие ISO-DEP только поверх технологии Nfc-A (ISO/IEC 14443-3 типа A). Поддержка Технология Nfc-B (ISO/IEC 14443-4 типа B) является дополнительной.Наслоение всех этих спецификаций показано на рисунке 3

В этом посте: HCE support for ISO/IEC 14443-3 Type B?

Глядя на устройства в поле, некоторые устройства используют тип А для HCE и некоторые, кажется, используют Тип B. Таким образом, это в основном производитель устройства, который решает, используется ли тип A или тип B. Android API не предоставляет средства , чтобы разработчик приложения мог повлиять на это.

Таким образом, вам необходимо проверить с помощью другого устройства Android NFC, если ваше устройство имитирует ISO/IEC 14443-3 (тип A) или ISO/IEC 14443-4 (тип B). Вы можете использовать NfcTagInfo application на другом устройстве Android, чтобы проверить это.

+0

Спасибо за помощь Лоран, просто взгляните на мой ответ выше. –

+0

@RomainHenry Я обновляю свой ответ – LaurentY

+0

спасибо, но в чем их определить? В конце концов, они мне не нужны. Я снова обновляю свой тестовый код, и он снова не работает. –

 Смежные вопросы

  • Нет связанных вопросов^_^