From ce2218857f77a4893f95cb552238ec04c0e67b7e Mon Sep 17 00:00:00 2001 From: Mentalflow <312902918@qq.com> Date: Thu, 22 Feb 2024 10:22:35 +0800 Subject: [PATCH] SerialPort and ZigBeeParser: bug fix in windows. --- app_source/dlln3x/DLLN3X.cpp | 2 -- app_source/include/protocol.h | 3 ++- app_source/include/zigbeeparser.h | 4 ++-- app_source/qml/components/TabBar.qml | 3 +-- app_source/qml/components/ZigBeeFrame.qml | 2 +- app_source/source/protocol.cpp | 2 +- app_source/source/serialportmanager.cpp | 3 ++- app_source/source/zigbeeparser.cpp | 24 +++++++++++------------ 8 files changed, 21 insertions(+), 22 deletions(-) diff --git a/app_source/dlln3x/DLLN3X.cpp b/app_source/dlln3x/DLLN3X.cpp index 2d68f63..32ca55d 100644 --- a/app_source/dlln3x/DLLN3X.cpp +++ b/app_source/dlln3x/DLLN3X.cpp @@ -92,8 +92,6 @@ void DLLN3X::rled_blink(uint8_t time) uint16_t DLLN3X::read_addr() { - if (_self_addr != 0) - return _self_addr; _self_addr = rw_config(CONFIG::ADDR); return _self_addr; } diff --git a/app_source/include/protocol.h b/app_source/include/protocol.h index 9ea81dc..4b4ef93 100644 --- a/app_source/include/protocol.h +++ b/app_source/include/protocol.h @@ -4,7 +4,7 @@ #include "zigbeeframe.h" #include "config.h" -#define SELF_ADDR 0xEEEE //按照实际修改 +#define DEFAULT_SELF_ADDR 0xEEEE //按照实际修改 namespace zigbee_protocol { class Protocol @@ -31,6 +31,7 @@ public: QString en_key = ""); QString hmac_verify_key = "11223344556677888877665544332211"; QStringList pre_hmac_verify_key; + u16 self_addr = DEFAULT_SELF_ADDR; private: Protocol(); ~Protocol(); diff --git a/app_source/include/zigbeeparser.h b/app_source/include/zigbeeparser.h index e2dcbe6..d8b1532 100644 --- a/app_source/include/zigbeeparser.h +++ b/app_source/include/zigbeeparser.h @@ -25,7 +25,7 @@ class ZigBeeParser : public QObject Q_PROPERTY(QString hmac_verify_key READ hmac_verify_key WRITE setHmac_verify_key NOTIFY hmac_verify_keyChanged FINAL) Q_PROPERTY(QStringList pre_hmac_verify_key READ pre_hmac_verify_key WRITE setPre_hmac_verify_key NOTIFY pre_hmac_verify_keyChanged FINAL) public: - Q_INVOKABLE QString self_addr(){ return _self_addr;}; + Q_INVOKABLE QString self_addr(){ _self_addr = QString::number(_protocol->self_addr,16).toUpper(); return _self_addr;}; QString hmac_verify_key(){ return _protocol->hmac_verify_key;}; void setHmac_verify_key(QString key){ _config->Set("Protocol","hmac_verify_key",key); _protocol->hmac_verify_key = key;emit hmac_verify_keyChanged();}; QStringList pre_hmac_verify_key(){ return _protocol->pre_hmac_verify_key;}; @@ -47,7 +47,7 @@ private: Event _event; EventsBus *_bus = nullptr; zigbee_protocol::Protocol* _protocol = nullptr; - QString _self_addr = QString::number(SELF_ADDR,16).toUpper(); + QString _self_addr = QString::number(DEFAULT_SELF_ADDR,16).toUpper(); Config* _config = nullptr; }; #endif // ZIGBEEPARSER_H diff --git a/app_source/qml/components/TabBar.qml b/app_source/qml/components/TabBar.qml index 4710633..1b7b508 100644 --- a/app_source/qml/components/TabBar.qml +++ b/app_source/qml/components/TabBar.qml @@ -373,8 +373,7 @@ RibbonTabBar { } let repeat_count = 16 - let t = `FF 29 ${get_rand_byte()}${get_rand_byte()} 83 `+ - `${get_rand_byte()}${get_rand_byte()} ${get_rand_byte()}${get_rand_byte()} `+ + let t = `FF 29 ${get_rand_byte()}${get_rand_byte()} 83 23 32 `+ `AA AD 23 32 52 48 23 32 01 00 17 00 00 00 AA AA 01 00 10 00 00 ` for (let j=0;jdes_addr == SELF_ADDR && (dev->id == 0||in_frame->reset_num==0xDD||((in_frame->id > dev->id && in_frame->id<=BASE_FRAME_RESET_NUM)))) + if (in_frame->des_addr == self_addr && (dev->id == 0||in_frame->reset_num==0xDD||((in_frame->id > dev->id && in_frame->id<=BASE_FRAME_RESET_NUM)))) { dev->addr = in_frame->ori_addr; dev->id = in_frame->id; diff --git a/app_source/source/serialportmanager.cpp b/app_source/source/serialportmanager.cpp index e8bffb3..4ff3172 100644 --- a/app_source/source/serialportmanager.cpp +++ b/app_source/source/serialportmanager.cpp @@ -26,6 +26,7 @@ SerialPortManager::SerialPortManager(QObject *parent) if (!_handledBymanager && _serial_port.isOpen()) { _zigbee->init(&_serial_port, _serial_port.baudRate()); + zigbee_protocol::Protocol::getInstance()->self_addr = _zigbee->read_addr(); connect(_zigbee, &zigbee_protocol::DLLN3X::recved, this, &SerialPortManager::zigbee_callback); } else @@ -192,7 +193,7 @@ bool SerialPortManager::write(QString data) for (auto item : td) bdata += QByteArray::fromHex(item.toLatin1()); - zigbee_protocol::ZigbeeFrame zf(bdata[2],bdata[3],(uint16_t)bdata[4] | bdata[5]<<8, bdata.data()+6,bdata.length()-7); + zigbee_protocol::ZigbeeFrame zf(bdata[2],bdata[3],*(uint16_t*)(bdata.data()+4), bdata.data()+6,bdata.length()-7); return _zigbee->send(zf); } diff --git a/app_source/source/zigbeeparser.cpp b/app_source/source/zigbeeparser.cpp index 99ae0ce..a0004a4 100644 --- a/app_source/source/zigbeeparser.cpp +++ b/app_source/source/zigbeeparser.cpp @@ -63,7 +63,7 @@ void ZigBeeParser::des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, bool is QPair* node = nullptr; memset(&temp,0,sizeof(temp)); memset(&temp,0,sizeof(self)); - self.addr = SELF_ADDR; + self.addr = _protocol->self_addr; if (!nodes.contains(((base_frame *)zframe.getData().data())->ori_addr)) { temp.addr=((base_frame *)zframe.getData().data())->ori_addr; @@ -75,7 +75,7 @@ void ZigBeeParser::des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, bool is } node = &nodes[((base_frame *)zframe.getData().data())->ori_addr]; bframe = (base_frame*)zframe.getData().data(); - if (is_demo || bframe->des_addr == SELF_ADDR && (node->first.id == 0||bframe->reset_num==0xDD||((bframe->id > node->first.id && bframe->id<=BASE_FRAME_RESET_NUM)))) + if (is_demo || bframe->des_addr == _protocol->self_addr && (node->first.id == 0||bframe->reset_num==0xDD||((bframe->id > node->first.id && bframe->id<=BASE_FRAME_RESET_NUM)))) { node->first.addr = bframe->ori_addr; node->first.id = bframe->id; @@ -126,7 +126,7 @@ void ZigBeeParser::des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, bool is object.insert("text",QJsonValue(QString(zdata.toHex(' ').toUpper()))); object.insert("note_text",QJsonValue("向0x"+QString::number(node->first.addr,16).toUpper()+"节点发送验证通过回复信息")); object.insert("recieved", false); - object.insert("sender", QString::number(SELF_ADDR,16).toUpper()); + object.insert("sender", QString::number(_protocol->self_addr,16).toUpper()); object.insert("type","zigbee_identify_data"); _bus->push_data("zigbee_identify_data_view",object); if(!is_demo) @@ -160,7 +160,7 @@ void ZigBeeParser::des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, bool is object.insert("text",QJsonValue(QString(zfdata.toHex(' ').toUpper()))); object.insert("note_text",QJsonValue("节点0x"+QString::number(node->first.addr,16).toUpper()+"正在使用旧密钥,发送密钥更新指令")); object.insert("recieved", false); - object.insert("sender", QString::number(SELF_ADDR,16).toUpper()); + object.insert("sender", QString::number(_protocol->self_addr,16).toUpper()); object.insert("type","zigbee_identify_data"); _bus->push_data("zigbee_identify_data_view",object); if(!is_demo) @@ -253,7 +253,7 @@ void ZigBeeParser::des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, bool is zigbee_protocol::ZigbeeFrame zf(0x83,0x83,node->first.addr,(char *)&bframe,bframe.length); QByteArray zfdata((char *)zf.data(),zf.size()); QJsonObject object; - object.insert("sender", QString::number(SELF_ADDR,16).toUpper()); + object.insert("sender", QString::number(_protocol->self_addr,16).toUpper()); object.insert("text",QJsonValue(QString(zfdata.toHex(' ').toUpper()))); object.insert("note_text",QJsonValue("向节点0x"+sender+"发送重置命令")); object.insert("recieved", false); @@ -279,7 +279,7 @@ void ZigBeeParser::remote_addr_parser(zigbee_protocol::ZigbeeFrame &zframe, bool void ZigBeeParser::message_parser(QJsonObject message) { - if (message["type"] == "demo_verify_request" || message["type"] == "zigbee_verify_request") + if (message["type"] == "demo_verify_request") { hmac_frame frame; frame.value = QRandomGenerator::global()->bounded(256); @@ -290,11 +290,11 @@ void ZigBeeParser::message_parser(QJsonObject message) new_base_frame(50 + BASE_FRAME_PREFIX_LEN) bframe; device test; test.addr = 0x5656; - _protocol->base_frame_maker(&frame, (base_frame *)&bframe, 0x5656, &test); + _protocol->base_frame_maker(&frame, (base_frame *)&bframe, _protocol->self_addr, &test); zigbee_protocol::ZigbeeFrame zf(0x81,0x81,0x5656,(char*)&bframe,bframe.length); - data_parser(zf, message["type"] == "demo_verify_request"); + data_parser(zf, true); } - if (message["type"] == "demo_verify_key_update" || message["type"] == "zigbee_verify_key_update") + if (message["type"] == "demo_verify_key_update") { hmac_frame frame; frame.value = QRandomGenerator::global()->bounded(256); @@ -305,9 +305,9 @@ void ZigBeeParser::message_parser(QJsonObject message) new_base_frame(50 + BASE_FRAME_PREFIX_LEN) bframe; device test; test.addr = 0x5656; - _protocol->base_frame_maker(&frame, (base_frame *)&bframe, 0x5656, &test); + _protocol->base_frame_maker(&frame, (base_frame *)&bframe, _protocol->self_addr, &test); zigbee_protocol::ZigbeeFrame zf(0x81,0x81,0x5656,(char*)&bframe,bframe.length); - data_parser(zf, message["type"] == "demo_verify_key_update"); + data_parser(zf, true); } if (message["type"] == "demo_recv_data" || message["type"] == "zigbee_raw_data") { @@ -316,7 +316,7 @@ void ZigBeeParser::message_parser(QJsonObject message) QStringList td = data.split(' '); for (auto item : td) bdata += QByteArray::fromHex(item.toLatin1()); - zigbee_protocol::ZigbeeFrame zf(bdata[2],bdata[3],(uint16_t)bdata[4] | bdata[5]<<8, bdata.data()+6,bdata.length()-7); + zigbee_protocol::ZigbeeFrame zf(bdata[2],bdata[3], *(uint16_t*)(bdata.data()+4), bdata.data()+6,bdata.length()-7); data_parser(zf, message["type"] == "demo_recv_data"); } }