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

    文章

    78

    浏览量

    37142
  • 上位机
    +关注

    关注

    26

    文章

    861

    浏览量

    54049
  • Qt
    Qt
    +关注

    关注

    1

    文章

    299

    浏览量

    37340
  • 注册机
    +关注

    关注

    9

    文章

    55

    浏览量

    23510

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

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

收藏 人收藏

    评论

    相关推荐

    上位开发Splash启动画面

    上位
    学习电子知识
    发布于 :2023年07月26日 21:43:47

    【Rico Board申请】基于Qt的环境信息采集系统

    套件首先是对板卡进行简单的评测,然后根据官方提供的技术文档学习相关的硬件资源和模块功能,然后根据自己想实现的项目搭建Qt开发环境,并且做简单的环境测试,后面利用交叉编译,先在PC
    发表于 11-08 16:50

    上位通过下位启动风扇

    实际工程应用中,通过上位通过下位启动风扇,是否需要考虑风扇在中途发生故障?如果需要,上位
    发表于 06-02 21:23

    一个APP如何控制多个智能硬件

    一个APP如何控制多个智能硬件,机智云告诉你其实只需要花三分钟使用“绑定其他产品”即可实现。绑定其它产品的应用是为了实现一个App可以控制多
    发表于 03-20 10:33

    基于zigbee的手机APP开发

    自己在做智能家居方面的项目,其中有一项需要把传感器收集到的数据通过无线网络传输到上位比如专用手机APP上边,也可以通过APP上的设置对
    发表于 08-19 02:10

    c#/winform c#/wpf c++/QT上位

    c#/winform c#/wpf c++/QT上位,本人从事上位开发5年,熟悉各大底层
    发表于 09-21 21:20

    实现基于Qt上位与下位进行串口通信

    Qt实现与单片直接的通信上位+单片代码测试环境项目目标实现效果关键通信类 QSerialport总结这是我大二下学期的单片
    发表于 12-08 07:26

    如何自己的应用程序自动启动

    在很多嵌入式系统中,由于可用资源较少,常常在系统启动后就直接应用程序自动启动,以减少用户操作和节省资源。如何自己的应用程序自动
    发表于 12-21 06:29

    怎样使用QT去搭建一个上位开发环境呢

    怎样使用QT去搭建一个上位开发环境呢?有哪些搭建步骤?
    发表于 02-24 07:17

    ESP IDF 4.4.2开发板BLE蓝牙掉电绑定信息消失的问题如何解决?

    开发环境:ESP IDF 4.4.2 开发板:ESP32-S3-DevKitC-1 v1.1 PC:win11 在编译测试gatt_security_server这个工程的时候,使用BLE4.2.在
    发表于 02-13 08:39

    基于QT的简单的上位

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

    QTQT上位机串口编程

    版本:QT Creater 4.80硬件:stm32 + 串口转ttl模块 默认安装好QT了 1.新建工程 选择Qt Widgets 然后下一步自己
    发表于 05-08 10:02 20次下载
    <b class='flag-5'>QT</b>篇<b class='flag-5'>QT</b><b class='flag-5'>上位</b>机串口编程

    QT|编写一个简单的上位

    QT | 编写一个简单的上位机 时间 :2023-03-19文章目录QT | 编写一个简单的上位机 参考及资料: 1.打开`QT Creat
    发表于 05-08 10:12 2次下载
    <b class='flag-5'>QT</b>|编写一个简单的<b class='flag-5'>上位</b>机

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

    接着嵌入式QT上位开发之串口助手(上)来完善一下串口助手的功能,上一篇博客已经实现了自动获取的功能了。 首先要在头文件里面包含一下头文件,再定义一个QSerialPort类型的参数;其次打开widget.cpp文件,在这个文
    发表于 05-29 16:49 1次下载
    <b class='flag-5'>QT</b><b class='flag-5'>上位</b>机<b class='flag-5'>开发</b>之串口助手(下)

    Qt上位开发实战案例

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