SerialPort and ZigBeeParser: bug fix in windows.

This commit is contained in:
Mentalflow 2024-02-22 10:22:35 +08:00
parent e82af33bb8
commit ce2218857f
Signed by: Mentalflow
GPG Key ID: 5AE68D4401A2EE71
8 changed files with 21 additions and 22 deletions

View File

@ -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;
}

View File

@ -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();

View File

@ -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

View File

@ -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;j<repeat_count;j++){
t+=` ${get_rand_byte()}${get_rand_byte()}`

View File

@ -253,7 +253,7 @@ Flow{
}
RibbonToolTip{
text: "ZigBee帧 源地址"
text: `ZigBee帧 , 0x${data_list[5]}${data_list[4]}`
visible: z_address_hh.hovered && control.show_tooltip
}

View File

@ -113,7 +113,7 @@ void Protocol::base_frame_maker(void *in_frame, base_frame *out_frame, u16 dest_
bool Protocol::base_frame_parser(base_frame *in_frame, void **out_frame , device *dev)
{
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))))
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;

View File

@ -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);
}

View File

@ -63,7 +63,7 @@ void ZigBeeParser::des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, bool is
QPair<device,device>* 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");
}
}