发明内容
本发明的目的是克服现有混合防碰撞算法中存在碰撞标签识别时间长、多标签回复的碰撞概率大、多标签的清点效率低的缺点,提供一种基于维码数的RFID混合防碰撞算法。该方法是按照每维的维码数对标签进行逻辑分组,加快了阅读器的识别效率,并且在每个识别阶段,只需发送当前维维码数和该维ID序列,通过检测碰撞位推测标签维ID序列,不仅减少了标签和阅读器之间的通信量,还降低了多标签回复的碰撞概率,提高了时隙利用率,多标签的清点效率得到提高。
本发明的一种基于维码数的RFID混合防碰撞算法技术方案如下:一种基于维码数的RFID混合防碰撞算法,其特征在于,该算法步骤包括:
步骤1)逻辑分组阶段:根据标签ID位数倍数关系分维,每3bit或4bit为一维。
步骤2)维码数压栈阶段:阅读器发送Request(prefix,n)指令,阅读器范围内符合前缀的标签回复其第n维维码数,阅读器将各标签回复的维码数m压栈。初始阶段即识别第n维ID序列时,阅读器发送Request(prefix,n)指令,标签回复其第n维维码数,若检测到只有一个标签应答,则阅读器可以直接识别该标签。若有不同的维码数的标签回复,则将维码数堆栈。
步骤3)标签维ID推算阶段:步骤3)中维码数m依次出栈,针对不同的维码数m采用不同的推算策略,推算出维ID,阅读器将推算出的维ID与之前识别出的对应ID序列拼接保存,作为下次的查询前缀。
步骤4)判断栈底:判断是否到栈底,若不是栈底,转到步骤3);若是栈底,判断是否所有保存的前缀对应标签该维的ID序列已全部识别,若已全部识别,阅读器维计数器和维指针各加1,转到步骤2)。
步骤5)判断最后一维:判断是否到最后一维,若是最后一维且能分成整维的标签组,算法结束;若是最后一维但不能分成整维的标签组,阅读器发送Request(prefix),标签返回其剩余位ID信息,通过检测碰撞位来推算剩余ID序列,算法结束。
作为本发明的进一步改进,所述标签ID位数倍数关系为首先判断标签ID位数是否能被3或4整除,选择能被整除的数,以该数为bit的数量值;若同时都能被3或4整除,选择4为bit的数量值;若都不能被整除,选择余数较小的数,以该数为bit的数量值。例如,若标签ID位共11bit,选择每3bit为一维,若ID位共13bit,选择每4bit为一维;若余数相同,优先选择4。
作为本发明的进一步改进,所述维码数m指的是每维中比特位为1的位数。例如标签ID为010 101 111,该标签对象ID序列为9位,按照每3位为一维计算其维码数,共分为3维,每维的维码数分别为1、2、3。
作为本发明的进一步改进,所述推算策略如下:
A、若按照每3bit分一维时
①当维码数m为0或3时,说明该维ID序列为000或111,阅读器可以直接将该维ID序列保存,不用再次发送查询指令查询该维ID。
②当维码数m为1或2时,标签返回其该维ID序列,检测碰撞位,即可按照维码数推算出该维ID。
B、若按照每4bit分一维时
①当维码数m为0或4时,说明该维ID序列为0000或1111,阅读器可以直接将该维ID序列保存,不用再次发送查询指令查询该维ID。
②当维码数m为1或3时,标签返回其该维ID序列,检测碰撞位,即可按照维码数推算出该维ID。
③当维码数m为2时,若碰撞位小于四位,标签返回其该维ID序列,检测碰撞位,可按照维码数推算出该维ID;若碰撞位等于4位,阅读器先发送Request(prefix ,n,2,“0”),识别符合前缀的第n维维码数为2且最高位为0的标签,再用相同的方法识别符合前缀的第n维维码数为2且最高位为1的标签。
作为本发明的进一步限定,所述标签剩余位ID信息为,当按照每3bit为一维分维时,剩余位ID信息=ID位数-阅读器维指针×3;当按照每4bit为一维分维时,剩余位ID信息=ID位数-阅读器维指针×4。
本发明取得了以下良好效果:
(1)在每个识别阶段,某些维码数可以直接推测出该维ID,且通过检测某前缀只有一个标签回复,直接识别标签,大大降低了搜索深度,针对每3bit为一维(见实施例2)中的标签组,传统的动态二进制搜索算法深度为4,本发明搜索深度为2,深度减少50%;
(2)按照每维维码数对标签进行分组,并根据不同的维码数采用不同的策略推算其维ID序列,减少了搜索次数,标签位数为8bit时,标签个数为200个时,传统算法搜索次数为400次,本发明搜索次数为100次,搜索次数减少了75%。
具体实施方式
实施例1
本实施例按照每4bit为一维来分维的推算方式,具体流程如图1所示。
假设阅读器范围内有6个标签,标签序列号如下表所示:
(1)第一步,逻辑分组阶段,首先根据标签的位数分维。标签ID号总共有14位,不能被3或4整除,那么选择余数较小的4。标签组按照每4bit为一维来分维,一共分为3维。
(2)第二步,当前识别的是第一维,所以prefix=null,n=1,阅读器发送Request(null,1)指令,标签返回其第一维维码数,分别为0、2、3、4,将这些维码数压栈。
(3)第三步,维码数依次出栈
维码数0出栈,可直接推算该维ID为0000,直接保存,标签A维计数器加1;
维码数2出栈,阅读器发送Request(null,1,2)指令,第一维维码数为2的标签B、D和E返回其第一维ID,检测碰撞位,译码可得?10?,可推算出第一维维码数为 2的标签组维ID为1100和0101,将该维ID保存, 标签B、D、E维计数器加1;
维码数3出栈,阅读器发送Request(null,1,3)指令,第一维维码数为3的标签C返回其第一维ID,无碰撞,直接将译码得出的1011保存,标签C维计数器加1;
维码数4出栈,可直接推算该维ID为1111,直接将该序列保存,标签F维计数器加1;
判断已到栈底,第一维识别完,阅读器维计数器和维指针加1,转到第二步。
(4)识别第二维ID,采用第二步的方法
阅读器发送Request(0000,2)指令,前缀为0000的标签A回复其第二维维码数,检测到只有一个标签回复,选中标签A,读取其所有ID号,并使其休眠;
阅读器发送Request(1100,2)指令,前缀为1100的标签D回复其第二维维码数,检测到只有一个标签回复,选中标签D,读取其所有ID号,并使其休眠;
阅读器发送Request(0101,2)指令,前缀为0101的标签B和E回复其第二维维码数,检测到不止一个标签回复,将维码数2压栈;
阅读器发送Request(0101,2,2)指令,前缀为0101且第二维维码数为2的标签B和E回复其第二维维ID,检测碰撞位,译码可得1010,推算可得第一维ID为0101的标签第二维ID为1010,将其与第一维ID拼接保存,标签B和标签E维计数器加1;
判断已到栈底,前缀为0101的标签的第二维维ID已识别完,但并不是所有识别的第一维前缀的最后一个前缀,阅读器发送Request(1100,2)指令,标签D回复其第二维维码数,检测到只有一个标签回复,选中标签D,读取其信息,并使其休眠;
阅读器发送Request(1011,2)指令,标签C回复其第二维维码数,检测到只有一个标签回复,选中标签C,读取其信息,并使其休眠;
阅读器发送Request(1111,2)指令,标签F回复其第二维维码数,检测到只有一个标签回复,选中标签F,读取其信息,并使其休眠;
判断已是保存的前缀的最后一个,阅读器维计数器和维指针加1;
(5)识别第三维ID序列,采用第二步的方法,
阅读器发送Request(01011010,3)指令,前缀为0101的标签B和E回复其第三维维码数,检测碰撞位,译码可得????,碰撞位为四位,采用第三步3-2iii b)步骤,阅读器发送Request(01011010,3,2,“0”),符合前缀第3维维码数为2且最高比特位为“0”的标签B回复其第3维维ID剩余的后三位,检测无碰撞位,译码可得到标签B的第三维ID,将其与前两维维ID拼接保存;用同样的方法可得出标签E的第三维维ID,将其与前两维维ID拼接保存;
判断已是栈底,表明前缀为0101 1010的标签已识别完第三维,无其他前缀并且是最后一个完整维,阅读器和标签维计数器不加1,阅读器维指针不加1;
(6)阅读器发送Request(010110101010)指令,标签B返回其剩余(ID位-阅读器维指针×4)即2位信息,译码可得到标签B的完整ID,用同样的方法可得到标签E的完整ID。
本实例通过分维计算维码数,针对某些维码数可直接推断其维ID,并通过检测碰撞位结合该维维码数推算其维ID,大大减少了搜索次数,具有显著的进步。
实施例2
本实施例按照每3bit为一维来分维的推算方式,具体流程如图2所示。
假设阅读器范围内有6个标签,标签序列号如下表所示:
(1)第一步,逻辑分组阶段,首先根据标签的位数分维。标签ID号总共有9位,能被3整除,那么选择3。标签组按照每3bit为一维来分维,一共分为3维。
(2)第二步,当前识别的是第一维,所以prefix=null,n=1,阅读器发送Request(null,1)指令,标签返回其第一维维码数,分别为0、1、3、2,将这些维码数压栈。
(3)第三步,维码数依次出栈
维码数0出栈,可直接推算该维ID为000,直接保存,标签A维计数器加1;
维码数1出栈,阅读器发送Request(null,1,1)指令,第一维维码数为1的标签B、C返回其第一维ID,无碰撞,译码可得100,将该维ID保存, 标签B、C维计数器加1;
维码数3出栈,可直接推算该维ID为111,直接保存,标签D维计数器加1;
维码数2出栈,阅读器发送Request(null, 1,2)指令,第一维维码数为2的标签E、F返回其第一维ID,检测碰撞位,译码可得1??,可推算出该维ID分别为101和110,标签E、F维计数器加1;
判断已到栈底,第一维识别完,阅读器维计数器和维指针加1,转到第二步。
(4)识别第二维ID,采用第二步的方法
阅读器发送Request(000,2)指令,前缀为000的标签A回复其第二维维码数,检测到只有一个标签回复,选中标签A,读取其所有ID号,并使其休眠;
阅读器发送Request(100,2)指令,前缀为100的标签B、C回复其第二维维码数,两个标签第二维维码数都为3,可直接推断出两个标签第二维维ID为111,拼接保存识别出的ID序列;
阅读器发送Request(111,2)指令,前缀为111的标签D回复其第二维维码数,检测到只有一个标签回复,选中标签D,读取其所有ID号,并使其休眠;
阅读器发送Request(101,2)指令,前缀为101的标签E回复其第二维维码数,检测到只有一个标签回复,选中标签E,读取其所有ID号,并使其休眠;
阅读器发送Request(110,2)指令,前缀为110的标签F回复其第二维维码数,检测到只有一个标签回复,选中标签F,读取其所有ID号,并使其休眠;
判断已是保存的前缀的最后一个,阅读器维计数器和维指针加1;
(5)识别第三维ID序列,采用第二步的方法,
阅读器发送Request(100111,3)指令,前缀为100111的标签B和C回复其第三维维码数,将维码数2压栈;
维码数2出栈,阅读器发送Request(100111,3,2),前缀为100111的标签B和C回复其第三维维ID,检测碰撞位,译码可得?1?,可推断出改维ID序列为011和110,即可得出标签B、C完整ID号,所有标签识别完毕。
最后所应说明的是,以上实施例仅用以说明本发明的技术方案而非限制。尽管参照实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,对本发明的技术方案进行修改或者等同替换,都不脱离本发明技术方案的精神和范围,其均应涵盖在本发明的权利要求内。