2012-04-23 4 views
2

M24LR64 STMicroelectronics의 IC는 안드로이드 NFC에서 NfcV라고도하는 ISO 15693 프로토콜을 지원합니다. 내 프로토 타입 태그 보드 근처에 내 넥서스 S 전화 (안드로이드 4.0.4)을 배치 할 때, 나는 삐 소리와 로그 캣에 의해 트리거 메시지를 본 수 : 안드로이드가 ACTION_TAG_DISCOVERED을 파견 이유가 궁금안드로이드 NFC로 NDEF 메시지로 ST M24LR64를 읽을 수없는 이유

no tag fallback activity found for Intent { act = android.nfc.action.TAG_DISCOVERED} 

을 ST 응용 프로그램 노트 다음에 ndef 형식 메시지를 구성했기 때문에 ACTION_NDEF_DISCOVERED가 아닌 int입니다. NfcV-Reader라는 자체 독자 소프트웨어 인 ST로 NDEF 메시지를 읽을 수 있습니다.

그런 다음 문제를 확인하기 위해 Android에서 데모 프로그램을 작곡했습니다. 이 AndroidManifest.xml에 의도를 등록한 경우

<intent-filter> 
    <action android:name="android.nfc.action.NDEF_DISCOVERED" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
</intent-filter> 

NFC 메시지를받을 수 없습니다. 나는이

로 수정 때 나는 안드로이드 시스템에서 NFC 메시지를받을 수 있습니다. 내가 표현

Parcelable[] rawMsgs = intent.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES); 

으로 NDEF 메시지를 확인할 때 그러나 rawMsgs 변수는 null입니다! 그래서 ST NfcV-Reader 소스 코드를 검토 한 결과 M24LR64 EEPROM의 모든 데이터가 읽기 블록으로 처리되었음을 확인했습니다. 이는 원시 데이터를 읽음을 의미하며 Android NFC 및 NDEF의 상용 유틸리티를 사용하지 않습니다.

protected Void doInBackground(Void... params) 
{ 
    DataDevice dataDevice = (DataDevice)getApplication(); 
    fullNdefMessage = null; 
    byte[] resultBlock0 = new byte[4]; 
    byte[] resultBlock1 = new byte[8]; 
    cpt = 0; 

    resultBlock0 = null; 
    while ((resultBlock0 == null || resultBlock0[0] == 1)&& cpt<1500) 
    { 
     resultBlock0 = NFCCommand.SendReadSingleBlockCommand(dataDevice.getCurrentTag(), new byte[]{0x00,0x00}, dataDevice); 
     cpt ++; 
     Log.v("CPT ", " CPT Read Block 0 ===> " + String.valueOf(cpt)); 
    } 

    //if CC0 = E1h & CC1 = right version 
    if(resultBlock0[0]==(byte)0x00 && resultBlock0[1]==(byte)0xE1 && resultBlock0[2]==(byte)0x40) 
    { 
     //NDEF TAG Format valid 
     cpt = 0; 
     resultBlock1 = null; 

     while ((resultBlock1 == null || resultBlock1[0] == 1) && cpt < 10) 
     { 
      resultBlock1 = NFCCommand.SendReadMultipleBlockCommand(dataDevice.getCurrentTag(),new byte[]{0x00,0x01}, (byte)0x02, dataDevice); 
     } 
     if(resultBlock1[1]==(byte)0x03 && resultBlock1[6]==(byte)0x54) // Text message 
     { 
      if(resultBlock1[5]<0) 
       numberOfBlockToRead = ((resultBlock1[5] + 256 + 14)/4); 
      else 
       numberOfBlockToRead = ((resultBlock1[5] + 14)/4); 
     } 
     else if(resultBlock1[1]==(byte)0x03 && resultBlock1[6]==(byte)0x55) // URL message 
     { 
      if(resultBlock1[1]<0) 
       numberOfBlockToRead = ((resultBlock1[2] + 256 + 12)/4); 
      else 
       numberOfBlockToRead = ((resultBlock1[2] + 12)/4); 
     } 
    } 
    else 
    { 
     //Not NDEF TAG Format 
     numberOfBlockToRead = 0; 
    } 

    bNumberOfBlock = Helper.ConvertIntTo2bytesHexaFormat(numberOfBlockToRead); 

    cpt = 0; 
    if(numberOfBlockToRead <32) 
    { 
     while ((fullNdefMessage == null || fullNdefMessage[0] == 1) && cpt < 10 && numberOfBlockToRead != 0) 
     { 
      fullNdefMessage = NFCCommand.SendReadMultipleBlockCommandCustom(dataDevice.getCurrentTag(),new byte[]{0x00,0x00}, bNumberOfBlock[1], dataDevice); 
      cpt++; 
     } 
    } 
    else 
    { 
     while ((fullNdefMessage == null || fullNdefMessage[0] == 1) && cpt < 10 && numberOfBlockToRead != 0) 
     { 
      fullNdefMessage = NFCCommand.SendReadMultipleBlockCommandCustom2(dataDevice.getCurrentTag(),new byte[]{0x00,0x00}, bNumberOfBlock, dataDevice); 
      cpt++; 
      Log.i("CPT ", "***** " + String.valueOf(cpt)); 
     } 
    } 

    return null; 
} 

내 질문은 내가 안드로이드 NDEF 기능을 사용할 수 있지만 원시하지 블록 읽기 및 ISO 15693 내 NFC 태그를 처리하기 위해 작성 여부? M24LR64 EEPROM에서 데이터를 어떻게 포맷 할 수 있습니까?

답변

1

M24LR64 및 유사한 LRiS64K 칩은 표준 ISO 15693 읽기 명령을 지원하지 않습니다. ST는이 태그들에 NDEF 메시지를 저장하는 방법을 최근에 정의한 published과 같이 태그 ID를 통해 쉽게 인식 할 수 있습니다. 이것은 Android가 지원하는 NXP ICODE SLI 태그에서 수행되는 것과 매우 유사한 방식으로 수행됩니다. 그러나 현재 Android의 NFC 소프트웨어 스택은 ST NfcV 태그에서 NDEF를 지원하지 않습니다.

UPDATE :

넥서스 4는 지금 NXP ICODE 외에 다른 NfcV 태그에 NDEF 저장을 지원한다. 이제 TI Tag-it HF-I 태그 및 LRi2K와 같은 ST 태그에서 NDEF 저장소가 지원됩니다.

+0

Android NFC 구현 스택에 대한 자세한 내용은 어디에서 찾을 수 있습니까? – yee

+0

안드로이드 소스 트리에서 : 그것은 오픈 소스입니다. Android 소스를 다운로드하는 방법 : http://source.android.com/source/downloading.html –

+0

LRiS64K는 ISO15693 명령 세트를 완전히 지원합니다. 대부분의 안드로이드 폰에서 작동하는 소프트웨어는 NXP 칩을 지원하지 않는다. 소프트웨어는 NXP에 의해 작성 되었기 때문에. –

0

오 잘. ISO15693.

ISO15693 태그가 많이 있으며, 메모리를 읽고 쓸 수있는 방법이 다릅니다 (1 바이트 대 2 바이트 주소 지정으로 공통적 인 차이점을 나타냄). 표준이 있지만 다양한 변형이 많이 있습니다. M24LR64 칩의 경우 2 바이트 주소 지정이 필요합니다.

불행히도 그런 태그에 어떤 변형이 있는지를 묻는 방법이 없으므로 NFC 소프트웨어가이를 식별하는 유일한 방법은 NFC 소프트웨어에 알려진 태그 및 해당 단점의 목록을 포함하는 것입니다.

다음과 같이 추측합니다. 일반적으로 안드로이드와 함께 제공되는 NFC 스택은 M24LR64 태그에 대해 알지 못하므로 NDEF 데이터를 읽거나 쓸 수 없습니다.

원시 읽기/쓰기 명령을 사용해야하는 이유가 여기에 있습니다. 이 오토는 완벽하게 작동합니다.

0

표준이 있지만 호환되지 않습니다 ... 원시 데이터를 읽는 것이 좋습니다, 그 순간을 고수하십시오. 또한 ST 참조 Android 코드에서 아이디어를 확인할 수 있습니다. 나는 그것이 많은 것을 명확히한다고 생각한다.