2

STMicroelectronics の M24LR64 IC は、Android NFC で NfcV とも呼ばれる ISO 15693 プロトコルをサポートしています。Nexus S 携帯電話 (Android 4.0.4) をプロトタイプのタグ ボードの近くに置くと、ビープ音が聞こえ、logcat によって発せられたメッセージが表示されました。

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

ST アプリケーション ノートに従って ndef 形式のメッセージを作成したため、Android が ACTION_NDEF_DISCOVERED ではなく ACTION_TAG_DISCOVERED インテントをディスパッチした理由を知りました。そして、NfcV-Readerという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-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;
}

私の質問は、ISO 15693 で NFC タグを処理するために Android NDEF 機能を使用できるが、生のブロックの読み取りと書き込みを使用できないかどうかです。M24LR64 EEPROM でデータをフォーマットするにはどうすればよいですか?

4

3 に答える 3

1

M24LR64 および同様の LRiS64K チップは、標準 ISO 15693 読み取りコマンドをサポートしていません。(ただし、タグ ID から簡単に認識できます。) ST は最近、そのようなタグに NDEF メッセージを格納する方法を定義し、公開しました。これは、Android がサポートする NXP ICODE SLI タグで行われる方法と非常によく似た方法で行われます。ただし、現在、Android の NFC ソフトウェア スタックは、ST NfcV タグの NDEF をサポートしていません。

アップデート:

NfcVNexus 4 は、NXP ICODE以外のタグで NDEF ストレージをサポートするようになりました。TI Tag-it HF-I タグおよび LRi2K などの ST タグで NDEF ストレージがサポートされるようになりました。

于 2012-04-23T09:18:50.780 に答える
0

標準はありますが、互換性がありません...生データを読んでも問題ありません。しばらくはそれに固執してください。アイデアについては、ST リファレンス Android コードを確認することもできます。私はそれが多くを明確にしていると思います。

于 2014-04-17T20:10:47.967 に答える
0

しかたがない。ISO15693。

そこには多くの ISO15693 タグがあり、それらはメモリから読み書きできる方法が異なります (一般的な違いを挙げると、1 バイトと 2 バイトのアドレス指定)。規格はありますが、さまざまなバリエーションが世の中に出回っています。M24LR64 チップの場合、2 バイトのアドレス指定が必要です。

残念ながら、そのようなタグがどのバリアントを話すかを尋ねる方法はないため、NFC ソフトウェアがそれを識別する唯一の方法は、NFC ソフトウェアで既知のタグとそれらの癖のリストを持つことです。

そして、何を推測しますか: 通常、android に付属している NFC スタックは M24LR64 タグを認識しないため、NDEF データを読み書きできません。

これが、生の読み取り/書き込みコマンドを使用する必要がある理由です。このオトーは完璧に機能します。

于 2012-04-23T08:58:16.157 に答える