前言
RFID (Radio Frequency IDentification) 是一種身份識別技術,採用無線通訊對目標標籤進行識別與讀寫;NFC (Near-field communication) 算是 RFID 的一種應用情境,但其通訊距離較短,適合用在注重安全性的應用上,例如:電子支付等。NDEF (NFC Data Exchange Format) 為 NFC 的主要資料格式,使 NFC 標籤 (Tag) 與讀取器 (Reader) 不會受到廠商的限制。這篇文章主要舉例說明如何解讀 NDEF。
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 Record 格式解析
詳細 NDEF 格式說明參考 NFC P2P NDEF Basics 如下
1 | The fields in an NDEF Message header are as follows: |
這裡直接透過一個實際例子來說明,最容易理解。
以 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)
解析:
- 黃色
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 RecordT
,這要對應到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 記憶體解析。