1.所有模块验证完成。

This commit is contained in:
2024-05-23 19:58:36 +08:00
parent 89ae5b9e16
commit 8660c10742
11 changed files with 178 additions and 49 deletions

View File

@ -13,6 +13,7 @@ add_executable(Analyser Analyser.rc
target_link_libraries(Analyser
PRIVATE QtComponets
PRIVATE Encrypt
PRIVATE Database
PRIVATE Ws2_32
PRIVATE Qt${QT_VERSION_MAJOR}::Widgets

View File

@ -2,6 +2,7 @@
#include "BoostLog.h"
#include <QSerialPort>
#include <WinSock2.h>
#include <mbedtls/md5.h>
#include <sstream>
static inline uint8_t xor_checksum_byte(const uint8_t *data, uint32_t len) {
@ -38,6 +39,13 @@ void ModuleCommunication::verify(uint8_t timeout) {
LOG_CAT(info, GUI) << Separator;
}
void ModuleCommunication::reset() {
auto [frameData, frameSize] = generateFrame(Reset);
m_serialPort->write(reinterpret_cast<const char *>(frameData), frameSize);
LOG_CAT(info, GUI) << "发送复位指令: " << protocolDataFormatString(frameData, frameSize);
LOG_CAT(info, GUI) << Separator;
}
void ModuleCommunication::enroll(const std::string &username, uint8_t timeout) {
EnrollData data = {0};
data.timeout = timeout;
@ -75,6 +83,33 @@ void ModuleCommunication::requestPalmFeature(uint16_t userid) {
LOG_CAT(info, GUI) << Separator;
}
void ModuleCommunication::enrollPalmFeature(uint16_t userid, const PalmFeature &feature) {
auto buffer = new uint8_t[sizeof(PalmFeatureHeader) + feature.feature.size()];
auto header = reinterpret_cast<PalmFeatureHeader *>(buffer);
header->userid = htons(userid);
header->featureTotalSize = htons(feature.feature.size());
strncpy(reinterpret_cast<char *>(header->username), feature.username.c_str(), sizeof(header->username));
mbedtls_md5_context context;
mbedtls_md5_init(&context);
mbedtls_md5_starts(&context);
uint8_t md5[16];
mbedtls_md5_update(&context, feature.feature.data(), feature.feature.size());
mbedtls_md5_finish(&context, md5);
mbedtls_md5_free(&context);
memcpy(header->featureDataMd5, md5, sizeof(header->featureDataMd5));
memcpy(buffer + sizeof(PalmFeatureHeader), feature.feature.data(), feature.feature.size());
auto [frameData, frameSize] =
generateFrame(RegisterPalmFeature, buffer, sizeof(PalmFeatureHeader) + feature.feature.size());
m_serialPort->write(reinterpret_cast<const char *>(frameData), frameSize);
LOG_CAT(info, GUI) << "发送注册掌静脉特征指令: " << protocolDataFormatString(frameData, frameSize);
LOG_CAT(info, GUI) << Separator;
if (buffer != nullptr) delete[] buffer;
}
void ModuleCommunication::processPackage(const uint8_t *data, uint16_t size) {
uint8_t messageId = data[2];
switch (messageId) {
@ -82,33 +117,38 @@ void ModuleCommunication::processPackage(const uint8_t *data, uint16_t size) {
uint8_t replyId = data[5];
auto result = data[6];
switch (replyId) {
case Verify: {
case Reset: {
LOG_CAT(info, GUI) << "模组: " << protocolDataFormatString(data, size);
if (result == Success) {
LOG_CAT(info, GUI) << "复位完成。";
}
LOG_CAT(info, GUI) << Separator;
break;
}
case Verify: {
LOG_CAT(info, GUI) << "模组: " << protocolDataFormatString(data, size);
if (result == Success) {
LOG_CAT(info, GUI) << "模组: " << protocolDataFormatString(data, size);
auto info = reinterpret_cast<const VerifyDataReply *>(data + 7);
LOG_CAT(info, GUI) << "用户ID: " << ntohs(info->userid)
<< ", 用户名: " << std::string_view(reinterpret_cast<const char *>(info->username));
LOG_CAT(info, GUI) << Separator;
} else if (result == Failed4Timeout) {
LOG_CAT(info, GUI) << "模组: " << protocolDataFormatString(data, size);
LOG_CAT(info, GUI) << "识别超时。";
LOG_CAT(info, GUI) << Separator;
} else if (result == Failed4UnknownReason) {
LOG_CAT(info, GUI) << "模组: " << protocolDataFormatString(data, size);
LOG_CAT(info, GUI) << "未录入用户。";
LOG_CAT(info, GUI) << Separator;
} else {
}
LOG_CAT(info, GUI) << Separator;
break;
}
case EnrollSingle: {
LOG_CAT(info, GUI) << "模组: " << protocolDataFormatString(data, size);
if (result == Success) {
auto info = reinterpret_cast<const EnrollDataReply *>(data + 7);
LOG_CAT(info, GUI) << "模组: " << protocolDataFormatString(data, size);
LOG_CAT(info, GUI) << "注册成功,用户ID: " << ntohs(info->userid);
LOG_CAT(info, GUI) << Separator;
} else if (result == Failed4Timeout) {
LOG_CAT(info, GUI) << "识别超时。";
}
LOG_CAT(info, GUI) << Separator;
break;
}
case DeleteUser: {
@ -147,6 +187,14 @@ void ModuleCommunication::processPackage(const uint8_t *data, uint16_t size) {
LOG_CAT(info, GUI) << Separator;
break;
}
case RegisterPalmFeature: {
LOG_CAT(info, GUI) << "模组: " << protocolDataFormatString(data, size);
if (result == Success) {
LOG_CAT(info, GUI) << "掌静脉特征值注册成功。";
}
LOG_CAT(info, GUI) << Separator;
break;
}
default:
LOG(warning) << "unknown reply command: 0x" << (static_cast<int>(replyId) & 0xff)
<< ", data: " << protocolDataFormatString(data, size);

View File

@ -16,6 +16,7 @@ public:
enum MessageId : uint8_t {
Reply = 0,
Note = 0x01,
Reset = 0x10,
Verify = 0x12,
EnrollSingle = 0x1D,
DeleteUser = 0x20,
@ -94,12 +95,14 @@ public:
explicit ModuleCommunication(QObject *parent = nullptr);
bool open(const QString &portName);
void verify(uint8_t timeout);
void reset();
void enroll(const std::string &username, uint8_t timeout);
void deleteUser(uint16_t userid);
void deleteAll();
void requestPalmFeature(uint16_t userid);
void enrollPalmFeature(uint16_t userid, const PalmFeature &feature);
signals:
void newPalmFeature(const PalmFeature &feature);

View File

@ -95,6 +95,10 @@ QGroupBox *Widget::initializeCommandGroupBox() {
layout->addWidget(initializeDeleteGroupBox(), 1, 0);
layout->addWidget(initializePalmFeatureGroupBox(), 1, 1);
auto resetButton = new QPushButton("复位");
connect(resetButton, &QPushButton::clicked, this, &Widget::onResetButtonClicked);
layout->addWidget(resetButton, 2, 0);
ret->setLayout(layout);
return ret;
}
@ -159,13 +163,14 @@ QGroupBox *Widget::initializePalmFeatureGroupBox() {
m_palmFeatureEdit = new QLineEdit("");
layout->addRow("用户ID:", m_palmFeatureEdit);
auto button = new QPushButton("特征值下发");
layout->addRow("", button);
auto button1 = new QPushButton("特征值上报");
layout->addRow("", button1);
connect(button1, &QPushButton::clicked, this, &Widget::onRequestPalmFeatureButtonClicked);
auto button = new QPushButton("特征值下发");
connect(button, &QPushButton::clicked, this, &Widget::onRegisterPalmFeatureButtonClicked);
layout->addRow("", button);
ret->setLayout(layout);
return ret;
@ -258,3 +263,18 @@ void Widget::onRequestPalmFeatureButtonClicked() {
auto id = m_palmFeatureEdit->text().toInt();
m_communication->requestPalmFeature(id);
}
void Widget::onRegisterPalmFeatureButtonClicked() {
if (!m_communication) return;
auto features = m_database->palmFeatures();
if (features.empty()) {
LOG(error) << "feature is empty.";
return;
}
m_communication->enrollPalmFeature(264, features.at(0));
}
void Widget::onResetButtonClicked() {
if (!m_communication) return;
m_communication->reset();
}

View File

@ -30,6 +30,8 @@ protected:
void onDeleteAllButtonClicked();
void onDeleteButtonClicked();
void onRequestPalmFeatureButtonClicked();
void onRegisterPalmFeatureButtonClicked();
void onResetButtonClicked();
QGroupBox *initializeEnrollGroupBox();
QGroupBox *initializeVerifyGroupBox();