1.所有模块验证完成。
This commit is contained in:
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -30,6 +30,8 @@ protected:
|
||||
void onDeleteAllButtonClicked();
|
||||
void onDeleteButtonClicked();
|
||||
void onRequestPalmFeatureButtonClicked();
|
||||
void onRegisterPalmFeatureButtonClicked();
|
||||
void onResetButtonClicked();
|
||||
|
||||
QGroupBox *initializeEnrollGroupBox();
|
||||
QGroupBox *initializeVerifyGroupBox();
|
||||
|
Reference in New Issue
Block a user