NFC | #2 什麼是 NDEF?

黃暉德 Wade Huang
8 min readJan 24, 2024

--

前言

工作關係接觸到 NFC 技術,延續上一篇繼續分享 NFC。

目錄

  • What is NDEF?
  • NDEF Message
  • NDEF Record
  • Record Header
    TNF
    – Message Flags
    – Type Length
    – Payload Length
    – ID Length
    – Payload Type
    – Payload ID
  • Record Payload
  • Record Chunk

What is NDEF?

NDEF (NFC Data Exchange Format)是 NFC Forum 定義 NFC devices 和 NFC tags 的通訊協定或是資料交換格式,NFC tag 為非接觸式或感應式的記憶卡,使用 NDEF 資料格式儲存資料。

NDEF message

NDEF 是由 NDEF message 組成,採用二進制格式,每一個 NDEF message 由一個或數個 NDEF records 組成。每一個 NDEF record 是由 record headerrecord payload 組成。

下圖為一個經典範例,通訊錄資料裡有三個 records。Record header 包含用來描述 record 和資料中的位置。 Record payload 就是資料的內容。

https://www.oreilly.com/api/v2/epubs/9781449324094/files/images/bnfc_0301.png

NDEF record

一個 NDEF record 由 record headerrecord payload 組成。

https://www.oreilly.com/api/v2/epubs/9781449324094/files/images/bnfc_0302.png

Record header

Record header 由
TNF,
Flags,
Type length,
Payload length,
ID length,
Payload type ,
Payload ID組成。

TNF 定義 Payload type 是什麼。
Payload type 定義 NDEF record 的資料類型。
Payload ID 是 optional 的,必須為合法的 URI,用於讓你透過 ID 辨識 record 的 payload 或允許其他 payloads 參考到其他 payloads。

Message flags

NDEF record 前 5 個 bit 定義如何處理 record 和 record 在 message 中位置的資訊。

MB (Message begin)

若此 record 為 message 的第一筆則為 true。

ME (Message end)

若此 record 為 message 的最後一筆則為 true。

CF (Chunk flag)

若此 record 被分塊傳輸則為 true。

SR (Short record)

若此 record 被表示為 SR 則為 true,record header 裡只用 1 個 byte 定義 payload length。若 SR 為 false,record header 裡用 4 個 bytes 定義 payload length。

IL (ID length is present)

ID length 欄位存在則為 true。這裡的 IL bit 不是表示 ID 欄位的長度,而是 ID 是否存在,若為 false 則表示沒有 ID lengthID

MBME 定義此 record 在 NDEF message 裡的開始或結束。若有一個 NDEF message 包含數個 NDEF records,則第一筆 record 的 MB 為 true,最後一筆 record 的 ME 為 true,中間 records 的 MBME 都為 false。

若有一個 NDEF message 只有一個 NDEF record,則 record 的 MBME 都為 true。

Type Name Format (TNF)

Record header 開頭第一個 byte 是由 TNFFlags 組成,而 TNF 定義該 record 是什麼類型,以下有 8 個可能的 TNF 值:

empty (0x00)

空的 record,表示沒有 type 或 沒有 payload。

Well-Known (0x01)

NFC Forum RTD (record type definition) 規範中的預先定義類型之一。
例如:”T” 表示 text, “u” 表示 URI, “Sp” 表示 smart poster。

MIME media-type (0x02)

RFC 2046 中定義的 Internal 媒體類型。
例如:“text/html”, “text/json”, “image/gif”。

Absolute URI (0x03)

RFC 3986 中定義的 URI。
例如:“https://www.medium.com/”。

External (0x04)

使用者定義的值。

Unknown (0x05)

未知類型。類型長度必須為0。

Unchanged (0x06)

僅適用於部分 payload 來定義中間或終止的 record。

Reserved (0x07)

由 NFC 論壇保留以供將來使用。

NDEF messages 包含數個 Payload types,但通常只會看第一筆 record,依據第一個 record type 來決定整筆 payload 應該如何處理。

由於 TNF 可能有這 8 種可能的值,所以需要 3 個 bit 來定義,TNF 定義在 message flags byte 的最後 3 個 bit。

URIs in NDEF message

URI(uniform resource identifier)

定義 web 資源的字串。

URN (uniform resource name)

定義 URI 的名字。

URL (uniform resource locator)

定義取得資源所需的傳輸協定。

你可能會在 NDEF message 經常看到 URI, URN 和 URL。可以想像成 URN 是你的名字, URI 是你的地址,URL 是到你的地址的交通方式。

如果今天想寫入 URI or URL,必須把資料寫入 payload 而不是 TNF 03 (absolute URI),並使用 NFC RTD “U” 編碼到 TNF 01(well-known)。

Type Length

Type length 定義需要讀取多少 bytes。

Payload Length

Payload length 是必要的欄位,可能需要 1 byte 或 4 個 bytes 來定義。

ID Length

ID length 若存在,message flags 裡的 IL(ID length is present) 為 true,且 record header 裡在 payload length 後面的欄位為 ID length。

Payload type

Payload type 也可以稱為 record type,具體描述 payload 的資料內容,NDEF 定義一些 record type,每個 record type 都有一個特定的標示符號。以下為常見的 record type:

Text record

“T” 或 ”text”,包含 UTF-8 文字。

URI record

“U” 或 “uri”,包含 URI 字串,例如:”https://www.apple.com/”。

Smart poster record

“Sp” 或 ”smartposter”,包含 URI、文字等。

Media record(audio/video/image)

“T”(音檔) 或 ”G”(圖片) 或 “M”(影片),包含音檔、圖片、影片等二進制資料。

Handover record

“Hr” 或 ”handover”,包含設備之間進行 NFC handover 所需的資料。

Payload ID

Payload ID 是 optional 的欄位,通常是一個有效的 URI,也可以是相對的 URI ,它可以讓你的應用程式透過 record 辨識 payload,或允許其他 payload 互相參考引用。

Record payload

Payload 就是實際資料的內容,可以加密、發送純文字、blob (Binary Large Object)。

理論上,payload 的大小限制是 2³²–1 bytes,也就是 header 裡的 payload length 欄位為什麼是用 4 個 bytes 來定義,但如果一個 NDEF message 有可能有數個 NDEF record 連接成更長的資料,那 NDEF message 的長度是沒有限制的,但實際上可能受限於 tag 的記憶體規格大小。

實務上,NFC 感應的資料傳輸時間很短,NFC 技術不是為了長時間傳輸而設計,若要傳輸大量的資料,NFC device 和 NFC tag 就必須長時間保持在感應的距離,但這就變得很奇怪,也不符合設計的目的。

Record Chunk

如果傳送的資料大於 payload 大小限制,可以接資料切成好幾個 payloads 包在一個 NDEF Message 來進行傳送,TNF 中的 Chunk Flag 設定為 1。

--

--