在保障装备装备时,训练使用、检修、加装改造等记录用传统手工操作,管理人员必须对进装备名称、随装配套类型及数量、出厂单位、出厂日期以及其他众多属性进行逐一登记,不但工作效率低、而且容易出差错,成为制约工作进度的瓶颈。如果装备信息管理运用RFID标签取代纸质履历表,记录装备从出厂、配备、动用、维修、保管、事故、加装改造、退役报废等全生命周期的履历信息,手持读写器读取射频标签及信息记录装置每日信息,可以帮助操作人员及时掌握装备工作情况,为维修保障人员提供信息支持。
但不同于普通物流领域,由于装备信息较为复杂,单一普通标签难以胜任承载所需全部信息。考虑经济和实用性,采用不同频率多标签方式才能较好满足要求。因此,本文针对装备信息的RFID数据结构重点进行了分析,并详细研究了嵌入式读写器内部数据的存储和管理,以满足装备保障信息化需求。
1 RFID数据模型研究
1.1 RFID数据特性
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.56 MHz的无源标签存储装备身份信息,采用频率为2.4 GHz的有源标签存储动态寿命信息。本设计采用Windows CE作为操作系统,通过RFID射频收发模块读取所需求的数据,对数据进行解析、提取、存储,并构建嵌入式SQLite数据库,实现对数据的管理。而用户对存储的数据进行查询修改等操作,最方便的方法就是在Web页面里实现,因此需要搭建一个Web服务器,使用户可以通过Web页面来控制这些工作的完成并实现对数据的操作访问。
设备管理提供了统一的读写器接口程序,可兼容性地控制多种类型读写器的工作;数据管理完成了数据的过滤、存储,并利用嵌入式Web服务器对数据进行查询和修改;嵌入式Web服务器是嵌入式技术和网络技术结合的产物,把Internet中的Web服务器进行一定的裁剪,嵌入到设备中,从而可以利用嵌入式Web服务器对设备进行操作、管理。本文拟使用GoAhead WebServer,它是一个源码免费、可以运行在多个平台的嵌入式Web服务器,并支持ASP、嵌入式JavaScript和标准的CGI执行,能较好地满足需求。
2.2 数据的解析和过滤
读写器从标签读取大量的未经处理的数据,一般来说读取到的数据并非完全有用的标签数据,需要对其进行提取、解析,以得到有用的信息。数据在传输过程中不可避免地会受到外界的干扰而发生错误,因此数据必须进行过滤,将过滤后的数据再进行存储[4]。
标签数据一般都是二进制编码,读取后需要将二进制编码数据转换成unicode数据。
在标签读取过程中实现标签的二进制位编码到unicode编码的转换,在标签数据处理环节则根据转换获得的标签unicode编码以及过滤条件对标签进行过滤,为信息应用层提供有意义的标签信息。
过滤规则可以通过Web页面进行设置,设置信息存储到过滤规则配置文件中。进行过滤时,过滤器读取配置文件并应用于过滤规则。
3 数据存储与管理的实现
3.1 构建嵌入式数据库
SQLite3是轻型、免费和开源的嵌入式数据库,支持绝大多数标准的SQL92语句,工作速度快,可以满足中间件数据处理的实时要求。因此选用SQLite3数据库在大小和功能方面是一个理想的折中。
SQLite3嵌入式数据库提供了源码,在硬件平台上对源码进行交叉编译即可实现移植。编译后,生成了大小为93 KB的sqlite3可执行文件和大小为991 KB的sqlite3动态链接库libsqlite3.so。
3.2 数据模型在数据库中的实现
嵌入式数据库中以单个库文件形式进行数据存储,数据库文件可以在不同的操作系统平台下使用而无需转换。数据库文件内部采用表数据页和索引数据页两种存储结构进行组织。用户定义的临时表和系统中的临时表(用于排序、分组等操作)以临时数据库文件形式进行管理。
在开发板上,使用上一步生成的sqlite3可执行文件来生成本系统所需要的数据库表。Sqlite3的数据库与Access数据库类似都采用了单文件的模式,为此生成了一个名为rfid的数据库文件,根据项目需求规划必须的数据表。
直接在命令行下敲入“sqlite3 rfid;”即可生成rfid数据库,并得到提示符“sqlite3〉”,通过输入SQL语句即可建立所需的表:
create table rfid(Number integer primary key, Objects varchar,Organizations varchar,Actions varchar,ActionItem varchar,ObjectOrganization varchar,Arrangement varchar);
.quit;
这里只考虑了基本属性,可以为数据表做扩展表格实现其额外的属性。
参照SQL DML的语法,该模型的逻辑结构主要元素描述如下:
(1)Objects: Objects(EPC Primary Key, name, deseription),记录系统及随装信息。
(2)Organizations: Organizations(organizationID Primary Key,organization),标识装备在生命周期内装配单位及编制序列。
(3)Actions: Actions(actionID Primary Key,actType),标识业务流程中的事务类型。其中,actionID为事务类型标识码;actType表示事务类型的名称。
(4)Arrangement:Arrangement(ID Primary Key,EPC,parentEPC,QtyOfChild,organizationID,stime,etime),Arran-
gement关系是本数据模型的关键,反映了物品的物理层次关系。其中,parentEPC标识关于该EPC的上一层次的EPC编码;QtyOfChild记录了由该EPC标识的下一层次的物品数量;stime和etime分别标识该层次关系的发生和结束时间。
(5)ActionItem:ActionItem(ID Primary Key,actionID,EPC references Objects,timestamp):ID标识每个发生的事务;timestamp为该事务发生的时间。
(6)ObjectOrganization(ID Primary Key,EPC refferenees Objects, organizationID, timestamp):ID标识装备的调拨、调整及编制战斗序列的变化。
SQLite数据库提供了丰富的C语言API接口函数,使得对数据库的操作十分方便。本系统只需要以下3个核心函数就可以实现连接数据库、处理查询等操作:
int sqlite3_open(const char*db,int mode,char* *errmsg);
int sqlite3_close(sqlite*db);
int sqlite3_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 数据的访问操作
GoAhead WebServer是一款面向嵌入式系统的Web服务器,作为系统中数据转发和模块承载平台。向Wince系统中移植比较简单,在Visual C++ 6.0打开CE子目录下的工作空间webs.dsw,将生成的webs.exe和所需的Web页面导入WinCE系统中相应位置即可。需要注意的是:要设置计算机系统环境变量Path,使其包含include和lib,确保包含CE、UEMF、webs和UNICODE的特征值被定义在内。
在使用GoAhead WebServer前,需要对GoAhead WebServer进行配置:
(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界面,只需通过浏览器进行简单的操作,就可完成对过滤规则的设置以及与数据的交互等功能。今后的工作是进行更多的页面优化设计,将使其更加有实际应用价值。