周一至周五 | 9:00—22:00

期刊论文网 > 工业技术论文 > 无线电通信技术论文 > 无线电技术论文 基于软件无线电的uhfrfid阅读器设计

无线电技术论文 基于软件无线电的uhfrfid阅读器设计

2018-12-17 17:43:07来源:组稿人论文网作者:婷婷

  摘要

  射频识别(Radio Frequency Identification,RFID)技术是一种新兴的非接触式自动识别技术,目前在交通运输、身份识别、物流行业、防伪与公共安全等领域被广泛的应用。其中,特高频(UHF)RFID技术因为具有读写距离远、安全性强和识别速度快的特点,在物联网领域得到了大量的使用。

  软件无线电(Software Defined Radio,SDR)是上个世纪90年代之后渐渐发展起来的一种新兴的设计思想,其核心是在统一的可编程的硬件平台上通过运行不同的软件代码,以实现在不同频段和不同协议下进行通信。基于软件无线电的RFID阅读器可以通过修改软件代码,简单的改变阅读器工作频段和通信协议。与传统RFID阅读器相比,它在识别多种不同标准的电子标签时更加方便。

  本文首先介绍了RFID技术和软件无线电技术的发展及研究现状。接着分析了RFID系统的组成和工作频段。之后重点研究了ISO/IEC 18000-6 Type C标准,分析了该标准下阅读器和电子标签的通信过程,对该标准中调制与编码方式进行分析。然后介绍了GNU Radio开放式软件无线电平台的软件架构和开发方式,并按照ISO/IEC 18000-6 Type C标准设计RFID阅读器。利用C++编写RFID阅读器的信号处理模块,利用python编写流图将各个信号处理模块连接起来构成完整的系统。之后对整个系统进行了仿真测试和整体测试,成功实现了ISO/IEC 18000-6 Type C标准定义的阅读器操作。然后对RFID防碰撞算法进行了分析,证明了在动态帧时隙ALOHA算法中最优帧长与标签数相等,并在下限估值法的基础上提出了一种改进的标签估计算法。最后使用软件无线电自定义了新的阅读器命令,将标签估值算法应用到了阅读器中。

  关键词:软件无线电,特高频RFID,GNU Radio,防碰撞

  目录

  第1章绪论

  1.1课题背景和研究意义

  射频识别(Radio Frequency Identification,RFID)技术是一种新兴的自动识别技术,通过射频电子标签(或称应答器、RFID电子标签)装置来实现数据的存储和远程数据检索,并通过射频电子标签和射频阅读器(或称质询机、RFID阅读器)之间的无线通信完成对对象的自动识别,从而进行远程识别、监控和跟踪各种对象。该技术起源于19世纪中叶法拉第的发现,并于1900-1940年在无线电与雷达技术中实现[1-2]。

  无线通信最新进展技术表明,射频识别技术胜过其他识别系统,如条码系统、光学字符识别系统、智能卡和生物识别技术(声音、指纹、视网膜扫描),其主要原因是射频识别不需要视线交流,不受恶劣的环境影响,具有允许同时识别多个电子标签的功能,并且兼具低成本和低功耗特点。射频识别技术可轻松地将日常用品变成可跟踪、可追溯、可监控、可触发、可请求或可响应的移动网络节点。射频识别远程监控的范围包括检查监控对象的存在与否,以及跟踪对象在一个距离范围内的运动。射频识别技术逐渐被广泛地应用于不同的应用领域。由于RFID技术与互联网、通讯等信息技术相结合,可以实现全球范围内物品跟踪与信息共享,未来市场需求巨大,对我国制造业的发展意义重大[3]。

  随着RFID技术的快速发展,目前使用的RFID标准非常多,但是各个标准因为编码方式和调制方式具有差异性,所以如果阅读器和电子标签所使用的RFID标准不同,它们之间是无法通信的,这就造成了目前RFID阅读器种类十分繁杂[4]。针对这一现状,为了让RFID阅读器能够对多种电子标签进行读写,我们提出了基于软件无线电(Software Defined Radio,SDR)设计RFID阅读器的思想。软件无线电是上个世纪90年代之后渐渐发展起来的一种新兴的设计思想,它的核心是在一个统一可编程的硬件平台上通过运行不同的软件代码,以实现不同通信频段和通信协议间的转换。软件无线电的设计思想可以让同一个硬件平台在不同的频段和协议下进行通信,这恰恰是传统RFID阅读器所欠缺的。利用软件无线电技术在统一的RFID阅读器硬件上运行不同的软件代码,就可以实现阅读器对不同标准电子标签的读写。与传统RFID阅读器相比,基于软件无线电的RFID阅读器提高了阅读器的兼容性,降低了配置各种不同标准RFID阅读器时的成本[5-8]。

  1.2 RFID和软件无线电的发展及研究现状

  1.2.1 RFID技术的发展和研究现状

  射频识别技术发展到现在已经经过了几十年的研究。在第二次世界大战时,通过反射无线电波识别目标在欧洲被广泛使用。德国飞行员操纵飞机为地面的雷达生成唯一的反射信号以区别敌机,这实质上是第一个被动射频识别系统。1939年,英国完善了这一想法,并开发出主动敌我识别(Identification Friend or Foe,IFF)系统,将一个应答器(一个手提箱大小)加在了飞机的机身内,应答器使用唯一的信号传输射频信号与总部通信,表明是友方飞机返回,进而避免误伤。1948年,哈里·斯托克曼(Harry Stockman)发表了名为《利用反射能量进行通信》(Communication by Means Of Reflected Power)的论文,首次提出了基于射频识别技术的思想。斯托克曼预测说:“反射能量通信方式仍有很多问题需要解决,其应用方向也没有找到,但是,显然相关的开发和研究工作仍然需要进行。”从那之后,射频识别技术变为现实并历经了30年的技术沉淀[9-11]。

  射频识别技术的真正鼻祖是1969年Mario cardu11o记录的第一个主动射频识别发明专利。在这项专利中,cardu11o提到一种可使用声、光信号进行内存重写的主动电子标签。紧随这项发明,1973年Charles Walton发明了第一个被动射频识别系统,第一次通过嵌入了应答器的卡与附在门上的射频阅读器之间通信实现无钥匙进人系统。1975年,在美国能源部的资助下,洛斯阿拉莫斯国家实验室的科学家报道了大量的有关主动和半主动射频电子标签的射频识别技术的研究和开发工作。尽管早期已经有了大量关于射频识别技术的研究和产品开发,这项技术的应用直到1990年才成为可能,材料和半导体技术的发展增强了半导体芯片的性能,同时降低了半导体芯片的尺寸和成本。这项技术的突破使得商业射频识别系统进人主流,被广泛应用于各种各样的实际应用中,包括安全性、访问控制、交通、收费、供应链管理和跟踪等应用[12]。

  20世纪90年代之前,各种应用有专用的射频识别解决方案,缺乏射频识别系统之间的互操作性标准,给这项技术的发展带来了障碍。1990-2000年,被认为是射频识别技术标准崛起的十年,一些组织,如国际标准化组织(ISO)和欧洲邮政和电信会议(CEPT)提出了RFID的互操作性和频率分配的规范。最后,成立于1999年的麻省理工学院Auto-ID中心建立了RFID网络和互操作性开放标准。

  2003年,是RFID技术令人兴奋的一年,Auto-ID中心与EPCglobal联合开发商业化电子产品识别码(EPC)技术,沃尔玛和美国国防部都采用电子产品识别码技术进行供应链管理。此外,FCC批准超宽带(UWB)用于商业用途之后,商用UWB RFID系统被一些公司引进,如Multispectral Solutions(MSST)公司、Time domain和Ubisense有限公司等。这些先进的射频识别系统在电子标签和跟踪技术领域有了突破,提高了使用范围及功能。

  目前RFID已经被广泛的应用与在个领域。在交通运输领域,RFID技术和GPS定位技术、视频监控技术一起应用在了自动收费系统上。自动收费系统可以在车辆不停车的情况下通过读取车内的标签进行自动收费,这大大节约了过收费站的时间。在图书管理领域,很多大学已经使用了基于RFID的物联网技术来取代了以前的扫码技术,图书的管理效率得到了很大的提升。安防领域可以说是RFID应用最早的领域,目前,从传统的简单门禁对RFID的使用,到现在已经发展为门禁系统、报警系统和视频监控系统一整套有机的结合,形成了一套综合安全管理系统。

  1.2.2软件无线电的发展和研究现状

  软件无线电是上个世纪90年代初期提出的一种具有统一标准、平台开放、功能分模块的通用无线电硬件平台。可以通过软件来修改硬件平台的发射频段以及通信协议,从而使同一硬件在通信中实现了不同频段、不同协议的无线接收和发送,大大提高了硬件平台的灵活性[13]。

  软件无线电这个概念是1992年5月在美国电信会议上由Joseph Mitola III博士第一次提出的。同年,美国国防部高级总署开始了SPEAKeasy(易通话)计划。经过三年的研究,软件无线电的发展迎来了一次里程碑,在1995年5月IEEE通信杂志出了一期软件无线电专刊。同年,SPEAKeasy计划顺利通过验收。1996年第一个关于软件无线电的论坛成立了,当时命名为MMITS(模块化多功能信息传输系统)论坛,在1999年该论坛的名字改为了现在的SDR论坛,1999年IEEE通信杂志又以软件无线电的全球化为主题,出版了关于软件无线电的系列文章[。之后的几年软件无线电得到了极大的重视,各种国际学术讨论会相继进行。SPEAKeasy计划的成功有力推动了可编程模块化通信系统(PMCS)研究组的成立。之后经过PMCS研究组建议,在1999年美军启动了JTRS(联合战术无线电系统)计划,软件无线电从此开始了迅勐的发展[14-17]。

  软件无线电初期的高速发展是由于美国军方对其有需求也十分重视,并投入了大量的人员和资金用于研究。随着时间的推移,目前全球在软件无线电方面的研究成果,不仅在军事通信领域得到了大量的应用,而且在其他军事领域软件无线电也得到了使用,如军舰搭载的一体化电子系统和在战机上的航空电子系统。软件无线电不仅在军用领域大展拳脚,在民用移动通信中的应用研究和应用也在飞速的发展。预计在不久的将来软件无线电在移动通信领域将会得到大量应用,那时的移动通信将会与现在完全不同。具有软件无线电优势的通信体系架构将会彻底颠覆目前的体系,把移动通信技术和移动通信业务推向一个全新的高度[18]。

  随着高速计算机、微电子技术和信号处理技术的高速发展和普及,软件无线电技术将会在移动通信领域中得到大量的应用,软件无线电技术将会是21世纪对人类发展来说最重要的新兴技术之一。软件无线电促使通信方式的改变会极大的影响人们的生活方式,同时软件无线电的普及也将形成新兴的个人无线电市场[19],从而有力推动整个世界经济的发展,推进现代文明发展和社会进步。

  1.3论文的主要研究内容及章节安排

  1.3.1主要研究内容

  本文主要的研究内容是设计基于软件无线电的UHF RFID阅读器。首先分析了由于目前RFID系统多种标准共存,传统的RFID阅读器通常依赖硬件决定其工作频段和协议,所以不同的电子标签需要不同的阅读器来读写。当存在多种电子标签的情况下我们不得不使用大量不同的阅读器进行电子标签信息的读取。接着分析了软件无线电技术在解决传统RFID阅读器问题上的可行性,软件无线电可使用软件来实现相同硬件在不同工作频段和不同协议下进行通信。之后对ISO/IEC 18000-6 Type C标准进行分析,研究其解调和编码方式及阅读器电子标签通信过程。最后使用GNU Radio开放式软件无线电平台根据协议设计阅读器,通过C++代码编写软件无线电平台中的信号处理模块,通过Python语言这种解释型的、通用的高级编程语言[20],来设计阅读器的流图,用来连接各个信号处理模块。之后对设计完成的RFID阅读器进行仿真信号测试和整体测试。最后分析了RFID防碰撞算法,证明了在动态帧时隙ALOHA算法中最优帧长的确定方式,并提出了一种改进的标签估值算法,并使用软件无线电定义了新的阅读器命令将该算法应用到了阅读器中。

  1.3.2论文的结构安排

  根据研究内容将论文分为六个章节,论文的总体结构为:

  第一章为绪论部分,主要阐述了本文课题的研究背景及研究意义,并介绍和分析了射频识别技术和软件无线电的发展过程及研究现状。归纳总结出使用软件无线电定义RFID阅读的实际的意义。

  第二章主要介绍了UHF RFID系统和相应的空中接口标准,首先对射频识别技术做了介绍,包括其系统组成、工作原理和工作频段。接着介绍了RFID三大标准体系,并对ISO/IEC 18000-6 Type C标准进行了具体分析,主要分析了其物理层的编码和调制方式以及标签识别层的标签阅读器通信过程。

  第三章为软件无线电实现RFID阅读器的设计思路和设计过程,首先介绍了软件无线电的定义,接着分析了GNURadio开放式软件无线电平台的结构和开发方式。之后使用C++设计RFID阅读器信号处理模块,使用Python设计RFID阅读器的流图。利用Swing当作粘合剂使Python能调用C++编写的信号处理模块,从而实现基于软件无线电的RFID阅读器的软件系统。

  第四章为阅读器联调与测试,根据上一章设计的开放式软件无线电平台下的各个信号处理模块进行测试。先在计算机上使用电子标签的仿真信号对软件进行仿真测试,分析每个模块的输出是否正确。之后将硬件平台和计算机连接进行完整系统的联调,通过示波器观察阅读器和电子标签的信号。最后通过修改代码中的频率参数来改变阅读器工作频率,并用频谱仪进行验证。

  第五章为RFID防碰撞算法的分析和改进,首先分析了目前运用最广泛防碰撞算法ALOHA算法和基于ALOHA算法的其它算法。接着分析了动态帧时隙ALOHA算法中RFID系统达到最大吞吐率时的帧长最优选择方式,并提出了一种改进的标签估值算法。最后为了将改进的算法应用到阅读器中定义了新的阅读器命令。

  第六章为总结与展望。总结了本文已做的研究工作,并说明了本文所实现的RFID阅读器所存在的不足与问题,并提出了一些可行的解决计划和方案。展望了未来的研究方向。

  第2章UHF RFID系统及标准分析

  2.1 RFID系统组成与频段分析

  2.1.1 RFID系统组成结构

  射频识别(Radio Frequency Identification,RFID)技术是一种新兴的非接触式自动识别技术,目前在交通运输、身份识别、物流行业、防伪与公共安全等领域被广泛的应用[21]。

  射频识别最基本的系统由两个部分组成,分别是电子标签(E-Tag)和射频阅读器(Reader)。其中电子标签主要由四个模块组成,分别是存储器、控制模块、射频模块、天线。阅读器则主要由五个模块组成,分别是时钟、电源、读写模块、射频模块、天线。图2.1展示了射频识别系统的主要结构:

  图2.1射频识别系统的结构框图

  射频识别技术主要是基于射频阅读器与射频电子标签之间数据和能量等信息之间的交换技术[22]。从图2.1所示的射频识别系统结构可知,射频阅读器和射频电子标签之间的通信包括能量的传递、时钟信号的获取以及数据的交互。射频电子标签通过射频场获取能量,射频阅读器将时钟信号传输给电子标签,电子标签响应射频阅读器的命令,将数据通过射频电子标签的射频模块返回给射频阅读器,或接收来自射频模块的数据输入,把数据存储在射频电子标签的存储器。

  完整的无线射频识别系统由射频电子标签、射频阅读器结合其他组件组成,如计算机、网络、无线设备、后端数据库和软件系统[23],如图2.2所示。所有这些组件、射频电子标签以及射频阅读器共同工作,组成一个功能更加完善的、体系更大的、完整的无线射频识别系统解决方案。对于无源电子标签来说,工作原理是射频阅读器向电子标签发射某个频率的无线电波能量,用于给电子标签电路提供能量并将其内部数据发射出来,阅读器接收电子标签返回的无线电波并对其进行解析,输送给应用程序进行下一步的处理。

  图2.2射频识别系统的组成部件

  射频电子标签或应答器是射频识别系统的核心部分,其主要作用是存储电子标签身份信息和数据,并向射频阅读器返回无线电信号实现通信。在某些情况下射频电子标签会被设计为具有自毁能力,在电子标签检测到不安全时进行自毁,提高了射频识别系统的安全性[24]。

  射频电子标签由集成电路以及附有天线的微芯片组成,存储了目标对象的唯一信息。目前的电子标签种类多样,有注入待识别物体内部的也有固定在待识别物体表面的。射频阅读器可以通过非接触方式读写电子标签的信息,射频电子标签和射频阅读器之间是以无线方式进行通信的。射频电子标签的集成电路提供一系列的功能,如提供多个电子标签检测基本的逻辑、内存中数据存储和数据调制等。

  射频阅读器是整个射频识别系统中重要的组成部分之一,阅读器性能直接影响了射频识别系统的准确性和识别效率,在射频识别系统中有着至关重要的作用。

  在完整的射频识别系统中,射频阅读器连通了射频电子标签和应用系统,完成无线电信号的解析工作并把解析结果发送到应用系统。射频阅读器利用射频技术读取射频电子标签的数据和写入数据到射频电子标签,承担向射频电子标签传输命令及读写数据的任务。射频阅读器可把应用系统的命令和数据经过数据加密后发射到射频电子标签,电子标签可以相应命令和存储数据。射频电子标签响应命令之后会向阅读器返回无线电信号,这些信号会被阅读器接收进行解析之后送到应用系统,之后通过网络系统或者计算机进行处理[25]。

  2.1.2 RFID工作频段

  一个射频识别系统的工作频率直接影响其读取范围和应用领域。图2.4显示了商用射频识别系统分配的6个主要的频段,分别为125-134KHz、13.56MHz、433MHz、868M~928MHz(即UHF)、2.5GHz以及5.8GHz,每一种频率都有它的特点,被用在不同的领域。

  图2.3 RFID系统使用的频段

  低频频段覆盖了从125~134 kHz的射频频谱,提供了良好的可穿透性能,可穿透包括人体或各种墙壁和障碍物。低频射频电子标签在各种导电和绝缘材料中,如金属、土壤和水等环境中表现良好,具有一定优势。因此,低频电子标签很适用于人类和动物跟踪以及汽车工业。

  高频射频识别系统用于在中等数据速率(接近Kbps数量级)和短读写范围内使用。在该频段的感应器不再需要线圈进行绕制,可以通过腐蚀活着印刷的方式制作天线[26]。被动高频射频识别系统可有效用于智能忙、短距离物品跟踪等。在存在水和金属的环境中,相对于低频射频电子标签其性能较差,但相对于更高频率的射频电子标签,如超高频和微波射频电子标签,其性能较好。高频射频电子标签比低频射频电子标签拥有更大的内存和更快的通信速度,这使得它们可以检测多个射频电子标签。此外,与低频射频电子标签相比,高频射频电子标签具有更短的波长,因此,高频射频电子标签有更小、更便宜的天线。类似于低频射频电子标签,高频射频电子标签也是采用电感耦合与射频阅读器交互信息。

  特高频射频电子标签工作在UHF波段(868~928 MHz)电子标签到阅读器之间的通信使用反向散射技术,即射频电子标签反射从射频阅读器接收到的电磁信号。特高频射频电子标签提供更大范围(一般为3~10。范围内)和更高的读取速度。与低频和高频系统相比,特高频能同步检测更多数量的射频电子标签,且仅需要较小尺寸的天线[27]。然而,读写性能在金属和液体表面显着恶化,且特高频射频电子标签成本高于低频和高频射频电子标签。

  特高频这一频段在世界各国的频率规划各不相同,所以目前应用于这一频段的RFID设备的应用频率存在一定差异[28]。导致特高频射频识别系统难以在世界范围内操作。另外,这些电子标签的工作频率落在拥挤的未经授权的ISM(工业、科学、医疗)频段内,使得特高频射频电子标签容易受到各种各样电磁信号的干扰。特高频电子标签通常用于供应链和资产管理应用。在特高频,场强的减少仅与距离的一次方有关,因此特高频更适合远距离操作的无线能量的传输。而且,反向散射原理提供了一条可靠的通信链路。

  微波频段标签具有标签信号强、定位精确、可被读取距离远、通讯速度快、可储存信息多等优点[29]。通常用于高速公路收费等应用。射频识别系统在这个频段是昂贵的,且要求直线视距传播。原因是这种高频率非视距信号会从传播效果上遭受更多干扰,如多路干涉和信号衍射。此外射频电子标签不能穿透许多材料,在临近金属和水时读写性能受到很大影响。表2.1总结了各个典型RFID工作频率下系统的性能情况。

  表2.1典型频率RFID系统的性能总结

  频率优势劣势典型应用低频

  (125-134kHz)液体和金属对信号衰减小读写范围有限、读写速度低、天线较大、产品代价高门禁控制、动物身份标识高频

  (13.56MHz)健壮性好、产品消耗低、数据存储大读写范围有限小范围存储管理特高频(868-928MHz)读取距离远通用性不强、电子标签和阅读器设计没有统一标准智能卡、供应链管理微波

  (2.4-5.8GHz)波长范围广容易受到信号干扰、信号传播问题仓库控制、运输量控制2.2 UHF RFID三大标准体系

  随着射频识别技术在全球范围的迅速发展,许多国家和相关国际组织都在积极推进射频识别技术标准的制定。但遗憾的是,到目前为止各个国家和国际组织还未制定出一个全球统一的RFID标准体系。目前主流的RFID相关标准有ISO/IEC射频识别技术标准、欧美的EPC(Electronic Product Code)射频识别技术标准和日本的UID(Ubiquitous ID)射频识别技术标准。

  2.2.1 ISO/IEC射频识别技术标准

  ISO/IEC是信息技术方面最具权威的标准化组织之一。是国际标准化组织(ISO)和国际电工委员会(IEC)联合组建的第一个标准化技术委员会,承担了制定信息技术方面国际标准的职责,这其中就包括制定了有关射频识别系统的各项标准定。该组织对射频识别系统的各个应用领域都进行了详细的规范,分别由下属的各专业委分别制定不同应用领域的标准。如应用在运输行业集装箱识别与定位的ISOTC104SC4标准,应用在动物身份识别和种群管理的ISOTC23SC19标准,在物流行业的供应链系统中有重要应用的由ISOTC122和ISOTC104共同定义的联合标准。

  负责射频识别技术标准制定的子委员会SC31制定了多个方面的标准,解决了多种电子标签和多种空中接口的需求,为射频识别系统制定了一套统一的信息交换规范。使用最广泛的空中接口标准是ISO/IEC18000系列,其制定、旨在提供符合全球无线频谱规范要求的RFID读写器与电子标签交互协议[30];其中ISO/IEC 18000-6由三种不同的无源电子标签空中接口协议组成,包括了Type A、Type B和Type C。标准中定义了超过10米的最远通信距离。Type C标准是对前两个标准的优势和缺陷进行总结后经过各项改进和研究规定的标准,相比于前两种标准在识别速度、读写速度、数据容量、防碰撞、安全保密、抗干扰能力方面有了很大提升[31]。ISO/IEC 18000-6 Type A/B/C三种标准和EPC Global Class 1 Gen2标准进行比较,如表2.2所示:

  表2.2 ISO/IEC 18000-6三种标准和EPC C1G2的主要区别

  标准类型ISO/IEC 18000-6EPC C1G2Type AType BType C工作频段860~960MHz860~960MHz860~960MHz860~960MHzR=>T数据速率33Kb/s10Kb/s或40Kb/s26.7Kb/s~

  128Kb/s26.7Kb/s~

  128Kb/s调制方式ASKASKDSB-ASK

  SSB-ASK

  PR-ASKDSB-ASK

  SSB-ASK

  PR-ASK编码方式PIEManchesterPIEPIET=>R数据速率40Kb/s40Kb/s40Kb/s~60Kb/s40Kb/s~60Kb/s调制方式反向散射反向散射反向散射反向散射编码方式FM0FM0FM0、MillerFM0、Miller通信方式半双工半双工半双工半双工防碰撞算法ALOHA二进制树Slotted

  ALOHASlotted

  ALOHA2.2.2 EPCglobal射频识别技术标准

  EPCglobal是由美国统一代码委员会(Uniform Code Council,UCC)和国际物品编码协会(EAN International,EAN)共同组建的非盈利性组织全球最大的零售商沃尔玛连锁集团和英国Tesco等多家美国和欧洲的流通企业都是EPCglobal的成员[32],其目的为了制定一套开放的、全球性的、透明化的RFID标准体系。和ISO/IEC更加注重RFID标准在各个领域的通用性相比,EPCglobal标准体系更加注重于服务物流行业的供应链系统。EPCglobal致力于解决供应链系统中透明性和追踪性问题,供应链中的透明性和追踪性是指与物品相关的所有个人和团体都能够准确获得物品的实时信息,如位置、生产日期等。

  EPCglobal专注于服务供应链,制定了可以实现为所有物品提供唯一标识的EPC编码标准,同时和ISO/IEC标准体系类似,制定了射频阅读器协议以及空中接口协议。对于空中接口协议的制定,EPCglobal的设计思路是尽量与ISO/IEC标准体系兼容,和ISO/IEC标准体系不同的是,EPCglobal空中接口协议主要关注的频段是特高频。除了对电子标签信息的读取之外,EPCglobal也致力于解决供应链中各个环节人员和组织的信息共享问题。从信息的发布、信息服务、信息资源管理和大量访问之间的协调等方面制定了详细的规范,包括EPC中间件规范、对象名解析服务、物理标记语言[33]。

  EPCglobal标准体系是一个开放性、全球性的应用型大体系,涉及了十多个类型的标准制定,这些标准分别是射频电子标签数据标准、射频阅读器协议、射频阅读器管理协议、空中接口标准、数据传输协议、电子产品代码信息服务协议、应用水平事件标准、安全规范标准、网络架构标准、ONS应用层接口标准以及EPC信息接口标准。

  2.2.3 UID射频识别技术标准

  日本泛在中心(UID Center)也制定了自己的RFID标准体系,泛在中心致力于制定一个完整的标准体系,UID RFID相关标准的设计理念和EPCglobal标准体系十分相似,但是在编码方式、空中接口规范这些具体内容存在一定差异[34]。

  泛在中心创新性的提出了使用Ucode编码方式作为射频识别系统中的编码规范。Ucode编码体系具有很好的兼容性,不仅与日本原有的编码体系可以兼容使用,而且可以和其他国际主流的编码体系兼容。泛在中心不仅积极的参加了ISO/IEC标准中空中接口相关标准的制定工作,还在自己的RFID标准体系中做到了与ISO/IEC标准兼容。由于有日本泛在网络的支持,在信息共享方面UID标准体系可以不使用传统的因特网[35]。

  泛在网络与EPCglobal的物联网还是有区别的。EPCglobal使用了业务链的模式,向个人和组织提供信息,十分注重物品与互联网的连通。UID使用扁平式信息获取和分析方式,注重与获取信息的过程和分析信息过程,更加突出无线电前端的集成化和微型化。

  2.3 ISO/IEC 18000-6 Type C标准

  本文所讨论的RFID系统是基于ISO/IEC 18000-6 Type C标准的,所以在设计该标准下的RFID阅读器之前我们首先需要对标准进行分析,按照标准规定的编码和调制方式来设计RFID阅读器。

  2.3.1物理层

  根据ISO/IEC 18000-6 Type C标准规定,阅读器向电子标签发送命令的信号可以使用的载波调制方式主要有三种,分别是单边带幅移键控(SSB-ASK)、双边带幅移键控(DSB-ASK)和反向幅移键控(PR-ASK)[36]。阅读器到电子标签的编码则采用脉冲宽度编码(PIE)。阅读器发送的命令首先经过PIE编码的方式进行编码,之后通过阅读器调制后发送给电子标签。电子标签可以从阅读器发射的无线电波中获得能量,并对接收到的命令进行响应。电子标签返回给阅读器的信号使用的调制方式是相移键控(PSK),可以使用的编码方式有两种,分别是双向间隔码(FM0)或者米勒码(Miller)。下文将会对阅读器和电子标签之间信号的调制方式和编码方式进行详尽的分析。从通信方式来看,阅读器和电子标签采用的是半双工的通信方式,电子标签不需要在返回信号的同时对阅读器发射的信号信息解调和响应[37]。全双工的通信方式不适用与该标准下的RFID系统。

  2.3.2标签识别层

  电子标签识别层主要针对阅读器和电子标签的通信过程进行了规定。对于阅读器,标准规范了其发送的各种操作命令的组成形式和发送顺序。对于电子标签,标准主要规范了其对阅读器发出的命令进行响应的行为以及自身状态的转变顺序。在阅读器和电子标签的通信过程中,最主要的操作过程有电子标签的选择过程,盘存过程以及电子标签访问过程。这三个过程可以被看作RFID系统数据链路层中最基本的操作,只有这三个过程都能正常工作阅读器才能完成对电子标签的识别和信息读取工作。电子标签识别层中阅读器和电子标签群通信的主要操作命令和电子标签的主要状态如图2.4所示:

  图2.4阅读器操作命令及电子标签状态

  阅读器和电子标签群进行通信的操作命令一般来说有三个,分别是电子标签选择操作、盘存操作和访问操作。阅读器发送选择操作命令的目的是为了给盘存操作和访问操作选取一定数量的电子标签作为目标电子标签群,之后的操作都是在这些被选定的电子标签群上完成的。在盘存操作之前,阅读器首先发送一个或者多个的选择命令来选取一定数量的电子标签作为目标电子标签群。选择操作过程和从数据库获取多条满足条件的记录十分相似。只有选取满足条件的电子标签群,之后的盘存操作和访问操作才能继续进行。

  阅读器首先发送出四个Session中任意一个的查询(Query)命令,查询命令是一个盘存过程开始的标志。由选择操作选取的电子标签群中的电子标签都可以对查询命令进行响应,当电子标签内的时隙计数器为零时会生成一个随机的RN16作为返回给阅读器的信息。阅读器接收到电子标签返回的RN16,并根据这个值发送一个ACK命令,这个命令要求返回这个RN16的电子标签再次返回其PC、EPC和CRC-16。阅读器收到电子标签返回的信息后继续发送一个Rep_RN命令,这个命令要求电子标签返回一个与之前不同的新RN16,这个RN16将作为handle在接下来的通信过程中使用。同一个盘存过程是在一个Session中完成的[38]。

  访问操作是阅读器与一个电子标签进行数据交互的过程,包括了阅读器向电子标签写入数据,电子标签向阅读器发送数据。进行访问操作的电子标签在操作之前都必须经过选择操作和盘存操作进行选定。访问操作也不是由单一命令完成的,阅读器需要发送一系列的命令来完成访问操作过程。

  2.4本章小结

  本章首先全面的介绍了RFID技术,包括RFID系统的完整组成、射频电子标签和射频阅读器。接着分析了现有RFID各个工作频段的特点和优劣势,对各个频段RFID系统的应用做了简单概括。之后介绍了三大标准体系并针对ISO/IEC 18000-6 Type C标准进行了分析,分析了标准中物理层的信号编码和调制方式以及标签识别层中阅读器和电子标签具体通信过程。

  第3章RFID阅读器的软件无线电设计

  3.1软件无线电结构

  对于软件无线电这个术语有多种定义。我们用一种最简单方式来描述,软件无线电是一种在统一的可编程硬件平台上运行软件代码,来实现硬件平台使用不同的工作频率和通信协议进行无线电的接收和发送,提供了一种建立多模式、多频段、多功能无线设备的有效而且相当经济的解决方案[39-40]。

  当需要具体实现软件无线电时,我们可以根据定义出发来分析。根据我们的简单定义可知软件无线电首先需要一个硬件平台,在本文的设计中硬件平台是由另一位同学完成的。有了硬件平台我们就需要软件代码,本文的软件代码部分主要由我来完成,我GNURadio开放式软件无线电平台下进行软件代码的设计,运行软件使用计算机处理器进行硬件接收到的信号的处理工作,之后再将处理完成的信号传输到硬件平台进行发射。把更多的硬件实现的无线电功能转移到软件端,使用软件来实现。软件无线电的基本工作过程如图3.1所示:

  图3.1软件无线电基本工作过程

  图3.1表示软件无线电基本工作过程。我们首先需要对相关的硬件有一定的了解,才能真正理解软件无线电工作过程[41]。可以看到图中的工作过程分为两个部分,分别是接收部分和发射部分。因为接收和发射相当于是一个镜像的过程,所有我们只要对其中一个部分进行分析就能了解另一部分了。拿接收端举例说明,在图中我们看到首先是一个RF前端对无线电信号进行了接收。接着RF前端收到的信号会进入一个ADC转换器,它可以把模拟信号转换为数字信号。最终数字信号会进入我们的软件代码部分进行处理。这就是一个软件无线电接收端的基本工作过程,而发射端相当于把这些过程调换顺序。

  3.2 GNURadio软件平台

  GNURadio开放式软件无线电平台,最早是由无线电工程师EricBlossom开发。是一个免费的、开源的、可以构建和使用软件无线电平台的软件工具包。GNURadio开发的目的就是为了给广大软件无线电研究者提供一个方便灵活的开发平台,将软件思想带到硬件领域[42]。

  GNURadio相比于传统的无线电系统,最大的优势是完全开源和可重配置,这就好比是目前的Android系统相比于IOS系统的优势。因为GNURadio完全的开源,吸引了大量来自全球各地的软件无线用户,包括学生、大学教师、无线工程师以及业余无线电爱好者。GNURadio的出现大大推动了软件无线电技术的发展,可以说是软件无线电必不可少的工具[43]。

  GNURadio为了提升开发的效率,提供了便于操作的图形界面和许多不同功能的内置信号处理模块,比如调制解调模块、滤波器模块、FFT变换模块、时频同步模块等等。当然开发者已经想到了要提示平台的灵活性,提供了给用户可以扩充信号处理模块的方式。用户们可以根据自己的需求编写需要的信号处理模块,之后将模块很方便的添加到工具包中进行使用,实现内置信号处理模块中不包含的功能。GNURadio把信号处理的工作交给PC机,用户只需外加一个通用的射频硬件前端就能够自己搭建一个软件无线电研究和应用平台。目前,主要的硬件平台有USRP、BladeRF、HackRF、RTLSDR等,本文中的硬件平台由另一位同学完成,基本原理就是基于HackRF平台完成的。

  3.2.1 GNURadio软件平台结构

  GNURadio软件平台可以分为python流图、SWING和C++信号处理模块。硬件层则是通过USB连接通用硬件平台来实现通信。完整的GNURadio平台结构如图3.2所示。

  图3.2 GNURadio平台结构图

  GNURadio的编程基于Python脚本语言和C++的混合方式。因为C++具有较高的数字处理效率和运行速度,所以在需要高速运算的信号处理模块中我们就是使用C++来进行编写的[44],这种信号处理模块在GNURadio中被称为block。Gnuradio自带了一个block库,包含了许多使用频率较高的模块,例如滤波器、FFT变换、调制解调器、信道编译码模块等[45],下面列举了一些常用的block见表3.1。

  表3.1 Gnuradio常用block

  信源正弦信源gr.sig_source_X简单运算添加常量gr.add_const_XX文件信源gr.file_source乘法器gr.multiply_XX噪声源gr.noise_source_X加法器gr.add_XXUSRP信源usrp.source_c[s]log对数gr.nlog10_ff信宿矢量信宿gr.vector_sink_X类型转换复数类型转换gr.complex_to_float音频信宿gr.audio_sinkgr.complex_to_realUSRP信宿usrp.sink_c[s]浮点类型转换gr.float_to_complex滤波器FIR抽取滤波器gr.fir_filter_cccgr.float_to_shortFIR设计器gr.firdes其它数控震荡器gr.fxpt_ncoIIR滤波器gr.iir_filter_ffd数字传输gr.simple_framer延时组合滤波器gr.filter_delay_fcFFTgr.fft_vccPython是一种近几年来十分流行的脚本语言,它是一种完全面向对象的编程语言,有着无需编译和语法简单的有点。因此我们用Python来编写连接信号处理模块的流图,流图就是一个用来调用不同block使之成为一个完成流程的脚本,GNURadio中称其为flow graph。一个标准的流图由三种block组成,分别是信源模块、信宿模块和一般信号处理模块,这三部分组成了GNURadio的流图机制。

  当我们想要使用block时,需要把它和其他的block连接起来形成一个完整的流图。经过上文的分析我们知道block是用C++编写的,而flow graph是用Python编写的,两种不同语言编写的程序不能直接进行连通,我们需要一种统一的接口来完成两种程序间的相互通信和调用。SWIG(Simplified Wrapper and Interfece Generator)正是我们需要的,它是由GNURadio定义的,中文全称是简化封装和接口生成器,它可以作为粘合剂把用C++编写的block模块与Python编写的流图连接起来,这样Python编写的流图就可以直接调用block模块构成完整的软件无线电系统[46]。

  3.2.2 GNURadio软件的安装

  GNURadio目前主流的运行系统是Linux,当然它也可移植到其他系统上。但是就目前来说,GNURadio和其它系统并不能完美兼容,运行时常常会发生一些难以解决的麻烦。所以在本课题中,我所采用的就是在Linux系统上安装GNURadio。所用的linux系统版本是Ubuntul4.04,安装的GNURadio版本是GNURadio3.7.10。

  本文使用的计算机系统是windows,同时采用了虚拟机来运行Ubuntu14.04。首先安装了VMware Workstation作为虚拟机,接着下载了Ubuntu14.04系统的镜像文件用于在虚拟机中进行安装。当安装完Ubuntu14.04系统之后,开始安装GNURadio,GNURadio的安装方法有许多,主流的方式有手动编译安装和脚本安装。脚本安装是GNURadio的开发者为了让用户更加方便的进行环境配置、依赖库安装和软件安装而编写的一个脚本,它将GNURadio的软件包依赖库、驱动安装、设置环境变量整合为一个命令,用户只需要在终端输入这个命令运行脚本,就可以完全自动化的完成安装。但我在实际安装过程中,由于要连接国外网站导致下载十分缓慢,在进行编译之前就要花费大量的时间。而且即使完成了下载,在编译过程中很容易出现难以解决的问题,所有我使用的是手动编译安装,主要安装过程如下:

  更新软件源

  sudo apt-get update

  (2)安装依赖包

  sudo apt-get-y install git swig cmake doxygen build-essential libboost-all-dev libtool libusb-1.0-0 libusb-1.0-0-dev libudev-dev libncurses5-dev libfftw3-bin libfftw3-dev libfftw3-doc libcppunit-1.13-0 libcppunit-dev libcppunit-doc ncurses-bin cpufrequtils python-numpy python-numpy-doc python-numpy-dbg python-scipy python-docutils qt4-bin-dbg qt4-default qt4-doc libqt4-dev libqt4-dev-bin python-qt4 python-qt4-dbg python-qt4-dev python-qt4-doc python-qt4-doc libfftw3-bin libfftw3-dev libfftw3-doc ncurses-bin libncurses5 libncurses5-dev libncurses5-dbg libfontconfig1-dev libxrender-dev libpulse-dev swig g++automake autoconf libtool python-dev libfftw3-dev libcppunit-dev libboost-all-dev libusb-dev libusb-1.0-0-dev fort77 libsdl1.2-dev python-wxgtk2.8 git-core libqt4-dev python-numpy ccache python-opengl libgsl0-dev python-cheetah python-mako python-lxml doxygen qt4-default qt4-dev-tools libusb-1.0-0-dev libqwt5-qt4-dev libqwtplot3d-qt4-dev pyqt4-dev-tools python-qwt5-qt4 cmake git-core wget libxi-dev gtk2-engines-pixbuf r-base-dev python-tk liborc-0.4-0 liborc-0.4-dev libasound2-dev python-gtk2 libzmq1 libzmq-dev python-requests python-sphinx libcomedi-dev

  获取UHD和GNURadio源码

  我们直接进入官网下载安装包,进入http://files.ettus.com/binaries/uhd_stable/src/下载UHD源码,进入http://gnuradio.org/下载GNURadio源码。

  安装UHD和GNURadio

  进入下载完成的源码所在的文件进行编译,命令如下mkdir build、cd build、cmake../、make、sudo make install、sudo ldconfig。整个编译过程需要的时间比较多,大约需要2个小时。

  验证GNURadio安装是否成功

  编译完成后在终端输入编译完成后在终端输入命令:sudo gnuradio-compagin,可打开GNURadio的图形化界面,如图3.3所示:

  图3.3 GNURadio图形化界面

  3.3软件无线电设计RFID阅读器

  3.3.1阅读器设计整体思路

  上文已经安装了GNURadio软件无线电通用平台,下面使用GNURadio实现RFID阅读器。文本设计的主要目标是利用开放式软件无线电平台设计一个简单的RFID阅读器,该阅读器可以实现RFID系统空中接口标准中的盘存过程。GNURadio采用模块化的设计模式,所以我根据标准中定义的盘存过程,分别设计多个信号处理模块用于模拟盘存操作,之后设计流图将信号处理模块连接。用软件系统来定义完整的电子标签数据信息解码过程和阅读器指令发送过程,定义的主要命令是ISO/IEC 18000-6 Type C标准里盘存过程要发送Query命令、ACK命令和QueryRep命令,并使用仿真模拟信号对设计软件代码进行测试。

  3.3.2主要程序组成和功能

  根据GNURadio的开发过程,需要设计信号处理模块和流图。本文主要设计了三个信号处理模块和一个GNURadio流图用来实现阅读器的盘存过程,三个信号处理模块分别命名为Reader、Tag_decoder和Gate,GNURadio流图命名为Reader。表3.2为主要程序名称、关键函数和对应的实现功能。

  表3.2主要代码块介绍

  程序主要函数功能Gate_imple.ccgeneral_work(int noutput_items,gr_vector_int&ninput_items,gr_vector_const_void_star&input_items,gr_vector_void_star&output_items)过滤阅读器接收到的信号Tag_decoder_imple.cctag_detection_RN16(std::vector&RN16_samples_complex)对电子标签返回信号进行解码tag_detection_EPC(std::vector&EPC_samples_complex,int index)check_crc(char*bits,int num_bits)Reader_imple.ccgen_ack_bits(const float*in)产生阅读器发射的命令gen_query_bits()crc_append(std::vector&q)Reader.pyu_source(self)初始化设备参数

  信号处理模块连接u_sink(self)__init__(self)3.4阅读器信号处理模块设计

  3.4.1 Gate模块设计

  当RFID阅读器进行信号接收的过程中,除了接收到电子标签返回的信号肯定也会接收到自身发送给电子标签的信号。如果接收端同时处理接收到的两种信号,肯定会导致整个系统的性能下降和解码难度提升。为了解决这个问题,我们了解到阅读器发送给电子标签的信号和电子标签返回个阅读器的信号是有时序上的间隔的,我们根据接受到的两种信号的时序间隔进行过滤,就可以将接受到的信号中的由自身发送的信号进行滤除,只留下电子标签返回的信号。

  信号先经过硬件的射频段和高速处理段变成中频I/Q信号进入软件处理层。在软件处理层,信号首先进入一个内置的抽取滤波器模块使信号的采样频率下降为低频信号。经过这一系列的降频后,信号才会进入Gate模块。这时的信号在软件端是以复数形式存储的,进入一个模块的输入输出则是根据GNURadion模块规范完成的。Gate信号处理模块内的主要函数如图3.4所示:

  图3.4信号处理模块的主要函数

  每一个block中都有一个general_work方法,该方法是所有block内定义的方法中最重要的一个。它的作用其实很容易说明,就是把从接收端接收到的信号进行一系列处理后发送到输出端。分析一个方法我们首先要分析他的参数。general_work方法的前两个参数noutput_items和ninput_items分别表示该信号处理模块输出信号和输入信号的数量。RNURadio规定一个block可以有多个输出信号和输入信号。后面两个参数input_items和output_items则分别表示指向输入流和输出流的指针,每个输入流和输出流都有一个指向它的指针。在编码过程中我们可以使用输入流指针来接收输入信号,经过一系列处理后再在通过输出流指针将信号输出。

  Gate模块软件设计的核心是确定所需要信号的长度和位置,并在接收端收到的信号中根据确定的信号长度和位置选取需要的信号将其写入到输出端。代码首先进行初始化,确定工作模式。通过设定的模拟转数字频率计算出数据位的长度以及EPC和RN16两种工作状态下需要的数据位信息。之后需要进行判断Gate模块目前的工作模式是EPC还是RN16,根据判断结果选择不同的数据位信息。之后判断整个阅读器的工作状态位,如果不是运行状态,说明目前阅读器不工作则Gate模块结束,如果是运行状态,程序进入主循环开始进行数据筛选。主循环首先判断Gate是否为“开”,“开”表示当前数据位是我们需要的数据,需要通过Gate模块进入下一个信号处理模块进行继续处理。如果Gate为“关”状态,则当前数据位不需要进入下一模块。当Gate为“开”时,我们首先把信号数据从模块输入端写到模块输出端,之后模块位进行加一操作,相当于一个在信号数据上的指针向后移动一个位置。之后进行判断改变后的数据位是否在之前确定的EPC或者RN16工作模式下所需要进行处理的数据位范围内,如果依然在要处理的数据位范围内则不做处理进行下一次循环判定。如果目前的数据位已经超出要处理的数据位范围,在进行循环判定之前先把Gate模块的状态设置为“关”。这样Gate模块就实现了过滤无用信号的功能,经过Gate模块后的信号就是我们需要进行解码处理的信号。图3.5为Gate模块软件设计的流程图。

  图3.5 Gate模块软件设计流程图

  3.4.2 Tag_decoder模块设计

  Tag_decoder模块是电子标签信号解码模块,该模块主要对电子标签信息进行了解码。根据协议我们按照FM0编码方式进行解码,而根据阅读器工作状态又将解码过程分为RN16和EPC两种模式。经过Tag_decoder模块之后的信号从复数类型变成了一个浮点类型的序列。

  Tag_decoder模块的实现和上文实现的Gate模块相比要复杂不少,除了GNURadio平台在block中规定的general_work函数用来处理输入输出之外,还定义了三个主要函数,一个是tag_detection_RN16,第二个是tag_detection_EPC,第三个是check_crc。前两个函数用不同的模式来对复数型的输入信号进行解码,解码的方式就是按照FM0编码的方式。解码完成后的信号就是一个浮点型的数据“0”和数据“1”的序列。tag_detection_RN16函数的码实现如下图3.6所示:

  图3.6 tag_detection_RN16函数实现

  tag_detection_RN16函数首先对输入信号进行了循环操作。因为用两个信号长度表示FM0编码的一个位窗,所以循环数j的最大取值小于一半的信号长度。之后对信号中同一个位窗的数据进行相减得出电平变化情况。由于FM0编码方式具有记忆性,所以FM0的解码结果需要根据前一次的信号传送形式来确定。所以我们定义一个prev变量保存FM0编码上一次的传送形式。最后根据电平跳变的情况和上一次传送形式两个方面确定最后的编码值。编码后的信号最终会存放在一个vector中,用push_back函数向该容器中添加数据。tag_detection_EPC函数的设计思路和实现过程和tag_detection_RN16函数类似,所以不再详细介绍。

  check_crc函数是为了完成CRC校验而编写的函数,采用了常见的CRC标准来设置参数,校验宽度为16,生成多项式为,余数初始值为0xFFFF,除数为0x1021,结果异或值为0x0000。算出CRC值后与数据末尾带的CRC值进行对比,如果CRC值相同则校验成功,计算CRC算法的主要步骤如下:(1)设置CRC寄存器,并给其赋值为“余数初始值”。(2)将数据的第一个8-bit字符与CRC寄存器进行异或,并把结果存入CRC寄存器。(3)CRC寄存器向右移一位,MSB补零,移出并检查LSB。(4)如果LSB为0,重复第三步;若LSB为1,CRC寄存器与0x31相异或。(5)重复第3与第4步直到8次移位全部完成。此时一个8-bit数据处理完毕。(6)重复第2至第5步直到所有数据全部处理完成。(7)最终CRC寄存器的内容与“结果异或值”进行或非操作后即为CRC值[47]。

  设计完三个主要函数之后可以开始Tag_decoder模块的整体设计了。整体的设计将在GNURadio的信号处理模块中最重要的general_work方法中进行,它控制着block模块的具体工作过程。下面具体介绍Tag_decoder模块运行过程。图3.7为Tag_decoder模块软件设计流程图:

  图3.7 Tag_decoder模块软件设计流程图

  首先进行初始化,包括电子标签bit位数、用于存放解码之前序列的容器和解码结果的容器等。初始化完成后首先进行判断当前解码器模块的工作状态是解码EPC还是解码RN16,并且选择使用相应的解码函数对输入信号进行解码。

  当使用RN16解码函数解码后需要先检测解码结果长度是否正确,如果正确则可以把RN16的解码结果写入输出端,发送到下一个模块进行ACK命令的创建,并把发送命令标志位设置为SEND_ACK。如果长度不不正确则判断当前时间间隔是否超过最大盘存周期的时间,根据判断结果分别把发送命令标志位设置为SEND_QUERY或SEND_QUERY_REP重新进行盘存操作。

  当使用EPC解码函数解码后需要先对解码结果进行CRC校验,如果CRC校验成功则把该目标电子标签作为选定电子标签,阅读器之后发送一个带有该电子标签的RN16的命令,电子标签收到后进入确认状态可以接收其他阅读器命令。如果CRC校验不成功,和RN16解码后的处理方式一样,也是判断当前时间间隔是否超过最大盘存周期的时间,根据判断结果分别把发送命令标志位设置为SEND_QUERY或SEND_QUERY_REP重新进行盘存操作。

  3.4.3 Reader模块设计

  Reader模块主要负责产生阅读器需要发射的命令,该模块发射命令的命令格式和长度都是根据ISO/IEC 18000-6 Type C规定的。根据协议分析我们已知一些发射命令需要根据解码信息来编写,所以该模块需要把解码模块的输出端作为输入端,按照当前的工作模式对解码后的信号进行分析,并使用PIE编码的方式拼接出对应的发射命令的序列。

  Reader模块设计的第一步需要设计拼接命令单元的初始化工作,我们首先确定存放命令信号的容器,Tag_decoder模块一样我们采用vector作为容器存放需要发射的命令。之后根据设置的数字转模拟采样频率和阅读器到电子标签Tari的值来确定一个PIE编码后的数据位的需要在vector容器中占用的长度。常用Tari参考值如下表3.3所示:

  表3.3常用Tari参考值

  Tari值Tari值容差频谱6.25µs+/–1%DSB-ASK

  SSB-ASK

  PR-ASK12.5µs+/–1%25µs+/–1%在本次课题的设计中我所采用的Tari值是25µs,使用较长的时间的Tari值可以在vector容器中用更长的数据长度表示一个PIE编码数据位,增加软件部分对信号处理的精度。确定完一个数据位的长度后先按照PIE编码的方式将数据“0”、数据“1”、RN16和EPC载波、分隔符、rtcal和trcal的序列拼接完成放入相应容器中备用。之后开始对可能发送的命令进行拼接,包括Query命令、ACK命令、QueryRep命令等。初始化关键代码如图3.8所示:

  图3.8 Reader模块初始化关键代码

  根据协议规定所有的阅读器到电子标签(R=>T)的命令都带有一个导引头或帧同步,图3.9显示了导引头和帧同步的编码形式。导引头会添加在一个Query命令之前,它是一个盘存过程开始的标志。所有其它命令之前需要添加帧同步。所有参数以Tari为单位的容差将在+/–1%内。阅读器设置RTcal等于一个数据“0”的长度与一个数据“1”的长度相加,delimiter长度为12.5µs,根据之前设定的Tari值为25µs可知delimiter长度就是二分之一的Tari。

  图3.9阅读器到电子标签的导引头和帧同步

  阅读器发射的用于发起盘存过程的Query指令中包含的导引头中的TRcal主要是用来指定电子标签返回信号的频率的。在本次设计中,我们设定TRcal长度为200µs。阅读器使用预先设定的TRcal值和分频比率来确定电子标签返回的信号频率。具体定义方法可以根据以下两个方程确定。签返回信号频率(LF),TRcal和DR之间的关系满足方程(3.1)的定义。电子标签使用接收到的命令中TRcal的长度来计算得到电子标签和阅读器的连接频率,并根据连接频率来调整T=>R的信号频率。阅读器在每一个盘存过程中使用的TRcal和RTcal都应满足方程(3.2)的约束[48]:

  (3.1)(3.2)根据协议我们可以发现帧同步恰好就是导引头减去一个TRcal。在同一个盘存过程中,阅读器发射的各个命令携带的帧同步使用的RTcal长度必须相同,因为RTcal的长度是在盘存过程开始时使用的导引头来确定的。Reader模块中拼接引头和帧同步的关键部分如下图3.10所示:

  图3.10导引头和帧同步拼接代码

  做完了以上编码工作之后,我们已经有了存放导引头和帧同步的容器,下一步可以开始拼接阅读器的命令了。我们首先拼接最简单的QueryRep命令,QueryRep命令的功能是对电子标签内的时隙计数器减一,当时隙计数器减到零时电子标签进入应答状态并返回一个RN16。表3.4显示了QueryRep命令的组成方式:

  表3.4 QueryRep命令的组成方式

  命令码节(Session)比特数22组成说明0000:S0

  01:S1

  10:S2

  11:S3根据表格我们发现QueryRep命令组成十分简单,所以我们可以直接把命令拼接出来。在general_work函数中直接写入到输出端。将1个帧同步和4个PIE编码的数据“0”拼接起来就是我们需要的QueryRep命令,拼接代码如下图3.11所示:

  图3.11 QueryRep命令拼接代码

  接下来开始拼接阅读器的Query命令。协议规定Query命令组成方式如表3.5所示。命令包括以下域:DR(Trcal除因子)设置T=>R链路频率。M表示每个符号的周期,设置T=>R数据速率,以及调制格式。TRext选择T=>R帧头是否加入引导信号。Sel选择哪些电子标签对Query响应。Session为这个盘存周期选择一个节。Target选择参与盘存周期电子标签的盘存标志是A还是B。作为已被识别的结果,电子标签可以改变它们的盘存标志从A到B或者从B到A。Q设置盘存周期的时隙数目。读写器应事先为Query插入导引头,CRC-5的计算覆盖从命令码的第一个比特到Q的最后一个比特。如果电子标签接收的Query带有错误CRC-5,它应不理会这个命令。

  表3.5 Query命令的组成方式

  命令码DRMTRextSelSessionTargetQCRC-5比特数412122145组成10000:DR=8

  1:DR=64/300:M=1

  01:M=2

  10:M=4

  11:M=80:No pilot tone

  1:Use pilot tone00:All

  01:All

  10:~SL

  11:SL00:S0

  01:S1

  10:S2

  11:S30:A

  1:B0–15电子标签接收到Query命令后,符合Sel和Target的电子标签从0到–1范围内选出一个随机数,并存入时隙计数器。当一个电子标签的时隙计数器的值为零时,电子标签进入应答状态并返回RN16[49];否则,电子标签应保持沉默。Query可以初始化一个新session或先前session的盘存周期。如果处于确认、开放或安全状态的电子标签接收到的Query命令中的session参数和先前session符合,电子标签会为这个session反转盘存标志(即A到B或B到A)。如果处于确认、开放或安全状态的电子标签接收到Query命令的session参数先前session不符合,电子标签会在之后开始的新一轮轮询时保持这个session的盘存标志不变。只要电子标签没有灭活,Query命令可以对处于任何状态的电子标签进行操作。

  按照协议的Query命令组成形式,我设计了一个gen_query_bits函数来拼接Query命令。函数首先依次将命令码、DR、M、TRext、Sel、Session、Target和Q添加到命名为query_bits的容器中,之后再调用crc_append函数在命令末尾添加一个CRC-5的校验码。gen_query_bits函数在Reader模块初始化过程中被调用,函数内拼接完的Query命令还没有添加导引头也没有使用PIE编码,这些工作都会在general_work函数内完成。gen_query_bits函数实现如下图3.12所示:

  图3.12 gen_query_bits函数实现

  接下来开始拼接阅读器的ACK命令。协议规定ACK命令组成方式如下表3.6所示。可以看到ACK命令的组成相对简单,只是由一个命令码和一个随机数组成。命令码是“01”,而随机数就是阅读器接收到电子标签返回的RN16。读写器向已确认的电子标签发送ACK。ACK是对电子标签回复的RN16的确认。

  表3.6 ACK命令的组成方式

  命令码随机数(RN)比特数216组成说明01回应接收到的RN16由于ACK命令需要把接收到的RN16再重新发送出去,所以该命令不能像Query命令和QueryRep命令那样在模块初始的时候就完成拼接,需要把ACK的拼接过程设计在模块的general_work函数内。我设计了一个gen_ack_bits函数用来拼接ACK命令,该函数用自身模块的输入端信息作为参数,也就是经过Tag_decoder模块解码后的信号。接着先把命令码“01”放进容器中,之后把输入的RN16也放进容器中。这样一个带有命令码和RN16的完整ACK命令就完成了。我们在general_work中调用这个函数,把输入端作为参数就可以输出完整的ACK命令码了。这个命令码还没有添加帧同步也没有经过PIE编码,这些工作和在完成Query命令时完成的工作相同,也是在general_work中完成的。gen_ack_bits函数实现如图3.13所示:

  图3.13 gen_ack_bits函数实现

  最后开始设计Reader模块中的general_work函数的实现。有了前面命令的拼接设计,这个函数的实现就变得相对简单。首先使用switch语句进行选择发送指令标志位,选择目前要发送的指令类型。确定发送指令类型后,根据不同的指令选择结果对Gate状态标志和decoder状态标志进行设置。之后将拼接完成的阅读器命令按照PIE编码的方式写入输出端。最后在输出端结尾加上所需的载波序列提供给电子标签返回信号使用。完整的Reader模块软件设计流程如图3.14所示:

  图3.14 Reader模块软件设计流程图

  3.5阅读器流图设计

  实现软件无线电系统的信号处理模块设计完成,最后需要完成工作是流图的设计。GNURadio流图可以通过两种方式完成,一种是使用图形化的GNURadio界面对各个信号处理模块进行连接,然后导出流图脚本。另外一种是自己使用Python语言编写流图脚本。本文所采用的方式是自己使用Python编写流图脚本,这种方式相比与用图形界面导出的方式生成流图来说难度有所提升,但是连接更加灵活,对信号处理模块属性的配置更加直观。

  RFID阅读器的流图设计主要分成了三个部分的,分别是u_source、u_sink和init。u_source和u_sink主要完成定义软件无线电的输入和输出端口,分别对应阅读器的接收和发射端口。根据GNURadio软件无线电平台规定,软件无线电的输入端和输出端可以是具体硬件平台,也可以是一个文件。在代码中我分别设计了两种输入输出方式,可以供模拟仿真调试和实际连接硬件两种情况分别使用。GNURadio软件无线平台的输入端和输出端也可以看作是一个信号处理模块,可以用于与其他信号处理模块连接。图3.15是阅读器流图中输入端和输出端的主要设计代码。

  图3.15流图输入输出主要代码

  定义完软件无线电的输入端和输出端之后开始设计流图的主体init函数。该函数在流图中的作用类似与Java中Main函数的作用,只要运行流图脚本,就会调用这个函数。在init函数中首先进行了阅读器各项参数的初始化,包括数模转换和模数转换的采样速率、信号采样因子、输出信号振幅、阅读器工作频率以及接收机和发射机的增益。这些参数可以在GNURadio各个信号模块中使用,包括我直接设计的输入输出端都需要使用这些参数带定义硬件的调制频率等参数。下一步定义需要使用到的信号处理模块,这其中不仅有我们自己定义的Gate模块、Tag_decoder模块和Reader模块,还有GNURadio软件平台自带的信号处理模块,包括抽取滤波器、乘法器和类型转换器模块。之后根据debug标志位确定程序是模拟仿真调试还是实际连接硬件的工作状态,debug的取值决定了使用文件作为输入输出端还是硬件平台作为输入输出端。使用connect函数将确定好的输入输出端和定义的信号处理模块连接,除了输入和输出端不同外,其余模块的连接方式在debug取不同值时都相同,连接方式如下图3.16所示:

  图3.16 RFID阅读器软件系统结构框图

  输入的信号首先通过一个内置的抽取滤波器模块使信号的采样频率进一步下降。之后经过Gate模块完成干扰信号的滤除,通过Gate模块后的信号就只剩下我们需要解码的电子标签返回信号了。接着通过Tag_decoder模块进行电子标签的解码工作,根据解码状态选择发送命令的类型,以及把解码内容发送给下一个Reader模块。Reader模块根据发送命令类型和接收到的解码信息进行命令的拼接,并将拼接好的命令发送到下一个模块。之后命令信息分别经过乘法器模块和类型转换器模块进行幅度调制和浮点类型转换为复数类型,最终输出到发射端。这样基于软件无线电的完整阅读器工作流程就完成了。下图3.17是阅读器流图部分的设计流程图。

  图3.17 RFID阅读器软件系统结构框图

  3.6本章小结

  本章主要介绍了使用软件无线电平台进行RFID阅读器的设计过程和方法。首先介绍了软件无线电定义和GNURadio软件平台的软件架构,之后对GNURadio软件平台的环境搭建和软件安装进行了详细说明。接着分别对Gate模块、Tag_decoder模块和Reader模块三个信号处理模块行了详细的设计说明并列出了关键代码和流程图。最后设计了GNURadio流图把各个信号处理模块进行连接,构成完整的RFID阅读器系统。从局部到整体的阐述了RFID阅读器的设计思路和方法。

  第4章RFID阅读器系统测试与分析

  本章主要是对上一章设计完成的软件无线电实现RFID阅读器的各个模块以及整体功能进行详细的测试与分析。测试的主要方法有软件仿真测试和连接通用硬件平台进行的整体测试。软件仿真测试不需要连接硬件,主要是对阅读器软件中的逻辑功能是否符合协议要求进行校验,对实验设备和仪器的要求不大,可以使用一台计算机完成,测试过程较为简单。而连接通用硬件平台进行的整体测试需要有专业的示波器和频谱仪辅助才能完成测试,测试过程较为复杂。

  4.1软件仿真测试

  4.1.1使用Octave仿真工具

  Octave是GNU项目下的一个开源软件,它实现了科学计算和数值分析等功能,而且可以把计算结果绘制成图像[50]。因为Octave的具有的功能和Matlab是重合的,所以它们之间有着一定的竞争关系。

  尽管和Matlab功能相近但它们之间也存在很多的不同,Octave和Matlab的主要区别有以下方面。从使用成本的角度来说,Octave是开源的并且完全免费,而使用Matlab是需要付费的,想要得到Matlab全部的功能需要花费不低的费用购买正版的软件。当然付费的Matlab意味着可以提供给使用者更加完善的服务。从占用空间来说,Octave是一个十分小巧的软件,整个安装程序通常不会超过一百兆。而Matlab却恰恰相反,由于要提供大量的辅助工具使Matlab可以胜任在各个领域下的使用,Matlab的完整安装程序十分庞大,大约有8G。当然你可以选择不安装完整的Matlab,然而即使是最基本的Matlab系统也要占用几百兆的空间。从绘图能力上来说,Octave和Matlab差距不大,甚至可以说有一点领先,依靠着强大的Gnuplot提供的绘图功能的支持Octave在输出格式和公式显示方面要比Matlab还要优秀。从图形界面来说,Octave和Matlab的差距还是比较大。Matlab经过这么多年的优化更新早已经形成了一个外观漂亮且功能强大的图形界面,而Octave早期并没有图形界面,交互方式是通过命令行实现的,4.0.0版本发布后才有了图形界面。在图形界面这方面Octave还需要继续优化和发展[51-53]。

  我们之所有使用Octave而不使用Matlab就是因为它小巧且画图功能强大。我们使用Octave主要就是使用画图功能,Octave强大的画图功能可以展示出信号在阅读器各个模块中的输出结果。直观的信号图方便我们进行分析,检测阅读器设计的的正确与否。Octave代码如下图4.1所示,先设定需要的输入文件路径,接着确定输入文件格式,之后分别处理文件信号的实部分和虚部分,接着设定横坐标和纵坐标的坐标轴文字和打开网格,最后使用plot函数进行图形绘制。使用时首先在终端输入ocatve进入octave操作的终端界面,之后根据路径找到我所编写的plot_test.m文件所在的文件夹,之后输入plot_test启动绘制代码进行图形绘制工作。

  图4.1使用Octave绘制信号图

  4.1.2仿真信号测试

  本文的仿真测试主要是使用一个电子标签和阅读器进行通信过程中的仿真信号作为阅读器系统的输入信号。接收到信号的阅读器会按照本文设计的工作流程进行工作,我们可以使用Octave绘制出阅读器中各个模块的输出结果,从信号图进行直观的分析。将信号图和ISO/IEC 18000-6 Type C协议要求进行比较,从而检测我们设计的阅读器的各个模块是否能正常工作以及是否符合协议规定。

  使用Octave绘制出的电子标签和阅读器通信仿真信号如下图4.2所示:

  图4.2电子标签和阅读器通信仿真信号

  可以清楚的看到图中信号共分为四个部分,四个部分从左到右依次是阅读器发送给电子标签的Query命令信号、电子标签返回给阅读器的RN16信号、阅读器发送给电子标签的ACK命令信号和电子标签返回给阅读器的EPC信号。

  输入仿真信号首先经过输入端模块进行了幅度增益,之后又经过抽取滤波器对采样频率进行下降。经过抽取滤波器的输出信号如图4.3所示:

  图4.3抽取滤波器输出信号

  信号从抽取滤波器输出后进入我们自己编写的Gate模块进行信号处理工作,在该模块对信号进行了滤除操作。经过该模块后信号中只剩下解码器模块需要解码的RN16信号和EPC信号。从Gate模块输出的信号如图4.4所示:

  图4.4 Gate模块输出信号

  经过Gate模块后的信号进入Tag_decoder模块进行解码处理,解码后的输出的“0”和“1”的序列如下图4.5所示,该序列输入到下一个Reader模块中使用,可以用于拼接需要发射的ACK命令。

  图4.5 Tag_decoder模块输出序列

  信号进过解码后变成了一个序列,序列中包含了电子标签返回的RN16和EPC等信息。将该序列输入到Reader模块中,我们只需要分析Reader模块的输出,看输出端是否按照PIE编码的方式正确的输出了要发送的命令。Reader模块输出如图4.6和图4.7所示:

  图4.6 Reader模块输出的Query命令

  图4.7 Reader模块输出的ACK命令

  试验截图可以清楚的看到Reader模块输出了一个Query命令之后又输出了ACK命令,这两个命令的连续输出正式一个阅读器完成盘存操作的过程。分析图4.6并且和协议进行对比可知其是一个Query命令,命令的起始部分是一个导引头,导引头后面是4位命令码“1000”,之后是Query命令各个域的信息。分析图4.7并且和协议进行对比可知其是一个ACK命令,命令的起始部分是一个帧同步,帧同步后是一个2位的命令码“01”,之后是一个16位的RN16。

  从Reader模块输出的命令之后经过乘法器模块和类型转换器模块,再进入输出模块写入文件或者写入通用硬件平台把命令发射取出。软件仿真测试的结果和我们设计的阅读器工作流程相同,阅读器发送命令也符合ISO/IEC 18000-6 Type C协议规定,下文开始进行连接通用硬件平台的整体测试。

  4.2连接硬件平台整体测试

  4.2.1测试环境搭建

  进行连接硬件的整体测试之前我们需要先完成测试平台的搭建。因为我们测试的是一个RFID阅读器,所以首先我们需要一个测试使用的无源电子标签。我们使用市面上传统的RFID阅读器对准备好的电子标签进行读取,测试电子标签是否能正常工作。只有电子标签能够正常工作我们才能进行下一步的测试工作。电子标签和传统RFID阅读器如图4.8所示:

  图4.8电子标签和传统RFID阅读器

  电子标签测试完成之后,我们开始进行硬件平台的连接。首先把计算机和硬件平台通过USB进行连接,接着把无源电子标签的VDD和VSS与示波器进行连接,无线电中的调制信号会引起电子标签内部的VDD的波动,所以可以电子标签内部的电压波动就是无线电波的信号波动。我们可以通过观察示波器来看到阅读器的发射波形和电子标签返回的波形。搭建完成的整体测试环境如图4.9所示:

  图4.9整体测试环境

  4.2.2 RFID阅读器测试

  通过计算机开启RFID阅读器程序控制硬件平台进行命令发射,之后通过示波器观察阅读器发送的波形和电子标签返回的波形。示波器波形如图4.10所示,我们看到波形显示的正是我们设计的RFID阅读器和电子标签之间的盘存过程,波形幅度较大的是阅读器发送的给电子标签的Query命令和ACK命令,而波形幅度较小的是电子标签返回给阅读器的RN16和EPC信号。这一过程符合ISO/IEC 18000-6 Type C协议中规定的盘存,我们设计的阅读器可以对电子标签完成盘存操作。

  图4.10开启RFID阅读器后示波器波形

  4.3软件定义阅读器工作频段测试

  上文的测试都是在设定阅读器的工作频率为915MHz时进行的,软件无线电的一大优势就是可以根据软件定义硬件的发送的频率。我们可以修改软件来改变我们设计的RFID阅读器的工作频率。下文开始对这一功能进行测试,在测试中需要用到频谱仪来检测RFID阅读器的发射频率,我们将硬件平台的发射端与频谱仪的接收端进行连接,然后使用计算机修改并运行阅读器程序,使硬件平台发射对应频率的无线电信号。我们主要测试几个典型RFID阅读器工作频段,分别是915MHz、800MHz以及435MHz。工作频段测试的实验环境如图4.11所示:

  图4.11 RFID阅读器工作频率测试

  首先设定RFID阅读器工作频率为915MHz,可以看到频谱仪在915MHz处有明显信号,频谱仪波形如图4.12所示:

  图4.12工作频率915MHz频谱仪波形

  接着设定RFID阅读器工作频率为800MHz,可以看到频谱仪在800MHz处有明显信号,频谱仪波形如图4.13所示:

  图4.13工作频率800MHz频谱仪波形

  最后设定RFID阅读器工作频率为435MHz,可以看到频谱仪在435MHz处有明显信号,频谱仪波形如图4.14所示:

  图4.14工作频率435MHz频谱仪波形

  实验结果成功的验证了之前的设想,软件无线电定义的RFID阅读器可以通过修改软件代码改变工作频率。软件无线电定义RFID阅读器不再像传统的RFID阅读器依赖硬件决定其工作频率,提高了阅读器的灵活性。

  4.4本章小结

  本章的主要工作是对软件无线电定义的RFID阅读器系统进行各项测试。首先使用阅读器和电子标签通信的仿真信号对软件无线代码中的各个信号处理模块进行测试,并将测试结果与ISO/IEC 18000-6 Type C协议进行对比验证了软件系统和信号处理模块设计的正确性。确保了软件的正确性之后连接硬件平台进行RFID阅读器整体测试,通过示波器显示了阅读器发射波形和电子标签返回波形。最后通过修改软件改变阅读器工作频率并使用频谱仪进行了验证。

  第5章RFID防碰撞算法分析及软件无线电实现

  5.1 ALOHA防碰撞算法分析

  在RFID系统中,阅读器发送的信息有可能被多个标签接收并返回信号,多个标签返回的信号之间就产生了干扰,使得RFID阅读器无法与标签进行正确的通信,对RFID阅读器的读写效率影响极大。

  为了能使RFID阅读器在多标签的使用情况下高效的完成对标签的读写工作,阅读器通常都需要使用防碰撞算法。目前采用的RFID防碰撞算法使用的基本原理都是时分多路访问法,主要分为两个大类。一种是基于ALOHA的随机性算法,另一种是基于二进制树搜索的算法。基于二进制树搜索的算法由于算法非常复杂,即使是识别率较高也没够得到普及。于ALOHA的随机性算法由于其简单的实现方式和较低的硬件成本,成为了被广泛使用的防碰撞算法。

  一般的阅读器基本上是采用ISO/IEC 18000-6 Type C标准的基于动态帧时隙的防碰撞Q算法[7,8],该算法属于ALOHA的随机性算法。所以对动态帧时隙ALOHA算法的研究和改进可以大大提高我们设计阅读器在多标签读写时的性能。

  5.1.1纯ALOHA算法

  纯ALOHA算法是一种最基本的ALOHA算法,它的设计原理是基于时分多路访问(TDMA)法。纯ALOHA算法使用“标签发言”的形式,只要标签进入阅读器的影响范围就会选择随机的时间向阅读器发送标签信息。这一算法是作用在标签上的,是由标签单向的发送信息给阅读器,并不关心被阅读器影响范围内的其它标签,并不能很好的防止标签碰撞。

  图5.1是纯ALOHA算法模型图,图中显示了各个标签按随机选择的时间向阅读器发送信息的过程。由于标签之间没有互相通信确定各自信息发送时间,所以很有可能会发送碰撞。碰撞的形式如图5.1所示可能有两种,一种是信号完全重叠的完全碰撞,另一种是信号部分重叠的部分碰撞。

  图5.1纯ALOHA算法模型

  运行中的阅读器会检查是否有碰撞发送,只要发现了存在碰撞,阅读器会立刻发送命令,该命令可以控制标签随机等待一段事件后再发送信息,这样不同标签的信息就产生了时间差,一定程度的减少的碰撞发送的可能性。这种算法的好处就是系统实现简单,只要有足够长的时间一定可以完成对所有标签的识别。

  纯ALOHA算法的缺点很明显,就是信道吞吐率低下。设数据包交换量为G,传输信道的平均吞吐率为S,纯ALOHA算法中G和S的关系为:

  (5.1)根据公式得到吞吐率S与数据包交换量G的曲线图如图5.2所示:

  图5.2纯ALOHA算法模型

  从图中可以看出纯ALOHA算法在标签数量较少,数据包交换量较低时吞吐率较好,吞吐率峰值可以达到18.4%。但是随着数据包交换量的上升吞吐率下降明显。

  5.1.2时隙ALOHA算法

  时隙ALOHA算法(Slotted ALOHA)是为了解决纯ALOHA算法而提出的一种改进算法。该算法规定标签发送信息的时间只能在特定的时间段上,这些时间点就称之为时隙,每个时隙的时间长度都要大于标签信息的时间长度,这使得每个标签的信息都只存在于一个时隙内。

  图5.3时隙ALOHA算法模型

  如图5.3所示,时隙ALOHA中每个标签发送的信息被规定在某个时隙内,所以标签信号之间的碰撞情况比纯ALOHA算法少,只有完全碰撞和完全不碰撞两种情况。碰撞发生的时间范围减少了一半,使得信道的利用率是纯ALOHA算法的两倍。

  时隙ALOHA算法的吞吐率S与数据包交换量G之间关系为:

  (5.2)根据公式(5.1)和(5.2)得到时隙ALOHA算法吞吐率S与数据包交换量G的曲线和纯ALOHA算法的对比如图5.4所示:

  图5.4纯ALOHA算法和时隙ALOHA算法系统吞吐率对比

  可以看到时隙ALOHA算法的吞吐量相比与纯ALOHA算法有了巨大的提升,吞吐率峰值达到了36.8%,是纯ALOHA算法吞吐率峰值的一倍。

  5.1.3帧时隙ALOHA算法

  帧时隙ALOHA算法是对时隙ALOHA算法一种改进算法,专门为了解决标签数量非常多的情况下标签有几率在发生碰撞后的一段时间内持续发送信息,导致时隙ALOHA算法性能明显下降的问题。

  帧时隙ALOHA算法把信道分成了许多个帧,每一个帧都是多个时隙组成,组成一个帧的时隙的个数就是这个帧的帧长,帧长在同一个识别过程中保持不变。阅读器向标签发送的识别命令中指定一个值,这个值会对标签通信过程中的时隙数进行指定。标签会在帧长度内随机确定一个整数,这个整数将在标签的时隙计数器内被存储。

  图5.5帧时隙ALOHA算法模型

  帧时隙ALOHA算法模型如图5.5所示,图中的帧长度为3,也就是说一个帧是由3个时隙组成的。标签在一个帧内可以随机选择0到2的整数,之后传输信息时就使用这个整数对应的时隙进行通信。标签在同一个帧内只会发送一次信息给阅读器,也只选择一次时隙。这样各个标签发送的数据相比于时隙ALOHA算法更加分散,使得同一个时隙内多个标签同时发送信息的可能性进一步下降,降低了发生标签碰撞的几率,系统的吞吐率得到了很大的提升。帧时隙ALOHA算法要求阅读器和标签需要有同步能力,还需要标签可以产生一个随机数,导致了阅读器和标签的硬件设计变得较为复杂。

  帧时隙ALOHA算法有一个严重的缺陷,阅读器向标签发送的命令需要指定帧长度,并且这个帧长度固定不变,这导致了帧时隙ALOHA算法不能始终保持较高的吞吐率。在实际使用中阅读器往往不能预先知道需要读写的标签个数,当阅读器进行工作时有两种可能性。第一种情况是标签数目远小于帧长度,这种情况下同一个帧内会存在大量的空闲时隙,这些空闲时隙相当于是浪费了的,这些浪费的时隙将导致阅读器识别标签过程耗时增多。第二种是标签数目远大于帧长度,这种情况下会导致同一个时隙内有多个标签发送信息,这就发生了标签碰撞,如果这种碰撞持续发送,系统吞吐率会急速下降。

  5.1.4动态帧时隙ALOHA算法

  动态帧时隙ALOHA算法是对帧时隙ALOHA算法的改进,为了解决在实际使用中帧时隙ALOHA算法在标签数量太多或者太少时,系统吞吐率急速下降的问题。动态帧时隙ALOHA算法可以根据前一帧内阅读器与标签信息通信的情况,对下一帧的时隙的数目进行调整,从而避免了时隙浪费或者缺乏的情况。

  图5.6动态帧时隙ALOHA算法模型

  帧时隙ALOHA算法模型如图5.6所示,在阅读器和标签的首次通信中,阅读器会以帧长为3来对标签进行通信,标签按照这个帧长随机选择帧和时隙进行信息发送。在首次通信结束后,阅读器成功识别了一个标签并发生了一次碰撞。这时阅读器根据设定好的时隙改变规则,在下一帧的通信中减少了一个时隙。这个改变规则就是动态帧时隙ALOHA算法的关键。

  动态帧时隙ALOHA算法中对下一个帧中时隙数调整的方法有许多。简单的方法是使用一个固定帧长变化方式,根据上一帧的时隙使用情况,在设定下一帧的时隙数时通过这种变化方式增加或减少帧长,在ISO/IEC 18000-6 Type C标准中就是使用了这种算法。还有一种更有效的方法是根据上一帧内时隙使用情况,估算出对阅读器进行应答的表签数,根据估算的表签数来决定下一帧内的时隙数[44]。这种算法相对于上一种比较复杂,本文将对这种帧长调整方法进行研究和改进。

  5.2动态帧时隙ALOHA算法改进

  动态帧时隙算法和普通帧时隙算法相比的优势在于能够根据上一次通信中得到的时隙使用情况对下一次数据通信的帧长进行调整,从而有效的避免了帧内时隙过少或者过多的带来的性能问题。一个适合的帧长是关系到整个系统吞吐率的关键因素。

  5.2.1最优帧长选择

  在动态帧时隙ALOHA算法中帧的长度影响了整个系统的性能,确定一个合适的帧长是一个非常重要的问题。确定帧长的基本原理其实很简单,我们只要找到一个帧长、标签数和吞吐率之间的关系。当帧长值是最优帧长时,系统的吞吐率一定是最高的。

  将一次通信中响应阅读器的标签数量设为n,帧长设为L。因为标签发送信息的时间点是随机的,所以在同一帧内各个标签的时隙分布是等概率的,所以在其中一个时隙中标签数量为k的概率服从二项分布。概率如下式(5.3)所示:

  (5.3)标签成功识别就是在一个时隙内只有一个标签发送信息,而空闲时隙就是该时隙内没有标签发送信息。则根据公式(5.3)可得成功识别概率。以及空闲时隙概率如下:

  (5.4)(5.5)成功识别的时隙数平均值就是帧长L乘以某个时隙内成功识别的概率,则成功识别的时隙数均值a为:

  (5.6)系统的吞吐率设为S,吞吐率的定义是成功识别的时隙数除以总时隙数,也就是除以帧长:

  (5.7)要求出S取最大值时L与n的关系,我们首先将L看为常数对式(5.7)求导,当导数为0时可以得到最大的吞吐率。如下式:

  (5.8)解出式(5.8)可以得到L与n的关系如下式:

  (5.9)根据式(5.9)可以列出L和n的关系表:

  表5.1 L-n的关系表

  L1.620.540.560.580.5100.5120.5n120406080100120由表可知当n的取值较大时,L与n的取值基本相等,即当系统的吞吐率达到最大值时,帧长的取值与标签数基本相等。这样我们的最优帧长就确定了,一个系统某次通信的最优帧长与该次通信内响应阅读器的标签数大致相等。

  5.2.2改进的标签估值算法

  在确定了最优帧长和标签数的关系后,估计标签数量就成了确定帧长的关键环节。有一种传统的下线估值法(Low Bound)可以估算标签数量,算法将发生碰撞的时隙数设为,将成功识别的时隙数设为。根据碰撞的定义可知在发送碰撞时隙内至少同时有两个标签在发送信息,所有估算发送碰撞的标签最小数量是个,成功识别的标签数量是个,根据这个估算得到所有响应阅读器的标签数量如下式:

  (5.10)的下线估值法是一种最小值估值算法,随着标签数量的增多误差会变得非常大,在实际使用过程中没有办法准确的将帧长进行调整。该种算法只适合在已知标签数量不多的情况下进行使用。

  本文的标签估值算法就是基于下线估值法而改进的,算法的基本原理是阅读器可以得出上一次通信中成功识别标签的时隙数和发生碰撞的时隙数。在发送碰撞的时隙内的所有标签就是当前还未被阅读器识别的标签,也就是下一次通信的标签数量。我们只要能够通过某种数学推导得出每个碰撞时隙内存在标签数量的平均值,就可以估算出下一次通信的标签数量。

  在通信过程中一个标签向阅读器发送信息的时间点是一个随机事件,所以在某一个时隙内存在的标签数量符合泊松分布。由于已知标签数量等于时隙数时系统的吞吐率达到峰值,所以在一次通信中一个时隙内标签数量的泊松分布均值为1。设有在某个时隙内有k个标签的概率为,如下式:

  (5.11)假设一个时隙发生了碰撞,那么这时的k一定不小于2。则这个时隙内有k个标签的概率为:

  (5.12)由此可以推导出在发送碰撞时隙中标签数量的平均值为:

  (5.13)与传统的下限估值法取发生碰撞的时隙内标签数量的最小值2作为参数估算所有标签数量的方式相比,采用推导出的2.39作为参数来进行估算显然更为精准。成功识别标签的时隙中的标签数量取值为1,而发生碰撞的时隙内的标签数量取值为2.39,则所有响应阅读器的标签数量如下式:

  (5.14)将实际的标签数量与估计的标签数量进行对比就能得出改进后的估值算法的效率。将实际标签数量设为,估计的标签数量设为,则准确率R如下式:

  (5.15)由式(5.4)可得在一次通信中成功识别标签的时隙数的平均值为:

  (5.16)因为成功识别标签的时隙中只存在一个标签,所以下一次通信中标签的实际数量的表达式为:

  (5.17)由式(5.4)和式(5.5)可以推导出某一时隙发生碰撞的概率为:

  (5.18)则得到当前通信中发生碰撞的时隙数的平均值为:

  (5.19)由式(5.14)推导出下一次通信标签数的估算值为:

  (5.20)将和带入式(5.15)可得到估算准确率的的表达式为:

  (5.21)根据式(5.21)将帧长L分别取值为8、16、32、64和128,分别得到了五种在与不同数量的标签进行通信过程中改进后的标签估值算法的准确率曲线,如图5.7所示:

  图5.7不同帧长的估值算法准确率曲线图

  由图5.7可以发现,改进后的标签估值算法在标签数量很小时的准确率基本统一维持在120%。随着标签数量的增长,估值算法的准确率逐渐下降。各条曲线中帧长越长的曲线下降的越慢。

  了解了估值算法准确率曲线的变化趋势,我们还需要确定在什么情况下估值算法的准确率可以达到峰值。我们设估值算法的误差率为W,则有如下公式:

  (5.22)则估值算法误差率W的随着标签数量的变化曲线如图5.8所示:

  图5.8不同帧长的估值算法误差率曲线图

  由图5.8可以我们可以发现,当标签数量与帧长接近时估值算法的误差率达到最低,基本可以做到零误差。随着标签数量的减少,估值算法的误差率始终保持在20%以内。随着标签数量的增多,估值算法的误差率不断上升,当标签数量过多时算法的误差率过大。

  5.2.3标签估值算法性能对比

  由上文推导知下限估值法的准确率可以表示为:

  (5.23)我们将帧长设为64,在这样的条件下对改进的标签估值算法与下限估值法进行对比,首先我们从准确率的方面进行比较。两种算法的准确率曲线如图5.9所示:

  图5.9 LB估算法和改进算法准确率曲线图

  根据图5.9我们发现,两种算法的起始准确率不同,下限估值法在标签数量很小时的准确率较高,但随着标签数量的增多准确率下降很快。改进的估值算法在虽然在标签数量很小时准确率并没有下限估值法高,但是随着标签增多准确率下降幅度较小。

  接着我们从误差率的方面进行比较。两种算法的误差率曲线如图5.10所示:

  图5.10 LB估算法和改进算法误差率曲线图

  根据图5.10我们发现,在标签数量很少的情况下,下限估值算法的误差率较小,但是改进的估值算法误差率也在可以接受的范围。但随着标签数量的增多,两种算法的差距逐渐显现,改进的标签估值算法的误差率明显要小于下限估值算法。

  5.3估值算法的软件无线电实现

  5.3.1协议中的Q算法

  ISO/ICE 1800-6C标准中所使用的防碰撞算法是基于用基于动态帧时隙的防碰撞Q算法。Q算法通过Query命令指定一个Q值来确定初始的帧内时隙数量,标签会在0至2Q中随机产生一个数作为时隙数,只有时隙数为0标签会对阅读器进行响应。之后阅读器通过QueryRep命令将每个标签随机产生的时隙数减一,循直到每一个时隙内的标签都进行识别。当一次循环完成后,如果存在碰撞阅读器会发送QueryAdjust命令对Q值进行调整以改变时隙数。

  正如我们之前分析的,阅读器想要得到最大的吞吐率帧内时隙数需要与标签数量相等。Q算法中使用QueryAdjust命令只能对Q进行三种操作,分别是加一、减一和不变。当标签数量远大于或者远小于设定的初始时隙数时,时隙数调整速度过慢,直接影响了阅读器的通信效率。我们可以用上文分析的标签估值算法计算出标签数量,将标签数量直接应用到时隙数的设定中,这种方式将大大提高阅读器在多个标签发生碰撞的情况下的工作效率。

  5.3.2使用估值算法改进Q算法

  针对标准中Q算法存在的缺陷,我们将采用改进的估值算法取代传统Q算法在阅读器识别标签过程中调整时隙的作用。

  改进算法的起始流程和Q算法类,阅读器首先发出一个Query命令,该命令会设定一个Q值用来产生初始的时隙数。标签收到Query命令后随机产生一个时隙,阅读器依次识别所有时隙。接下来的步骤开始与Q算法不同,阅读器对所有时隙进行识别完成后,统计出产生碰撞的时隙数,之后通过改进的标签估值算法估计下一次通信的标签数量。这时我们需要一个命令把标签估值算法计算出的标签数量发送给标签,标签会根据这个数值调整时隙数。传统协议中规定的调整时隙数的QueryAdjust命令已经不能满足我们新算法的需要,所以我们将在下文中自定义一条命令,用来发送估值算法的结果。使用估值算法的具体流程如图5.11所示:

  图5.11使用估值算法流程图

  使用改进的估值算法取代Q算法中时隙数的调整方式后,根据估算得到的标签数来设定时隙数将会大大提高整个系统的吞吐率,标签的识别速度可以得到明显的加快。

  5.3.3自定义阅读器命令设计

  ISO/IEC 18000-6 Type C标准中对标签时隙数进行调整的命令是QueryAdjust,根据上文提出的改进方案,我们将不再使用这个命令。我们通过软件无线电代码定义发送的命令,重新设定了一个自定义命令newQueryAdjust,作为标准中的补充命令,该命令和QueryAdjust类似,组成方式如下表5.2所示:

  表3.6自定义newQueryAdjust命令的组成方式

  命令码节(Session)设定时隙数比特数428组成000100:S0

  01:S1

  10:S2

  11:S3根据估值算法得出的标签数n设定和QueryAdjust类似的该命令也拥有一个四位的命令码,为了与标准中的其他命令码不冲突,newQueryAdjust命令采用“0001”作为命令码用来给标签识别。之后与QueryAdjust相同,也拥有一个两位的Session数据,这个数据是为了确认当前周期内的Session号,如果标签收到newQueryAdjust命令的Session号和初始化本次盘存时的Query命令中的Session号不一致,标签将不会对这个命令作出响应。最后我设计了一个八位的设定时隙数,这个八位二进制数代表了标签估值算法计算得出的预测标签数。八位二进制数可以最多表示255个标签,在实际使用过程中一次性读到的标签数量基本不会超过这个数值,所以我们决定用八位二进制数表示设定时隙数。

  接下在我们在软件无线电代码中进行该命令的设计工作,这项工作是基于在第三章中设计的基于软件无线电的RFID阅读器中的Reader模块完成的。我们在Reader模块中添加了gen_new_query_bits函数,该函数如下图5.12所示:

  图5.12自定义newQueryAdjust命令函数实现

  我们可以看到该函数有一个参数Ck,参数Ck就是阅读器统计出的发送碰撞的时隙数。函数获得发生碰撞的时隙数后,先使用改进的标签估值算法中得出的标签碰撞时隙内标签数量的平均值2.39和时隙数Ck相乘,这样就得到了下一次通信中还需要识别的标签数的估计值。接着我们通过一个循环,依次将十进制的标签数转换为一个八位二进制数组,这个数组就是我们需要发送给标签的时隙数。接着按照规定的命令组成顺序,依次将命令码、Session号和设定时隙数填入vector类型的容器中,容器名称为new_query_adjust_bits。这样自定义newQueryAdjust命令就按照规定拼接完成了

  为了能够让阅读器发送newQueryAdjust命令,我们需要把命令在Reader模块的主函数general_work中写入输出端。根据第三章中Reader模块中general_work的设计流程,我们需要在switch语句的选择中多添加一种发送newQueryAdjust命令的标志。在选择发送newQueryAdjust命令的代码块中先将帧同步添加到输出端,将完成的newQueryAdjust命令序列通过PIE编码的方式写到输出端。最后在输出端结尾加上所需的载波序列提供给电子标签返回信号使用。

  5.3.4阅读器命令发送仿真

  接下来对我们添加进阅读器的自定义命令进行测试。因为目前没有标签能够适用与改进过的ISO/ICE 1800-6C标准,所以我们的测试主要通过仿真进行,我们在代码中设定不同的时隙碰撞数Ck,模拟在不同情况下阅读器统计得到的Ck。之后将Reader模块的工作状态设定为发送newQueryAdjust命令。接着修改流图模块,在流图模块中我们将不再使用Gate模块和Tag_decoder模块,而是直接将文件输入和文件输出连接到Reader中,因为我们只需要测试自定义命令是否根据标签估值算法发出了正确的时隙设定值。运行软件无线电程序之后我们只要分析Reader模块的输出文件就能检验newQueryAdjust命令是否正确发出。

  我们首先设定碰撞时隙数的值Ck为16的,根据估值算法可得需要设定的时隙数为38,启动软件无线电程序Reader模块的输出信号如图5.13所示:

  图5.13碰撞时隙Ck为16时的newQueryAdjust命令

  观察图5.13中Reader模块的输出信号,我们可以发现这正是我们定义的命令。在信号的的起始部分是一个帧同步,帧同步后是一个4位的命令码“0001”,之后是一个2位的Session号“00”,最后是一个8位的设定时隙数。根据PIE编码规则可以得出图中的8位设定时隙数是二进制数“00100110”,转为10进制是38,这与我们预计的设定时隙数一致。

  接下来对碰撞时隙数进行调整,我们取Ck的值为32。根据估值算法可得需要设定的时隙数为76,启动软件无线电程序Reader模块的输出信号如图5.14所示:

  图5.14碰撞时隙Ck为32时的newQueryAdjust命令

  观察图5.14中Reader模块的输出信号,我们可以发现这和上一个输出信号图类似也是一个newQueryAdjust命令,只是在设定时隙数的八位信号上有区别,同中的设定时隙数是“0100110”,转换为二进制是76,这与我们预计的设定时隙数一致。

  该仿真测试结果说明阅读器成功根据按照自定义的指令组成形式,成功发出了自定义的newQueryAdjust命令。而且根据碰撞时隙数Ck的值的不同,使用了标签估值算法预测了相应的设定时隙数并成功发出。

  5.4本章小结

  本章首先通过对RFID防碰撞算法中应用最广泛的ALOHA算法及其改进算法进行了分析。接着针对在ISO/IEC 18000-6 Type C标准中使用的动态帧时隙ALOHA算法提出了改进,分析了RFID系统达到最大吞吐率时帧长需要等于响应阅读器的标签数量,提出了一种基于泊松分布概率模型的改进型标签估值算法。之后将该算法与传统的下限估值法进行对比,发现该算法相比与下限估值法拥有更好的性能。最后使用改进的标签估值算法加入到了设计的阅读器中,并使用软件无线电自定义了一个新的阅读器命令。

栏目分类