添加加密部分

This commit is contained in:
95384 2025-01-11 09:47:25 +08:00
parent 98549e640c
commit 9aea2abcd8
4 changed files with 354 additions and 5 deletions

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject> <!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 4.12.2, 2024-12-18T09:05:17. --> <!-- Written by QtCreator 4.12.2, 2025-02-06T11:28:13. -->
<qtcreator> <qtcreator>
<data> <data>
<variable>EnvironmentId</variable> <variable>EnvironmentId</variable>
@ -77,7 +77,7 @@
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.12.9 MinGW 32-bit</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop Qt 5.12.9 MinGW 32-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.12.9 MinGW 32-bit</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop Qt 5.12.9 MinGW 32-bit</value>
<value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5129.win32_mingw73_kit</value> <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">qt.qt5.5129.win32_mingw73_kit</value>
<value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value> <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">1</value>
<value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value> <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
<value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value> <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
<valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0"> <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.0">
@ -320,7 +320,7 @@
<value type="bool" key="RunConfiguration.UseQmlDebugger">false</value> <value type="bool" key="RunConfiguration.UseQmlDebugger">false</value>
<value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value> <value type="bool" key="RunConfiguration.UseQmlDebuggerAuto">true</value>
<value type="QString" key="RunConfiguration.WorkingDirectory"></value> <value type="QString" key="RunConfiguration.WorkingDirectory"></value>
<value type="QString" key="RunConfiguration.WorkingDirectory.default">E:/Y/QT/build-micro_climate_config-Desktop_Qt_5_12_9_MinGW_32_bit-Debug</value> <value type="QString" key="RunConfiguration.WorkingDirectory.default">E:/Y/QT/build-micro_climate_config-Desktop_Qt_5_12_9_MinGW_32_bit-Release</value>
</valuemap> </valuemap>
<value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value> <value type="int" key="ProjectExplorer.Target.RunConfigurationCount">1</value>
</valuemap> </valuemap>

View File

@ -91,6 +91,13 @@ void Widget::disable__()
ui->groupBox->setEnabled(false); ui->groupBox->setEnabled(false);
ui->groupBox_2->setEnabled(false); ui->groupBox_2->setEnabled(false);
ui->groupBox_3->setEnabled(false); ui->groupBox_3->setEnabled(false);
// 未打开串口时不让开加密页面
ui->main_tabWidget->setTabEnabled(1, false);
ui->Password_lineEdit->setEnabled(false);
ui->ID_lineEdit->setEnabled(false);
ui->label_10->setEnabled(false);
ui->label_11->setEnabled(false);
ui->Trans_password_pushButton->setEnabled(false);
} }
void Widget::able__() void Widget::able__()
@ -98,6 +105,8 @@ void Widget::able__()
ui->groupBox->setEnabled(true); ui->groupBox->setEnabled(true);
ui->groupBox_2->setEnabled(true); ui->groupBox_2->setEnabled(true);
ui->groupBox_3->setEnabled(true); ui->groupBox_3->setEnabled(true);
// 未打开串口时不让开加密页面
ui->main_tabWidget->setTabEnabled(1, true);
} }
uint16_t Widget::modbusCrc16(const uint8_t *data, const int len) uint16_t Widget::modbusCrc16(const uint8_t *data, const int len)
@ -382,8 +391,6 @@ void Widget::get_configdata()
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr); disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
} }
//30->1E //30->1E
void Widget::on_pushButton_clicked() void Widget::on_pushButton_clicked()
{ {
@ -417,6 +424,11 @@ void Widget::on_pushButton_clicked()
sent_comand.append(crc_16_val); sent_comand.append(crc_16_val);
Serial_port->write(sent_comand); Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
} }
//31->1F //31->1F
@ -452,6 +464,11 @@ void Widget::on_pushButton_2_clicked()
sent_comand.append(crc_16_val); sent_comand.append(crc_16_val);
Serial_port->write(sent_comand); Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
} }
//32->20 //32->20
@ -487,6 +504,11 @@ void Widget::on_pushButton_3_clicked()
sent_comand.append(crc_16_val); sent_comand.append(crc_16_val);
Serial_port->write(sent_comand); Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
} }
//33->21 //33->21
@ -522,6 +544,11 @@ void Widget::on_pushButton_4_clicked()
sent_comand.append(crc_16_val); sent_comand.append(crc_16_val);
Serial_port->write(sent_comand); Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
} }
//34->22 //34->22
@ -558,6 +585,11 @@ void Widget::on_pushButton_5_clicked()
sent_comand.append(crc_16_val); sent_comand.append(crc_16_val);
Serial_port->write(sent_comand); Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
} }
//35->23 //35->23
@ -594,6 +626,11 @@ void Widget::on_pushButton_6_clicked()
sent_comand.append(crc_16_val); sent_comand.append(crc_16_val);
Serial_port->write(sent_comand); Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
} }
//36->24 //36->24
@ -630,4 +667,194 @@ void Widget::on_pushButton_7_clicked()
sent_comand.append(crc_16_val); sent_comand.append(crc_16_val);
Serial_port->write(sent_comand); Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
}
void Widget::on_Get_ID_pushButton_clicked()
{
QByteArray sent_comand;
sent_comand.append(static_cast<uint8_t>(0x30));
sent_comand.append(static_cast<uint8_t>(0x03));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x37));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x04));
sent_comand.append(static_cast<uint8_t>(0xF1));
sent_comand.append(static_cast<uint8_t>(0xE6));
Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(getIdData()), Qt::UniqueConnection);
}
uint32_t PassWord[2] = {0};
uint32_t key[] = {0x509770ff, 0x29c6b369, 0x4da2c125, 0x0};
void Widget::getIdData()
{
uint32_t ID_1;
uint32_t ID_2;
// 接收数据,一会再接收,以便接收超长数据
QByteArray readed_data;
while(Serial_port->waitForReadyRead(UART_WAIT_MS)==true);
readed_data.append(Serial_port -> readAll());
//防止干扰
while(readed_data.length() > 1)
{
qDebug() << readed_data.length();
qDebug() << readed_data;
if(readed_data[0] != static_cast<char>(0x30) || readed_data[1] != static_cast<char>(0x03))
{
readed_data.remove(0, 1);
}
else
break;
}
uint8_t read_comand_u8[readed_data.length()];
for(int i = 0; i < readed_data.length(); i++)
{
read_comand_u8[i] = readed_data[i];
}
if(readed_data.length() >= 13)
if(modbusCrc16(read_comand_u8, 11) >> 8 == read_comand_u8[11] && (modbusCrc16(read_comand_u8, 11) & 0x00FF) == read_comand_u8[12])
{
ui->ID_lineEdit->clear();
ID_1 = read_comand_u8[3] << 24 | read_comand_u8[4] << 16 | read_comand_u8[5] << 8 | read_comand_u8[6];
QString ID_1_Str = QString::number(ID_1, 16).toUpper().rightJustified(2, '0').prepend("0x");
ID_2 = read_comand_u8[7] << 24 | read_comand_u8[8] << 16 | read_comand_u8[9] << 8 | read_comand_u8[10];
QString ID_2_Str = QString::number(ID_2, 16).toUpper().rightJustified(2, '0').prepend("0x");
ui->ID_lineEdit->setText(ID_1_Str + " " + ID_2_Str);
qDebug("%x %x",ID_1, ID_2);
key[3] = ID_1;
PassWord[0] = ID_1;
PassWord[1] = ID_2;
tea_encrypt(PassWord, key);
ui->Password_lineEdit->clear();
QString PW_1_Str = QString::number(PassWord[0], 16).toUpper().rightJustified(2, '0').prepend("0x");
QString PW_2_Str = QString::number(PassWord[1], 16).toUpper().rightJustified(2, '0').prepend("0x");
qDebug("%x %x",PassWord[0], PassWord[1]);
ui->Password_lineEdit->setText(PW_1_Str + " " + PW_2_Str);
}
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
// 点亮控件
ui->Password_lineEdit->setEnabled(true);
ui->ID_lineEdit->setEnabled(true);
ui->label_10->setEnabled(true);
ui->label_11->setEnabled(true);
ui->Trans_password_pushButton->setEnabled(true);
}
void Widget::tea_encrypt(uint32_t *v, uint32_t *k)
{
uint32_t v0 = v[0], v1 = v[1], sum = 0, i; // 初始化v0, v1, sum
uint32_t delta = 0x9e3779b9; // 初始化delta
uint32_t k1 = k[1], k3 = k[3], k0 = k[0], k2 = k[2]; // 初始化密钥k
for (i = 0; i < 32; i++) { // 执行32轮加密
sum += delta;
v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
}
v[0] = v0; // 返回加密结果
v[1] = v1;
}
void Widget::on_Trans_password_pushButton_clicked()
{
QByteArray sent_comand;
sent_comand.append(static_cast<uint8_t>(0x30));
sent_comand.append(static_cast<uint8_t>(0x10));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x3B));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x04));
sent_comand.append(static_cast<uint8_t>(0x08));
sent_comand.append(static_cast<uint8_t>(PassWord[0] >> 24));
sent_comand.append(static_cast<uint8_t>(PassWord[0] >> 16));
sent_comand.append(static_cast<uint8_t>(PassWord[0] >> 8));
sent_comand.append(static_cast<uint8_t>(PassWord[0] >> 0));
sent_comand.append(static_cast<uint8_t>(PassWord[1] >> 24));
sent_comand.append(static_cast<uint8_t>(PassWord[1] >> 16));
sent_comand.append(static_cast<uint8_t>(PassWord[1] >> 8));
sent_comand.append(static_cast<uint8_t>(PassWord[1] >> 0));
uint8_t sent_comand_u8[sent_comand.length()];
for(int i = 0; i < sent_comand.length(); i++)
{
sent_comand_u8[i] = sent_comand[i];
}
uint16_t crc_16_val = modbusCrc16(sent_comand_u8, sent_comand.length());
sent_comand.append(crc_16_val >> 8);
sent_comand.append(crc_16_val);
Serial_port->write(sent_comand);
//连接信号与槽
//断开所有其他的信号与槽连接
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
connect(Serial_port, SIGNAL(readyRead()), this, SLOT(write_ack()), Qt::UniqueConnection);
}
void Widget::on_pushButton_8_clicked()
{
QByteArray sent_comand;
sent_comand.append(static_cast<uint8_t>(0x30));
sent_comand.append(static_cast<uint8_t>(0x10));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x1A));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x01));
sent_comand.append(static_cast<uint8_t>(0x02));
sent_comand.append(static_cast<uint8_t>(0x00));
sent_comand.append(static_cast<uint8_t>(0x01));
sent_comand.append(static_cast<uint8_t>(0x3C));
sent_comand.append(static_cast<uint8_t>(0x3B));
Serial_port->write(sent_comand);
}
void Widget::write_ack()
{
// 接收数据,一会再接收,以便接收超长数据
QByteArray readed_data;
while(Serial_port->waitForReadyRead(UART_WAIT_MS)==true);
readed_data.append(Serial_port -> readAll());
//防止干扰
while(readed_data.length() > 1)
{
qDebug() << readed_data.length();
qDebug() << readed_data;
if(readed_data[0] != static_cast<char>(0x30) || readed_data[1] != static_cast<char>(0x10))
{
readed_data.remove(0, 1);
}
else
break;
}
uint8_t read_comand_u8[readed_data.length()];
for(int i = 0; i < readed_data.length(); i++)
{
read_comand_u8[i] = readed_data[i];
}
if(modbusCrc16(read_comand_u8, readed_data.length()-2) >> 8 == read_comand_u8[readed_data.length()-2] && (modbusCrc16(read_comand_u8, readed_data.length()-2) & 0x00FF) == read_comand_u8[readed_data.length()-1])
{
QMessageBox::information(this, "提示", "数据下发成功");
}
disconnect(Serial_port, &QSerialPort::readyRead, nullptr, nullptr);
} }

View File

@ -10,6 +10,7 @@
#include <QRegExp> #include <QRegExp>
#include <QRegExpValidator> #include <QRegExpValidator>
#include <QLabel> #include <QLabel>
#include <QThread>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
namespace Ui { class Widget; } namespace Ui { class Widget; }
@ -32,6 +33,8 @@ private slots:
//槽函数 //槽函数
void get_configdata(void); void get_configdata(void);
void getIdData(void);
void write_ack(void);
void on_pushButton_clicked(); void on_pushButton_clicked();
@ -47,6 +50,12 @@ private slots:
void on_pushButton_7_clicked(); void on_pushButton_7_clicked();
void on_Get_ID_pushButton_clicked();
void on_Trans_password_pushButton_clicked();
void on_pushButton_8_clicked();
private: private:
Ui::Widget *ui; Ui::Widget *ui;
//关闭窗口提示 //关闭窗口提示
@ -57,6 +66,8 @@ private:
void able__(void); void able__(void);
//crc校验 //crc校验
uint16_t modbusCrc16(const uint8_t *data, const int len); uint16_t modbusCrc16(const uint8_t *data, const int len);
//加密
void tea_encrypt(uint32_t *v, uint32_t *k);
//串口 //串口
QSerialPort * Serial_port; QSerialPort * Serial_port;

111
widget.ui
View File

@ -1559,6 +1559,117 @@ border-radius: 10px; /* 圆角半径 */
</item> </item>
</layout> </layout>
</widget> </widget>
<widget class="QWidget" name="encrypt_tab">
<attribute name="title">
<string>加密</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_7">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout_6" columnstretch="3,2,5">
<item row="0" column="0">
<widget class="QPushButton" name="Get_ID_pushButton">
<property name="text">
<string>获取ID并计算</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_10">
<property name="text">
<string>唯一ID</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLineEdit" name="ID_lineEdit">
<property name="minimumSize">
<size>
<width>160</width>
<height>0</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="Trans_password_pushButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>下发密文</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_11">
<property name="text">
<string>密文</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QLineEdit" name="Password_lineEdit">
<property name="minimumSize">
<size>
<width>160</width>
<height>0</height>
</size>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item row="0" column="1">
<widget class="QPushButton" name="pushButton_8">
<property name="text">
<string>复位</string>
</property>
</widget>
</item>
<item row="0" column="2">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_12">
<property name="text">
<string>下发密文后需复位</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget> </widget>
</item> </item>
</layout> </layout>