查看: 2744|回复: 1

【EVB-335X-II】QT远程访问MySql数据库

[复制链接]
  • TA的每日心情
    难过
    2021-2-27 22:16
  • 签到天数: 1568 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2018-1-16 21:18:17 | 显示全部楼层 |阅读模式
    分享到:
    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
    执行结果如图所示:

    1.png

    3)配置MySql
    cd mysql-5.1.70_pc
    ./configure -prefix=/usr/local/mysql-pc
    4)编译与安装
    执行命令:
    make
    sudo make install
    编译、安装结果如图所示:

    2.png

    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
    配置、编译、安装结果如图所示:

    3.png

    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
    命令执行结果如图所示:

    4.png

    2)修改configure文件
    cd mysql-5.1.70_arm
    在configure文件下找到如下图所示相关代码,注释掉蓝色部分。该文件中共有4处。千万别缺,否则编译会出错了,找到4处相同的.修改后保存退出。

    5.png

    主要上述代码中的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
    如图所示:

    6.png

    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
    需要拷贝的文件如图所示:

    7.png

    拷贝到NFS共享目录,如图所示:

    8.png

    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
    注释掉下图所示的行:

    9.png

    执行如下命令:
    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
    如图所示:

    10.png

    关于如何建立数据库、建立数据库表等操作,请参考我的Nanopi M2的相关试用报告。
    在MySql数据库中创建一个名为test_db1的数据库。
    6. 开发基于QT的MySql程序
    启动qtcreator,创建mysql_test工程,如图所示:

    11.png

    设置工程如图所示:

    12.png

    编写代码如图所示:

    21.png

    源码如下:
    #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();
    }
    程序编译结果如图所示:

    22.png

    执行命令,将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
    运行效果如图所示:

    23.png

    系统提示我们远程连接成功,并且打开数据库成功。
    点击“OK”按钮后,QT软件开始建表、插入数据、查询数据、以及显示数据,效果如图所示:

    24.png

    8. 小结
    经过前后9个小时努力,终于完成了在嵌入式ARM板运行的QT+MySql程序,并且实现了EVB-335X-II对远程数据库服务器的访问,使得我们的EVB-335X-II真正的成为了车间级的数据中转服务器。在移植的过程中,出现了很多预想不到的错误,由于一些疏忽,走了不少弯路,不管怎么说,远程MySql上层应用程序可以运行了,从18点开始移植,到测试结束,已是凌晨3点31分,虽然很累、很困,但是移植成功的收获还是值得这些付出的,
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-5-10 14:30
  • 签到天数: 6 天

    连续签到: 2 天

    [LV.2]偶尔看看I

    发表于 2018-2-1 11:13:57 | 显示全部楼层
    来学习下~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 07:52 , Processed in 0.169146 second(s), 25 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.