嵌入式数据库SQLite在电梯B/S监控中的应用
2008-05-29
作者:陈 新,高凤梅,曹玲芝,石 军,
摘 要: 提出了在电梯嵌入式监控中使用SQLite数据库的方案。在介绍SQLite的特点及监控方案整体结构的基础上,以电梯B/S" title="B/S">B/S监控CGI程序访问数据库为例,着重介绍了SQLite的用法,最后介绍了基于三星2410的监控终端硬件平台。
关键词: 嵌入式数据库" title="嵌入式数据库">嵌入式数据库 SQLite B/S监控 S3C2410
基于嵌入式的B/S监控方案由于其成本低、体积小、使用方便,越来越受到工程技术人员的关注。与此同时,在设备的嵌入式" title="的嵌入式">的嵌入式B/S远程监控" title="远程监控">远程监控、故障诊断中需交换的数据越来越多,对数据库的要求越来越高。传统的桌面数据库建立的开发模型是数据库控制应用程序,需要专门的管理和配置,使用复杂、体积大、不便于移植。因此,对适合嵌入式的数据库的研究已成为数据库领域一个新的研究方向。
在小区或楼宇的电梯监控中,大多是基于PC机的C/S或B/S监控。一种是利用CAN总线或电话网络接入PC机,采用电梯监控采集卡向下通过CAN总线与电梯通信,向上通过RS232接口接入PC机。一种是采用以太网的SOCKET方式,由PC机实现B/S或C/S监控。这些方案运用传统的桌面数据库来实现基于PC机的C/S或B/S监控,功能相对强大,但成本较高。在智能下移、以太网应用到设备层的趋势下,研究嵌入式数据库在电梯B/S监控中的应用是非常有意义的。
1 SQLite数据库简介
SQLite是由D.Richard Hipp于2000年编写的执行自容纳、可嵌入、零配置数据库引擎的小型C库。它支持多数SQL92标准,可以在所有主要的操作系统上运行,并且支持大多数计算机语言。其作为PHP V4.3中的一个选项引入,已构建在PHP V5中,比MySQL快2倍以上,且完全开放。SQLite虽然比Berkeley DB功能稍弱,但是Berkeley DB不支持SQL,体积比SQLite大,在某些商业应用上不是免费的,况且在开源社区的推动下SQLite的功能在增强,因此SQLite正在成为受欢迎的开源数据库之一。
嵌入式数据库来自于其嵌入式运行模式,它使用精简代码编写,零配置,直接在应用程序进程中运行,并且占用资源非常少。嵌入式数据库系统没有管理员,具有自调节和自适应能力,能够“无处不在”。SQLite是一个非常适合嵌入式应用的数据库,这可以从其设计的目的和独特的特点看出。SQLite设计的主要目的是简单:简单的管理、简单的操作、简单地嵌入、简单的维护。SQLite的特征如下:
(1)零配置。SQLite在使用前不需要安装设置,不需要进程来启动、停止或配置,不需要管理员去创建新数据库或分配用户权限,在系统崩溃或失电之后自动恢复。
(2)无服务器。大多数SQL数据库引擎是作为一个单独的服务器进程被执行。访问数据库的程序使用某种内部进程通信(典型的是TCP/IP)与服务器通信,完成发送请求到服务器和接收查询结果的工作。SQLite不采用这种工作方式。使用SQLite时,访问数据库的程序直接从磁盘上的数据库文件读写,没有中间的服务器进程。
(3)精简性。当尺寸优化后,在不减少功能的情况下,整个SQLite库小于225KB。如果在编译时去掉一些不需要的特性,库的大小能被减小到170KB。IBM最新发行的CloudScape数据库引擎是2MB的罐文件,压缩后仍比SQLite大10倍;Firefox宣称其客户订制的库只有350KB,但是不包括数据库引擎;来自Sleepycat的Berkeley DB库是450KB,并且删去了SQL支持。通过比较可知:SQLite非常小。
(4)简单的访问。一个SQLite数据库是一个单独的普通磁盘文件,能够被定位在路径层次的任何地方。如果SQLite能读写磁盘文件,则它也能访问数据库。大多数SQL数据库引擎趋向于把数据存为一个大的文件集合,通常这些文件在一个标准的定位中,只有数据库引擎本身能访问它。
(5)可变长度的记录。一般的SQL数据库引擎在表中为每一个记录分配一个固定的磁盘空间数,SQLite只使用一个记录中实际存储信息的磁盘空间数。显然,这会使数据库非常小,同时,由于在磁盘上移动的信息很少,也使数据库很快。
SQLite不仅小、快,而且简单、可靠,这是它受欢迎的主要原因。对于嵌入式场合,管理、执行、维护的简单化比企业数据库引擎提供的许多复杂应用更重要,因此SQLite数据库是一个很好的选择。
2 电梯嵌入式B/S监控系统" title="监控系统">监控系统的整体结构
本监控系统分为两层:嵌入式终端、远方楼宇中心或电梯公司的监测中心。监控软件的主要功能是:与电梯通信接口通信,采集电梯运行状态和故障数据并存入数据库;对故障报警优先处理,自动发短信至维保人员手机,并将现场数据实时存入数据库,以便进一步故障分析和统计。数据库成为连接前后台的中间件,存储状态数据供B/S远程监控和本地LCD显示,同时接收浏览器和本地键盘输入,由通信程序、CGI程序完成控制命令的下传及运行状态的上传;同时数据库还实现故障的分析统计和查询。软件程序主要分为四个模块:与电梯接口的CAN/RS485通信程序,GPRS故障报警程序,本地的人机交互程序,远程B/S监控程序。
3 嵌入式数据库SQLite的应用
3.1 SQLite的C语言API函数
嵌入式数据库SQLite的C语言API以下面三个核心函数为基础:
sqlite*sqlite_open(const char*dbname,int mode,char**errmsg);
void sqlite_close(sqlite*db);
int sqlite_exec(sqlite*db,char*sql,int(*Callback)(void*,int,char**,char**),void*parg,char**errmsg);
其中,前两个函数用于打开与关闭数据库,sqlite_exec函数用来处理SQL查询,它含有五个参数:
(1)调用sqlite_open函数获得的数据库结构的指针。
(2)容纳了一个或更多SQL语句的字符串。
(3)指向Callback函数的指针,查询结果的每一条记录都调用该函数。
(4)成为Callback函数第一个参数的指针。
(5)指向错误串的指针。
其中,Callback函数由用户编写,用来接收查询结果,查询结果的每一条记录都会调用Callback函数一次,其原型为:
int Callback(void*pArg,int argc,char**argv,char**
columnNames)
{return 0;
}
其中,第一个参数接收客户代码的任意信息;第二个参数是字段数;第三个参数是一个字符串数组,每一个串是记录的一个字段值;第四个参数是字段名。Callback函数是用户根据应用编写的,正常应返回0。如果Callback函数非0,则查询失败。
此外,一些扩展的API提供了有用的接口函数。这里着重介绍sqlite_exec_printf( )。
int sqlite_exec_printf(sqlite*,char*sql,int(*)(void*,
int,char**,char**),void*,char**errmsg,……);
它与sqlite_exe一样执行同样的查询功能,但采用printf-style格式的字符串代替完整的SQL语句。作为第二个参数,这个格式串产生SQL语句,并且在函数结尾可以绑定任意参数。使用sqlite_exec_printf函数的好处是:(1)sqlite_exec_printf为了容纳产生的SQL语句,通常会分配足够的缓存,因此不会产生静态缓存溢出的危险;(2)扩展了%Q和%q两个新格式以支持SQL中的串值。
3.2 SQLite在电梯监控中的应用
在电梯的B/S监控中,电梯的运行状态需要在浏览器端实时显示,实时记录故障信息,并能统计查询,同时通过客户浏览器进行一些控制和参数设置。因此对数据库的访问有上端的以太网通信程序和下端的CAN/RS485通信程序。这里着重讨论以太网通信程序。下面以电梯故障查询中CGI程序访问数据库为例说明SQLite数据库Callback函数、API函数的用法。Callback函数编写如下:
int fault_dis(void*p_data,int fields_count,char**
p_fields,char**p_columnN)
{
int *p=malloc(sizeof(int));
p=(int*)p_data;(*p)++;
printf(″<tr>n″);
printf(″<td><div align=″center″><span class=″style7″> %s </span></div></td>n″,p_fields[0]);
printf(″<td class=″style7″><div align=″center″>%s</div></td>n″,p_fields[1]);
printf(″<td height=″58″><div align=″center″ class=″style7″>%s</div></td>n″,p_fields[2]);
printf(″<td><div align=″center″class=″style7″>%s</div></td>n″,p_fields[3]);
printf(″<td><div align=″center″class=″style7″>%s</div></td>n″,p_fields[4]);
printf(″</tr>n″);
return 0;
}
C语言编制的CGI程序中用SQLite的API函数调用Callback函数的关键语句为:
int*precs=malloc(sizeof(int));
char**errmsg=malloc(100);
char*q0=malloc(10);
……
sqlite*p_elevator=sqlite_open(″elevator″,777,0);
/*打开数据库*/
sqlite_exec_printf(p_elevator,″select*from faultinfo where 电梯号=′%s′;″,fault_dis,precs,errmsg,q0);
/*调用Callback函数fault_dis,*/
……
sqlite_close(p_elevator)/*关闭数据库*/
free(precs);
free(errmsg);
free(q0);
4 运行测试
本监控终端的硬件核心板采用华恒公司的HHARM2410-K1,包括CPU模块、Flash、SDRAM存储部分。底板主要包括LCD及键盘、CAN/RS485通信模块、以太网控制芯片、GPRS模块等。核心板CPU采用三星公司2410芯片。2410芯片基于ARM920T内核,ARM920T核由ARM9TDMI、存储管理单元MMU和高速缓存三部分组成,运行频率可达203MHz。MMU管理虚拟内存,实现虚拟地址物理地址的转换。与μCLinux相比, 在ARM-Linux下可简单地开发更强大的嵌入式程序。CAN总线通信芯片采用Microchip公司的MCP2510。它支持CAN2.0A、CAN2.0B两种模式,与CAN总线通信能力更强。与国内常用的SJA1000相比,MCP2510数据吞吐率高,使用简单。
从www.sqlite.org下载源代码包,本文选择sqlite-2.8.16并移植到ARM平台。移植时采用armv4l-unknown-linux编译工具。移植时,在环境变量中要加入工具链的路径,否则,即使Makefile文件指定绝对路径,make时也会报错。若采用静态链接,strip过的库,也可以使一个CGI程序达600KB,而采用动态链接只有十几KB。为了使CGI程序不太大,采用了动态链接。Web Server选用boa,它支持认证及CGI,源码开放易于移植,适合嵌入式应用。用CGI应用程序制作ramdisks映像,通过tftp下载烧写到板子上,设置目标板的静态IP为202.196.9.16,在宿主机上通过浏览器访问目标板,CGI程序能正常访问数据库,监控界面运行正常。调试时要注意几个问题:(1)库要烧写到板子上,否则即使调试好的程序在用nfs调试时,浏览器仍会报错;(2)要根据boa.conf文件放置好CGI程序和HTML文件路径;(3)调试时注意权限;(4)sqlite.so、sqlite.so.0、sqlite.so.0.8.6要放入板子/lib目录。
嵌入式数据库SQLite在电梯远程监控中的应用,实现了电梯的嵌入式B/S监控,符合监控系统e网到底、成本低廉、界面友好、升级维护方便的趋势,对于设备的嵌入式网络化远程监控和故障诊断具有重要的意义。同时为Web Services技术在工控领域的应用奠定了基础。
参考文献
1 李建中.日新月异的数据库研究领域——数据库技术的回顾与展望[J].计算机应用与软件,2003;(11)
2 宗 群,王宇波,李爱国.CAN总线在电梯远程监控中的应用[J].制造业自动化,2004;26(7)
3 周文瑜.基于网络技术的电梯远程监测系统——监测中心及楼宇子系统软件设计.中国优秀硕博论文全文数据库.北京:清华大学,2004
4 Edmund X..Dejesus/苏欣.嵌入式数据库[J].中文信息,1999;Z1:90~94