TA的每日心情 | 难过 2021-2-27 22:16 |
---|
签到天数: 1568 天 连续签到: 1 天 [LV.Master]伴坛终老
|
QT远程访问MySql数据库(交叉编译MySql QT客户端驱动程序及功能测试)
MySQL是一款非常优秀的、开源、免费的数据库,其查询速度非常快,连续多年排名世界第一。我在Nanopi M2的试用报告中,写过两篇在Linux系统下安装MySQL,可视化配置MySQL,以及采用QT集成开发环境设计开发操作MySQL数据库的程序范例。那个篇报告相对来说还是比较简单的,因为Nanopi M2上运行的是基于Debian的Linux系统,我们可以直接通过apt-get install,安装本地MySQL,并且可以通过apt-get instll安装QT操作MySql的驱动程序。
而对于EVB-335X_II开发板来说,其硬件资源非常有限,只有256MB的Nand Flash,我们很难把一个庞大的MySql安装到EVB-335X-II的运行环境中。还有一个需要认真面对的一个问题是,保存在数据库中数据的稳定性、安全性和一致性。如果我们把EVB-335X-II运行在工业环境中,而数据又保存在开发板的本地存储器中,我们很难保证在恶劣的环境下,开发板能够稳定的运行,如果由于强磁干扰、剧烈震动导致存储器的损坏,我们保存在存储器中的数据库数据将不可恢复。
对于企业级的数据库应用,我们通常采用C/S架构的开发模式,即数据库服务器运行在环境适度的计算机中心机房,而数据采集前端运行在工业现场,数据采集设备通过工业以太网将结合数据库远程驱动程序,将数据写入运行在计算机机房的数据库服务器上。
对于我想通过EVB-335X-II搭建的一个工业级的RFID数据采集系统,为了保证数据的安全性、稳定性,采用业界通用的C/S开发模式。Server端,我采用PC机模拟数据库服务器,即通过Ubuntu虚拟机运行MySql数据库,配置Server端的Mysql数据库支持通过以太网的远程操作;移植能够在EVB-335X-II开发板上运行的MySql远程访问的client端驱动程序;创建一个简单的基于QT的demo,使其运行在EVB-335X-II开发板上,实现将数据远程写入数据库服务器,并远程查询数据数据,将查询结果显示在EVB-335X-II本地QT应用程序界面上。
本主题的试用报告分为两大部分:移植MySql数据库驱动程序到EVB-335X-II;配置数据库服务器、配置EVB-335X-II的系统环境,以及开发QT远程访问数据库服务器的应用程序。
1. 下载必须的软件
下载MySQL的源码包mysql-5.1.70.tar.gz(CSDN有链接);
下载ncurses-5.6.tar.gz
这两个软件包我会以附件的形式提供。
2. 编译能够在PC机运行的MySql
我们编译能够在PC机端运行的Mysql,主要是了为了得到交叉编译时要用的一个文件。
1)将第一节下载的软件源码拷贝到Ubuntu虚拟机;
2)解压MySql源码
tar -zxvf mysql-5.1.70.tar.gz -C/home/vmuser/EVB-335X-II/source
mv mysql-5.1.70 mysql-5.1.70_pc
执行结果如图所示:
3)配置MySql
cd mysql-5.1.70_pc
./configure -prefix=/usr/local/mysql-pc
4)编译与安装
执行命令:
make
sudo make install
编译、安装结果如图所示:
3. 交叉编译ncurses
在交叉编译MySql时,需要用到ncurses的库文件,所以我们提前对其进行编译。
执行命令:
su root
export PATH=$PATH:/opt/gcc-linux/bin (交叉编译链的路径)
tar -zxvf ncurses-5.6.tar.gz
cd ncurses-5.6
./configure -host=arm-linux-gnueabihf-prefix=/usr/local/ncurses -enable-static
make
make install
配置、编译、安装结果如图所示:
4. 交叉编译MySql
1)为ARM再次解压缩MySql源码
执行命令:
tar -zxvf mysql-5.1.70.tar.gz -C/home/vmuser/EVB-335X-II/source
mv mysql-5.1.70 mysql-5.1.70_arm
命令执行结果如图所示:
2)修改configure文件
cd mysql-5.1.70_arm
在configure文件下找到如下图所示相关代码,注释掉蓝色部分。该文件中共有4处。千万别缺,否则编译会出错了,找到4处相同的.修改后保存退出。
主要上述代码中的echo是我们自己加上去的,必须有,否则编译报错。
3) 配置MySql
执行命令:
./configure --host=arm-linux-gnueabihf --enable-static --with-named-curses-libs=/usr/local/ncurses/lib/libncurses.a --prefix=/usr/local/mysql-arm --without-debug --without-docs--without-man --without-bench --with-charset=gb2312--with-extra-charsets=ascii,latin1,utf8
4) 交叉编译MySql
执行编译命令:
make
会提示一个gen_lex_hash相关的错误,我们把第一节中编译的gen_lex_hash文件拷贝到交叉编译目录下,执行如下命令:
cp .../ mysql-5.1.70_pc/sql/gen_lex_hash ./sql/
然后再次执行编译命令:
make
编译过程中再次出错:sql_parse.cc:××××:21: operator '<' has no left operand
××××表示该文件的行号,按照这个行号找到后,在此行的上面,添加一个宏定义:#define STACK_DIRECTION 1
即执行命令:
gedit ./sql/ sql_parse.cc
定位到第XXXX行,在该行的上面输入语句#define STACK_DIRECTION 1,然后保存退出。
继续执行编译命令:
make
编译结束后执行安装命令:
make install
4) 执行命令交叉编译QT4.8.4下的MySql驱动库
我们上一篇试用报告介绍了如何交叉编译QT4.8.4,我进入QT4.8.4的源码目录下:
cd /home/vmuser/EVB-335X-II/source/qt-everywhere-opensource-src-4.8.4/src/plugins/sqldrivers/mysql/
用上一篇交叉编译好的qmake编译MySql驱动:
/opt/qtenv/ QT-4.8.4-arm/bin/qmake "INCLUDEPATH+=/usr/local/mysql-arm/include/mysql""LIBS+=-L/usr/local/mysql-arm/lib/mysql -lmysqlclient_r" mysql.pro
再次执行命令:
make
交叉编译结束后,在QT的如下目录下生成了QT下MySql基于AMR架构的驱动程序,目录如下:
qt-everywhere-opensource-src-4.8.4/plugins/sqldrivers/libqsqlmysql.so
如图所示:
4) 将交叉编译好的库文件拷贝到NFS共享目录
将libsqlmysql.so拷贝到NFS:
cp /home/vmuser/EVB-335X-II/source/qt-everywhere-opensource-src-4.8.4/plugins/sqldrivers/libqsqlmysql.so /nfsshare
将交叉编译的MySql其他库文件拷贝到NFS,文件路径为:
/usr/local/mysql-arm/lib
需要拷贝的文件如图所示:
拷贝到NFS共享目录,如图所示:
5. 配置数据库服务器
我们把Ubuntu虚拟机做为数据库服务器。
1)安装MySql
sudo apt-getinstall mysql-server
在安装过程中需要设定root用户登陆数据库管理系统的密码
apt-get isntallmysql-client
sudo apt-getinstall libmysqlclient-dev
2)安装可视化配置MySql工具
sudo apt-get install mysql-workbench
3)配置Mysql可远程访问
修改文件内容:
gedit /etc/mysql/mycnf
注释掉下图所示的行:
执行如下命令:
mysql -uroot -p
Enter password:
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'sy31214' WITH GRANT OPTION;
mysql>FLUSH PRIVILEGES;
其中sy31214是远程登陆密码,你可以修改成自己定义的密码。
退出Mysql,重启MySql:
sudoservice mysql restart
4)启动可是化Mysql配置工具
./mysql-workbench
如图所示:
关于如何建立数据库、建立数据库表等操作,请参考我的Nanopi M2的相关试用报告。
在MySql数据库中创建一个名为test_db1的数据库。
6. 开发基于QT的MySql程序
启动qtcreator,创建mysql_test工程,如图所示:
设置工程如图所示:
编写代码如图所示:
源码如下:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QtSql/QSqlDatabase>
#include <QtSql/QSqlDriver>
#include <QtSql/QSqlQuery>
#include <QtSql/QSqlQueryModel>
#include <QTableView>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QSqlDatabase db =QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("192.168.1.102"); //远程主机IP地址
db.setDatabaseName("test_db1"); //通过mysql-workbench创建一个数据库
db.setUserName("root");
db.setPassword("sy31214"); //根据你自己设置远程登陆的密码修改
if(!db.open())
QMessageBox::information(this,tr("worning"),tr("Opendatabase failed!"));
else
QMessageBox::information(this,tr("worning"),tr("Opendatabase succeed!"));
QSqlQueryquery;
query.exec("create table hello(id bigint not nullauto_increment,name varchar(255),age bigint,primary key (id))");
query.exec("insert intohello(name, age) values('xiaoxi', 18)");
query.exec("insert into hello(name, age) values('xiaonan',19)");
query.exec("insert into hello(name, age) values('xiaobei',20)");
query.exec("insert into hello(name, age) values('xiaodong',21)");
QSqlQueryModel *model = new QSqlQueryModel;
model->setQuery("select * from hello");
model->setHeaderData(0,Qt::Horizontal, "id");
model->setHeaderData(1, Qt::Horizontal, "name");
model->setHeaderData(2, Qt::Horizontal, "age");
QTableView *view = new QTableView(this);
view->resize(400,200);
view->setWindowTitle("QSqlQueryModel");
view->setModel(model);
view->show();
db.close();
}
程序编译结果如图所示:
执行命令,将mysql_test拷贝到NFS共享目录:
cd mysql_test /nfsshare
7. 将Mysql移植到EVB-335X-II
1) 给开发板上电拷贝文件
开发板上电后,执行命令:
ifconfig eth0 192.168.1.112
mount -t nfs 192.168.1.102:/nfsshare /mnt -o nolock
2)拷贝QT MySql驱动以及Mysql客户端库文件到QT的plugins目录
cp /mnt/libsqlmysql.so /usr/lib/qt/plugins/sqldrivers
cp /mnt/libmysql* /usr/lib/qt/plugins/sqldrivers
3)设置加载MySql库的路径环境变量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/qt/plugins/sqldrivers
4)执行程序
cd /mnt
./mysql_test
运行效果如图所示:
系统提示我们远程连接成功,并且打开数据库成功。
点击“OK”按钮后,QT软件开始建表、插入数据、查询数据、以及显示数据,效果如图所示:
8. 小结
经过前后9个小时努力,终于完成了在嵌入式ARM板运行的QT+MySql程序,并且实现了EVB-335X-II对远程数据库服务器的访问,使得我们的EVB-335X-II真正的成为了车间级的数据中转服务器。在移植的过程中,出现了很多预想不到的错误,由于一些疏忽,走了不少弯路,不管怎么说,远程MySql上层应用程序可以运行了,从18点开始移植,到测试结束,已是凌晨3点31分,虽然很累、很困,但是移植成功的收获还是值得这些付出的,
|
|