2013-03-28 1 views
1

Android 애플리케이션에서 NXP가 개발 한 NFC 태그를 읽으려고합니다. Android로 태그를 읽을 수 있습니다 : App by NXPone other 올바르게 읽습니다.NXP ICODE SLI-L 태그를 Android로 읽는 중

정확한 태그 유형은 "ICODE SLI-L (SL2ICS50)"이고 RF 기술은 "Type V/ISO 15693"(작동중인 응용 프로그램에서 가져온 데이터)입니다. 메모리는 각각 4 블록으로 구성된 2 페이지로 구성되며 블록은 각각 4 바이트를 갖습니다. 전체 데이터를 메모리에 저장하려고합니다.

태그는 Android의 NfcV 클래스로 처리해야하며 태그의 데이터 시트는 available here이지만 NfcV을 사용하여 작동하는 코드 예제를 찾는 것은 어렵습니다. 나는 데이터 시트에 의해 스스로 결론을 내린 몇 가지 시도를했고 통신 샘플을 this PDF I found with Google에서 시도했지만 아무것도 작동하지 않는다.

내 활동에 대응하는 방법 (I는 NFC 전경 파견 사용)은 다음과 같습니다

public void onNewIntent(Intent intent) { 
    android.nfc.Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
    NfcV tech = NfcV.get(tag); 
    try { 
     tech.connect(); 
     byte[] arrByt = new byte[9]; 
     arrByt[0] = 0x02; 
     arrByt[1] = (byte) 0xB0; 
     arrByt[2] = 0x08; 
     arrByt[3] = 0x00; 
     arrByt[4] = 0x01; 
     arrByt[5] = 0x04; 
     arrByt[6] = 0x00; 
     arrByt[7] = 0x02; 
     arrByt[8] = 0x00; 
     byte[] data = tech.transceive(arrByt); 
     // Print data 
     tech.close(); 
    } catch (IOException e) { 
     // Exception handling 
    } 
} 
내가 태그에 내 전화를 배치 할 때이 방법이 제대로이라고

하지만 NfcV 개체의 transceive() 방법 항상 IOException을 던집니다 : android.nfc.TagLostException: Tag was lost.. 이것은 제가 시도한 모든 바이트 배열의 결과입니다 (위의 것은 정확하지 않을 수 있지만 마지막 날에 나는 같은 결과로 모든 결과를 얻었습니다.)

인터넷에서 읽은 것으로부터 결론을 내립니다. 내가 잘못된 명령을 태그에 전송했기 때문에 오류가 발생했지만 올바른 것만 가져올 수는 없습니다. 어떤 아이디어?

+0

NXP로 이메일을 보내도되지만 내가 이미 가지고있는 데이터 시트에 나를 연결하고 여기에 StackOverflow ;-)를 묻는 것이 좋습니다 –

답변

6

ISO 15693은 독점적 인 읽기 명령을 정의 할 수 있으며 모든 ICODE 태그 ISO 15693 단일 블록 읽기 명령을 지원합니다. 다음과 같이 보낼 수 있습니다 :

public static void processNfcIntent(Intent intent){ 
    Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
    if(tag != null){ 
     // set up read command buffer 
     byte blockNo = 0; // block address 
     byte[] readCmd = new byte[3 + id.length]; 
     readCmd[0] = 0x20; // set "address" flag (only send command to this tag) 
     readCmd[1] = 0x20; // ISO 15693 Single Block Read command byte 
     byte[] id = tag.getId(); 
     System.arraycopy(id, 0, readCmd, 2, id.length); // copy ID 
     readCmd[2 + id.length] = blockNo; // 1 byte payload: block address 

     NfcV tech = NfcV.get(tag); 
     if (tech != null) { 
     // send read command 
     try { 
      tech.connect(); 
      byte[] data = tech.transceive(readCmd); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
      tech.close(); 
      } catch (IOException e) { 
      e.printStackTrace(); 
      } 
     } 
     } 
    } 
} 
+0

Works, thanks you! –

+0

위대한 작품으로, 박스에서 꺼내기 위해 필요한 작은 변화를 추가했습니다. onNewIntent (Intent intent)에서 processNfcIntent (intent)를 호출하거나 사용하려고합니다. –