2016-06-20 7 views
0

RC522 및 안드로이드 HCE 사이의 데이터 교환 도움말 : 내 RC522 내 아두 이노 UNO에 연결된 문이NFC - 나는 내 프로젝트 설명합니다

합니다.

저는 현재 MIFARE 클래식으로 문을 열 수 있습니다.

이제 안드로이드 스마트 폰으로 열어보고 싶습니다. 그래서 선택한 AID를 가진 좋은 APDU를 받아들이 기 위해 HCE 애플릿을 개발 한 다음, 내 전화기가 데이터를 전송하여 문을 열 것입니다.

는 그러나 문제는 다음과 같습니다

나는 RC522를 사용하여 내 아두 이노와 함께 APDU 명령을 전송하는 방법을 모르겠어요.

현재 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

제 질문은 더 구체적 일 수 없습니다 : RC522와 함께 Arduino에서 APDU 명령을 보내는 방법은 무엇입니까? 도움을 청합니다! :)) –

+0

C++ 언어를 모르지만 validBits 매개 변수에 0 또는 null을 전달하는 것과 동일한가요? 그것은 다음과 같이 사용됩니다 : byte txLastBits = validBits? * validBits : 0; – LaurentY

답변

0

그건 :

내 테스트 코드가

(잘 주석 처리 된) 오픈 소스 프로젝트.

/** 
* 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_TransceiveData가 호출보고이 기능의 소스를 확인할 수 있습니다 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() 

MIFARE_Read 기능을 사용하는 경우 그냥 예를 들어, 소스 코드를 보라 PCD_CommunicateWithPICC 기능.

UPDATE는

당신은 매개 변수에 0 값을 넣어 : "backData", "backLen"및 "validBits을". validBits는 null 일 수 있습니다. backData 및 backLen은 byte로 정의해야합니다.

UPDATE2

당신은 ISO/IEC 14443-3 (A 형)를 지원하지 ISO/IEC 14443-4 (B 형)를 지원 라이브러리 support protocols를 읽어보십시오.

Android HCE documentation 봐 당신이 한 경우 : 특히

, 에 NFC-포럼 ISO-DEP 사양을 기반으로 카드를 모방 안드로이드 4.4 지원이와 (ISO/IEC 14443-4 기준) 프로세스 프로토콜 데이터 유닛 (Application Protocol Data Units : APDU)은 ISO/IEC 7816-4 사양에 정의되어 있습니다. Android는 Nfc-A (ISO/IEC 14443-3 Type A) 기술 위에 ISO-DEP 만 에뮬레이션하는 것을 의무화합니다 ( ). Nfc-B (ISO/IEC 14443-4 유형 B) 기술 지원은 선택 사항입니다. 모든 사양의 레이어링이 게시물에 그림 3

에 표시됩니다 : HCE support for ISO/IEC 14443-3 Type B?

이 분야에서 장치를 보면, 일부 장치는 일부를 사용하는 것 HCE와 에 대한 유형 A를 사용 Type B. 따라서 기본적으로 Type A 또는 Type B가 사용되는지는 인 장치 제조업체가 결정합니다. 안드로이드 API는 앱 개발자가 이것을 영향을 줄 수있는 수단이 전혀 없음 을 제공합니다.

기기가 ISO/IEC 14443-3 (유형 A) 또는 ISO/IEC 14443-4 (유형 B)를 에뮬레이트하는 경우 다른 Android NFC 기기를 확인해야합니다. 다른 Android 기기에서 NfcTagInfo application을 사용하여이를 확인할 수 있습니다.

+0

도움을 주셔서 감사합니다 Laurent, 그냥 내 대답을보세요. –

+0

@RomainHenry 내 대답을 – LaurentY

+0

업데이트하지만 감사의 정의는 무엇입니까? 나는 결국 그것들이 필요하지 않다. 나는 내 테스트 코드를 다시 업데이트하고, 다시 작동하지 않는다. –