Почему я не могу прочитать ST M24LR64 как сообщения NDEF с Android NFC

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

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.

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

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

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

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

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;
}

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


person yee    schedule 23.04.2012    source источник


Ответы (3)


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

ОБНОВИТЬ:

Nexus 4 теперь поддерживает хранилище NDEF для других тегов NfcV помимо NXP ICODE. Теперь есть поддержка хранения NDEF для тегов TI Tag-it HF-I и тегов ST, таких как LRi2K.

person NFC guy    schedule 23.04.2012
comment
где я могу найти более подробную информацию о стеке реализации Android NFC? - person yee; 23.04.2012
comment
В дереве исходного кода Android: исходный код с открытым исходным кодом. Инструкции по загрузке исходного кода Android: source.android.com/source/downloading.html - person NFC guy; 23.04.2012
comment
LRiS64K полностью поддерживает набор команд ISO15693. Программное обеспечение, работающее на большинстве телефонов Android, просто не заботится о поддержке чипов, отличных от NXP, потому что программное обеспечение было написано: (как вы уже догадались) NXP. - person Nils Pipenbrinck; 14.11.2012
comment
На самом деле, LRiS64K без проблем читается любым устройством Android NFC, которое я тестировал. Однако для этого тега необходимо использовать нестандартные проприетарные команды чтения ST. См., например. стр. 57 st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LИТЕРАТУРА / где номер блока закодирован 16 битами (вместо 8 битов, которые использует ISO 15693-3). - person NFC guy; 14.11.2012
comment
Ссылка, предоставленная @NFCguy, не работает. Не могли бы вы обновить свой комментарий - person Deepak Goel; 24.05.2013
comment
Новая ссылка на техническое описание LRiS64K: st.com/st-web-ui/static/active/en/resource/technical/document/ - person NFC guy; 26.05.2013

Ну что ж. ИСО15693.

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

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

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

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

person Nils Pipenbrinck    schedule 23.04.2012

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

person Ross    schedule 17.04.2014