【问题标题】:Why I can't read ST M24LR64 as NDEF messages with Android NFC为什么我无法使用 Android NFC 将 ST M24LR64 读取为 NDEF 消息
【发布时间】:2012-05-03 21:00:27
【问题描述】:

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 Intent,而不是 ACTION_NDEF_DISCOVERED,因为我已经按照 ST 应用说明构建了 ndef 格式的消息。并且我可以使用 ST 自己的阅读器软件 NfcV-Reader 阅读 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 消息。 但是当我用表达式检查 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 工具而不是原始块读取和写入来处理我的带有 ISO 15693 的 NFC 标签?如何格式化 M24LR64 EEPROM 中的数据?

【问题讨论】:

    标签: android nfc ndef iso-15693


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      M24LR64 和类似的 LRiS64K 芯片不支持标准 ISO 15693 读取命令。 (不过,它们可以很容易地从它们的标签 ID 中识别出来。)ST 最近定义了published 一种在此类标签上存储 NDEF 消息的方法。这与在 NXP ICODE SLI 标签上完成的方式非常相似,Android 对此提供支持。但是,目前Android中的NFC软件栈不支持ST NfcV标签上的NDEF。

      更新:

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

      【讨论】:

      • 在哪里可以找到有关 Android NFC 实施堆栈的更多详细信息?
      • 在 Android 源代码树中:它是开源的。安卓源码下载说明:source.android.com/source/downloading.html
      • LRiS64K 完全支持 ISO15693 命令集。大多数 Android 手机上运行的软件并不关心支持非 NXP 芯片,因为该软件的编写者是:(你猜对了)NXP。
      • 实际上,我测试过的任何 Android NFC 设备都可以读取 LRiS64K,没有任何问题。但是,您需要为此标签使用 ST 的非标准专有读取命令。参见例如st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/… 的第 57 页,其中块编号以 16 位编码(而不是 ISO 15693-3 使用的 8 位)。
      • @NFCguy 提供的链接无效。你能更新你的评论吗
      【解决方案3】:

      哦,好吧。 ISO15693。

      市面上有很多 ISO15693 标签,它们在读取和写入内存的方式上有所不同(一字节与两字节寻址是一个共同的区别)。有一个标准,但在野外有许多不同的变化。对于 M24LR64 芯片,需要两个字节寻址。

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

      你猜怎么着:通常android自带的NFC栈不知道M24LR64标签,所以它不能读/写NDEF数据。

      这就是您必须使用原始读/写命令的原因。这个 otoh 效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多