Desiginer:Jeking
摘要:本文详细分析了ISO18000-6B标准的防碰撞算法及实际阅读器设计中带来的问题,阐述了改进办法及思路,最后给出了利用该算法的阅读器的软件实现流程。
关键词:ISO8000-6B 防碰撞算法 改进 CRC-16
前言早期的系统中,1次只能读/写1个射频卡。射频卡之间要保持一定距离,确保一次只有一个卡在读写区域内。很多时候不可避免地会出现多个射频卡进入识别区域时信号互相干扰的情况(即碰撞),应用起来很不方便。但这种应用很难满足越来越多的系统需求。
由于射频卡含有可被识别的唯一信息(序列号),RFID系统的目的就是要读出这些信息。如果只有一个射频卡位于阅读器的可读范围内,则无需其他的命令形式即可直接进行阅读。如果有多个射频卡同时位于一个阅读器的可读范围内,则射频卡的应答信号就会相互干扰形成所谓的数据碰撞,从而造成阅读器和射频卡之间的通信失败。为了防止这些碰撞的产生,RFID系统中需要设置一定的相关命令,解决冲突问题,这些命令被称为“防碰撞命令或算法(anticollision algorithms)”。
ISO18000-6B中防碰撞算法防碰撞算法由卡片支持的状态机、命令、容错校验机制及命令处理流程综合协同完成。通过硬件或者软件来实现防碰撞算法流程。
- 卡片的状态及状态切换
(图1)
Power-Off(掉电状态):当阅读仪器不能激活标签时,标签处于该状态。
Ready(准备好状态):当阅读器上电,标签获得波束转化来的电能供内部芯片工作时处于该状态
ID(碰撞状态):当标签试图发送自己的卡号给阅读器时处于该状态。
DataExchange(数据交换状态):当该标签已经被阅读器识别到,并被选择后,处于该状态。
- 标准中支持的命令序列
ISO18000-6B中规定的强制命令中,实现二进制搜索算法的命令有,
Initialize:收到该命令的卡片,卡片将从ID、DataExchange状态回到Ready状态。
Select:收到该命令的卡片,Ready状态将进入ID状态,ID状态保持ID状态,参与防碰撞命令Fail和Success.
DataRead:接收该命令的卡片,将从其他状态直接进入DataExchange状态
Fail:处于ID状态的卡片会接受该命令,卡片内部计数器如果不等于0则加1,否则应该其卡号给阅读器。
Success:处于ID状态的卡片会接受该命令,卡片内部计数器减1,如果结果为0则返回其卡号给阅读器。
- 标准中卡片与阅读器间通讯校验机制
卡片与阅读器间采用CRC-16容错校验机制,。
- 卡片防碰撞处理流程(参考ISO/IEC 18000-6:2004(E))
反碰撞基本处理流程就是根据标签的状态及标签支持的命令序列进行处理的,将碰撞而找到的标签切换到数据交换状态,让该卡不再参与防碰撞过程的命令,从而实现将一大堆卡片一张一张找出的过程。
反碰撞软件算法基本流程如下:
阅读器可以使用GROUP_SELECT 和 GROUP_UNSELECT命令来定义所有或者部分进入感应区的标签参与碰撞过程。可以使用相关命令来运行防碰撞算法。
对于碰撞算法,标签在硬件上应该具有以下两个硬件:
• 一个8位计数器
• 一个产生0或1的随机发生器
开始,一组标签通过GROUP_SELECT命令进入ID状态并设置其内部的计数器为0。可以使用GROUP_UNSELECT命令让一部分标签返回到READY 状态,其他的能够被选择.
按上述描述选择后,可以循环执行下面的流程:
- 所有处于ID状态的标签,其计数器将为0,标签会应答其ID号给阅读器。
- 如果超过1个标签传送, 则阅读器就会收到错误的响应。就需要继续发送FAIL command 命令.
- 对于接收到FAIL命令的所有标签,如果其计数器不为0,则自动加1,他们将远离应答其ID号的状态。
对于接收到FAIL命令的所有标签,如果其计数器为0,将产生一个随机数。如果随机数为1,则其计数器加1,否则保持计数器为0,并应答其ID号给阅读器
可能会出现以下4种情况的一种:
- 超过1个标签应答,则执行FAIL命令,回到步骤2(情况1)
- 如果所有标签产生的随机数为1,则没有应答,阅读器什么也收不到.阅读器会发送SUCCESS命令. 所有计数器减1, 对于计数器为0的标签则应答其ID号. 一般情况会回到步骤2. (情况2)
- 如果只有一个标签应答其ID号,并且接收正确, 阅读器应该发送带ID号的DATA_READ 命令给相应标签. 标签收到DATA_READ 命令后切换到 DATA_EXCHANGE 状态并应答其数据
阅读器应该发送SUCCESS命令,所有ID状态的标签的计数器减1.
- 如果只有一个计数器为1的标签则应答其ID号,重复步骤5或者步骤 6. 如果超过一个标签应答则重复步骤2. (情况3)
- 如果仅仅只有一个标签应答但ID号接收错误,阅读器应该发送RESEND 命令。 如果ID号接收正确,重复步骤5. 如果ID号接收多次都不正确 (出错次数可以根据系统需要进行处理), 假定超过一个标签应答,重复步骤2 (情况4)
- CRC-16容错能力的分析
CRC-16也会有出错的时候,只是常用的算法出错概率极低,可以100%判断单个位和双位的错误。
因为是无线射频设备,在数据接收过程中不可避免会受到一些干扰,干扰随机附加在信号中,阅读器在受到干扰或者标签偏离天线感应区太远,可能存在CRC-16校验正确,但得卡号却不正确的情况。
标签与阅读器不存在重发纠错的算法,所以可能会导致读出的卡号不是实际的卡号。本项目在研究的过程中,经过多数次的试验和测试,确实存在该种现象。
- TypeB标准中命令集分析
ISO18000-6B中用于防碰幢算法的命令主要有Initialize、Select、Fail、Success、Read.
Read命令时,当发信通道没有干扰而返回信息受到干扰时,这样卡片已经将状态切换到DataExchange状态了,但是MCU却不知道。卡片的DataExchange状态只接受Initialize命令才能回到Ready状态,或者掉电重新上电而进入Ready状态。
(图2)
- 可能带来的找卡处理问题
1)当我们在执行Select、Fail或Success命令,校验和正确时,我们还不能确认得到的卡号就是对的。
2)我们需要利用该得到的卡号执行相关读写命令,以确认卡号的正确性。
3)在执行第2步骤时,如果发信正确,返回信息时受到干扰。则此种情况下,卡片已经将自己的状态切换到DataExchange状态了,但阅读器却无从知道。对于此卡号,阅读器就只好当没有找到。
4)对于漏掉的或者被误认为非正常的卡,目前按ISO18000-6B技术标准规定的命令序列而言,目前只有Initialize命令让该状态下的卡回到Ready状态。
综合以上分析知道,Initialize命令会让所有状态的卡都回到Ready状态。于是,原来参与过防碰撞的卡,现在继续参与防碰撞,导至重复找到很多卡,某些卡可以找到多次,而可能原来没有找到的卡可能还是没有找到。
反碰撞算法的改进- 快速反碰撞算法的设想
执行Initialize让所有卡都处于Ready状态,采用Select一次选中所有卡让他们都进入ID状态,然后执行Fail或者Success进行碰撞找卡。
对于所有反回信号的解码CRC-16校验和正确的卡号进行状态切换DataExchange,让他们不再参与防碰撞。
同一感应区中的尽可能只参与一次防碰撞过程,这样就加快了防碰撞处理过程。
- 防碰撞算法的改进
- 改进后的卡片状态机及切换
增加一个卡片挂起态,卡片根据命令情况可以从该状态切换到其他任何状态,该状态下的卡,可以接受Restore,Read, Initialize相关命令。
只有从ID状态的卡才能切换到该状态。带*的为新增加的。
(图3)
2)改进后新增加的命令
根据要求,需要增加的命令序列有Halt,Restore.使用这两个命令组合,卡片可以从ID状态切换到CardHalt状态,也可以从CardHalt状态切换到ID状态。利用该状态,方便确定并校对接收到的卡号的正确性。
- Halt:
处于ID状态的标签,接收到该命令后,与自己自己的卡号对照,一致则切换到CardHalt状态,并返回卡号。否则什么也不返回。
命令代码 = ‘1E’
Preamnle |
Delimiter |
Command |
ID |
CRC-16 |
8 bits |
64 bits |
16 bits |
成功应答:
Preamnle |
ID |
CRC-16 |
64 bits |
16 bits |
- Restore:
处于CardHalt状态下的所有卡,当收到该命令后,自动返回到ID状态。此命令无返回信息。
Command Code = ‘1F’
Preamnle |
Delimiter |
Command |
CRC-16 |
8 bits |
16 bits |
- 改进算法后阅读器的软件设计流程
- 主流程
(图4)
说明:
- 阅读器对卡发送Initialize命令,让所有接收到该命令的卡进入准备好状态。该命令没有返回信息。
- 阅读器对卡发送Select命令,让所有处于准备好状态和碰撞状态的接收到该命令,则进入碰撞状态。接收卡片返回信息,如果CRC-16校验正确,则进入单卡处理流程,否则进入步骤c
- Restore将所有处于CardHalt状态的卡恢复到ID状态,参与防碰撞。
- 执行碰撞处理流程
- 看是否有新卡,有新卡就回到第b步,否则继续
- 看是否退出循环找卡,如果是则结束找卡,否则继续
- 回到b继续
- 单卡处理流程
(图5)
- 对找到的卡发送Halt命令,将其状态切换到CardHalt状态。
- 对得到的卡号进行校验对比,如果得到的卡号正确则执行步骤c,否则执行步骤e
- 暂存卡号,或者将卡号给到上位机进行处理。
- 发送READ命令,让该卡切换到DataExchange状态。让该卡不再参与防碰撞。
- 结束流程
- 碰撞处理流程
利用Fail或者Success命令进行处理,算法按ISO18000-6B算法进行处理。可以参考ISO/IEC 18000-6:2004(E)的第92页。
- 改进后的算法优点
该防碰撞处理算法兼容以前协议,支持以前防碰撞协议的阅读器同样实用于本算法的。
该算法可以让碰撞得到的卡临时进入CardHalt状态,确认卡号后在进入DataExchange 状态,当受到干扰而没有得到确认的卡的CardHalt状态可以通过Restore命令恢复到ID状态,从新参与防碰撞处理。
利用该算法可以尽可能地让同一张卡只一次切换到DataExchange状态,而不再用Initialize命令回到Ready状态从新开始处理。而可以提高阅读器找卡速率。
利用该算法可以实时监视新卡。因为以前找到的卡在供电稳定的情况下一直会处于DataExchange状态,而无需参与碰撞过程的。
结束语本协议从产品设计的角度提出了一种支持ISO18000-6B技术标准的卡片,在原来防碰撞算法基础上增加了3条处理命令。从理论上讲可提高在无线电干扰情况下的找卡性能,减少重复找卡次数,从而提高找卡速率。
相信本算法的实施会让实际产品性能有很大提高,对ISO18000-6B防碰撞算法是个补充。
参考文献:
1.ISO/IEC 18000-6:2004(E)
2.(德)Klaus Finkenzeller. 射频识别(RFID)技术——无线电感应的应答器和非接触IC卡的原理. 陈大才编译. 北京:电子工业出版社,2001 3. 沈树群,沈宇超. 射频识别技术及其应用. 国际自动识别技术研讨会论文集, 1997
4.徐丽香, 蓝运维 RFID二进制搜索法防碰撞的实现, 北京:单片机嵌入式系统, 2006
,