为什么我不能读ST M24LR64与Android的NFC NDEF消息(Why I can'

2019-09-16 16:56发布

意法半导体M24LR64 IC支持ISO 15693协议,也称为NfcV Android中NFC。 当我把我的歌Nexus S手机(安卓4.0.4)接近我的原型标签板,我能听到蜂鸣声,只见由logcat的发射的消息:

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

我不知道为什么在Android派出ACTION_TAG_DISCOVERED意图,而不是ACTION_NDEF_DISCOVERED,因为我已经构造了以下的ST应用笔记的NDEF格式的消息。 我可以读取称为NfcV阅读器的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消息。 当我修改这个

我可以接收来自Android系统的NFC消息。 但是,当我检查了NDEF消息与表达

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

rawMsgs变量为null ! 所以,我回顾了ST NfcV阅读器的源代码,并发现它已经从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;
}

我的问题是我是否可以使用Android NDEF设施,但没有原始块的读写处理我的NFC标签符合ISO 15693? 我如何格式化我的M24LR64 EEPROM数据?

Answer 1:

该M24LR64和类似LRiS64K芯片不支持标准ISO 15693读取命令。 (他们可以轻松地从他们的标签ID识别,虽然。)ST定义并公布最近一个方式来存储这样的标签NDEF消息。 这在某种程度上非常相似,它是如何在恩智浦ICODE SLI标签完成,其中Android提供支持完成。 然而,目前,在Android中的NFC软件栈提供了ST NfcV标签NDEF不支持。

更新:

Nexus的4现在有其他NDEF存储支持NfcV除恩智浦ICODE标签。 现在有对TI的Tag-它HF-I标签和ST标签,如LRI2K NDEF存储支持。



Answer 2:

那好吧。 ISO15693。

有很多ISO15693标签在那里,他们的方式不同,内存可以读取和写入从它(一个字节与两个字节寻址来命名一个共同的差异)。 有一个标准,但许多不同的变化是在野外。 对于M24LR64芯片两个字节寻址是必要的。

不幸的是没有办法问哪个变化方案中讲这样一个标签,所以对于NFC软件来识别它的唯一途径是拥有知名的标签和他们的NFC软件怪癖的列表。

你猜是什么:通常内建Android的NFC堆栈不知道的M24LR64标签,所以它不能读/写数据NDEF。

这就是为什么你必须使用原始的读/写命令的原因。 这OTOH完美的作品。



Answer 3:

是有标准的,但它们是不兼容的。阅读原始数据是好的,坚持这一点的时刻。 您还可以检查ST参考Android的代码的想法。 我认为它澄清了很多。



文章来源: Why I can't read ST M24LR64 as NDEF messages with Android NFC