一种嵌入式RFID读写器的内部数据管理研究
导读:
如果装备信息管理运用RFID标签取代纸质履历表,记录装备从出厂、配备、动用、维修、保管、事故、加装改造、退役报废等全生命周期的履历信息,手持读写器读取射频标签及信息记录装置每日信息,可以帮助操作人员及时掌握装备工作情况,为维修保障人员提供信息支持。
关键字
嵌入式RFID读写器近场通信安防
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界面,只需通过浏览器进行简单的操作,就可完成对过滤规则的设置以及与数据的交互等功能。今后的工作是进行更多的页面优化设计,将使其更加有实际应用价值。