一、移植前准备工作

1、下载源码、解压:

https://sqlite.org/download.html 中的 Source Code 下的sqlite-autoconf-3350400.tar.gz;

tar –zxvf sqlite-autoconf-3210000.tar.gz  解压成  sqlite-autoconf-3350400。

2、开发环境搭建

(1)在sqlite-autoconf-3350400平级处创建文件夹build,再进入sqlite-autoconf-3350400中

./configure  --host=(如果SQLite移植到pc直接删除该项,会默认为gcc,移植到开发板的话填写使用的交叉编译工具,如下:./configure  --host=arm-linux-gnueabihf  --prefix=/home/linbo/linux/nfs/sqlite3_Arm/build)--prefix=/home/linbo/linux/nfs/sqlite3/build(存放最后配置文件的位置)

linbo@linbo:~/linux/nfs/sqlite3$ ls
sqlite-autoconf-3350400
linbo@linbo:~/linux/nfs/sqlite3$ mkdir build
linbo@linbo:~/linux/nfs/sqlite3$ ls
build  sqlite-autoconf-3350400
linbo@linbo:~/linux/nfs/sqlite3$ cd build
linbo@linbo:~/linux/nfs/sqlite3/build$ pwd
/home/linbo/linux/nfs/sqlite3/build
linbo@linbo:~/linux/nfs/sqlite3/build$

注意:上述步骤如果出现错误,按以下步骤解决:

  • sudo apt-get install libtool
  • sudo apt-get install libtool-ltdl
  • sudo apt-get install libtool-ltdl-devel

然后将/usr/share/libtool/build-aux/config.guess 拷贝到sqlite-autoconf-3350400中;

/usr/share/libtool/build-aux/config.sub也拷贝到sqlite-autoconf-3350400中。

路径有可能随系统改变,可以使用以下命令查找出路径拷贝:

sudo find / -name config.guess
sudo find / -name config.sub

(2)执行sudo make编译并使用make install 安装,成功之后在build下面,生成以下四个文件夹

linbo@linbo:~/linux/nfs/sqlite3/sqlite-autoconf-3350400$ cd ../build/
linbo@linbo:~/linux/nfs/sqlite3/build$ ls
bin  include  lib  share
linbo@linbo:~/linux/nfs/sqlite3/build$

bin文件夹中的文件是数据库的服务:sqlite3,拷贝至/bin中。

lib文件夹中的文件是需要用到的静态库和动态库,拷贝至/lib中。

3、验证成功

任意路径下输入sqlite3出现下图界面代表成功

linbo@linbo:~/linux/nfs/sqlite3/build/bin$ sqlite3
SQLite version 3.35.4 2021-04-02 15:20:15
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite>

二、网关表数据结构设计

sqlite3 DB_gateway.db (数据库名称:DB_gateway.db)

1、登录信息 (表名称:TABLE_login)

账号、密码
CREATE TABLE TABLE_login(ID INTEGER PRIMARY KEY,login_account TEXT, login_password TEXT);

2、云平台服务器(表名称:TABLE_cloud)

域名地址、服务器端口、用户名、密码

CREATE TABLE TABLE_cloud(ID INTEGER PRIMARY KEY,cloud_domain TEXT, cloud_port INTEGER,cloud_account TEXT,cloud_password TEXT );

3、NTP服务器配置(表名称:TABLE_NTP)

域名地址、端口

CREATE TABLE TABLE_NTP(ID INTEGER PRIMARY KEY,ntp_domain TEXT, ntp_port INTEGER);

4、串口参数:(表名称:TABLE_serial)

串口名称、开/关、波特率、有效数据位个数、停止位个数、奇偶校验方式
CREATE TABLE TABLE_serial(ID INTEGER PRIMARY KEY,serial_name TEXT,serial_switch INTEGER,serial_baudrate INTEGER,serial_date INTEGER,serial_stop INTEGER,serial_parity TEXT);

5、子设备(modbus+CAN):(表名称:TABLE_device)

在线/不在线、设备名、驱动、端口、地址码
CREATE TABLE TABLE_device(ID INTEGER PRIMARY KEY,device_line INTEGER,device_name TEXT,device_driver TEXT,device_port TEXT,device_id INTEGER);

6、CAN配置信息:(表名称:TABLE_CAN)

CAN名称、开/关、波特率、过滤使能
CREATE TABLE TABLE_CAN(ID INTEGER PRIMARY KEY,can_name TEXT,can_switch INTEGER,can_baudrate INTEGER,can_filt INTEGER);

7、CAN 子设备 (表名称:TABLE_device)

在线/不在线、设备名称、驱动、端口、地址码
同5子设备,子设备包含modbus和CAN

8、固件版本号:(表名称:TABLE_version)
版本号
CREATE TABLE TABLE_version(ID INTEGER PRIMARY KEY,version TEXT);

9、以太网:(表名称:TABLE_ETH)

dhcp开关、ip、netmask、gateway
CREATE TABLE TABLE_ETH(ID INTEGER PRIMARY KEY,dhcp INTEGER,ip TEXT,netmask TEXT,gateway TEXT);

三、SQL常用指令

注:每个命令以 ;结束,命令中type为数据类型,有如下类型:NULL、INTEGER、REAL、TEXT、BLOB,若未指定类型,默认是字符串,为TEXT类型。

  • 创建新表:                             sqlite > create table <table_name> (f1 type1, f2type2,...);
  • 删除表:                                sqlite > drop table <table_name>;
  • 查询表中所有记录:              sqlite >select * from<table_name>;
  • 按指定条件查询表中记录:  sqlite >select * from <table_name>where <expression>;
  • 向表中添加新纪录:              sqlite >insert into <table_name>values(value1,value2,...);
  • 按指定的条件删除表中记录:sqlite >delete from <table_name>where <expression>;
  • 更新表中记录:                      sqlite > updata <table_name> set<f1=value1>,<f2=value2>... where <expression>;
  • 在表中添加字段:                  sqlite > alter table <table> addcolumn <field><type> defalut... ;

四、sqlite3编程接口

1. 函数原型:int   sqlite3_open(char  *path,  sqlite3 **db);

功能:打开数据库

参数:  char  *path:   数据库的名字

sqlite3 **db:   数据库句柄

返回值:成功返回0,失败返回错误码(非零值)

2. 函数原型:int   sqlite3_close(sqlite3*db);

功能:   关掉数据库

返回值:成功返回0,失败返回错误码

3. 函数原型:const  char  *sqlite3_errmsg(sqlite3 *db);

功能:提取错误信息

4. 函数原型:int   sqlite3_exec(sqlite3 *db, const  char *sql,  sqlite3_callback callback,void *,  char **errmsg);

功能:  执行一条sqlite3的语句

参数:  sqlite3 *db

char  *sql:   sql命令语句

sqlite3_callbackcallback:  回调函数,如果命令带有返回信息,就会调用该函数

void * : 给回调函数传递参数

char**errmsg :   错误信息

返回值:成功返回0,失败返回错误码

5. 函数原型:typedef  int (*sqlite3_callback) (void *para, int f_num, char **f_value,char **f_name);

功能:每找到一条记录自动执行一次回调函数

参数:para:传递给回调函数的参数

f_num:记录中包含的字段数目

f_value:包含每个字段值的指针数组

f_name:包含每个字段名称的指针数组

返回值:成功返回0,失败返回-1

6. 函数原型:int   sqlite3_get_table(sqlite3*db, const  char  *sql, char ***resultp,  int*nrow,  int *ncolumn, char **errmsg);

功能:执行SQL操作,会把所有的结果一次性返回给我们,而sqlite3_callback函数返回多次

参数:db:  数据库句柄

*sql: sql命令语句

resultp: 用来指向sql执行结果的指针,所有结果还包括标题

nrow : 满足条件的记录的数目,比如记录12345、‘wang’、‘m’、24算一个

ncolumn:每条记录包含的字段数目,比如sno、sname等

errmsg:错误信息指针的地址

返回值:成功返回0,失败返回错误码

五、代码编写

#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"
#include "sqlite3_api.h"#define _DEBUG_int main(int argc,char *argv[])
{sqlite3 *db = NULL;char *zErrMsg = 0;int rc;char *sql;rc = sqlite3_open("DB_gateway.db", &db);     //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件if(rc){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 0;}printf("You have opened DB_gateway.db successfully!\n");//创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中char *sql1[MAX_TABLE_NUM] = {"CREATE TABLE TABLE_login(\ID INTEGER PRIMARY KEY,\login_account TEXT, \login_password TEXT);","CREATE TABLE TABLE_cloud(\ID INTEGER PRIMARY KEY,\cloud_domain TEXT,\cloud_port INTEGER,\cloud_account TEXT,\cloud_password TEXT);","CREATE TABLE TABLE_NTP(\ID INTEGER PRIMARY KEY,\ntp_domain TEXT,\ntp_port INTEGER);","CREATE TABLE TABLE_serial(\ID INTEGER PRIMARY KEY,\serial_name TEXT,\serial_switch INTEGER,\serial_baudrate INTEGER,\serial_date INTEGER,\serial_stop INTEGER,\serial_parity TEXT);","CREATE TABLE TABLE_device(\ID INTEGER PRIMARY KEY,\device_line INTEGER,\device_name TEXT,\device_driver TEXT,\device_port TEXT,\device_id INTEGER);","CREATE TABLE TABLE_CAN(\ID INTEGER PRIMARY KEY,\can_name TEXT,\can_switch INTEGER,\can_baudrate INTEGER,\can_filt INTEGER);","CREATE TABLE TABLE_version(\ID INTEGER PRIMARY KEY,\version TEXT);","CREATE TABLE TABLE_ETH(\ID INTEGER PRIMARY KEY,\dhcp INTEGER,\ip TEXT,\netmask TEXT,\gateway TEXT);"}; for(int i=0;i<MAX_TABLE_NUM;i++){sqlite3_exec(db,sql1[i],0,0,&zErrMsg);#ifdef _DEBUG_printf("zErrMsg = %s \n", zErrMsg);#endif}if(NULL == zErrMsg){//插入默认数据sql = "INSERT INTO \"TABLE_login\" VALUES(NULL ,'admin', 'admin');" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"TABLE_cloud\" VALUES(NULL ,'www.baidu.com', 8000 , 'admin', 'admin');" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"TABLE_NTP\" VALUES(NULL , 'www.baidu.com', 9000);" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"TABLE_serial\" VALUES(NULL , 'RS485_1' , 1 , 9600, 8,1,'N');" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"TABLE_serial\" VALUES(NULL , 'RS485_2' , 1 , 9600, 8,1,'N');" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"TABLE_serial\" VALUES(NULL , 'RS485_3' , 1 , 9600, 8,1,'N');" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"TABLE_serial\" VALUES(NULL , 'RS485_4' , 1 , 9600, 8,1,'N');" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );// sql = "INSERT INTO \"TABLE_device\" VALUES(NULL , 34 , 45 , '200605011306', 15.4 );" ;// sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"TABLE_CAN\" VALUES(NULL , 'CAN_1', 1 , 10000, 1 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"TABLE_version\" VALUES(NULL , 'VERSION_1.1' );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"TABLE_ETH\" VALUES(NULL , 1 , '192.168.1.100' , '255.255.255.0', '192.168.1.1');" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );printf("zErrMsg is NULL!! \n");}else{printf("zErrMsg is had!! \n");}int nrow = 0, ncolumn = 0;char **azResult; //二维数组存放结果//查询数据sql = "SELECT * FROM TABLE_ETH ";sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );int i = 0 ;printf( "row:%d column=%d \n" , nrow , ncolumn);printf( "\nThe result of querying is : \n" );for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )printf( "azResult[%d] = %s\n", i , azResult[i] );//删除数据sql = "DELETE FROM TABLE_ETH WHERE ID = 1 ;" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );#ifdef _DEBUG_printf("zErrMsg = %s \n", zErrMsg);#endifsql = "SELECT * FROM TABLE_ETH ";sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );printf( "\n\n\n\nrow:%d column=%d " , nrow , ncolumn );printf( "\nAfter deleting , the result of querying is : \n" );for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )printf( "azResult[%d] = %s\n", i , azResult[i] );//释放掉 azResult 的内存空间sqlite3_free_table( azResult);#ifdef _DEBUG_printf("zErrMsg = %s \n", zErrMsg);#endifsqlite3_close(db); //关闭数据库return 0;}

数据库SQLite之嵌入式Linux实际网关项目使用初步相关推荐

  1. kotlin能用嵌入式linux,Kotlin在项目中的应用和踩过的坑

    应用 空类型安全 Kotlin引入了可空类型(用?标识),在编译期杜绝了可空类型直接调用方法的可能. var a: String = "abc" a = null // 编译错误 ...

  2. Linux网络编程小项目sqlite,嵌入式数据库sqlite

    *************************************** * 嵌入式数据库sqlite在LPC22XX上的应用 * ******************************* ...

  3. 基于Linux下嵌入式网关,基于嵌入式Linux系统的无线网络网关设计

    嵌入式网关.嵌入式web服务器(boa).嵌入式sqlite数据库.通用网关接口 1.概述 传统网关在功能上主要完成协议转换及部分系统管理功能,而采用嵌入式无线网关作为无线网络设备接入有线网络的接入部 ...

  4. 嵌入式Linux中使用SQLite3数据库

    嵌入式Linux中使用SQLite3数据库 SQLite3是一款轻量级的文件型数据库,非常适合嵌入式环境下使用,最近搞的Linux嵌入式项目中需要用到这款数据库,就研究了一下怎么在嵌入式Linux中使 ...

  5. 飞信Fetion历史数据库研究(History.dat)——嵌入式数据库SQLite介绍(转)

    最近使用飞信,但发现不能将历史消息像QQ消息那样导出,感觉很不爽. 当在飞信中设置(操作–选项–个人设置–消息历史)了保存历史消息之后,飞信的历史消息数据保存的路径如下: 2008的消息存储路径: v ...

  6. 嵌入式数据库 SQLite 浅析

    SQLite是一个非常轻量级自包含(lightweight and self-contained)的DBMS,它可移植性好,很容易使用,很小,高效而且可靠.SQLite嵌入到使用它的应用程序中,它们共 ...

  7. C语言到嵌入式Linux开发项目指导

    C语言到嵌入式Linux开发项目指导 第一阶段C语言 1.常量与变量,数据类型,数据类型转换,数据输入与输出: 2.C语言运算符,C语言操作符,C语言表达式,表达式优先级: 3.C语言流程控制,分支, ...

  8. 嵌入式linux python移植过程_嵌入式linux项目开发(一)——BOA移植

    嵌入式linux项目开发(一)--BOA移植 项目目标:使用BOA.CGIC.SQLite搭建嵌入式web服务器 一.嵌入式web服务器BOA简介 在嵌入式设备的管理与交互中,基于Web方式的应用成为 ...

  9. 嵌入式数据库SQLite的编译、安装和使用[ZT]

    嵌入式数据库SQLite的编译.安装和使用 下文介绍的内容都是基于 RedHat Linux 9.0 平台的. 引言:sqlite简介 sqlite是嵌入式SQL数据库引擎SQLite(SQLite ...

  10. 【嵌入式实验】《嵌入式数据库 sqlite 移植及使用》

    嵌入式数据库 sqlite 移植及使用 一.实验目的 二.实验内容 三.预备知识 四.实验设备及工具(包括软件调试工具) 五.实验步骤 实验一:移植嵌入式数据库 sqlite 1~5:安装 sqlit ...

最新文章

  1. ssl java 客户端_Java SSL生成客户端和服务端crt文件
  2. 参加第十一届开源黑客松大会有感:
  3. linux 中mmap的用法
  4. linux compress tar,Linux命令:压缩指令(compress,uncompress,gzip,gunzip,tar)
  5. java 创建文件夹的方法_Java创建文件夹的方法
  6. 机房系统(七)——【报表】
  7. 第一章、第一节 Angular基础
  8. python 读取元组对的key_Python基本认识基本类型
  9. php设计模式实战之--观察者模式
  10. Kettle8.2输入组件之Get data from xml
  11. 三星Cortex-A53八核6818核心板
  12. Datawhale组队学习周报(第043周)
  13. 雷锋科普:联发科MT6577,国产平民双核手机的芯
  14. 使用python将图片改为灰度图或黑白图
  15. Python简单爬取蚂蚁窝首页的图片
  16. linux skb 存放数据,请教关于在linux网络驱动层对skb网络数据..._网络编辑_帮考网...
  17. 计算机毕业设计系列基于SSM的养老保险管理系统
  18. 一个view事件分发,面试官6连问直击灵魂,我被虐的体无完肤
  19. 58 mysql 军规_58到家MySQL军规升级版(转)
  20. 机器学习——关联规则

热门文章

  1. 卷毛机器人抢大龙_EDG卷毛宣布退役:感谢WE和EDG的培养
  2. EDG获得S11冠军
  3. CH340G常见故障的处理
  4. 推荐几款好用的云笔记软件
  5. axios的并发请求和 排队请求
  6. Linux软件安装包保存
  7. 华为往事(十八)--CC08 STP:华为抢占制高点
  8. react 录制音频_如何在React Native中录制音频
  9. mac chrome更新错误12
  10. Incremental Event Detection via Knowledge Consolidation Networks