6

Android デバイスの NFC ツール アプリを使用して (組み込みの NFC リーダーを介して)、Mifare Classic 1K タグにテキストを書き込みます。このテキストは「moretto」(私の名字)です。

次に、ACS が提供するライブラリで NFC リーダー ACR1255U を使用して、このテキスト (NDEF 形式) を読み取ろうとしています。

私は以下を得ることができます:

ブロック 4 の読み取り:FF B0 00 04 10応答:0000030ED1010A5402656E6D6F726574 9000

ブロック 5 の読み取り:FF B0 00 05 10応答:746FFE00000000000000000000000000 9000

私はそれFEがコンテンツの終わりを示し、6D6F726574746F私のテキストであることを知っています. しかし、テキストの開始位置を特定するにはどうすればよいでしょうか。NXP のドキュメントに記載されている TLV 形式を理解するのが困難です。

4

1 に答える 1

16

まず、MIFARE Classic タグに対する NXP 独自の NDEF マッピングは、次の 2 つのアプリケーション ノートで指定されています。

すでにわかっているように ( NDEF タグとして使用される MIFARE クラシック タグを認証できません)、NDEF データは特定のセクターのデータ ブロック ( MIFARE アプリケーション ディレクトリによってそのようにマークされた NDEF セクター) に格納されます。したがって、NDEF に関連するデータは、これらのブロックからのすべてのデータの組み合わせです。

たとえば、NDEF セクターがセクター 1 と 2 の場合、ブロック 4、5、6 (= セクター 1 のブロック 0..2) とブロック 8、9、10 (= セクター 2 のブロック 0..2) を読み取る必要があります。 ) NDEF タグのデータを集約します。

あなたの場合、ブロック 4 と 5 のデータで十分なようです (ブロック 5 でタグ データの末尾がマークされているため、自分自身を正しく見つけたからです)。あなたの場合に関連するタグデータは

0000030E D1010A54 02656E6D 6F726574
746FFE00 00000000 00000000 00000000

タグ データ自体は、TLV (tag-length-value) 構造にパックされます。TLV ブロックは、必須のタグ バイト、条件付き長さフィールド、およびオプションのデータ フィールドで構成されます。

  • 長さとデータ フィールドを持たない TLV:
    +---------+
    | | タグ |
    | | (1 バイト) |
    +---------+
    
  • データ フィールドの長さが 0 ~ 254 バイトの TLV:
    +------------+------------+-----------+
    | | タグ | 長さ n | データ |
    | | (1 バイト) | (1 バイト) | (n バイト) |
    +------------+------------+-----------+
    
  • データ フィールドの長さが 255 ~ 65534 バイトの TLV:
    +------------+------------+-----------+-----------+
    | | タグ | 0xFF | 長さ n | データ |
    | | (1 バイト) | (1 バイト) | (2 バイト) | (n バイト) |
    +------------+------------+-----------+-----------+
    

特定のケースで興味深いタグは次のとおりです。

  • NULL TLV: タグ = 0x00、長さフィールドなし、データ フィールドなし
  • ターミネータ TLV: タグ = 0xFE、長さフィールドなし、データ フィールドなし
  • NDEF メッセージ TLV: タグ = 0x03、フィールドあり、データ フィールドあり (ただし、長さがゼロの場合があります)

したがって、あなたの場合、データは次のようにデコードされます。

00 NULL TLV (無視、次のバイトを処理)
00 NULL TLV (無視、次のバイトを処理)
03 NDEF メッセージ TLV (NDEF メッセージを含む)
    0E 長さ = 14 バイト
    D1010A5402656E6D6F726574746F データ = NDEF メッセージ
FE Terminator TLV (データの処理を停止)

NDEF メッセージは、0、1、または複数の NDEF レコードで構成できます。あなたの場合、NDEF メッセージは次のようにデコードされます。

D1 レコード ヘッダー (最初で唯一のレコードの)
          ビット 7 = MB = 1: NDEF メッセージの最初のレコード
          ビット 6 = ME = 1: NDEF メッセージの最後のレコード
          ビット 5 = CF = 0: チェーンの最後のレコードまたは唯一のレコード
          ビット 4 = SR = 1: 短いレコード長フィールド
          ビット 3 = IL = 0: ID/ID 長フィールドなし
          ビット 2..0 = TNF = 0x1: タイプ フィールドは NFC フォーラムを表します
                                有名な型名
    01 タイプ 長さ = 1 バイト
    0A ペイロード長 = 10 バイト
    54 Typeフィールド(TNFの設定によりデコード)
              "T" (US-ASCII) = タイプ名のバイナリ形式 urn:nfc:wkt:T
    02656E6D6F726574746F ペイロード フィールド (Type フィールドの値に従ってデコード)

したがって、NDEF メッセージは 1 つのテキスト レコード (データ ペイロードを持つ NFC FOrum well-known タイプ) で構成されます02656E6D6F726574746F。このレコード ペイロードは次のようにデコードされます。

02 ステータスバイト
          ビット 7 = 0: テキストは UTF-8 でエンコードされます
          ビット 6 = 0: 未使用
          ビット 5..0 = 0x02: IANA 言語コード フィールドの長さ
656E IANA 言語コード フィールド
            "en" (US-ASCII) = テキストは英語です
6D6F726574746F テキスト
                      「モレット」(UTF-8)
于 2016-05-14T07:54:46.790 に答える