0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

嵌入式应用研究院 来源:嵌入式应用研究院 作者:嵌入式应用研究院 2022-10-24 09:29 次阅读

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

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

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

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

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

获取cpu名称
wmiccpugetName
获取cpu核心数
wmiccpugetNumberOfCores
获取cpu线程数
wmiccpugetNumberOfLogicalProcessors
查询cpu序列号
wmiccpugetprocessorid
查询主板序列号
wmicbaseboardgetserialnumber
查询BIOS序列号
wmicbiosgetserialnumber
查看硬盘
wmicdiskdrivegetserialnumber

这是我的电脑硬件信息:

a63a16b2-52d3-11ed-a3b6-dac502259ad0.png

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

实现获取硬件信息接口

将硬件信息经过Base64格式转换

显示Base64格式转换为的结果

#include"mainwindow.h"
#include"ui_mainwindow.h"
#include

//获取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
QStringMainWindow::getMachineInfo(constQString&cmd)
{
QProcessp;
p.start(cmd);
p.waitForFinished();
QStringresult=QString::fromLocal8Bit(p.readAllStandardOutput());
QStringListlist=cmd.split("");
result=result.remove(list.last(),Qt::CaseInsensitive);
result=result.replace("
","");
result=result.replace("
","");
result=result.simplified();
returnresult;
}

QByteArrayMainWindow::Encode(QByteArraydata)
{
returndata.toBase64();
}

MainWindow::MainWindow(QWidget*parent)
:QMainWindow(parent)
,ui(newUi::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle("注册机");
}

MainWindow::~MainWindow()
{
deleteui;
}


voidMainWindow::on_GenerateCode_clicked()
{
QStringCode=getMachineInfo("wmiccpugetprocessorid");
QFilefile("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编码的结果,如下所示:

a6f5e734-52d3-11ed-a3b6-dac502259ad0.png

a73026ce-52d3-11ed-a3b6-dac502259ad0.png

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

#include"mainwindow.h"
#include

#defineARRAY_SIZE(x)(sizeof(x)/sizeof(x[0]))

QStringgetMachineInfo(constQString&cmd)
{
QProcessp;
p.start(cmd);
p.waitForFinished();
QStringresult=QString::fromLocal8Bit(p.readAllStandardOutput());
QStringListlist=cmd.split("");
result=result.remove(list.last(),Qt::CaseInsensitive);
result=result.replace("
","");
result=result.replace("
","");
result=result.simplified();
returnresult;
}

intmain(intargc,char*argv[])
{
uint8_tRunFlag=0;
QByteArrayDecodeStr;
QStringCpuSerialNumber;
QApplicationa(argc,argv);
//1.获取CPU序列号
CpuSerialNumber=getMachineInfo("wmiccpugetprocessorid");
//2.打开注册码文件,读取加密字符串并进行匹配加密字符串
QFilefile("D:/Register.txt");
if(!file.open(QIODevice::ReadOnly))
{
QMessageBox::warning(NULL,"Error","注册码不存在,请导入注册码!",QMessageBox::Yes);
return-1;
}
else
{
//读取文件所有的内存
QByteArrayEncodeStr=file.readAll();
//将读取的内容进行解码
DecodeStr=fromBase64(EncodeStr);
//将解码的结果与当前PC的CPU序列号进行比较
QStringStr(DecodeStr);
if(0==Str.compare(CpuSerialNumber))
RunFlag=1;
}

//3.如果匹配成功,运行软件
if(RunFlag)
{
MainWindoww;
w.show();
returna.exec();
}
else
{
QMessageBox::warning(NULL,"Error","注册码无效,请联系厂商获取注册码!",QMessageBox::Yes);
return-1;
}
return0;
}

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

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

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Window
    +关注

    关注

    0

    文章

    82

    浏览量

    37244
  • 上位机
    +关注

    关注

    27

    文章

    930

    浏览量

    54720
  • Qt
    Qt
    +关注

    关注

    1

    文章

    301

    浏览量

    37816
  • 注册机
    +关注

    关注

    9

    文章

    55

    浏览量

    23658

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

文章出处:【微信号:嵌入式应用研究院,微信公众号:嵌入式应用研究院】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    EtherCAT运动控制器上位开发Python+Qt(三):PDO配置与SDO读写

    PC上位Python+Qt混合编程实现PDO配置与SDO读写
    的头像 发表于 08-21 15:56 965次阅读
    EtherCAT运动控制器<b class='flag-5'>上位</b><b class='flag-5'>机</b><b class='flag-5'>开发</b><b class='flag-5'>之</b>Python+<b class='flag-5'>Qt</b>(三):PDO配置与SDO读写

    QT从零开始作单片机上位-串口调试助手+波形显示

    第一章 QT开发环境搭建及工程文件建立前言:笔者本想用codeblock+QT搭建一个上位开发
    发表于 01-12 19:13 20次下载
    <b class='flag-5'>QT</b>从零开始作单片机<b class='flag-5'>上位</b><b class='flag-5'>机</b>-串口调试助手+波形显示

    基于QT的简单的上位

    。同样的,我们也从编写一个简单的基于QT上位来体会体会上位开发及认识认识
    发表于 05-08 10:57 16次下载
    基于<b class='flag-5'>QT</b>的简单的<b class='flag-5'>上位</b><b class='flag-5'>机</b>

    QTQT上位串口编程

    QTQT上位串口编程 最近因为项目需要,需要用到上位,通过串口与
    发表于 05-08 10:02 25次下载
    <b class='flag-5'>QT</b>篇<b class='flag-5'>QT</b><b class='flag-5'>上位</b><b class='flag-5'>机</b>串口编程

    QT|编写一个简单的上位

    QT | 编写一个简单的上位 时间 :2023-03-19文章目录QT | 编写一个简单的上位
    发表于 05-08 10:12 3次下载
    <b class='flag-5'>QT</b>|编写一个简单的<b class='flag-5'>上位</b><b class='flag-5'>机</b>

    VS上位开发曲线显示

    、结束语刚刚接触上位开发,单纯是为了玩一下,浅度学习,关于曲线显示的实现方法,网上的资料太杂,也很零碎,经过自己的一些摸索,终于实现了我想要的效果,算是迈出了第一步。写博客记录一下
    发表于 05-08 09:48 1次下载
    VS<b class='flag-5'>上位</b><b class='flag-5'>机</b><b class='flag-5'>开发</b><b class='flag-5'>之</b>曲线显示

    QT实现简单的上位软件

    最近项目要求写上位软件,需要实现界面功能和串口读写。界面方面用过MFC(早忘记了),网上查阅资料后发现QT在5.1版本后有自带的串口模块,而且用QT实现简单界面功能很容易上手(也就期
    发表于 05-08 09:54 4次下载
    <b class='flag-5'>QT</b>实现简单的<b class='flag-5'>上位</b><b class='flag-5'>机</b>软件

    STM32+ESP8266连接电脑Qt网络上位——QT

    本文简单介绍下手写网络调试器并连接ESP8266模块 上篇 : STM32+ESP8266连接电脑Qt网络上位——准备工作 目录 一、部分Qt代码及实现过程 二、实现过程——使用
    发表于 05-09 14:22 21次下载
    STM32+ESP8266连接电脑<b class='flag-5'>Qt</b>网络<b class='flag-5'>上位</b><b class='flag-5'>机</b>——<b class='flag-5'>QT</b>篇

    基于Qt的简单arduino上位

    准备工作 一块esp8266,安装arduinoIDE、Qt、navecate、mysql/**若没有mysql可直接采用sqllist。 QT上位 通信协议采用UDP(TCP
    发表于 05-09 10:36 3次下载
    基于<b class='flag-5'>Qt</b>的简单arduino<b class='flag-5'>上位</b><b class='flag-5'>机</b>

    QT设计风速仪上位实例

    本人之前所做项目需要使用风速仪进行风速检测,市面上所购买的风速仪产品可以多通过串口与上位进行通信,为满足后续需求且提高更高的灵活性,本人决定采用QT软件自主开发风速仪
    发表于 05-10 09:41 1次下载
    <b class='flag-5'>QT</b>设计风速仪<b class='flag-5'>上位</b><b class='flag-5'>机</b>实例

    USB3.0开发bulkLoop上位程序

    USB3.0开发bulkLoop上位程序 一、开发测试软件 硬件平台:Cypress公司的C
    发表于 05-29 15:16 14次下载
    USB3.0<b class='flag-5'>开发</b><b class='flag-5'>之</b>bulkLoop<b class='flag-5'>上位</b><b class='flag-5'>机</b>程序

    STM32 IAP升级固件与上位例程

    本例程实现功能: 1、IAP固件程序实现固件APP搬移,跳转至APP 2、APP固件程序实现自定义功能,接收上位下发的bin文件 3、
    发表于 05-29 16:26 17次下载
    STM32 IAP升级固件与<b class='flag-5'>上位</b><b class='flag-5'>机</b>例程

    QT上位开发串口助手(下)

    接着嵌入式QT上位开发串口助手(上)来完善一下串口助手的功能,上一篇博客已经实现了自动获取的功能了。 首先要在头文件里面包含一下头文件
    发表于 05-29 16:49 2次下载
    <b class='flag-5'>QT</b><b class='flag-5'>上位</b><b class='flag-5'>机</b><b class='flag-5'>开发</b><b class='flag-5'>之</b>串口助手(下)

    Qt上位开发实战案例

    Qt Creator是一个用于Qt开发的轻量级跨平台集成开发环境。 Qt Creator可带来两大关键益处: 提供首个专为支持跨
    的头像 发表于 03-13 12:31 2218次阅读
    <b class='flag-5'>Qt</b><b class='flag-5'>上位</b><b class='flag-5'>机</b><b class='flag-5'>开发</b>实战案例

    EtherCAT运动控制器上位Python+Qt(一):链接与单轴运动

    PC上位Python+Qt混合编程,助力智能制造高效开发
    的头像 发表于 07-31 09:43 344次阅读
    EtherCAT运动控制器<b class='flag-5'>上位</b><b class='flag-5'>机</b><b class='flag-5'>之</b>Python+<b class='flag-5'>Qt</b>(一):链接与单轴运动