APP下载

SQLite数据库调用系统程序的实现与应用

2016-06-06陈刚侯晓荣

电脑知识与技术 2016年6期
关键词:监控系统嵌入式数据库

陈刚++侯晓荣

摘要:该文对SQLite数据库源码进行了分析、修改和重新编译,为SQLite数据库增加了自定义的内置函数,实现了SQLite对系统程序的调用。基于此,提出采用SQLite数据库对数据进行检测并调用系统中的程序对检测的问题进行处理,适用于嵌入式监控系统中的数据检测和报警问题。该方法利用了数据库对数据进行检测和处理,相比编程的方法,减少了程序员的工作量,方便了大批量数据的管理。

关键词:嵌入式;SQLite;数据库;SQLite;内置函数;监控系统

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)06-0001-02

Implementation and Application of SQLite Calling System Program

CHEN Gang, HOU Xiao-rong

(School of Energy Science and Engineering, University of Electronic Science and Technology of China, Chengdu 611731, China)

Abstract: In this paper,the source code of SQLite is analyzed, modified and recompiled. By this way, a new custom built-in function is added to the SQLite, which enable the SQLite database system to call the system programs. Based on this new function, this paper proposes to use SQLite database for data detection and invoking programs to dealing with detected problems, which is suitable for the data detection and alarm handling problems in the embedded monitoring system. This method utilizes the database technology to detect data and handle alarms, which reduces the workload of the programmer and facilitates large amounts of data management compared with the programming method.

Key words: Embedded System ; SQLite; Database; Built-in Function; Monitoring System

1 引言

在嵌入式数据采集与监控系统中,需要对数据进行定时检测,当数据出现异常时,调用程序进行相应的处理。比如,对一个温度数据采集与监控系统而言,当检测到温度过高时,需要调用系统控制程序降低温度,或者调用程序触发相关告警装置,提醒工作人员处理。一般的,监控系统中数据的检测与处理,都是通过编写程序完成的。但是,当数据量非常大的时候,程序的数据判断和处理工作会非常多,代码量巨大,不方便程序的开发和管理。

针对以上问题,本文通过对SQLite源码进行修改和重新编译,实现了SQLite数据库对系统程序的调用。基于此,提出通过SQLite数据库解决监控系统中的数据检测和处理问题:如图1所示,利用SQLite的触发器对存储的数据进行判断,当数据异常时,触发相关程序进行处理。该方法通过设计数据库触发器检测和处理数据,相比编程的方法,不用编写繁杂的判断处理代码,可以方便大量数据的监控管理。

2 SQLite的原理和开发技术

SQLite是针对嵌入式系统采用ANSIC C语言开发的轻量级开源数据库[1],可以在Windows/Linux/Unix等主流操作系统上稳定运行。SQLite可以支持多种语言对其进行数据操作,比如C/C++语言、Java、PHP等,相对MySQL等著名的开源数据库管理系统而言,它的处理速度更快[2]。SQLite第一个Alpha版本最早由D. Richard Hipp在2000年发布。自发布以来,SQLite不断更新,目前已经更新到SQLite3.11.0版本。SQLite是一个基于文件的数据库,它可以处理所有类型的数据,支持多数的 SQL92 标准。SQLite是一个自包含、零配置的数据库[3]:一个应用程序在使用SQLite的过程中,SQLite功能会被集成在其中,应用程序和SQLite共用相同的进程,而不是单独的一个进程;应用程序会直接访问数据库文件,而不是通过套接字来交互,这使得SQLite快速和高效。由于SQLite可移植性好,体积小且高效的特性,自发布以来,SQLite逐步受到关注,在嵌入式、Android、IOS系统中得到广泛应用。

2.1 SQLite的实现原理

SQLite采用模块化的设计, 主要由四个部分组成:即内核、SQL 编译器、后端以及附件。其中内核和SQL编译器完成SQL语句的接收、提取、执行;而后端负责完成SQL指令与系统的对接进而执行这些指令;附件用于SQLite的附加功能实现[4]。

2.2 SQLite的内置函数

SQLite 有许多内置函数用于数据的处理,所有函数都是大小写不敏感的,可以使用这些函数的小写形式、大写形式或混合形式来调用它们。目前,官方发布的SQLite内置函数一般是用于处理字符串或数字数据的,但是,内置函数的功能不局限于此。我们可以通过增加一个自定义的SQLite的内置函数,使SQLite能够通过该内置函数实现对系统程序的调用。

SQLite内置函数是采用回调的方式实现的:所有内置函数都通过回调函数[5]的定义和注册实现。在SQLite源码中,func.c模块是负责实现内置函数的。SQLite的内置函数(例如count(),substr()函数),都可以在func.c中找到。因此,可以通过在func.c中增加SQLite的回调函数,实现SQLite对外部程序的调用。

3 SQLite实现系统程序调用

目前,官方发布的SQLite数据库不支持对系统程序的调用,这限制了SQLite的使用。因此,本节将根据上述原理,通过在SQLite的func.c模块中定义和注册回调函数,并重新编译SQLite,实现SQLite对系统程序的调用,具体步骤如下所述。

3.1 为SQLite添加内置函数

在SQLite官网上下载sqlite-amalgamation-3090200.zip压缩包,解压后得到shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h四个文件。在Windows下使用Visual Studio 2013修改SQLite源码:

1)在Visual Studio 2013中新建一个空的C++控制台工程,命名为SQLite;依次添加shell.c、sqlite3.c、sqlite3.h、sqlite3ext.h四个文件到SQLite工程中。

2)在SQLite的func.c模块,按照回调接口定义:void (*xFunc)(sqlite3_context*,int,sqlite3_value **),在lowerFunc函数下方,增加回调函数sys_execFunc,实现SQLite对系统程序的调用,具体代码为:

static void lowerFunc(sqlite3_context *context, int argc, sqlite3_value **argv){[…]};//lowerFunc定义

static void sys_execFunc(sqlite3_context *context, int argc, sqlite3_value **argv){

const char *c = (char*)sqlite3_value_text(argv[0]); //获取用户输入的系统命令

if (c){system(c); //执行系统命令

}

3)在lowerFunc函数的注册代码下方,将新增的sys_execFun函数注册为sys_exec。注册代码为: FUNCTION(lower, 1, 0, 0, lowerFunc ) //lowerFunc注册

FUNCTION(sys_exec,1, 0, 0, sys_execFun)

4)至此,如果没有语法错误,项目可以直接编译成功,则代码修改完毕。

3.2 Linux下代码编译及测试

代码修改完成后,可以在Linux系统中对SQLite进行重新编译,实现SQLite对系统程序的调用。实验环境可以为SQLite支持的任意Linux操作系统。为了将问题具体化,这里采用树莓派2代主板(Debian Linux系统)作为实验环境,该主板采用Broadcom BCM2836 900MHz ARM Cortex-A7 四核处理器,具有1G的运行内存,可以满足实验要求。

参考SQLite官网和文献[6],对修改后的代码在Linux下重新编译。首先,在SQLite官网上下载sqlite-autoconf-3090200.tar.gz压缩包,Linux下解压后得到sqlite3.c、sqlite3.h等一系列文件。将其中的sqlite3.c文件替换为之前修改过的sqlite3.c文件。然后依次按照如下的步骤,在Linux系统中编译程序:

1)进入SQLite源码目录,对软件进行系统配置,即运行命令:

~$ sudo ./configure

2)编译程序,等待程序生成,即运行命令:

~$ sudo make

3)程序编译完成后,安装生成的sqlite3程序,即运行命令:

~$ sudo make install

最后,通过以上操作,SQLite新增了一个名为sys_exec的内置函数。我们可以对新增的sys_exec内置函数进行测试。例如:输入命令select sys_exec(‘pwd),控制台将输出当前目录;输入命令select sys_exec(‘ls),控制台将输出当前目录下的文件夹和文件。

4 SQLite实现数据自检与处理

SQLite的数据自检与处理可以通过触发器实现。SQLite的触发器是数据库的回调函数,它会在指定的数据库事件发生时自动执行。SQLite触发器支持的触发操作有:DELETE(删除)、INSERT(插入) 和 UPDATE(更新),即SQLite支持在数据库表发生删除、插入和更新操作之前或之后,触发事先定义的操作。

利用SQLite实现数据自检和处理的一般方法为:为数据库表创建一个UPDATE触发器,通过SELECT语句和WHERE语句结合使用,实现对数据表的自检和处理。这样,当数据更新后,触发器通过WHERE子句定位到更新的数据,并对数据进行判断,如果监测到异常,然后通过SELECT语句调用SYS_EXEC内置函数执行指定的外部程序,从而实现SQLite对数据库数据的自检和处理。

5 结束语

本文提出使用SQLite数据库对监控系统的数据进行检测和处理。相比编程的方法,该方法利用了数据库检测异常数据并调用相关程序进行处理,可以完成很繁重的任务,而不必编写繁杂的算法。

参考文献:

[1] 蔡勇,王勇. 嵌入式数据库SQLite在测控系统设计中的应用[J]. 电子测试,2011(10):89-93.

[2] 韩善锋,曹凤海,易昌华. SQLite数据库在嵌入式程序开发中的应用[J]. 物探装备,2011(3):170173+178.

[3] 梁永恩,万世明,翟敏换. SQLite数据库在嵌入式系统中的应用研究[J]. 现代计算机(专版),2015(10):60-62.

[4] 党玉春,翟秀云,陈明通. SQLite系统构架及虚拟机分析[J]. 微型机与应用,2012(10):67-70.

[5] 张海平. C/C++语言中函数指针的深入分析与应用[J]. 电脑编程技巧与维护,2009(22):17-18.

[6] 杨洋. SQLite数据库在嵌入式系统中的应用实践[J]. 柳钢科技,2013(5):41-43.

猜你喜欢

监控系统嵌入式数据库
搭建基于Qt的嵌入式开发平台
嵌入式软PLC在电镀生产流程控制系统中的应用
Altera加入嵌入式视觉联盟
倍福 CX8091嵌入式控制器