2013-06-04 3 views
0

현재 Android 용 NFC 애플리케이션을 개발 중입니다. 우리의 경험Nexus 4 읽기 Mifare 클래식 카드 UID

  • MIFARE 클래식 (1K)의 제어 및 표준 CEPAS 위해 NXP PN5xx 칩을 사용

    개발 POS NFC 제어 시스템

  • 갤럭시 넥서스에서 MiFareClassic 및 초경량 C (NXP를 사용하는

    개발 안드로이드 NFC 제어 시스템 NFC 칩셋)

  • 넥서스의 초경량 C 대

    개발 안드로이드 NFC 제어 시스템 (4)

우리의 과제 : POS 시스템 (NXP 칩 포함)의 MiFareClassic 1K 카드를 제어하고 새로운 Android 태블릿 (Broadcom 칩 포함)에 이미 카드 기반이 설치되어있어이를 대체 할 수 없습니다.

- Nexus 4가 NFC 칩을 변경 한 것을 알고 있지만 이제는 UID를 제외한 Mifare 클래식 카드 블록을 읽거나 쓸 수 없습니다.

- Google 코드가 Mifare 클래식 카드를 NfcA 유형으로 감지합니다. NfcA에는 원시 NFC-A 명령을 태그에 보내고 응답을 수신하는 transmitive (byte [] 데이터)라는 메서드가 있습니다.

은 - 우리의 문제는 우리가 다른 사람들이 온라인 그들은 그것을 할 수 있다고 UID를 읽을 수있는 장치로 전송할 무엇 코드를 알 필요가있다하지만 방법은 현재 우리가 항상 오류가

을 발견 할 수 있습니다 안드로이드 .nfc.TagLostException : 태그가 손실되었습니다.

답변 해 주셔서 감사합니다.

답변

1

인 텐트의 태그 개체에 getId()을 호출 할 수 있습니다. 이렇게하면 태그의 ID가 반환됩니다 (MIFARE Classic의 경우 4 바이트 또는 7 바이트의 고유 ID, 임의의 ID 또는 고정 된 고유하지 않은 4 바이트 ID 일 수 있음, 정확한 MIFARE Classic에 따라 다름) 생성물). NfcAconnect()으로 전화 할 필요가 없습니다 (의미있는 작업을 수행 할 가능성이 없음).

삼성 갤럭시 S4에서는 작동하지 않습니다. 그 전화는 MIFARE 태그가 두드려 졌을 때 NFC 인 텐트를 보내지 않을 것입니다. 대신 전화가이 태그와 호환되지 않는다는 오류 메시지를 화면에 표시 한 다음 태그를 무시합니다.

업데이트 : S4 실행중인 Android 4.4 KitKat에서 NFC 판독기 모드를 사용하여 MIFARE 기본 태그의 경우 카드 UID와 같은 세부 정보에 액세스 할 수 있습니다.

+0

고맙습니다. 당신의 방식대로 작동합니다. – andy8702

+0

안녕하세요, 제 친구가 'NFC 도구'라는 앱을 사용하여 S4에서 Mifare 1K 카드를 테스트했는데 앱이 일련 번호 (이 경우 UID)를 감지했습니다. 이것이 어떻게 이루어 졌는지 아십니까? 감사. – paradite

+0

@ zhuliangg11 내 업데이트보기, 아마도 그걸 해결할 수 있을까요? –

3

당신은 브로드 컴 칩을 사용하여 MIFARE 클래식 칩에 말할 수 당신은 UID를 읽을 수 있습니다 4.

넥서스에서 발견. 이것이 NfcA와 호환되는 Mifare Classic 프로토콜의 일부입니다.

그 이상의 것들은 Broadcom 칩 (및 다가올 많은 NFC 컨트롤러)에서 부족한 Mifare Classic Crypto1 알고리즘을 구현해야합니다.

Mifare Classic에 대한 인증 요청에서 칩이 NfcA와 호환되지 않는 프레임을 보내야하기 때문에 소프트웨어에서 Crypto1을 실행 (sourcecode는 wikipedia에 있음) 할 수도 없습니다.

+0

닐스, 나는 내가 UID를 읽을 수 you.How에 동의? 이것은 나의 질문이다. 예제 코드가 있습니까? 당신은 오류를 볼 수 있습니다, 그것은 위의 내 OP에 있습니다. – andy8702

0

발송자가 이미 설정과 음, 당신이 당신의 활동에 이것을 사용할 수 있습니다 :

private String serialId = ""; 

@Override 
    public void onNewIntent(Intent intent) { 
    String action = intent.getAction(); 
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
    if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(action)) {   
     try { 
      byte[] tagId = tag.getId(); 
      serialId = bytesToHex(tagId); 
      Log.d("[ReadCardTools]", "Serial Number: " + result); 
     } catch (NullPointerException ex) { 
      ex.printStackTrace(); 
      serialId = "ERROR"; 
     } 
    } else { 
     Toast.makeText(this, "This tag is not supported. Action: " + action, Toast.LENGTH_LONG).show(); 
    } 
} 

private String bytesToHex(byte[] bytes) { 
    char[] hexChars = new char[bytes.length * 2]; 
    int v; 
    for (int j = 0; j < bytes.length; j++) { 
     v = bytes[j] & 0xFF; 
     hexChars[j * 2] = hexArray[v >>> 4]; 
     hexChars[(j * 2) + 1] = hexArray[v & 0x0F]; 
    } 
    return new String(hexChars); 
} 
관련 문제