2012-04-23 4 views
2

M24LR64 IC от STMicroelectronics поддерживает протокол ISO 15693, также называемый NfcV в Android NFC. Когда я разместил свой телефон Nexus S (Android 4.0.4) рядом с моим прототипом тегом борта, я мог услышать звуковой сигнал, и увидел сообщение запускаемого в LogCat:Почему я не могу читать ST M24LR64 как сообщения NDEF с Android NFC

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

Я задавался вопрос, почему андроид отправил ACTION_TAG_DISCOVERED а не ACTION_NDEF_DISCOVERED, потому что я создал сообщения формата ndef после примечания ST-приложения. И я могу прочитать сообщение NDEF с помощью собственного программного обеспечения для чтения ST под названием NfcV-Reader.

Затем я составил демо-программу в android, чтобы проверить проблему. Когда я зарегистрировал намерение с этим AndroidManifest.xml

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

Я не могу получить сообщение NFC. Когда я изменил с этим

я могу получить сообщение NFC от системы Android. Но когда я проверил сообщение ЦНК с выражением

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

переменная rawMsgs является null! Итак, я просмотрел исходный код ST NfcV-Reader и обнаружил, что он обработал все данные из EEPROM M24LR64 с блоком чтения. Это означает, что необработанные данные считываются, не используйте готовые утилиты от 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; 
} 

Мой вопрос, могу ли я использовать андроид ЦНК объект, но не сырой блок чтение и запись на обработку NFC тега с ISO 15693? Как я могу отформатировать свои данные в EEPROM M24LR64?

ответ

1

M24LR64 и аналогичные чипы LRiS64K не поддерживают стандартные команды чтения ISO 15693. (Однако они могут быть легко распознаны из их идентификатора тега.) ST определил и published недавно способ хранения сообщений NDEF на таких тегах. Это делается так же, как это делается на тегах NXP ICODE SLI, для которых Android поддерживает. Однако в настоящее время стек программного обеспечения NFC в Android не поддерживает NDEF в тегах ST NfcV.

UPDATE:

Нексус 4 теперь поддерживает хранение ЦНК на других NfcV тегов, кроме NXP Icode. В настоящее время поддерживается хранение NDEF на тегах TI - это теги HF-I и теги ST, такие как LRi2K.

+0

Где я могу найти дополнительную информацию о стеке реализации NFC для Android? – yee

+0

В исходном дереве Android: это с открытым исходным кодом. Инструкции по загрузке источника Android: http://source.android.com/source/downloading.html –

+0

LRiS64K полностью поддерживает набор команд ISO15693. Программное обеспечение, работающее на большинстве телефонов Android, не имеет никакого отношения к поддержке чипов, отличных от NXP, потому что программное обеспечение написано: (вы уже догадались) NXP. –

0

О, хорошо. ISO15693.

Есть много тегов ISO15693, и они отличаются тем, как память может быть прочитана и записана из нее (однобайтная и двухбайтовая адресация, чтобы назвать общую разницу). Существует стандарт, но в дикой природе много разных вариантов. для микросхемы M24LR64 необходима двухбайтовая адресация.

К сожалению, не существует способа спросить такой тег, какой вариант он говорит, поэтому единственный способ для программного обеспечения NFC определить его - иметь список известных тегов и их причуды в программном обеспечении NFC.

И угадайте, что: Стек NFC, который обычно поставляется с Android, не знает о теге M24LR64, поэтому он не может читать/записывать данные NDEF.

Именно поэтому вы должны использовать сырые команды чтения/записи. Это otoh прекрасно работает.

0

Есть стандарты, но они несовместимы ... Прочитайте необработанные данные в порядке, придерживайтесь этого на данный момент. Вы также можете проверить ST-код Android для идей. Я думаю, что это многое проясняет.

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