RFID干货专栏概述
经过20多年的努力发展,超高频RFID技术已经成为物联网的核心技术之一,每年的出货量达到了200亿的级别。在这个过程中,中国逐步成为超高频RFID标签产品的主要生产国,在国家对物联网发展的大力支持下,行业应用和整个生态的发展十分迅猛。然而,至今国内还没有一本全面介绍超高频RFID技术的书籍。
为了填补这方面的空缺,甘泉老师花费数年之功,撰写的新书《物联网UHF RFID技术、产品及应用》正式出版发布,本书对UHF RFID最新的技术、产品与市场应用进行了系统性的阐述,干货满满!RFID世界网得到了甘泉老师独家授权,在RFID世界网公众号特设专栏,陆续发布本书内容。
扫码观看本章节视频讲解
3.2.1 EPC C1 Gen 2空中接口数字部分
01、"Q"(Query)询问指令
Query命令的意思是询问命令,是针对多标签的快速盘点而产生的,在学习这个知识点之前,首先要了解超高频RFID协议是半双工的通信方式,且是由阅读器先主动发起通信,也就是说阅读器“说一句”,Tag“应答一句”,如此往复。
首先分析一下Query命令包含哪些内容,如表3-2所示,其中:
Query的命令字为1000,一共4个字节,是一个常用的命令字。
DR是与反向链路频率BLF相关的配置参数。
M代表编码方式:M=0代表FM0编码;M=1代表Miller2编码;M=10代表Miller4编码;M=11代表Miller8编码。
Sel表示选择Select命令配置参数,3.2.4节会详细介绍;
Session表示会话层,3.2.3节会详细介绍;
Target表示标签的状态,一共有两个状态A或B;
Q是Query的简称,是超高频RFID协议中最重要的参数。
表3-2Query命令
在阅读器发Query命令的时候,会自带一个参数Q,这个Q的大小决定了整个系统的清点效率。Q可以设置从0到15的整数,标签收到命令后会从0到2Q中随机产生一个数字,作为这个标签的应答槽。阅读器可以通过命令让标签应答槽中的数字不断变小,直到变为0,此时标签会返回一个16位的随机数,与阅读器通信。也可以理解为标签有一个随机响应概率,其中Q的最大值为15,如表3-3所示为Q为0到5时对应的位置计数器大小。
表3-3Q值与位置计数器
Q设的越大,理论上可以清点的标签数量越多。如果标签少,Q设置过大效率就会降低(随机响应概率p太小导致)。因为Q的最大值为15,槽计数器的最大值为215=32768,也就是说一个阅读器可以同时读取32768个标签。理论上只要场内标签数量不超过最大值的3倍,可以相对高效的完全全部识别,或者理解为在EPC C1 Gen2协议下,一个阅读器可以同时识别的标签数量上限为10万个。当然实际场景中一般只有几个或几十个标签在辐射场内,只有非常特殊的应用场景中会出现超过1000个标签在同一个阅读器的辐射场内,所以Query协议在设定时已经充分考虑到了这些问题。下面通过几个例子来分析Query对应的实际场景:
场景1,场内永远只有1个标签,那么Q直接设置成0,最快速的方式进行读取,如果此时场内有两个标签,则会出现冲突,阅读器会返回冲突告警,说明场内有超过一张标签出现。这种应用在电子票据上很常见,因为电子票据都是一个一个通过的,不应该出现两个标签同时被识别的情况,因此设置为Q=0最合适。
场景2,场内有大量标签(如100张),Q的值如果设定太小,小于7,则会出现大量的冲突。假如设置为5,一共有32个槽计数器,100个标签,那么每个槽里面有3个标签,一定会冲突,读取效率会降低,所以这个情况的Q一般设置为7。
场景3,场内有10个标签,Q如果设置过大,比如7,会有128个槽计数器,数了128次才清点出来这10个标签,效率太低。
关于Q算法有很多,在3.3节有详细的分析,有兴趣的读者可以详细研读相关内容。
02、阅读器与标签的握手过程
从应用层看阅读器读取标签,只需要一个简单的盘点命令,很快就收到读取的EPC号码。但是这个读到标签的通信过程并非一次简单的应答,而是通过多次的握手实现的。本节将详细讲解该握手的过程。通过学习这个握手的过程,读者可以了解到Reader和Tag如何进行数据交互和身份认证,标签传达的数据是什么。通信握手过程如图3-7所示。
图3-7阅读器与标签的握手过程
如图3-7所示,左边是阅读器天线(代表Reader),右边是电子标签(代表Tag)。在Gen2协议中每次的通信握手都是由阅读器发起的,阅读器通过清点命令(Query及其辅助命令QueryAjust QueryRep)获得标签的句柄(16B的随机数,代表标签在此次清点过程中的身份)。阅读器通过获得的句柄,发送ACK命令(Acknowledge),可以理解为通过“暗号”来获取标签的电子编码信息;标签返回自己的PC+EPC+CRC信息给阅读器,其中PC是决定EPC长度的标识段,EPC是阅读器需要获得的电子编码信息,CRC是做校验用的。此时阅读器已经获取了所需要的标签EPC数据,如果阅读器需要对标签的其它数据区进行操作,需要再要一次句柄Req_RN(Request Random Number),意思就是再做一次身份认证,标签会再给一个RN16,随后阅读器可以继续发送其他指令,如读、写、锁、杀。可以看得到超高频RFID的整个通信过程非常简单,相比Wi-Fi等其他无线通信技术的数据认证要简单很多,其特点就是快速简单。在多数的应用中,只需要完成快速的EPC获取,一般不需要图3-7中最后那一次握手(Req_RN)。在实际场景中,阅读器可以实现每秒几十个甚至上百个标签的快速识别。图3-8和图3-9为单标签的通信握手过程和多标签抗冲突的标签通信握手过程。
图3-8单标签通信握手
图3-9多标签通信握手
关于数据区的处理本小节不做详细讲解,4.3.2节会做详细讲解。
阅读器识别标签EPC所需要的时间是应用项目中大家最关注的问题。项目中遇到物体快速通过的场景,这时要考虑读取一个标签所需的时间。这个时间是由两部分决定的:超高频 RFID空中接口的通信时间及阅读器的通信时间(如网口,串口的通信时间以及阅读器固件的通信机制,是实时返回还是定时返回等)。一般情况下空中接口部分读取一个标签的EPC数据的时间不会超过5ms(多标签情况下),当然这个读取时间与BLF等众多空口参数相关,由于多数情况下选择的BLF通信频率会超过160kHz,具体的时间戳的计算方法这里就不详细介绍了。5ms这个数字非常重要,读者可以通过加上通信时间计算出系统的最快相应时间,从而优化阅读器的工作占空比等参数。
03、会话层
超高频RFID空口协议中,最难理解的参数是Session(翻译为会话层)。如表3-4所示,Session共有:S0、S1、S2、S3这四种会话层。(Session SL与这几个不同,不放在一起介绍)。
Session | 标签进入辐射区域 | 标签离开辐射区域 |
S0 | 无限时间 | 持续 |
S1 | 500ms – 5s | 500ms – 5s |
S2 | 无限时间 | >2s |
S3 | 无限时间 | >2s |
表3-4Session 会话层定义
Session描述的是标签的状态跳转的条件,其目的是把场内的标签全部清点完成,针对不同的应用场景采用不同的清点方式,而选择不同的Session。
每个标签都有4个会话层,每个会话层都有A和B两个状态,默认的初始状态为A,当标签被清点后变成状态B,当标签离开辐射区域或到达指定时间后状态跳转回A。下面通过一个挑夫数桃子的例子来解释Session的意义。假定所有的超高频RFID标签都是桃子,且有四个挑夫分别是S0到S3,每个挑夫都有两个框子,分别是A筐和B框,每个桃子只可能放在其中的一个筐内。默认状态为A筐,可以理解为,无论选哪个挑夫任何初始的情况都是所有桃子在A筐中。当一个标签读取后(ACK应答后)就会从A筐放入B筐,此处讨论Session的不同,就是讨论的几个挑夫的不同特点。
第一个挑夫(S0)一旦离开筐子(阅读器场强离开标签),所有B筐内的桃子(标签)就都立刻(0秒的时间响应)跳回A筐;如果挑夫不离开筐子(标签一直在场内),则桃子一直留在B筐,当挑夫在A筐内找不到新的桃子则说明所有的桃子都在B筐中;
第二个挑夫(S1)把桃子(标签)从A筐放入B筐后开始计时,500mS到5S后自动跳回A筐中,无论挑夫在不在筐边,这个跳回操作都会发生;
第三个挑夫(S2)和第四个挑夫(S3)的特点是,当离开筐(标签离开场强)后开始计时,超过2秒后,桃子回到A筐内。
不同Session中的跳转机制直接影响到标签的清点效率。对于不同的应用场景需要选择不同的Session,这样才能达到Gen2协议的最佳效率。关于Session的场景使用推荐如下:
S0:应用于快速识别场景,如智能交通生产自动化的快速流水线等,主要针对于单个标签或少量标签的应用。
S1:应用于有一定批量多标签场景,如一箱服装,几个小的货架管理等。
S2、S3:应用于大量标签场景,如仓库管理等。
在实际的应用场景中,选择合适的Session进行操作,才可事半功倍。不同的芯片Session的长度也不同,实际使用中必须了解清楚。比如Alien的H3芯片中S2的时间长达200秒左右。如果一直用S2来读标签,等了一分钟再读标签发现标签的状态还在B没有回来,如果不会使用Select命令让标签从B翻转到A,只能等待200秒后再做下一次盘点。
04、Select和Mask命令的妙用
Select命令,字面意思是选择,即在大量的标签中选择出所需要特定标签进行操作。Select命令主要有两个功能,其一是针对3.2.3节中Session会话层的A和B进行翻转设置,另外一个功能就是针对特定类别标签的选择操作。
在前面的内容中,我们已经了解了超高频 RFID的协议可以支持大批量的标签识别,但是如果标签的数量非常巨大,阅读器工作量效率会变得非常低。例如在一个仓库中有几万件不同货物,货物上装有超高频RFID标签,我们需要找到一个特定的货物,并把该物品对应标签的数据区进行更改。试想一下,当你在仓库里面打开阅读器对标签进行盘点的时候,成百上千的标签都会返回自己的EPC,应用软件通过EPC号码判断是否为所找的物品。按照这种方式需要盘点整个仓库才有可能完成任务。由于多标签的读取需要时间,仓库管理员需要慢慢对每一个区域进行详细的盘点,人力和时间的消耗都非常的大。为了解决这个问题,Gen2协议设计了Select命令,这个命令的作用是只让符合特定规则的一个或一类标签返回数据而其它不符合规则的标签完全不响应阅读器命令,这样的操作方式可以大大提高识别效率。当然Select命令还有许多作用,比如多标签的防冲突识别。
如表3-5所示,为Select命令字包含内容。标签的选择是通过Select命令和Query命令共同实现的,先发Select命令再发Query命令。默认情况下Query命令的参数为Sel=00、Target=0。
表3-5Select 命令内容
如表3-5Select 命令内容所示:
Select的命令字Command是1010,是一个非常短的命令字,说明Select命令是常用命令。
Target是针对Session会话层来描述的,指出Select命令针对的是哪个会话层(S0~S3),在寻找少量标签的时候可以使用任意的会话层。在Target中还存在一个会话层SL,其作用是对标签的状态A和B进行翻转。
Action是执行、动作的意思,其功能是通过SL对标签状态A和B进行翻转。根据标签的数据是否匹配,共有8种不同的翻转情况,如表3-6所示。可能很多读者不理解为什么只是翻转A和B有这么多的可能性呢?这是Gen2协议的发明人考虑到了一些复杂的应用场景,并通过Select指令为之提供更高效的多标签解决方案。最常见的Action配置参数为000,它的功能是让匹配(Matching)的标签变成A状态,不匹配(Non-Matching)的标签跳转到B状态。当阅读器在多标签盘点时使用该命令,则符合条件的标签响应阅读器命令,不符合条件的标签不做任何应答。
表3-6Select 命令中Action内容
Action | 匹配 | 不匹配 |
000 | 保持SL或盘点→A | 不保持SL或盘点→B |
001 | 保持SL或盘点→A | 无动作 |
010 | 无动作 | 不保持SL或盘点→B |
011 | 取消SL或(A→B,B→A) | 无动作 |
100 | 不保持SL或盘点→B | 保持SL或盘点→A |
101 | 不保持SL或盘点→B | 无动作 |
110 | 无动作 | 保持SL或盘点→A |
111 | 无动作 | 取消SL或(A→B,B→A) |
MemBank是英文Memory Bank的简写,意思为数据存储区,在Select命令中指对比的数据区。根据EPC协议规范,其数据区一共有四个,分别是密码区(RFU)、电子编码区(EPC)、厂商编码区(TID)、用户区(User)。
Pointer是指选择对比的起始地址;Length是指选择对比的数据长度;Mask是指选择对比的数据内容,由于只有8b协议长度,最多可以Mask的数据内容为256b。当使用Select命令时,需要根据需求设置存储区、指向起始地址、选择对比数据长度。
例如,在一个仓库中需要盘点EPC前32b是0A/0B/19/29这组数据的所有标签。此时需要使用Select命令,其命令字配置如下:Target=000(S0速度最快);Action=000;MemBank=01;Pointer=2(EPC区有效其实地址是从2开始);Length=00010000(32b)。通过上述的设置就可以快速的盘点所这批次的标签了
关于Select和Mask的使用特别多,本节再介绍两种高效的使用方法,给它们命名为“排除异己法”“一休哥数树法”。
在一些项目中,有竞争对手把他们的标签搀在了我们的标签中,我们必须将这些标签剔除出去,这时使用“排除异己法”。但是这些标签的EPC数据与原有的标签数据是一样的(EPC可以由客户改写)。可以通过对厂商编码区TID区进行Select-Mask,只留下自己的标签进行操作。一般情况下,自己提供的同一批次同种标签的TID为相同字段,即使竞争对手使用同样型号的芯片也无法替代。“排除异己法”在国内应用非常多,特别是在智能交通领域,一般电子车牌标签的TID都是由芯片厂家订制的,可以轻松的通过Select命令选择本项目的标签。
“一休哥数树法”主要针对离线环境中需要对标签的数据区进行改写的案例。由于离线操作没有数据库的认证,对大批量的标签进行数据改写,会带来大量的重复操作,同时也无法发现未执行改写操作的标签。因此需要Select-Mask命令的帮助,如果一个标签数据区改写完成后在它的RFU区的首位写入1(默认值为0),然后通过Select命令选择该存储位置是0的标签继续进行操作,直到全部的标签的RFU区的首位写入1,所有标签停止响应(之所以选择RFU区的首位,是因为这部分的数据一般没有人使用)。至于为什么叫“一休哥数树法”,是小时候看《聪明的一休》得到的创意:一次将军出了一个难题,要一休把树林里有多少棵树统计出来,一休的方法就是用绳子系在树上,把树林中的树都系上绳子,最后计算绳子的数量就知道有多少棵树,与这个方法异曲同工。