引用原文链接[!https://www.cnblogs.com/ioter/articles/3732918.html]
在做 UHF 应用的越来越多了, 如何根据实际应用设计系统以达到更佳的使用效果, 其中对 UHF 标签相关内容的了解至关重要, 很多朋友对标签的了解不多, 在此不才, 整理了一些资料, 供大家参考, 有出入的地方欢迎各位鞋童多拍砖头, 大家一起来探讨, 最后达到你好, 我好, 大家都好的效果.
RFID 标签物品编码区 (EPC 区) 由 CRC-16,PC(协议控制),EPC 三部分组成.
RFID 标签 EPC 物品编码区 PC 协议控制字编码解析
PC 协议控制字包含标签物理层的信息, 标签在每一次盘存操作中通过它的物品编码区 EPC 返回这些信息. PC 协议控制一共包含 16bits, 它们被存储在 EPC 存储区地址从 10h 到 1Fh 的单元中, 其中每一位的含义定义如下:
10h-14h: 标签反向散射的 (PC+EPC) 的长度, 所有字为:
000002:PC+EPC 的长度为 1 个字(EPC 长度为 0)
000012:PC+EPC 的长度为 2 个字(EPC 长度为 1 个字, 2 个字节, 16bits)
000102:PC+EPC 的长度为 3 个字(EPC 长度为 2 个字, 4 个字节, 32bits)
...
111112:PC+EPC 的长度为 32 个字(EPC 长度为 31 个字, 62 个字节, 496bits)
15h-17h:RFU(第 1 类标签为 0002).
18h-1Fh: 默认值为 000000002 且可以包括如 ISO/IEC 15961 定义的 AFI 在内的计数系统识别(NSI).NSI 的 MSB 存储在 18h 的存储位置.
我们常见的 RFID 标签 PC 协议控制字通常设置为 3000h 或者 4000h:
PC 协议控制字设置为 3000h 指示 EPC 长度为 6 个字, 12 字节, 96bits.
PC 协议控制字设置为 4000h 指示 EPC 长度为 8 个字, 16 字节, 128bits.
在标签的上电过程中, 标签应该通过 PC 协议控制字中的前 5bits 所指定的 PC+EPC 的长度计算它的 CRC-16 校验码, 而不是通过整个 EPC 存储区的长度进行 CRC-16 计算.
符合 EPC Class1 Gen2(简称 G2)协议 V109 版的电子标签 (Tag, 简称标签) 和 Reader(读写器), 应该具有下述的特性.
Q1: 标签存储器分为哪几个区? A:Tag memory(标签内存)分为 Reserved(保留),EPC(电子产品代码),TID(标签识别号)和 User(用户)四个独立的存储区块 (Bank). Reserved 区: 存储 Kill Password(灭活口令) 和 Access Password(访问口令). EPC 区: 存储 EPC 号码等. TID 区: 存储标签识别号码, 每个 TID 号码应该是唯一的. User 区: 存储用户定义的数据. 此外还有各区块的 Lock(锁定)状态位等用到的也是存储性质的单元.
Q2: 标签有哪几种状态? A: 收到连续波 (CW) 照射即上电 (Power-up) 以后, 标签可处于 Ready(准备),Arbitrate(裁断),Reply(回令),Acknowledged(应答),Open(公开),Secured(保护),Killed(灭活)七种状态之一. 1,Ready 状态是未被灭活的标签上电以后, 开始所处的状态, 准备响应命令. 2, 在 Arbitrate 状态, 主要为等待响应 Query 等命令. 3, 响应 Query 后, 进入 Reply 状态, 进一步将响应 ACK 命令就可以发回 EPC 号码. 4, 发回 EPC 号码后, 进入 Acknowledged 状态, 进一步可以响应 Req_RN 命令. 5,Access Password 不为 0 才可以进入 Open 状态, 在此进行读, 写操作. 6, 已知 Access Password 才可能进入 Secured 状态, 进行读, 写, 锁定等操作. 7, 进入到 Killed 状态的标签将保持状态不变, 永远不会产生调制信号以激活射频场, 从而永久失效. 被灭活的标签在所有环境中均应保持 Killed 状态, 上电即进入灭活状态. 灭活操作不可逆转. 要使标签进入某一状态一般需要适当次序的一组合法命令, 反过来各命令也只能当标签在适当的状态下才能有效, 标签响应命令后也会转到其他状态.
Q3: 命令分为哪几类? A: 从命令体系架构和扩展性角度, 分为 Mandatory(必备的),Optional(可选的), Proprietary (专有的)和 Custom(定制的)四类. 从使用功能上看, 分为标签 Select(选取),Inventory(盘点)和 Access(存取)命令三类. 此外还为了以后命令扩展, 预留了长短不同的编码待用.
Q4: 必备的 (Mandatory) 命令有哪些? A: 符合 G2 协议的标签和读写器, 应该支持必备的命令有十一条: Select(选择),Query(查询), QueryAdjust(调节查询), QueryRep(重复查询), ACK(EPC 答复), NAK(转向裁断), Req_RN(随机数请求),Read(读),Write(写),Kill(灭活),Lock(锁定).
Q5: 可选的 (Optional) 命令有哪些? A: 符合 G2 协议的标签和读写器, 支持也可以不支持可选的命令有三条: Access(访问),BlockWrite(块写),Blockerase(块擦除).
Q6: 专有的 (Proprietary) 命令会是什么? A: 专有的命令一般用于制造目的, 如标签内部测试等, 标签出厂后这样的命令应该永久失效.
Q7: 定制的 (Custom) 命令会有哪些? A: 可以是制造商自己定义而开放给用户使用的命令, 如 Philips 公司提供有: BlockLock(块锁定),ChangeEAS(改 EAS 状态),EASAlarm(EAS 报警)等命令(EAS 是商品电子防盗窃系统 Electronic Article Surveillance 的缩写).
Q8: 选取 (Select) 类命令有哪些? A: 仅有一条: Select, 是必备的. 标签有多种属性, 基于用户设定的标准和策略, 使用 Select 命令, 改变某些属性和标志就人为选择或圈定了一个特定的标签群, 可以只对它们进行盘点识别或存取操作, 这样有利于减少冲突和重复识别, 加快识别速度.
Q9: 盘点 (Inventory) 类命令有哪些? A: 有五条: Query, QueryAdjust, QueryRep, ACK, NAK, 都是必备的. 1, 标签收到有效 Query 命令后, 符合设定标准被选择的每个标签产生一个随机数(类似掷骰子), 而随机数为零的每个标签, 都将产生回响(发回临时口令 RN16-- 一个 16-bit 随机数), 并转移到 Reply 状态; 符合另一些条件的标签会改变某些属性和标志, 从而退出上述标签群, 有利于减少重复识别. 2, 标签收到有效 QueryAdjust 命令后, 只是各标签分别新产生一个随机数(象重掷骰子), 其他同 Query. 3, 标签收到有效 QueryRep 命令后, 只对标签群中的每个标签原有的随机数减一, 其他同 Query. 4, 仅单一化的标签才能收到有效 ACK 命令(使用上述 RN16, 或句柄 Handle-- 一个临时代表标签身份的 16-bit 随机数. 此为一种安全机制!), 收到后, 发回 EPC 区中的内容??EPC 协议最基本的功能. 5, 标签收到有效 NAK 命令后, 除了处于 Ready,Killed 的保持原状态外, 其它情况都转到 Arbitrate 状态.
Q10: 存取 (Access) 类命令有哪些? A: 有五条必备的: Req_RN,Read,Write,Kill,Lock, 和三条可选的: Access,BlockWrite,BlockErase. 1, 标签收到有效 Req_RN(with RN16 or Handle)命令后, 发回句柄, 或新的 RN16, 视状态而不同. 2, 标签收到有效 Read(with Handle)命令后, 发回出错类型代码, 或所要求区块的内容和句柄. 3, 标签收到有效 Write(with RN16 & Handle)命令后, 发回出错类型代码, 或写成功就发回句柄. 4, 标签收到有效 Kill(with Kill Password,RN16 & Handle)命令后, 发回出错类型代码, 或灭活成功就发回句柄. 5, 标签收到有效 Lock(with Handle)命令后, 发回出错类型代码, 或锁定成功就发回句柄. 6, 标签收到有效 Access(with Access Password,RN16 & Handle)命令后, 发回句柄. 7, 标签收到有效 BlockWrite(with Handle)命令后, 发回出错类型代码, 或块写成功就发回句柄. 8, 标签收到有效 BlockErase(with Handle)命令后, 发回出错类型代码, 或块擦除成功就发回句柄.
Q11: 所谓冲突 (collisions) 是怎么回事, 怎样抗冲突? G2 用什么机制抗冲突的? A: 按上述 Q9 解答中提到的, 当有不止一个随机数为零的标签各发回不同的 RN16 时, 它们在接收天线上会出现不同 RN16 的波形迭加, 也即所谓冲突 (collisions), 从而不能正确解码. 有多种抗冲突机制可以避免波形迭加变形, 例如设法(时分) 使某时刻只有一个标签 "发言", 接着再单一化处理, 就能识别读写多张标签中的每一张标签. 上述三条 Q 字头的命令体现了 G2 的抗冲突机制: 随机数为零的标签才能发回 RN16, 若同时有多个标签随机数为零, 而不能正确解码, 就策略性地重发 Q 字头的命令或组合, 给被选择的标签群, 直到能正确解码.
Q12: 标签识别号 (TID) 应该具有唯一性吗? 怎样达成? A: 标签识别号 TID(Tag identifier)是标签之间身份区别的标志 (可以类比于钞票的编号). 从安全和防伪角度考虑, 任何两张 G2 标签不应该完全相同, 标签应该具有唯一性; 从上述 Q1 的解答中我们知道, 标签四个存储区块各有用处, 出厂后有的还能随时改写, 只有 TID 应该也可以担当此任, 所以标签的 TID 应该具有唯一性. 出厂前 G2 芯片的生产厂家应使用 Lock 命令或其他手段作用于 TID, 使之永久锁定; 并且生产厂家或有关组织应该保证每个 G2 芯片适当长度的 TID 是唯一的, 任何情况下不会有第二个同样的 TID, 即使某 G2 标签处于 Killed 状态不会被激活再使用, 它的 TID(仍在此标签中) 也不会出现在另一张 G2 标签中. 这样由于 TID 是唯一的, 虽然标签上的 EPC 码等可以被复制到另一张标签上去, 也能通过标签上的 TID 加以区分, 从而正本清源. 此种架构和方法简单可行, 但要注意保证唯一性的逻辑链. V109 版的 G2 协议对 TID 的规定, 必须的仅有 32-bit(包括 8-bit allocation class identifier,12-bit tag mask-designer identifier,12-bit tag model number); 对更多位的 bit, 如 SNR(serial number 序列号), 说的是 "Tags may contain", 而非 "should". 但由于 EPC 号码被设计成会用到区分单件商品上, 32-bit 大概是不够用的, 应该具有 SNR.G2 协议修订或者 Class 2 等会考虑这些的吧.
Q13:G2 协议中的灭活 (Kill) 命令效果怎么样? 能否重新使用已灭活的标签? A:G2 协议设置了 Kill 命令, 并且用 32-bit 的密码来控制, 有效使用 Kill 命令后标签永远不会产生调制信号以激活射频场, 从而永久失效. 但原来的数据可能还在标签中, 若想读取它们并非完全不可能, 可以考虑改善 Kill 命令的含义 -- 附带擦除这些数据. 果然如此的话, 人们应该可以彻底放心了. 此外在一定时期内, 由于 G2 标签使用的成本或其他原因, 会考虑到兼顾标签能回收重复使用的情况(如用户要周转使用带标签的托盘, 箱子, 内容物更换后相应的 EPC 号码, User 区内容要改写; 更换或重新贴装标签所费不菲, 不方便; 等等), 需要即使被永久锁定了的标签内容也能被改写的命令, 因为不同锁定状态的影响, 仅用 Write 或 BlockWrite,BlockErase 命令, 不一定能改写 EPC 号码, User 内容或者 Password(如标签的 EPC 号码被锁定从而不能被改写, 或未被锁定但忘了这个标签的 Access Password 而不能去改写 EPC 号码). 这样就产生了一个需求, 需要一个简单明了的 Erase 命令 -- 除了 TID 区及其 Lock 状态位(标签出厂后 TID 不能被改写), 其他 EPC 号码, Reserved 区, User 区的内容和其它的 Lock 状态位, 即使是永久锁定了的, 也将全部被擦除以备重写. 比较起来, 改善的 Kill 命令和增加的 Erase 命令功能基本相同(包括应该都使用 Kill Password), 区别仅在于前者 Kill 命令使不产生调制信号, 这样也可以统一归到由 Kill 命令所带参数 RFU 的不同值来考虑.
Q14:G2 中访问 (Access) 等命令是可选的, 若标签或读写器不支持可选的命令怎么办? A: 若不支持 BlockWrite 或 BlockErase 命令, 完全可以由 Write 命令 (一次写 16-bit) 多使用几次代替, 因为擦除可以认为是写 0, 前者块写, 块擦除的块是几倍的 16-bit, 其他使用条件类似. 若不支持 Access 命令, 只有 Access Password 为 0, 才可进入 Secured 状态, 才能使用 Lock 命令. 在 Open 或 Secured 状态里都可以改变 Access Password, 之后再使用 Lock 命令锁定或永久锁定 Access Password 的话(pwd-read/write 位为 1,permalock 位为 0 或 1, 参考附表), 则标签再也进不了 Secured 状态了, 也再不能使用 Lock 命令去改变任何锁定状态了. 若支持 Access 命令, 才可能使用相应的命令自由进入全部各种状态, 除了标签被永久锁定或永久不锁而拒绝执行某些命令和处于 Killed 状态以外, 也多能有效执行各个命令. G2 协议规定的 Access 命令属于 Optional 可选的, 但日后若能让 Access 命令成为必备的或者厂商生产对 G2 标签和读写器都支持 Access 命令的话, 则控制和使用起来将比较灵活和全面.
来源: http://www.bubuko.com/infodetail-3474739.html