【深入探讨】嵌入式RFID读写器的内部数据管理
不同于普通物流领域,由于装备信息较为复杂,单一普通标签难以胜任承载所需全部信息。考虑经济和实用性,采用不同频率多标签方式才能较好满足要求。因此,本文针对装备信息的RFID数据结构重点进行了分析,并详细研究了嵌入式读写器内部数据的存储和管理,以满足装备保障信息化需求。
在保障装备装备时,训练使用、检修、加装改造等记录用传统手工操作,管理人员必须对进装备名称、随装配套类型及数量、出厂单位、出厂日期以及其他众多属性进行逐一登记,不但工作效率低、而且容易出差错,成为制约工作进度的瓶颈。如果装备信息管理运用RFID标签取代纸质履历表,记录装备从出厂、配备、动用、维修、保管、事故、加装改造、退役报废等全生命周期的履历信息,手持读写器读取射频标签及信息记录装置每日信息,可以帮助操作人员及时掌握装备工作情况,为维修保障人员提供信息支持。
1RFID数据模型研究
1.1RFID数据特性
RFID数据模型是管理RFID数据的基础。从总体上RFID应用有着共同的需求特点:(1)识别:RFID标签唯一地标识该物体。(2)位置:一个位置可以是一个地理位置,也可以是有背景含义的特殊位置,如仓库、靶场等。(3)关系:RFID应用的另一个关键概念是聚合,即对象之间形成的关系。一种常见聚合情况是包含关系,即在物体运动过程中,被包含的物体与外包装物体有相同的运动路径等特性。另一个集合情况是协作,即贴有标签的物体之间有一定的关系[1],如某型导弹射击训练由发射车与检测车共同完成,则发射车与检测车之间有协作关系。1.2数据模型本文重点是利用数据库技术实现装备数据信息的层次化管理。系统中涉及的数据主要有静态数据和动态数据两种类型。
1.2.1静态数据
静态数据是有关固定信息、业务规则以及系统设置的数据,不轻易随时间变更[2]。在本系统中,静态数据主要包括:(1)Objects:所有使用射频标签进行标识系统,包括系统及随装配件的名称、型号、出厂单位、出产年份等信息。(2)Organizations:装备在生命周期(出厂到退役报废之间的时间)内装配变动信息,包括装配单位、装配时间、战斗序列等信息。(3)Actions:事务处理类型。包括重大活动记录、技术检查、维修、加装改装等信息。
1.2.2动态数据
动态数据反映了系统运作中的事务过程,与时间、空间密切相关。动态数据主要包括:Arrangement,用于描述装备实体(Objects)与状态的层次关系;ObjectOrganization,用于描述装备实体(Objects)在某时间内的调拨、调整;ActionItem,用于描述装备处理情况。
1.2.3数据模型的建立
如果有静态关系,则根据ER模型的映射关系,映射成表即可[3]。对于两个实体之间的基于状态的关系,则在两个实体表的主键之间加上时间间隔(stime,etime)组成,其中时间间隔代表了关系或者状态存在的生命周期。基于事件的动态关系,由映射在两个表的主键加上时间戳属性timestamp组成,这个时间戳代表了时间发生的时间点。
2基于嵌入式的RFID读写器数据管理
2.1系统的设计思路
根据以上分析,数据来源主要分为两类:一类是固定的装备身份信息,这些信息是一般不会随时间变化,数据量比较小;另一类是动态的装备寿命信息,通常是记录日常操作的起始时间和装备调拨、调整,数据量稍大且需要重复读写。为此,以某型车辆装备为例,采用一种13.56MHz的无源标签存储装备身份信息,采用频率为2.4GHz的有源标签存储动态寿命信息。本设计采用WindowsCE作为操作系统,通过RFID射频收发模块读取所需求的数据,对数据进行解析、提取、存储,并构建嵌入式SQLite数据库,实现对数据的管理。而用户对存储的数据进行查询修改等操作,最方便的方法就是在Web页面里实现,因此需要搭建一个Web服务器,使用户可以通过Web页面来控制这些工作的完成并实现对数据的操作访问。设备管理提供了统一的读写器接口程序,可兼容性地控制多种类型读写器的工作;数据管理完成了数据的过滤、存储,并利用嵌入式Web服务器对数据进行查询和修改;嵌入式Web服务器是嵌入式技术和网络技术结合的产物,把Internet中的Web服务器进行一定的裁剪,嵌入到设备中,从而可以利用嵌入式Web服务器对设备进行操作、管理。本文拟使用GoAheadWebServer,它是一个源码免费、可以运行在多个平台的嵌入式Web服务器,并支持ASP、嵌入式JavaScript和标准的CGI执行,能较好地满足需求。2.2数据的解析和过滤读写器从标签读取大量的未经处理的数据,一般来说读取到的数据并非完全有用的标签数据,需要对其进行提取、解析,以得到有用的信息。数据在传输过程中不可避免地会受到外界的干扰而发生错误,因此数据必须进行过滤,将过滤后的数据再进行存储[4]。标签数据一般都是二进制编码,读取后需要将二进制编码数据转换成unicode数据。在标签读取过程中实现标签的二进制位编码到unicode编码的转换,在标签数据处理环节则根据转换获得的标签unicode编码以及过滤条件对标签进行过滤,为信息应用层提供有意义的标签信息。过滤规则可以通过Web页面进行设置,设置信息存储到过滤规则配置文件中。进行过滤时,过滤器读取配置文件并应用于过滤规则。
3数据存储与管理的实现
3.1构建嵌入式数据库
SQLite3是轻型、免费和开源的嵌入式数据库,支持绝大多数标准的SQL92语句,工作速度快,可以满足中间件数据处理的实时要求。因此选用SQLite3数据库在大小和功能方面是一个理想的折中。SQLite3嵌入式数据库提供了源码,在硬件平台上对源码进行交叉编译即可实现移植。编译后,生成了大小为93KB的sqlite3可执行文件和大小为991KB的sqlite3动态链接库libsqlite3.so。
3.2数据模型在数据库中的实现
嵌入式数据库中以单个库文件形式进行数据存储,数据库文件可以在不同的操作系统平台下使用而无需转换。数据库文件内部采用表数据页和索引数据页两种存储结构进行组织。用户定义的临时表和系统中的临时表(用于排序、分组等操作)以临时数据库文件形式进行管理。在开发板上,使用上一步生成的sqlite3可执行文件来生成本系统所需要的数据库表。Sqlite3的数据库与Access数据库类似都采用了单文件的模式,为此生成了一个名为rfid的数据库文件,根据项目需求规划必须的数据表。直接在命令行下敲入“sqlite3rfid;”即可生成rfid数据库,并得到提示符“sqlite3〉”,通过输入SQL语句即可建立所需的表:createtablerfid(Numberintegerprimarykey,Objectsvarchar(),Organizationsvarchar(),Actionsvarchar(),ActionItemvarchar(),ObjectOrganizationvarchar(),Arrangementvarchar());.quit;这里只考虑了基本属性,可以为数据表做扩展表格实现其额外的属性。参照SQLDML的语法,该模型的逻辑结构主要元素描述如下:(1)Objects:Objects(EPCPrimaryKey,name,deseription),记录系统及随装信息。(2)Organizations:Organizations(organizationIDPrimaryKey,organization),标识装备在生命周期内装配单位及编制序列。(3)Actions:Actions(actionIDPrimaryKey,actType),标识业务流程中的事务类型。其中,actionID为事务类型标识码;actType表示事务类型的名称。(4)Arrangement:Arrangement(IDPrimaryKey,EPC,parentEPC,QtyOfChild,organizationID,stime,etime),Arran-gement关系是本数据模型的关键,反映了物品的物理层次关系。其中,parentEPC标识关于该EPC的上一层次的EPC编码;QtyOfChild记录了由该EPC标识的下一层次的物品数量;stime和etime分别标识该层次关系的发生和结束时间。(5)ActionItem:ActionItem(IDPrimaryKey,actionID,EPCreferencesObjects,timestamp):ID标识每个发生的事务;timestamp为该事务发生的时间。(6)ObjectOrganization(IDPrimaryKey,EPCreffereneesObjects,organizationID,timestamp):ID标识装备的调拨、调整及编制战斗序列的变化。SQLite数据库提供了丰富的C语言API接口函数,使得对数据库的操作十分方便。本系统只需要以下3个核心函数就可以实现连接数据库、处理查询等操作:intsqlite3_open(constchar*db,intmode,char**errmsg);intsqlite3_close(sqlite*db);intsqlite3_exec(sqlite*db,char*sql,int(*callback)(void*,int,char**,char**),void*parg,char**errmsg);其中,前2个函数用于打开与关闭数据库,第3个函数sqlite3_exec()用来处理SQL查询,此函数的第2个参数用来处理一条或多条SQL语句,如果是查询(SELECT)语句,则查询结果的每一条记录都必须调用第3个参数的Callback函数,第4个参数则为Callback函数的第一个参数指针;如果不是查询语句,则第3、4个参数为NULL。所有SQL执行完毕后返回0,否则返回错误代码,可通过第5个参数值来查看详细错误信息。使用sqlite3_mprintf函数将数据段的值添加到SQL语句中,然后通过sqlite3_exec函数执行该SQL语句把标签数据插入到数据库中。
3.3数据的访问操作
GoAheadWebServer是一款面向嵌入式系统的Web服务器,作为系统中数据转发和模块承载平台。向Wince系统中移植比较简单,在VisualC++6.0打开CE子目录下的工作空间webs.dsw,将生成的webs.exe和所需的Web页面导入WinCE系统中相应位置即可。需要注意的是:要设置计算机系统环境变量Path,使其包含include和lib,确保包含CE、UEMF、webs和UNICODE的特征值被定义在内。在使用GoAheadWebServer前,需要对GoAheadWebServer进行配置:(1)在浏览器输入地址时,服务器返回某一页面,该页面通过在main.c文件中的initWebs函数进行设定,设定语句为:websRedirec(wp,T("index.htm"));(2)当浏览器访问某一地址下的目录时,服务器将返回该目录下的缺省页面,通过main.c文件中的websHomePageHandler函数进行设定,设定语句为:websSetDefaultPage(T("default.asp"));用户在页面对过滤规则进行配置后,CGI程序将配置结果写入配置文件filter.conf中。在进行数据过滤时,过滤器将会读取此配置文件得到相应的过滤规则对数据进行过滤。首先使用C语言API调用sqlite3_open()打开数据库,然后调用sqlite3_exec()函数来执行SQL语句完成对数据库的读写更新等操作,最后执行sqlite3_close()关闭数据库。通常,CGI应用程序将执行结果输出到标准输出(stdout),WebServer从CGI应用程序中的标准输出中读取信息,并将这些信息返回给客户端[5]。因此,在程序中如果要将SQL查询结果输出给客户。CGI应用程序中可以使用prinf()函数将查询结果以HTML的形式输出到标准输出,进而Web服务器向客户端返回动态页面,这样就实现了用户、WebServer与SQLite3嵌入式数据的交互。通过编译,webs.ere最后将以操作系统的一个子进程运行,可与操作系统内的其他进程进行通信及数据传输,从而实现操作系统内部程序间的相互交互作用。本文研究了针对装备信息的RFID数据结构模型,使用SQLite数据库实现标签数据的存储、过滤,并设计了简单易用的Web界面,只需通过浏览器进行简单的操作,就可完成对过滤规则的设置以及与数据的交互等功能。今后的工作是进行更多的页面优化设计,将使其更加有实际应用价值。