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串口通信接收数据不完整,怎么解决?

目录
相关文章
|
3天前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
10 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
14天前
|
编解码 Java Android开发
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
RTMP Streamer是一款开源的安卓直播推流框架,支持RTMP、RTSP和SRT协议,适用于各种直播场景。它支持H264、H265、AV1视频编码和AAC、G711、OPUS音频编码。本文档介绍了如何使用Java版的RTMP Streamer,建议使用小海豚版本的Android Studio (Dolphin)。加载项目时,可添加国内仓库加速依赖下载。RTMP Streamer包含五个模块:app、encoder、rtmp、rtplibrary和rtsp。完成加载后,可以在手机上安装并运行APP,提供多种直播方式。开发者可以从《FFmpeg开发实战:从零基础到短视频上线》获取更多信息。
46 7
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
|
11天前
|
数据可视化 数据处理 Swift
Swift开发——简单App设计
SwiftUI教程概述:简化App设计,通过代码展示了如何创建一个计算两个数之和的界面。工程`MyCh0902`包含`ContentView.swift`,其中定义了`ContentView`和`MyView`结构体。`MyView`负责界面布局,使用`VStack`和`HStack`组织元素,如`TextField`和`Button`。点击`Button`调用`calc`方法处理输入并更新结果。界面设计可在Xcode的Inspector窗口中可视化配置。推荐将界面逻辑移到单独的`MyView.swift`文件中以清晰分离视图设计。
183 1
Swift开发——简单App设计
|
17天前
|
开发框架 移动开发 JavaScript
SpringCloud微服务实战——搭建企业级开发框架(四十七):【移动开发】整合uni-app搭建移动端快速开发框架-添加Axios并实现登录功能
在uni-app中,使用axios实现网络请求和登录功能涉及以下几个关键步骤: 1. **安装axios和axios-auth-refresh**: 在项目的`package.json`中添加axios和axios-auth-refresh依赖,可以通过HBuilderX的终端窗口运行`yarn add axios axios-auth-refresh`命令来安装。 2. **配置自定义常量**: 创建`project.config.js`文件,配置全局常量,如API基础URL、TenantId、APP_CLIENT_ID和APP_CLIENT_SECRET等。
|
3天前
|
JSON 小程序 数据格式
uni-app 使用vscode开发uni-app
uni-app 使用vscode开发uni-app
9 0
|
3天前
|
JSON 前端开发 API
移动端---------app开发03----apicloud必须掌握的代码
移动端---------app开发03----apicloud必须掌握的代码
|
3天前
|
前端开发 开发者
移动端-------app开发02,了解apicloud功能和使用,真机测试
移动端-------app开发02,了解apicloud功能和使用,真机测试
|
5天前
4. 解决uni-app开发过程中view、image等标签出现诸如“出现错误:类型“{ class: string; }”的参数不能赋给类型“.......”
4. 解决uni-app开发过程中view、image等标签出现诸如“出现错误:类型“{ class: string; }”的参数不能赋给类型“.......”
9 0
|
5天前
|
JSON 数据格式
3. 使用 VsCode 开发 uni-app 项目需要使用到的插件
3. 使用 VsCode 开发 uni-app 项目需要使用到的插件
8 0
|
18天前
|
关系型数据库 MySQL 项目管理
数据库大作业——基于qt开发的图书管理系统(四)项目目录的整理与绘制登录页面
数据库大作业——基于qt开发的图书管理系统(四)项目目录的整理与绘制登录页面

推荐镜像

更多