目錄
- 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 header
和 record payload
組成。
下圖為一個經典範例,通訊錄資料裡有三個 records。Record header
包含用來描述 record 和資料中的位置。 Record payload
就是資料的內容。
NDEF record
一個 NDEF record 由 record header
和 record payload
組成。
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 length
或 ID
。
MB
和 ME
定義此 record 在 NDEF message 裡的開始或結束。若有一個 NDEF message 包含數個 NDEF records,則第一筆 record 的 MB
為 true,最後一筆 record 的 ME
為 true,中間 records 的 MB
和 ME
都為 false。
若有一個 NDEF message 只有一個 NDEF record,則 record 的 MB
和 ME
都為 true。
Type Name Format (TNF)
Record header 開頭第一個 byte 是由 TNF
和 Flags
組成,而 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。