http://blog.chinaunix.net/uid-10604457-id-3069619.html
1.2.2.4 管理标签群
读写器采用下图所示的三个基本操作管理标签群。每个操作均由一个或一个以上的命令组成。这三个基本的定义如下:
a) 选择:读写器选择标签群以便于盘存和访问的过程。读写器可以一个或一个以上的Select命令在盘存之前选择特定的标签群。
b) 盘存:读写器识别标签的过程。读写器在四个通话的其中一个通话中传输Query命令,开始一个盘存周期。一个或一个以上的标签可以应答。读写器检查某个标签应答,请求该标签发出PC、EPC和CRC-16。同时只在一个通话中进行一个盘存周期。
c) 访问:读写器与各标签交易(读取或写入标签)的过程。访问前必须要对标签进行识别。访问由多个命令组成,其中有些命令执行R=>T链的一次活页加密。
读写器指令 标签状态
管理标签群
1.2.2.4 单标签的读卡流程及状态图
由上述的标签状态图可以看出读写器如何与单标签进行通信,
流程图如下:
读写器指令与标签返回数据标签状态
单标签的读卡流程状态图
a) 当读写器的射频场中只有一个单标签时,首先读写器上电复位,并发送强制指令SELECT指令,通过指令相应的匹配条件选择此标签;此时标签对此命令不会做出应答,标签即时转到就绪状态。
b) 随后经过读写器命令之间的最小时间T4之后,读写器发送QUERY指令,标签在收到QUERY指令后,根据已盘标记和SL标记来确认是否响应,如果匹配条件满足且槽计数器值为非0,则即时进入仲裁状态,随后发送QUERY_REP指令使槽计数器减值,直至槽计数器为0标签转到应答状态;如果匹配条件满足且槽计数器值为0,则反向散射一个随机数RN16且立即转换到应答状态。
c) 读写器接收到标签有效反向散射的RN16,读写器以相同的RN16为参数发送ACK(RN16)指令,若标签收到有效ACK指令;立刻转换到确认状态并反向散射其PC,EPC和CRC-16。
d) 标签在确认状态下,执行读写器发送的REQ_RN(RN16)指令;则标签收到有效指令后反向散射一个新的RN16(句柄)并且转到其他状态(开放状态和保护状态),在此状态下;读写器可以单独对此标签进行读写处理。
1.2.2.5 多标签的盘存流程
读写器对标签的盘存操作中设计的指令具体包括Query、QueryAdjust、QueryRep、ACK和NAK。Query用来开始对选定标签的一个盘存周期,并且指定哪些标签群参与该盘存周期。
Query命令中包含有槽计数器的参数Q。参与盘存的标签在收到Query指令后在(O,2^Q-1)范围内选择一个随机数,并把这个随机数装入标签内部的槽计数器中。槽计数器选到零数值的标签应该瞬间转换成应答状态,并立即应答。标签内部槽计数器选择的数值不是零的标签应该转换成仲裁状态,并且等待读写器发出QueryAdjust或者QueryRep命令。那么读写器和标签的通信过程如下:
a)当标签内部的槽计数器减到0时,标签则转换到应答状态同时向读写器反向散射RN16。
b)读写器收到标签回复的正确的RNl6时,以RNl6为参数向标签发送ACK指令。
c)处于应答状态的标签收到RNl6正确的信号后,向读写器反向散射PC、EPC和CRC16,并且转换到确认状态。
d)读写器重新发送QueryAdjust或QueryRep命令,让刚识别的标签倒转其已盘标记,以便读写器对剩下的为被盘存标签进行盘存时,已盘的标签不用对盘存命令进行反应,起到了为系统节约资源的目的。标签转换完标记后,转换到就绪状态。此时应使另一个标签启动与该读写器从上述(a)开始的询问-问答的对话。
注意,由于在确认状态下读写器与标签之间通信的具体定时要求(如T2),且如果不满足定时要求就会造成标签已经发生了碰撞,但是还会继续参与防碰撞的结果。故实际操作中需要把标签通过REQ_RN指令放置于开放状态或者是保护状态,因为这2种状态对定时没有要求,以便确保已盘存的标签不用再参与防碰撞,减少碰撞时间和出错率。上述只是理论分析过程,具体到实际的标签盘存可能略有不同。
在b)步中,如果标签在时间T2内没有收到读写器发送的ACK,或者收到的读写器发送的ACK指令中的参数RNl6发生了错误,那么标签应该返回到仲裁状态。
如果在读写器阅读范围内存在多个标签,如果同时应答读写器超过两个,那么将产生碰撞。倘若读写器通过波形检测可以对发生碰撞的某个标签的信号进行解决,那么将对可以被解决的标签先行盘存,未被未决的标签将会收到读写器发送的ACK指令中包含的错误的RNl6,将重新返回仲裁状态,同时向读写器反向散射它的PC、EPC和CRC16。
如果读写器向停留在确认状态下的标签发送ACK指令并且此指令含有正确的RNl6,那么此标签应该重新向读写器反向散射其PC、EPC和CRC-16。
读写器在任何情况都可以发送NAK,收到此指令后的所有标签将返回仲裁状态,而且已盘标记保持不变。
读写器采用Query指令开始一个盘存周期后,读写器一般情况下要对标签发出一个或多个的QueryAdjust和QueryRep指令。QueryAdjust命令只是改变Q参数的值,让标签重新在一个帧长度内产生一个新的随机数,不改变读写器以前对标签设定的任何参数,也不将新的标签引入到盘存标签内。而读写器发送的QueryRep指令也不对之前读写器在标签内设置的参数,也不将新的标签引入该盘存周期,只是使标签内部槽计数器的值减1。当然盘存周期可以包含有限多个QueryAdjust或者QueryRep命令或者同时含有两种命令。在任何一点上读写器可以发出新的Query命令,以此来开始新的盘存周期。
当处于仲裁或者应答状态的标签收到读写器发送的QueryAdjust命令时,标签首先调整Q值(增值、减值或保持不变),然后在该范围内(O,2^Q-1)挑选一个随机数值,将该数值载到标签内部的槽计数器内。随机发生器选到零的标签应该转换到应答状态并立即向读写器反向散射RNl6。随机发生器没有选到零的标签应该立即转换到仲裁状态,并一直等到收到读写器向标签发送QueryAdjust或QueryRep命令为止。
当处于仲裁状态下的标签收到QueryRep命令后,应该立即让内部的槽计数器进行减1,当槽计数器减到零时标签则把自己的状态转换到应答状态,并且向读写器反向散射随机数RNl6。槽计数器达到0的,对读写器反射了RNl6的标签(包括响应原Query命令但未被确认的标签),如果没有收到确认指令,标签应该在槽计数器的值达到0时返回仲裁状态,并在读写器发送下一个QueryRep时使其槽值从0000h减值到7FFFh,这样就可以阻止标签过于频繁的应答,造成不必要的碰撞。标签其实应该在2^Q-1个QueryRep命令中至少对读写器反射一次RN16。
在对6C协议的单标签读卡流程和多标签盘存流程有了一定的理解后,可以开始针对6C协议的防碰撞理论进行论述。