NFC NDEF message format

1. NDEF message format

下圖是 NDEF mssage format 的示意圖, 1份 NDEF message 包含 >= 1 NDEF Record
1份 NDEF Record 包含 Header & Payload
Header包含好幾個欄位, 包括 TNF (Type Name Format)

1.1 Record Layout

每個 Record 前5個 bit 定義了record 在message中的位置

  • MB (Message Begin) : True when this is the first record in a message.
  • ME (Message End) : True when this is the last record in a message.
  • CF (Chunk Flag) : True when this record is chunked. (只用在NDEF message大到無法一次傳完)
  • SR (Short Record) : True if the short record format is used for payload length.
  • IL (ID Length is present) : True if the ID Length field is present.

如果 message 有多個 record, 那麼第一個 record 的 MB=1, ME = 0, 最後一個 record 的 MB = 0, ME = 1
如果 message 只有1個 record, 那個這個 record 的 MB=1, ME = 1

1.2 Type Name Format

TNF (Type Name Format) 佔 3 bits, 值為 0~7

  • 0 Empty : Empty record that has no type or payload
  • 1 Well-Known : NFC Forum RTD (Record Type Definition) specification 定義好的其中1種
  • 2 MIME media-type : Internet media type (defined in RFC 2046 )
  • 3 Absolute URI : URI (defined in RFC 3986 )
  • 4 External : User-defined value, based on rules in NFC Forum RTD specification
  • 5 Unknown : Type is unknown. Type length must be 0.
  • 6 Unchanged : Only for middle and terminating records of chunked payloads. Type length must be 0.
  • 7 Reserved : Reserved by the NFC Forum for future use.

常見的應用程式裡, TNF 01 (Well-Known) 以及 TNF 02 (MIME media-type) 最為常用
另外, TNF 04 (External) 也很常用, 包括了 Android App

1.3 Record Type Length

在 TNF & Layout Flag 之後是 1 byte 的 Payload Type Length
它定義了 Record Type 的長度
Record Type的用途是在TNF之外提供更細的分類, 而這個欄位的長度是可變動的
而 Record Type Length 定義這個欄位的長度

1.4 Payload Length

接著是 Payload Length, 它可能佔用1個 byte 或佔用 4個 byte
如果前面的 SR (Short Record) = 1, 那麼它佔用1個 byte
如果 SR = 0, 那麼它佔用4個byte

1.5 Record Type

Record Type,  RTD (Record Type Definition)進一步描述 Payload的內容, 這個

比如說, 當 TNF = 01 (Well-Known), 那麼 Record Type = "T" 表示 text, "U" 表示 URI, "Sp" 表示 Smart poster,
當 TNF = 02 (MIME media-type), 那麼 Record Type 可以描述 "text/html," "text/json," 以及 "image/gif."
當 TNF = 04 (External), Record Type 可以描述它是 Android APP

1.6 ID length &  ID (optional)

如果前面的 flag IL(ID Length is present)=1, 那麼就會有 ID length 以及 ID 欄位

Payload ID 是 optional field, 通常是 URL, 但也可以隨便放, 它的用途是讓應用程式提供相關資訊, 或是讓不同的 NDEF record reference 其它 record
因為是 optional, 所以也可以不放

1.7 Payload

Payload 沒有規定它的 format, 通常 NDEF library 在包NDEF record時, 是直接塞data進去而不做檢查, 所以可以加密, 也可以帶二進位資料