一直不是十分清楚RFID tag 和reader的交互过程,现在简要翻译一下EPC协议中相关的概念。
sessions and inventoried tags:
双方的交互有四个会话(S0,S1,S2,S3),tag在一次盘点中能且仅能参加一个会话,会话存在的意义是多个阅读器对同一个tag集合的盘点。当有多个阅读器时,这些阅读器可以通过不同的会话对同一个tag集合盘点,每个tag可以独立的为四个会话保持盘点标志位(inventoried flag),这个标志位包括两个值,A和B,在每个inventory round开始的时候,reader选择状态为A或者B的tags进行盘点,当完成对一个tag的盘点之后,reader会发送一个命令导致tag反转标志位,下面是一个例子
interrogator#1对所有的tags盘点完之后,下一轮的盘点将使标签从B反转到A。
对于一个杂乱的tag集合,在盘点之前tag某个会话的inventoried flag可能不统一,其实是这样的,对于session0,tags在power up之后会将flag首次设置成A,其他的session这里暂时不讨论。也就是说每次power up都会将flag重置为A
selected flag:
selected flag(SL)应该是用于选定标签子集??这个不是很清楚。由reader Select命令设置,设置为真或为假,reader的query命令还有一个参数Sel(这个参数不是Select命令的一部分),通过这个参数reader可以选择只对SL声明为真(或者假)的tag子集进行盘点或者忽略这个标志位,对所有标签盘点。tag的SL在断电情况下会保持一定时间,超过这个时间,再次power up时会重置为假,否则保持原值。
tags states and slot count:
EPC协议中tag必须实现几个元状态,简要介绍如下
1、ready state:
该状态也叫保持状态,tag power up之后当没有被kill也没有开始被盘点的时候处于这个状态,等待Query命令,如果session 和Sel相匹配就会产生一个Qbits 的随机数,作为应答slot,如果值为0则进入reply状态,否则进入arbitrate状态,tag在除killed状态之下任何状态断电,当再次充电时将进入ready状态。
2、arbitrate状态:
标签进入盘点期间而且slot值不为0将进入该状态,在该状态下,每次收到QueryRep命令时将会把slot减一,当slot值为0()X0000)时进入reply状态,当标签应答完毕后,QueryRep将会使slot counter继续减一变为0XFFFF,然后再次进入arbitrate状态。
3、reply状态:
进入该状态后tag将发送RN16数据,如果收到有效的ACK命令则变为acknowlege状态,如果没有收到有效的ACK或者收到ACK 但是带有错误的RN16(reader 也将产生相同的RN16数值作为ACK的参数返回)则返回到arbitrate状态。(然后呢?slot counter会怎么样)此时的slot counter应该还是0x0000,在arbitrate等待,直到下次的QueryRep,这样的话标签在本轮盘点中好像会失去应该的机会。
4、acknolege state:
在该状态下如果标签判断收到的ACK是否包含正确的RN16,如果正确将会将应用数据发送给reader,否则进入arbitrate状态。
5、open state:
进入acknowlege状态后续动作完成之后,如果 access password不为0,则在收到Req_RN后进入open状态,发送RN16,,在该状态下tag不会进入acknowlege状态,但是可以根据收到的命令进入其他状态,比如在此状态下,如果收到正确ACK命令将会重新发送应用数据。
6、Secured state:
处于acknowledge状态的标签如果password=0则在收到Req_RN命令之后进入secured状态,发送新的RN16……
7、killed state:
处于open状态或者secured状态的tag如果收到kill命令将会进入killed 状态,kill命令将永久使标签失能,即标签永久废掉,不可恢复
8、slot counter:
标签拥有15bits的slot counter,当标签受到Query或者QueryAdjust命令时将重新加载一个0-2的Q次方-1的值,Query会设置初始的Q,QueryAdjust可以修改Q
在每一轮盘点过程中(包括Query和QueryRep),每个标签都会若干次将slot减一,当为0时应答,应答之后的标签以及没有收到reader确认的标签将会进入保持在arbitrate状态(会重复对这个tag盘点吗???),在下一轮盘点(收到QueryRep命令)时将会把slot couter 从0x0000重置为0xFFFF.****感觉这段讲述不是很清楚
下面附上状态转移图:
标签集的管理:
reader使用3个基本的操作管理标签集,Select,inventory和 Aceess.
a) Select:该操作包括Select命令和Challenge命令,主要用于选定标签集然后进行盘点或者认证
b)Inventory:该操作用于识别tag
c) Access:该操作对标签进行读写
下面稍微详细介绍部分内容
Select操作下的Select和Challange命令是唯一两个在inventory之前的命令,两个命令之间不是互斥的,前者是强制的,后者是可选的。
在inventory操作之前,Select操作会选定特定的标签集,选定的标准由用户决定,可实现并集,交集和非操作,其中并集和交集可以通过连续发送Select命令实现(???怎么实现)Select命令可以声明标签的SL标志位(SL,~SL,或者取消),或可以设置inventoried状态位。但是两者好像不能同时设置
具体的Select包括Target,Action,MemBank, Pointer, Length,Mask,Truncate等参数,Target和Action要么修改SL要么修改inventoried flag。Membank用于选定memory bank.Pointer,length标志memory bank的位置和范围,Mask长度为length的bit串,用于和特定的memory range 比较(什么意思没明白)。Truncate用于设定标签发送完整的EPC,还是仅仅是EPC的一部分。
Inventorying 包括Query,QueryAdjust, QueryRep,ACK,NACK等命令。Query发起一轮盘点,该命令包含一个设定slot counter的Q参数,被选定的标签在随机选择一个值加载到slot counter中,slot counter为0的标签转到reply状态应答,非0的标签转到arbitrate状态等待QueryAdjust(为什么会转到这个状态)或者QueryRep。假设只有一个标签应答,具体的流程如下:
a) tag发送RN16
b) reader 发送ACK命令包含RN16
c) tag 进入acknowledge状态发送数据
d) reader 发送QueryRep命令使得标签invecntoried flag反转然手进入ready状态,隐含导致另一个标签开启和reader的对话。然后重复a。
如果标签在b阶段规定的时间内未收到ACK或者收到ACK但是RN16错误将会返回arbitrate状态,对于a中出现多标签的情况,reader将会在waveform层次检验冲突的发生,从中识别出某个标签,其他标签返回arbitrate状态。在任何时刻reader都可以发送NAK,标签收到该命令将会返回arbitrate状态而不改变inventoried flag。reader的Query命令开启盘点之后可能会发起一个或以上QueryAdjust或者QueryRep命令,QueryAdjust重复Query但不会引入新的tag(这个是由Query决定的)。
在arbitrate或者reply状态的标签在收到QueryAdjust命令将会调整Q并重新加载slot counter。在arbitrate的所有标签每次收到QueryRep命令都会将slot counter减一,当slot counter=0时进入reply状态,slot counter为0 的标签,应答完毕或者没有被确认返回arbitrate状态保持slot为0,并在下次的QueryRep命令时将slot counter减一变成0xFFFF(疑问,在这种情况下标签将会在本轮盘点中再次获得被查询的机会,只是延后到最后时隙,问题是多个标签发生这种情况的话最后一个时隙会出现多个标签,这样在最后的时隙只能有一个标签应答,其他的怎么办???或者就没有机会应答,因为reader已经开始了若干时隙,剩余的时隙小于0xFFFF),实际上这种情况下标签本轮不在应答,直到下一轮。
如果标签是在acknowlege,open或者secured状态收到Query且session匹配命令将重新开启新一轮的盘点,这时标签将反转inventoried flag然后进入ready,arbitrate或者reply状态,否则inventoried flag不变
下面举一个例子说明上述过程:
假设64个标签充电进入ready状态,,Select命令选定其中16个标签子集,在假设有12个标签的invecntoried 状态为A,Query 命令发送并携带参数(SL,Q=4,S0,A),12标签每个选个一个时隙。一个query结果分为三种情况
1)没有标签应答。reader重新发送Query,或者QueryAdjust或者QuqeryRep
2) 有一个标签应答,可能走完正常的流程也可能在收到ACK之后,reader发送QueryAdjust或者QueryRep命令,然后反转标签的inventory flag(疑问,这两个命令会反转inventoried flag 吗)
3) 多个标签应答。reader尝试解析出来其中一个,其他的reader发送QueryAdjust或者QueryRep命令或者NAK,没有识别的标签一般返回arbitrate状态
accessing individual tags:
当reader对tag ACK之后可能会访问tag,访问命令包括Req_RN,Read,Write,Kill,Acess,BlockWrite,BlockErase, ReadBuffer等等,访问命令将使标签从acknowledged状态进入open或者secured状态。首先reader发送Req_Rn命令,tag产生一个并保存一个新的RN16,发送给reader。
NAk命令不会改变inventoried flag。
下面是标签典型的响应过程
下面是Q参数生成算法
由上图可知当标签集合很大的时候,Q参数的数值调整是很慢的,但是由于Q的含义是2的指数次方,因此每经过2-10个Query rounds之后,slot 数量增加一倍。初始大小为16.
Select命令各域如下表
Query command 各域如下表所示
下面是部分状态的转移表
下面是部分命令的响应图表
参考文献:
EPC™ Radio-Frequency Identity Protocols Generation-2 UHF RFID https://www.gs1.org/epcrfid/epc-rfid-uhf-air-interface-protocol/2-0-1