Qt上位机开发之如何让自己的APP启动与硬件信息绑定(Win端)

简介: Qt上位机开发之如何让自己的APP启动与硬件信息绑定(Win端)

在工作中,为了方便项目调试,一般情况下我们都会选择开发一个上位机来实现简单的控制和数据读取的功能;但是,这个工具仅限于研发人员使用。为了防止别有用心的测试或者其它人员将这个APP通过U盘的形式拷贝走然后到另外一台电脑上运行,我们可以有以下两种简单的设计方案(以下内容默认用户已了解QT上位机开发,故屏蔽许多细节):


(1)设计一个简单的输入密码逻辑,当输入密码与自己设定的密码匹配时,即进入软件界面。这种方法比较简单,也很容易被破解。


(2)提前通过另外一个软件读取本机的硬件信息(我们称之为注册机),然后通过某种编码格式将该信息编码为其它的格式并生成一个文件(将该文件放到系统较为隐蔽的目录下)。当我们使用的APP打开时,按照约定格式打开并将该文件里的数据转换为硬件信息,然后进行匹配,如果发现没有该文件或者硬件信息不匹配,则提示软件未注册,否则,正常打开该软件。


第一种方法比较简单,初学QT应用编程的小白都可以很容易将它实现,我们就不多说了。我们重点来讲解一下第二种方法的实现。


以下几个命令可以在Window cmd上运行即可以看到对应的信息:

获取cpu名称
wmic cpu get Name
获取cpu核心数
wmic cpu get NumberOfCores
获取cpu线程数
wmic cpu get NumberOfLogicalProcessors
查询cpu序列号
wmic cpu get processorid
查询主板序列号
wmic baseboard get serialnumber
查询BIOS序列号
wmic bios get serialnumber
查看硬盘
wmic diskdrive get serialnumber

这是我的电脑硬件信息:

640.png

其中,CPU序列号是一个唯一的ID号,它是厂家在制造CPU的时候烧入到内部的。我在工作中主要使用这个来进行加密,当然你也可以使用其它的内容。下来我们可以实现一个简单的注册机逻辑:


  • 实现获取硬件信息接口
  • 将硬件信息经过Base64格式转换
  • 显示Base64格式转换为的结果
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
//获取cpu名称:wmic cpu get Name
//获取cpu核心数:wmic cpu get NumberOfCores
//获取cpu线程数:wmic cpu get NumberOfLogicalProcessors
//查询cpu序列号:wmic cpu get processorid
//查询主板序列号:wmic baseboard get serialnumber
//查询BIOS序列号:wmic bios get serialnumber
//查看硬盘:wmic diskdrive get serialnumber
QString MainWindow::getMachineInfo(const QString &cmd)
{
    QProcess p;
    p.start(cmd);
    p.waitForFinished();
    QString result = QString::fromLocal8Bit(p.readAllStandardOutput());
    QStringList list = cmd.split(" ");
    result = result.remove(list.last(), Qt::CaseInsensitive);
    result = result.replace("\r", "");
    result = result.replace("\n", "");
    result = result.simplified();
    return result;
}
QByteArray MainWindow::Encode(QByteArray data)
{
    return data.toBase64();
}
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setWindowTitle("注册机");
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::on_GenerateCode_clicked()
{
    QString Code = getMachineInfo("wmic cpu get processorid");
    QFile file("D:/Register.txt");
    //打开文件,不存在则创建
    file.open(QIODevice::ReadWrite | QIODevice::Text);
    //写入文件需要字符串为QByteArray格式
    if(file.write(Encode(Code.toLatin1())) > 0)
    {
        ui->CodeDisplay->setText(Encode(Code.toLatin1()));
        QMessageBox::information(NULL, "提示", "注册成功", QMessageBox::Ok);
    }
    else
        QMessageBox::information(NULL, "提示", "注册失败", QMessageBox::Ok);
    file.close();
}

编译运行后,当我们点击生成注册码时,则会显示硬件信息通过Base64编码的结果,如下所示:

640.png

640.png

一个简单的注册机写完以后,APP在加载运行的时候需要加上以下逻辑:

#include "mainwindow.h"
#include <QApplication>
#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
QString getMachineInfo(const QString &cmd)
{
    QProcess p;
    p.start(cmd);
    p.waitForFinished();
    QString result = QString::fromLocal8Bit(p.readAllStandardOutput());
    QStringList list = cmd.split(" ");
    result = result.remove(list.last(), Qt::CaseInsensitive);
    result = result.replace("\r", "");
    result = result.replace("\n", "");
    result = result.simplified();
    return result;
}
int main(int argc, char *argv[])
{
    uint8_t RunFlag = 0;
    QByteArray DecodeStr;
    QString CpuSerialNumber;
    QApplication a(argc, argv);
    //1.获取CPU序列号
    CpuSerialNumber = getMachineInfo("wmic cpu get processorid");
    //2.打开注册码文件,读取加密字符串并进行匹配加密字符串
    QFile file("D:/Register.txt");
    if(!file.open(QIODevice::ReadOnly))
    {
        QMessageBox::warning(NULL, "Error", "注册码不存在,请导入注册码!",QMessageBox::Yes);
        return -1;
    }
    else
    {
        //读取文件所有的内存
        QByteArray EncodeStr = file.readAll();
        //将读取的内容进行解码
        DecodeStr = fromBase64(EncodeStr);
        //将解码的结果与当前PC的CPU序列号进行比较
        QString Str(DecodeStr);
        if(0 == Str.compare(CpuSerialNumber))
             RunFlag = 1;
    }
    //3.如果匹配成功,运行软件
    if(RunFlag)
    {
        MainWindow w;
        w.show();
        return a.exec();
    }
    else
    {
        QMessageBox::warning(NULL, "Error", "注册码无效,请联系厂商获取注册码!",QMessageBox::Yes);
        return -1;
    }
    return 0;
}

实现注册机更好的方案则可以直接将信息写入注册表,然后APP去注册表中读取相应的内容。关于硬件信息的加密和解密方式,用户可以有其它的实现方法。


这里留一个问题,如何将APP启动信息与其它平台进行关联呢?例如Qt ARM端、Mac端、Android端?


好了,今天的分享到此为止,如果对您有帮助,欢迎一键三连!

往期精彩

QT移植腾讯云C-SDK结合实现OTA更新


QT开发中延时的几种处理方法


嵌入式linux检测U盘拔插与QT界面开发相结合的实现思路


嵌入式Linux Qt应用开发WIFI搜索、显示与连接思路


Qt串口通信接收数据不完整,怎么解决?

目录
相关文章
|
6月前
|
缓存 移动开发 JavaScript
如何优化UniApp开发的App的启动速度?
如何优化UniApp开发的App的启动速度?
1063 139
|
6月前
|
移动开发 JavaScript weex
UniApp开发的App在启动速度方面有哪些优势和劣势?
UniApp开发的App在启动速度方面有哪些优势和劣势?
514 137
|
6月前
|
数据采集 JavaScript 前端开发
开发比分App?你缺的不是程序员
开发体育比分App,关键不在代码,而在懂体育、懂数据、懂用户。明确定位、理清需求、选好数据源,再找专业的产品、数据与技术人才协同,才能少走弯路。程序员最后入场,效率最高。
334 154
|
6月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
995 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
796 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
985 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
6月前
|
人工智能 前端开发 JavaScript
最佳实践3:用通义灵码开发一款 App
本示例演示使用通义灵码,基于React Native与Node.js开发跨平台类通义App,重点展示iOS端实现。涵盖前端页面生成、后端代码库自动生成、RTK Query通信集成及Qwen API调用全过程,体现灵码在全栈开发中的高效能力。(238字)
698 11
|
6月前
|
人工智能 小程序 开发者
【一步步开发AI运动APP】十二、自定义扩展新运动项目03
继【一步步开发AI运动小程序】后,我们推出新系列【一步步开发AI运动APP】,助开发者打造高性能、优体验的AI运动应用。本文详解自定义扩展运动分析器的统一管理实现,提升代码复用性与可维护性,涵盖APP与小程序插件差异及完整代码示例,助力AI运动场景深度拓展。
|
6月前
|
移动开发 Android开发
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【03】建立隐私关于等相关页面和内容-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
292 0