NFC Tag
Tag 标签分类:
NFC 1 型标签
• 标准:ISO-14443A
• 内存大小:96 字节,可被扩充到2k字节
• 速度:106 Kbps
• 数据访问:读/写或只读
• 碰撞机制:数据碰撞保护不可用。
• 兼容产品:Innovision Topaz
• 价格:低
NFC 2 型标签
• 标准:ISO-14443A
• 内存大小:48 字节/144 字节,内存可被扩充到2k字节
• 速度:106 Kbps
• 数据访问:读/写或只读
• 碰撞机制:提供防碰撞支持
• 兼容产品:NXP Mifare Ultralight、NXP Mifare Ultralight C
• 价格:低
NFC 3 类标签
• 标准:ISO-18092、JIS-X-6319-4
• 内存大小:1/2/4/9 KB
• 速度:212 或 424 kbps
• 数据访问:读/写或只读
• 碰撞机制:提供防碰撞支持
• 兼容产品:Sony Felica
• 价格:高
NFC 4 类标签
• 标准:NXP DESFire 标签 (ISO-14443A)
• 内存大小:2KB/4 KB/8KB/32 KB
• 速度:106/212/424 Kbps
• 数据访问:读/写或只读
• 碰撞机制:提供防碰撞支持
• 兼容产品:NXP DESFire、NXP SmartMX-JCOP
• 价格:中高
NFC 类型 5 标签
• 标准:ISO-14443A、MF1 IC S50
• 内存大小:192 字节/768 字节/3584 字节
• 速度:106Kbps
• 数据访问:读/写或只读
• 碰撞机制:提供防碰撞支持
• 兼容产品:NXP Mifare Classic 1K、NXP Mifare Classic 4K、NXP Mifare Classic Mini
• 价格:低
每种 NFC 标签类型都具有独特的优势,具体取决于应用。类型 1 和 2 标签由于内存和速度较低,非常适合简单任务,而类型 4 和 5 标签则具有更高的性能和安全功能,适合支付系统等复杂应用。
NFC Tag NVM布局:
Tag Type1/2/5
小内存情况(T1/T2/T5)
Block Number | Byte0 | Byte1 | Byte2 | Byte3 | Type |
---|---|---|---|---|---|
0 | Internal 0 | Internal 1 | Internal 2 | Internal 3 | Reserved |
1 | Internal 4 | Internal 5 | Internal 6 | Internal 7 | Reserved |
2 | Internal 8 | Internal 9 | Static Lock 0 | Static Lock 1 | Reserved |
3 | CC 0 | CC 1 | CC 2 | CC 3 | Reserved |
4 | Data 0 | Data 1 | Data 2 | Data 3 | Data |
5 | Data 4 | … | … | … | Data |
… | … | … | … | … | Data |
N | … | … | … | Data n | Data |
N+1 | Dynamic Lock 1 | Dynamic Lock 2 | … | … | Lock |
... | … | … | … | … | Lock |
N+X | Dynamic Lock n | Lock | |||
... | Rsvd | Rsvd | Rsvd | Rsvd | Lock |
... | Rsvd | Rsvd | Rsvd | Rsvd | Lock |
大内存情况(T5)
Block Number | Byte0 | Byte1 | Byte2 | Byte3 | Type |
---|---|---|---|---|---|
0 | Internal | Internal 1 | Internal 2 | Internal 3 | Reserved |
1 | Internal 4 | Internal 5 | Internal 6 | Internal 7 | Reserved |
2 | Internal 8 | Internal 9 | Static Lock 0 | Static Lock 1 | Reserved |
3 | CC 0 | CC 1 | CC 2 | CC 3 | Reserved |
4 | CC 4 | CC 5 | CC 6 | CC 7 | Reserved |
5 | Data 0 | Data 1 | Data 2 | Data 3 | Data |
6 | Data 4 | … | … | … | Data |
… | … | … | … | … | Data |
N | … | … | … | Data n | Data |
N+1 | Dynamic Lock 1 | Dynamic Lock 2 | … | … | Lock |
... | … | … | … | … | Lock |
N+X | Dynamic Lock n | Lock | |||
... | Rsvd | Rsvd | Rsvd | Rsvd | Lock |
... | Rsvd | Rsvd | Rsvd | Rsvd | Lock |
字段说明
UUID bytes:
Byte Number | Byte Name | 4-byte UID | 7-byte UID | 10-byte UID | Description |
---|---|---|---|---|---|
0 | Internal0 | UID0 | UID0 | UID0 | |
1 | Internal1 | UID1 | UID1 | UID1 | |
2 | Internal2 | UID2 | UID2 | UID2 | |
3 | Internal3 | UID3 | BCC0 = CT ^ UID0 ^ UID1 ^ UID2 | UID3 | ISO/IEC 14443-3 A 中CT 取 0x88 |
4 | Internal4 | BCC0 = UID0 ^ UID1 ^ UID2 ^ UID3 | UID3 | UID4 | |
5 | Internal5 | 0xFF | UID4 | UID5 | |
6 | Internal6 | 0xFF | UID5 | UID6 | |
7 | Internal7 | 0xFF | UID6 | UID7 | |
8 | Internal8 | 0xFF | BCC1 = UID3 ^ UID4 ^ UID5 ^ UID6 | UID8 | |
9 | Internal9 | Rsvd | Rsvd | UID9 |
Static Lock bytes:
此区域一般具有比特位只写"1"属性,也就是一旦在对应的bit 位写入1,则此比特位不允许再次修改,区域下的每个bit位用于控制静态存储区下指定个数的 Block 是否允许非接触面(NFC空口)对 NFC tag 进行写操作,具体情况请参考对应芯片的描述。
Capability Container bytes:
Byte Number | Byte Name | Meaning | Value | Description |
---|---|---|---|---|
12 | CC0 | NFC magic number | 0xE1 | 一般为0xE1或0xE2 |
13 | CC1 | Version number (v1.0) | 0x10 | 版本号, [b7-b4]major number, [b3-b0]minor number |
14 | CC2 | Size of data area (408 bytes / 8) | 0x33 | T2T 区域大小,单位是8Bytes,内存大于2KBytes 时为0,使用ExtMenSize 区域表示 |
15 | CC3 | R/W access | 0x00 | 读写访问标志位(只读Tag或读写Tag),具体参考对应芯片的描述 |
16 | CC4 | Rsved1 | 0x00 | |
17 | CC5 | Rsved1 | 0x00 | |
18 | CC6 | Ext Memory Size H | 0x00 | 扩展的T2T 区域大小,高字节 |
19 | CC7 | Ext Memory Size L | 0x00 | 扩展的T2T 区域大小,低字节 |
Data bytes
用户数据以 TLV 块的形式组织,数据区域可以包含一个或多个 TVL 块,TLV 格式如下:
- T(必需):块类型,不同类型用于存放不同用途的数据。
- L(可选,取决于 T 值):块长度(以字节数表示),本身占有 1字节或3字节,内容长度小于255时,L本身占用1字节,长度大于255时,长度占用3字节,L[0] = x0FF,L[1] = LenH,L[2] = LenL。
- V(可选,取决于 T 和 L 值):块内容(仅当 L 字段存在且大于 0 时才存在),长度等于 L 字段值的多字节字段,可以包含了多个NDEF Record。
TLV block type | Value | Description |
---|---|---|
NULL TLV | 0x00 | 无效类型 |
Lock Control TLV | 0x01 | 包含定义 Dynamic Lock 区域的位置信息 |
Memory Control TLV | 0x02 | 包含定义保留的内存区域 |
NDEF Message TLV | 0x03 | 包含 NDEF 消息 |
Proprietary TLV | 0xFD | 包含标签专有信息 |
Terminator TLV | 0xFE | 表示 NDEF 消息结束,一般没有长度和内容 |
Dynamic Lock bytes
此区域一般具有比特位只写"1"属性,每个bit位用于控制动态存储区下连续 Block 区域是否允许非接触面(NFC空口)对 NFC tag 进行写操作,具体情况请参考对应芯片的描述。
Tag Type3:
Block Number | Byte0 | Byte1 | Byte2 | Byte3 | Type |
---|---|---|---|---|---|
0 | Version | Nbr | Nbw | Nmaxb H | Reserved |
1 | Nmaxb L | Rsvd | Rsvd | Rsvd | Reserved |
2 | Rsvd | WriteF | R/W Flag | NLEN 1 | Reserved |
3 | NLEN 2 | NLEN 3 | Checksum H | Checksum L | Reserved |
4 | Data 0 | Data 1 | Data 2 | Data 3 | Data |
5 | Data 4 | … | … | … | Data |
… | … | … | … | … | Data |
N | … | … | … | Data n | Data |
... | Rsvd | Rsvd | Rsvd | Rsvd | Lock |
... | Rsvd | Rsvd | Rsvd | Rsvd | Lock |
字段说明
Attribute bytes
Byte Number | Byte Name | Meaning | Value | Description |
---|---|---|---|---|
0 | Version | Mapping version (v1.0) | 0x10 | 版本号, [b7-b4]major number, [b3-b0]minor number |
1 | Mbr | Max block to read | 0x04 | 单次写入的最大block个数 |
2 | Mbw | Max block to read | 0x01 | 单次读取的最大block个数 |
3 | Nmaxb H | Max block for NDEF stroage high | 0x00 | T2T 区域大小高字节 |
4 | Nmaxb L | Max block for NDEF stroage low | 0x0D | T2T 区域大小低字节(以block大小为单位) |
5 | Rsvd | Reserved | 0x00 | 保留 |
6 | Rsvd | Reserved | 0x00 | 保留 |
7 | Rsvd | Reserved | 0x00 | 保留 |
8 | Rsvd | Reserved | 0x00 | 保留 |
9 | WriteF | Write Flag | 0x00 | 写标志位,用于控制非接触面对应连续block区域的写入 |
10 | R/W Flag | NEDF access read and write flag | 0x01 | 读写访问标志位(只读Tag或读写Tag) |
11 | NLEN 1 | Current NDEF message Length | 0x00 | 当前NDEF 消息长度 |
12 | NLEN 2 | 0x00 | ||
13 | NLEN 3 | 0x1F | ||
14 | Checksum H | Checksum high | 0x00 | attribute 区域校验和, Checksum = B0+B1+ ... +B13 |
15 | Checksum L | Checksum low | 0x42 |
Data bytes
用于区域位于与NVM 区域偏移 16 的位置,从这个位置开始写入用户需要的多个NDEF Record 即可,需要注意的是,用户区域的数据长度需要反映在 Attribute 下的 NLEN 字段上,并且每次修改 Attribute 区域都需要重新进行 Checksum 的计算。
Tag Type4
在 Tag Type4 中不在时直接使用NVM 偏移进行数据读取和写入,从而引入了文件的概念,在操作不同文件时需要先使用 'Select" 指令进行文件选择,选择完成后进行文件操作,文件的偏移都是从 0开始。Tag Type4 中一般至少会包括两种文件,Capability Container 文件用于描述一些通用信息,NDEF file 则用于用户区数据的读写。CC File 的文件表示父固定为 0xE103,通过CC file 中的FileID字段可以找到 NDEF file ID。
CC File
File offset | Name | Meaning | Value | Description |
---|---|---|---|---|
0x0000 | CCLen | Number of bytes of CC file | 0xFF | CC文件长度 |
0x0002 | Version | Mapping version | 0x10 | 版本号, [b7-b4]major number, [b3-b0]minor number |
0x0003 | MLe | Maximum number of bytes that can be read | 0x00FF | 最大可读字节数 |
0x0005 | MLc | Maximum number of bytes that can be written | 0x0036 | 最大可写字节数 |
0x0007 | NDEF T | DEF file control TLV | 0x04 | T字段 |
0x0008 | NDEF L | 0x06 | L字段,6个字节的内容 | |
0x0009 | FileID | 0x0001 | NDEF文件ID | |
0x000B | MaxNLEN | 0x0100 | 最大NDEF文件的大小 | |
0x000D | CCRD | 0x00 | 读访问条件 | |
0x000E | CCRW | 0x00 | 写访问条件 |
NDEF File
File offset | Name | Meaning | Value | Description |
---|---|---|---|---|
0x0000 | NLEN | Current NDEF message Length | … | 当前用户区数据长度 |
0x0002 | Data0 | Data byte 0 | … | 用户数据 |
0x0003 | Data1 | Data byte 1 | … | 用户数据 |
… | … | … | … | 用户数据 |
N | … | … | … | 用户数据 |
NDEF Message
NFC Forum定义,R/W模式下,NFC设备之间每一次交互的数据都会封装在一个NDEF Message 中,而一个NDEF Message可以包含多个NFC Record,真正的数据则封装在NFC Record Payload中。
NDEF Message | ||
---|---|---|
NFC Record 1 (MB=1, ME=0) | NFC Record ... (MB=0, ME=0) | NFC Record n (MB=0, ME=1) |
NFC Record:
记录格式:
偏移 | bits mapping | 备注 | |||||||
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
0 | MB | ME | CF | SR | IL | TNF | flags标识,必选项 | ||
1 | Type Length | Type 长度,必选项 | |||||||
2 | Payload Length 3 | SR=0时存在,可选项 | |||||||
3 | Payload Length 2 | SR=0时存在,可选项 | |||||||
4 | Payload Length 1 | SR=0时存在,可选项 | |||||||
5 | Payload Length 0 | Payload 长度,必选项 | |||||||
6 | ID Length | SR=1时存在,可选项 | |||||||
7 | Type String | Type 字符串,必选项 | |||||||
8 | ID String | SR=1时存在,可选项 | |||||||
9 | Payload | 数据内容,可选项 |
字段说明:
- MB(消息开始):表示此记录是 NDEF Message 中第一条记录。
- ME(消息结束): 表示此记录是 NDEF Message 中最后一天记录。
- CF(块标志): 表示此记录是某个记录的分块片段,在除最后一个块之外的所有记录块中设置。
- SR(短记录): 用于确定有效负载长度字段的大小。置位表示负载长度占用 1 个字节;否则占用 4 个字节。
- IL(存在 ID 长度): 表示记录头中是否存在 ID 长度字段。如果设置了该标志,则存在 ID 长度字段。
- TNF(类型名称格式): 指定负载类型字段数据的类型。NFC Forum定义类型如下:
Value | Type Name Format | Value | Type Name Format |
---|---|---|---|
0x00 | Empty | 0x04 | NFC Forum external type [NFC RTD] |
0x01 | NFC Forum well-known type [NFC RTD] | 0x05 | Unknown |
0x02 | Media-type [RFC 2046] | 0x06 | Unchanged |
0x03 | Absolute URI [RFC 3986] | 0x07 | Reserved |
- Type Length(类型长度):指明记录中 Type 字段的字符串长度。
- Payload Length(负载长度):由SR 控制使用1个字节还是这4个字节来指明负载长度。
- ID Length(ID长度):指明ID字段的长度。IL未设置,则 ID Length 和 ID 字段都不存在。
- Type(记录类型):字段表明负载的具体类型,TNF是父类型,而Type字符串表示具体的类型。
- ID(ID字符串):与URI类型的负载一起使用,使得一个记录能通过ID来指向另外一个记录。
Type 类型字符串如下:
Type | Type String | Type | Type String |
---|---|---|---|
URI | "U" | Text | "T" |
Signature | "Sig" | Smart Poster | "Sp" |
Generic Control | "Gc" | "Gc" |
URI Record
URI Record Type属于 NFC Forum Well-known Type 的一种,其对应的 Type 字段取值为 "U"。组织方式如下:
Name | Length | Description |
---|---|---|
Identifier Code | 1 Byte | 指明URI 的类型 |
URI | N Byte | URI 字符串内容 |
ID code
ID Code | Meaning | ID Code | Meaning |
---|---|---|---|
0x00 | 无前缀,前缀包括在URI中 | 0x05 | tel: |
0x01 | http://www | 0x06 | mailto: |
0x02 | https://www | 0x07 | ftp://anonymous:anonymous@ |
0x03 | http:// | 0x08 | ftp://ftp. |
0x04 | https:// | 0x09 | ftps:// |
URI 示例
URI Record 内容:0xd1 0x01 0x08 0x55 0x01 0x6e 0x66 0x63 0x2e0x63 0x6f 0x6d
TEXT Record
Text Record Type 属于 NFC Forum Well-known Type 的一种,其对应的 Type 字段取值为 "T"。组织方式如下:
Name | Length | Description |
---|---|---|
status | 1 Byte | bit7 为0表示使用 UTF-8,为1表示使用 UTF-16 bit6 强制为0 bit5~0 表示语言码的长度 |
language code | N Bytes | 语言码字符串,ISO/IANA 中英语为"en" |
Text | N Bytes | 字符串内容,编码格式由status 最高位决定 |
Text 示例
Text Record 内容:0xd1 0x01 0x10 0x54 0x02 0x65 0x6e 0x22 0x48 0x65 0x6c 0x6c 0x2c 0x77 0x6f 0x72 0x6c 0x64 0x21 0x22