定义 NDEF 消息
Defining a NDEF Message
我正在使用我的 Raspberry Pi 和 RFID-RC522 板进行 Python 项目。作为 NFC 标签,我使用 NXP NTAG213。我现在的计划是在标签上存储 links。我可以 read/write 毫无问题地处理它们。但是我不明白如何为标签上存储的数据定义 NDEF header。
当我用智能手机在标签上写一个 link 并用我的程序读取它时,标签上存储的数据如下所示:
URL“http://www.gmx.at”的 NDEF header 是
[3, 11, 209, 1, 7, 85, 1, ... (Data)]
我发现当我写另一个 link 时,其中一些参数会发生变化,但有些参数仍然保持不变。
我发现这个 tutorial 描述了 NDEF header 的不同字段,但我仍然不明白我需要如何设置它们才能将 link 存储到网站.
如果有人能正确描述我需要如何 calculate/define link 的参数,我将非常高兴。
为了了解NDEF格式以及NDEF格式数据在NFC Forum Type 2标签(NTAG213实现的标签平台)上的存储方式,建议您阅读以下NFC论坛规范:
您从标签中读取的数据是一个 NDEF 消息 TLV 对象,其中包含一条由一个 URI 记录组成的 NDEF 消息。
NDEF 消息 TLV:
0x03 TLV tag = NDEF Message TLV
0x0B TLV length = 11 bytes
0xD1 ... 0x74 TLV value = NDEF message
这意味着标签包含一个长度为11字节的NDEF消息。 NDEF 消息是 0xD1 ... 0x74
.
NDEF 消息:
0xD1 Record header
Bit 7 = MB = 1: first record of NDEF message
Bit 6 = ME = 1: last record of NDEF message
Bit 5 = CF = 0: last or only record of chain
Bit 4 = SR = 1: short record length field
Bit 3 = IL = 0: no ID/ID length fields
Bit 2..0 = TNF = 0x1: Type field represents an NFC Forum
well-known type name
0x01 Type length = 1 byte
0x07 Payload length = 7 bytes
0x55 Type field = "U" (in US-ASCII) = binary form of type name urn:nfc:wkt:U
0x01 ... 0x74 Payload field = URI record payload
这意味着 NDEF 消息由一个 URI 记录(类型名称 urn:nfc:wkt:U)组成,遵循 URI 记录类型定义。
URI 记录负载:
0x01 Identifier byte = URI prefix "http://www."
0x67 ... 0x74 URI field (UTF-8 encoded) = "gmx.at"
这意味着URI记录指向URI“http://www.gmx.at”。
在使用 Python 的同时,您还可以使用 ndeflib 包对数据进行编码。
以你的例子为例:
import ndef
record1 = ndef.UriRecord(f"http://www.gmx.at")
message = [record1]
buf = b"".join((ndef.message_encoder(message)))
print(buf.hex())
输出:
d101075501676d782e6174
您需要将其包装在 TLV (Tag Length Value) structure:
03 # TLV T field: block contains NDEF message
0B # TLV L field: NDEF message length = 11
: # TLV V field: NDEF message data (from above)
FE # TLV terminator
这些是您应该写入标签用户内存的字节。
我正在使用我的 Raspberry Pi 和 RFID-RC522 板进行 Python 项目。作为 NFC 标签,我使用 NXP NTAG213。我现在的计划是在标签上存储 links。我可以 read/write 毫无问题地处理它们。但是我不明白如何为标签上存储的数据定义 NDEF header。
当我用智能手机在标签上写一个 link 并用我的程序读取它时,标签上存储的数据如下所示:
URL“http://www.gmx.at”的 NDEF header 是
[3, 11, 209, 1, 7, 85, 1, ... (Data)]
我发现当我写另一个 link 时,其中一些参数会发生变化,但有些参数仍然保持不变。
我发现这个 tutorial 描述了 NDEF header 的不同字段,但我仍然不明白我需要如何设置它们才能将 link 存储到网站.
如果有人能正确描述我需要如何 calculate/define link 的参数,我将非常高兴。
为了了解NDEF格式以及NDEF格式数据在NFC Forum Type 2标签(NTAG213实现的标签平台)上的存储方式,建议您阅读以下NFC论坛规范:
您从标签中读取的数据是一个 NDEF 消息 TLV 对象,其中包含一条由一个 URI 记录组成的 NDEF 消息。
NDEF 消息 TLV:
0x03 TLV tag = NDEF Message TLV 0x0B TLV length = 11 bytes 0xD1 ... 0x74 TLV value = NDEF message
这意味着标签包含一个长度为11字节的NDEF消息。 NDEF 消息是
0xD1 ... 0x74
.NDEF 消息:
0xD1 Record header Bit 7 = MB = 1: first record of NDEF message Bit 6 = ME = 1: last record of NDEF message Bit 5 = CF = 0: last or only record of chain Bit 4 = SR = 1: short record length field Bit 3 = IL = 0: no ID/ID length fields Bit 2..0 = TNF = 0x1: Type field represents an NFC Forum well-known type name 0x01 Type length = 1 byte 0x07 Payload length = 7 bytes 0x55 Type field = "U" (in US-ASCII) = binary form of type name urn:nfc:wkt:U 0x01 ... 0x74 Payload field = URI record payload
这意味着 NDEF 消息由一个 URI 记录(类型名称 urn:nfc:wkt:U)组成,遵循 URI 记录类型定义。
URI 记录负载:
0x01 Identifier byte = URI prefix "http://www." 0x67 ... 0x74 URI field (UTF-8 encoded) = "gmx.at"
这意味着URI记录指向URI“http://www.gmx.at”。
在使用 Python 的同时,您还可以使用 ndeflib 包对数据进行编码。
以你的例子为例:
import ndef
record1 = ndef.UriRecord(f"http://www.gmx.at")
message = [record1]
buf = b"".join((ndef.message_encoder(message)))
print(buf.hex())
输出:
d101075501676d782e6174
您需要将其包装在 TLV (Tag Length Value) structure:
03 # TLV T field: block contains NDEF message
0B # TLV L field: NDEF message length = 11
: # TLV V field: NDEF message data (from above)
FE # TLV terminator
这些是您应该写入标签用户内存的字节。