0%

[NFC] NDEF 解析

前言

RFID (Radio Frequency IDentification) 是一種身份識別技術,採用無線通訊對目標標籤進行識別與讀寫;NFC (Near-field communication) 算是 RFID 的一種應用情境,但其通訊距離較短,適合用在注重安全性的應用上,例如:電子支付等。NDEF (NFC Data Exchange Format) 為 NFC 的主要資料格式,使 NFC 標籤 (Tag) 與讀取器 (Reader) 不會受到廠商的限制。這篇文章主要舉例說明如何解讀 NDEF。

NFC 與 RFIC 的關係NFC 與 RFIC 的關係

NDEF 是什麼?

NDEF 全名為 NFC Data Exchange Format,簡單來說 NDEF 是一種 NFC 協會定義出來的資料格式,全球通用的標準,讓所有支援 NDEF 的 Tag 與 Reader 可以相互溝通!手機的 NFC Reader 與 NFC Tag 之所以可以達到許多互動,就是依靠解析存放在 Tag 記憶體內 NDEF 訊息區塊的資料,取得對應的指示並執行相關操作。

NDEF Message vs NDEF Record

NDEF 可以根據粒度分為 NDEF Message 與 NDEF Record

  • 每一個 NDEF 就是一個 NDEF Message。
  • 而每個 NDEF 可包含多個 NDEF Record。
  • NDEF Record 中的 Payload 才是真正的資料所在。

    NDEF 結構示意圖NDEF 結構示意圖

NDEF Record 格式解析

詳細 NDEF 格式說明參考 NFC P2P NDEF Basics 如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
The fields in an NDEF Message header are as follows:
______________________________
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0|
|------------------------------|
| MB| ME| CF| SR| IL| TNF | NDEF StatusByte, 1 byte
|------------------------------|
| TYPE_LENGTH | 1 byte, hex value
|------------------------------|
| PAYLOAD_LENGTH | 1 or 4 bytes (determined by SR) (LSB first)
|------------------------------|
| ID_LENGTH | 0 or 1 bytes (determined by IL)
|------------------------------|
| TYPE | 2 or 5 bytes (determined by TYPE_LENGTH)
|------------------------------|
| ID | 0 or 1 byte (determined by IL & ID_LENGTH)
|------------------------------|
| PAYLOAD | X bytes (determined by PAYLOAD_LENGTH)
|------------------------------|

這裡直接透過一個實際例子來說明,最容易理解。

以 NDEF 記錄字串 AEIOU,採用 RTD (Record Type Definition) 的 Text Record 格式為 03 0c d1 01 08 54 02 7a 68 41 45 49 4f 55。其中 Record = 藍 (Header) + 紅 (Payload)

NDEF 解析範例NDEF 解析範例

解析:

  • 黃色 03 為 NDEF Message TLV 的 NDEF 開頭。
  • 黃色 0c 為 NDEF Record 的長度 (藍色 + 紅色) 的長度,為 12 bytes。
  • 藍色 d1 為 Header 第一個 Byte,即 NDEF StatusByte,d1 = 1101_0001b 對應到 Record 格式示意圖,可知 MB, ME, SR 都為 1,CL, IL 為 0,TNF 為 1 (代表 RTD)。
  • 藍色 01 表示後面的 Type 是用 1 個 byte 來記錄。
  • 藍色 08 表式紅色 Payload 的長度為 8 個 bytes。
  • 因為 IL 為 0,所以與 ID 有關的 Byte 都不存在。
  • 藍色 54 為 T 的 ASCII code,表示為 RTD 的 Text Record T,這要對應到 TNF 為 1,才會是 RTD 的 T
  • 參考下面表格解析紅色 02 7a 68 分別是 Record StatusByte 與 language code。紅色 02 表示後面為 UTF-8 編碼,且 language code 為 2 個 bytes,也就是 7a 68,這兩個代表 zh 的 ASCII code (英文的 ASCII 與 UTF-8 一樣)。
    1
    2
    3
    4
    5
    6
    7
    8
    9
     ______________________________
    | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0|
    |------------------------------|
    |UTF| 0 | Length of Lang Code | 1 byte Text Record StatusByte
    |------------------------------|
    | Lang Code | 2 or 5 byte, multi-byte language code
    |------------------------------|
    | Text | Multiple Bytes encoded in UTF-8 or UTF-16
    |------------------------------|
  • 最後 41 45 49 4f 55 即為實際訊息 AEIOU 的 ASCII code。

結語

NDEF 僅僅是資料格式,然而 NFC Tag 內不僅僅是只有資料而已,還有 Tag 本身的一些資訊,例如:UID/SN、lock bytes 等等。若讀者有興趣知道 NDEF 在 Tag 記憶體中的哪一個位置,歡迎參考 [NFC] NTAG213 記憶體解析

參考文獻

  1. 手機與穿戴式裝置連結透過NFC

  2. NFC P2P NDEF Basics

  3. About the NDEF Format

  4. NFC TYPE 2 TAG 概觀

很高興能在這裡幫助到您,歡迎登入 Liker 為我鼓掌 5 次,或者成為我的讚賞公民,鼓勵我繼續創造優質文章。
以最優質的內容回應您的鼓勵