为什么我无法使用Android NFC读取ST M24LR64作为NDEF消息

时间:2012-04-23 08:42:36

标签: android nfc ndef iso-15693

意法半导体(STMicroelectronics)的M24LR64 IC支持ISO 15693协议,在Android NFC中也称为NfcV。当我将Nexus S手机(Android 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格式消息。我可以使用ST自己的读取器软件NfcV-Reader读取NDEF消息。

然后我在android中编写了一个演示程序来验证问题。当我使用此AndroidManifest.xml注册intent时

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

我的问题是我是否可以使用Android NDEF工具而不是原始块读取和写入来处理我的NFC标签与ISO 15693?如何在M24LR64 EEPROM中格式化数据?

3 个答案:

答案 0 :(得分:1)

M24LR64和类似的LRiS64K芯片不支持标准ISO 15693读取命令。 (但是很容易从它们的标签ID中识别它们。)ST最近定义了published并且在这些标签上存储NDEF消息的方法。这与NXP ICODE SLI标签的完全类似,Android为其提供了支持。但是,目前,Android中的NFC软件堆栈不支持ST NfcV标签上的NDEF。

更新:

除了NXP ICODE之外,Nexus 4现在支持其他NfcV标签上的NDEF存储。现在支持TI Tag-it HF-I标签上的NDEF存储和LRi2K等ST标签。

答案 1 :(得分:0)

好吧,好吧。 ISO15693。

有很多ISO15693标签,它们的存储器可以从中读取和写入的方式不同(一个字节对两个字节寻址,这是一个常见的区别)。有一个标准,但野外有很多不同的变化。对于M24LR64芯片,必须进行双字节寻址。

不幸的是,没有办法向这样的标签询问它所说的变体,因此NFC软件识别它的唯一方法是在NFC软件中列出已知标签及其怪癖。

猜猜:通常附带android的NFC堆栈不知道M24LR64标签,因此无法读/写NDEF数据。

这就是你必须使用原始读/写命令的原因。这个otoh完美无缺。

答案 2 :(得分:0)

有标准,但它们不兼容......阅读原始数据很好,暂时坚持下去。您还可以查看ST参考Android代码以获取创意。我认为它澄清了很多。