【射频技术】ISO14443协议A类卡——PCD防止PICC冲突并选出一张PICC的过程

相关知识铺垫:

注意:

①阅读本文之前需要一定的射频知识基础

②类型A表示A型卡(即A型PICC),其实类型A、类型B之类的可以忽略,本文主要就是以A型卡为例讲述PCD防止PICC冲突的过程。

PCD——接近式耦合设备(读卡器)(Proximity Coupling Device)
PICC——接近式卡(Proximity Card)(卡)
UID——PICC的唯一标识符(Unique Identifier, Type A)
CLn——UID串联级n,3 ≥ n ≥ 1(Cascade Level n, Type A)
CT——UID的串联标记,‘0x88H’(Cascade Tag, Type A)
BCC——UID CLn校验字节, 前面4个字节的“异或”值(UID CLn check byte, calculated as exclusive-or over the 4 previous bytes, Type A)
REQA——请求命令,类型A(Request Command, Type A)
ATQA——请求应答,类型A(Answer To Request, Type A)
SEL——选择命令(SELect code, Type A)(1个字节大小,0x93串联1级防冲突,0x95串联2级防冲突,0x97串联3级防冲突)
NVB——有效位的数目(Number of Valid Bits, Type A)(1个字节大小,例:0x20,仅发送NVB和SEL这2字节,无UID相关字节;0x34,除发送NVB和SEL字节外,还有1个UID字节 + 4个UID比特位 +  1个被假设的UID冲突比特位也会被发送)

        每个PICC都有自己唯一的UID序列号,但UID序列号根据UID长度可分为三类,第一类为4个字节(4个字节UID,1个字节BCC校验),第二类为7个字节(1个字节CT,3个字节UID,1个字节BCC校验,4个字节UID,1个字节BCC校验),第三类为10个字节(1CT,3UID,1BCC,1CT,3UID,1BCC,4UID,1BCC)。从上面可以看出,除第一类外,第二类和第三类大于四个字节的部分都是通过CT标志串联起来的,第二类较第一类多串联了一级,共两级,第三类多串联了两级,共三级,而它们串联的部分,UID夹在CT标志和BCC校验中间。因此,用第三类UID做例子,以CT和BCC作为一级的首末位(注意,最后一级都没有CT标志),可以将第一级称为UID CL1,第二级称为UID CL2,第三级称为UID CL3。


正式流程:

        PCD先发送REQA命令(REQA命令主要用于探测PICC是否在PCD的工作射频场内),或WAKE-UP命令(接收WAKE-UP命令的PICC早已经过一遍流程了,所以一定在工作射频场内),让那些PICC进入到类准备状态(或称准备状态)。PICC在接收到了REQA后,需回复ATQA,告知PCD自己的卡类型以及防冲突比特帧。接着PCD根据收到的ATQA里的防冲突比特帧来判断是否有冲突。
        如果有冲突,则PCD发送Anticollision和Select命令,该命令分为三部分,第一部分是SEL字节(该字节确定进行防冲突的串联级别,即防冲突的级别),第二部分是NVB字节(该字节高四位是PCD准备发送的字节数,低四位是PCD在准备发送的字节外,再加上准备发送的多少个比特位),第三部分是需要PICC发送的和UID有关的数据(该部分共5个字节,包含CT和BCC字节,也就意味着一次最多发送4个字节的UID,最少发送3个字节的UID)
以串联1级防冲突为例子(一般是从串联级别一,也就是最上面的CL1开始防冲突)——SEL=0x93,PCD将这些设定好后,然后发送两个字节(SEL字节和NVB字节,0个UID相关的字节),后面加上0个比特位给PICC——NVB=0x20。因为PCD没有确定该命令第二部分中UID相关的字节数据为多少,所以PICC在收到命令后,需发送完整UID CL1的序列号给PCD。如果PCD只接收到一个PICC的UID CL1,则会忽略串联1级的防冲突流程,直接进入后续环节。反之,如果PCD接收到多个PICC发送的UID CL1,就会按预定的防冲突流程走,先检查接收的UID CL1在第几个比特位产生了冲突(意思就是在接收UID的过程中被干扰了,有的发的为0,有的发的为1,无法确认具体的数字是多少,这个时候要先选出一张卡进行后续工作,工作完成后,再选其他卡),然后将之前接收到的无冲突的字节和比特位,加上被假设的冲突比特位(不确定就干脆假设冲突位为1(也可假设为0)),回发给那些PICC(数据通过Anticollision和Select命令回发),让符合这部分UID的PICC继续发剩下来的所有数据,其他的则不用回应,此时就筛选了一部分PICC,若接下来还有冲突,则重复以上流程。如果在接下来的UID传输过程中,没有冲突发生,则PCD会重新设定NVB字节,设定为准备发送7个字节(1SEL,1NVB,5UID相关数据),加上0比特位——NVB=0x70。以及将接收到的所有5个字节的UID相关数据(即UID中完整的CL1),回发给已筛选出的唯一PICC进行校对,PICC接收到后,通过回复SAK命令表明UID是否完整。
        如果PICC的UID仅为4个字节,则其在回复的SAK命令里表示UID完整,代表防冲突执行完毕,开始执行后续的环节。反之,如果PICC的UID为7个字节或10个字节,则其在回复的SAK命令里表示UID不完整,需要进行串联级别为2的防冲突筛选——SEL=0x95,然后继续重复以上流程,直至筛选出唯一一张PICC。

注意事项:
①防冲突级别n就是在第n串联级别上执行防冲突操作。
②简单来说,PCD在执行防冲突时,并没有预置的UID进行核对,而是说从多个PICC所发的UID里,选出一张PICC进行验证等工作,工作完成后再用同样的方法选出其他的。因为PCD只靠UID分辨PICC,所以在接收UID识别PICC的过程中,会受到干扰,无法确定UID中接下来的数据为0还是为1
(有些PICC前几位UID一样,后面不一样就会产生冲突),所以就得先依据之前收到的未受干扰的部分UID数据,再加上被假设的冲突位数据(冲突位无法确定,干脆就假设其为1(也可假设为0)),回发给那些PICC,让匹配这些部分UID数据的PICC继续发送,其他不符合的就停止发送了,这时就筛选了一部分PICC,后面如果还有冲突,则重复以上操作。

以下是ISO14443协议描述的PCD防冲突过程:
步骤1:PCD为选择的防冲突类型和串联级别分配了带有编码的SEL。
步骤2:PCD分配了带有值为‘20’的NVB。
注:该值定义了该PCD将不发送UID CLn的任何部分。因此该命令迫使工作场内的所有PICC以其完整的UID CLn表示响应。
步骤3:PCD发送SEL和NVB。
步骤4:工作场内的所有PICC应使用它们的完整的UID CLn响应。
步骤5:假设场内的PICC拥有唯一序列号,那么,如果一个以上的PICC响应,则冲突发生。如果没有冲突发生,则步骤6到步骤10可被跳过。
步骤6:PCD应识别出第一个冲突的位置。
步骤7:PCD分配了带有值的NVB,该值规定了UID CLn有效比特数。这些有效位应是PCD所决定的冲突发生之前被接收到的UID CLn的一部分再加上(0)b或(1)b。典型的实现是增加(1)b。
步骤8:PCD发送SEL和NVB,后随有效位本身。
步骤9:只有PICC的UID CLn中的一部分等于PCD所发送的有效位时,PICC才应发送其UID CLn的其余部分。
步骤10:如果出现进一步的冲突,则重复步骤6~9。最大的环数目是32。
步骤11:如果不出现进一步的冲突,则PCD分配带有值为‘70’的NVB。
 注:该值定义了PCD将发送完整的UID CLn。
步骤12:PCD发送SEL和NVB,后随UID CLn的所有40个位,后面又紧跟CRC_A校验和。
步骤13:它的UID CLn与40个比特匹配,则该PICC以其SAK表示响应。
步骤14:如果UID完整,则PICC应发送带有清空的串联级别位的SAK,并从READY状态转换到ACTIVE状态。
步骤15:PCD应检验SAK的串联比特是否被设置,以决定带有递增串联级别的进一步防冲突环是否应继续进行。
如果PICC的UID是已知的,则PCD可以跳过步骤2~10来选择该PICC,而无需执行防冲突环。

找到一篇很有用的资料,分享给大家阅读,可以让大家对防冲突流程更深入了解。

符合ISO14443协议的Card_风雨兼程8023的博客-CSDN博客_iso14443的卡能复制吗

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值