高级

标签编码与 EPC 内存

掌握标签内存架构和 GS1 编码,实现供应链集成

4 个内存库

每个 EPC Gen2 标签都有且仅有 4 个内存库,每个库都有特定用途。了解这一结构对于标签的编码、读取和安全保护至关重要。

Bank 00 (Reserved): 包含 32 位销毁密码 (Kill Password) 和 32 位访问密码 (Access Password)。默认值为 0x00000000。发送销毁密码会永久禁用标签,且不可逆。访问密码用于锁定内存库,防止未经授权的写入。

Bank 01 (EPC): 包含 StoredCRC(16 位,自动计算)、StoredPC/协议控制(16 位,指示 EPC 长度和标签功能)以及 EPC 值本身 — 对于 SGTIN-96,通常为 96 位(12 字节)。某些标签支持 128 位甚至 496 位的 EPC。

Bank 10 (TID): 出厂固化的标签标识符。包含芯片制造商代码、型号和唯一的序列号。该库是只读的,永远无法更改,因此在防伪和标签认证方面具有极高价值。

Bank 11 (User): 可选的额外存储空间。容量因芯片而异:NXP UCODE 9 为 0 位(无用户内存),Quanray QStar-7U 为 512 位(64 字节)。可用于存储批次号、检查日期、温度阈值或维护记录。写入前请务必检查可用容量。

SGTIN-96 编码 — 分步指南

SGTIN-96 是应用最广泛的 EPC 方案。它将 GTIN-14(您的产品条形码)加上一个唯一的序列号编码为 96 位(12 字节)。这使得每种产品类型可拥有多达 2740 亿个唯一的序列号。

96 位结构:Header(8 位,SGTIN-96 始终为 0x30)→ Filter(3 位:0=全部,1=POS,2=整箱,3=保留,4=内包装,5=保留,6=单元负载,7=组件)→ Partition(3 位:定义公司前缀和项目引用之间的位数分配)→ 公司前缀 (20–40 位) → 项目引用 (4–24 位) → 序列号 (38 位)。

分区值 (0–6) 决定了公司前缀长度:P=0 → 40 位前缀(12 位数字),P=1 → 37 位(11 位数字),P=2 → 34 位(10 位数字),P=3 → 30 位(9 位数字),P=4 → 27 位(8 位数字),P=5 → 24 位(7 位数字),P=6 → 20 位(6 位数字)。您的 GS1 公司前缀长度决定了应使用哪个分区值。

💡

使用位于 /tools/tds-rfid-converter 的 Nextwaves TDS RFID 转换器工具,以交互方式对 SGTIN-96 值进行编码和解码。输入您的 GTIN-14 + 序列号,即可立即获取十六进制 EPC。

SGTIN-96 Bit Structure
┌────────┬──────┬─────┬──────────────┬──────────────┬──────────────┐
│ Header │Filter│Part │Company Prefix│Item Reference│   Serial     │
│ 8 bits │3 bits│3bits│  20-40 bits  │   4-24 bits  │   38 bits    │
│  0x30  │ 0-7  │ 0-6 │  GS1 prefix  │  product ref │  unique ID   │
└────────┴──────┴─────┴──────────────┴──────────────┴──────────────┘

Partition table (defines prefix/item bit allocation):
P=0: 40-bit prefix (12 digits)  P=4: 27-bit prefix (8 digits)
P=1: 37-bit prefix (11 digits)  P=5: 24-bit prefix (7 digits)
P=2: 34-bit prefix (10 digits)  P=6: 20-bit prefix (6 digits)
P=3: 30-bit prefix (9 digits)

Example: 3034257BF7194E4000001A85
  Header=0x30 Filter=1 Part=5 Prefix=0614141
  Item=812345 Serial=6789 → GTIN-14: 80614141123458

其他 EPC 方案

除了 SGTIN-96,GS1 还为不同的供应链标识符定义了其他几种 96 位 EPC 方案。每种方案都有自己的标头字节。

读写标签内存

在盘点期间读取标签是被动的——阅读器广播查询,标签从 Bank 01 返回其 EPC。但您也可以通过发送包含 Bank 编号、字偏移量和字数的 READ 命令,显式读取任何内存 Bank。

向标签写入数据需要更高的精度。标签必须经过单化(singulated,即只有一个标签响应),且写入操作一次只能进行一个字(16 位)。完整的 96 位 EPC 写入需要 6 次连续的字写入。每次写入耗时 10–20 毫秒,因此仅 EPC 数据的编码,单个标签就需要 60–120 毫秒。

常见的写入失败原因:标签离天线太远(写入比读取需要更强的信号——请将标签移至 1 米以内)。场内有多个标签(单化失败——隔离目标标签)。标签内存已锁定(需要访问密码)。写入验证失败(重试,或标签可能已损坏——典型损坏率为万分之一到三)。

💡

最佳实践:写入后务必通过回读数据并进行比较来验证。在极少数情况下,写入命令可能成功但损坏了相邻位。写后读验证可以捕获这些问题。

Write EPC — Nextwaves NRN Protocol
TX → 5A 00 01 02 11 00 0C [EPC_12_BYTES] [CRC16]

Write per 16-bit word: 10-20ms
Full 96-bit EPC = 6 words = 60-120ms total

With access password:
TX → 5A 00 01 02 11 00 10 [PWD_4B] [EPC_12B] [CRC16]

标签安全与密码

EPC Gen2 标签支持两个 32 位密码以确保安全性。访问密码(Access Password)用于锁定特定的内存库——一旦设置,该库在进行任何读写操作前都需要密码。销毁密码(Kill Password)在传输时会永久禁用标签——这是一种不可逆的操作,主要用于零售业中的消费者隐私保护(在结账后销毁标签)。

安全最佳实践:切勿在生产环境中使用默认的全零密码 (0x00000000)——它不提供任何安全性。为每个标签批次生成唯一的密码,或使用公司前缀作为种子。将密码存储在后端系统中,绝不要存储在标签本身(如果标签未锁定,密码内存是可以被读取的)。在编程后锁定密码库。考虑使用不可追踪(Untraceable)模式(适用于较新的芯片),该模式可以隐藏 TID 并减少 EPC,在不销毁标签的情况下提供隐私保护。

⚠️

销毁(Kill)命令是永久且不可逆的。无法撤销。一旦标签被销毁,它将永远无法再响应任何读取器。请务必在软件中实现销毁密码验证,并在执行销毁命令前要求管理员授权。