Compare commits

...

4 Commits

3 changed files with 48 additions and 16 deletions

View File

@ -15,7 +15,8 @@ SerialDataResolver::SerialDataResolver(QObject *parent)
{
_zigbee->init(_serial, _serial->baudRate());
zigbee_protocol::Protocol::getInstance()->self_addr = _zigbee->read_addr();
connect(_zigbee, &zigbee_protocol::DLLN3X::recved, this, &SerialDataResolver::zigbee_callback);
connect(_zigbee, &zigbee_protocol::DLLN3X::recved, this, &SerialDataResolver::zigbee_callback,
Qt::ConnectionType(Qt::AutoConnection | Qt::UniqueConnection));
}
else
{
@ -109,7 +110,8 @@ void SerialDataResolver::open(QString port_name, QString baudrate, QString datab
{
_zigbee->init(_serial, _serial->baudRate());
zigbee_protocol::Protocol::getInstance()->self_addr = _zigbee->read_addr();
connect(_zigbee, &zigbee_protocol::DLLN3X::recved, this, &SerialDataResolver::zigbee_callback);
connect(_zigbee, &zigbee_protocol::DLLN3X::recved, this, &SerialDataResolver::zigbee_callback,
Qt::ConnectionType(Qt::AutoConnection | Qt::UniqueConnection));
}
}
}
@ -186,6 +188,7 @@ void SerialDataResolver::close()
serial_opened(false);
disconnect(_serial,&QSerialPort::aboutToClose,this,&SerialDataResolver::close);
disconnect(_zigbee, &zigbee_protocol::DLLN3X::recved, this, &SerialDataResolver::zigbee_callback);
if(_serial->isOpen())
{
_serial->clear();

View File

@ -60,6 +60,7 @@ void ZigBeeDataResolver::des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, b
QString sender = QString::number(((base_frame *)zframe.getData().data())->ori_addr,16).toUpper();
device temp,self;
QPair<device,device>* node = nullptr;
bool addr_check = false, id_check = false, reset_flag_check = false;
memset(&temp,0,sizeof(temp));
memset(&temp,0,sizeof(self));
self.addr = _protocol->self_addr;
@ -74,7 +75,10 @@ void ZigBeeDataResolver::des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, b
}
node = &nodes[((base_frame *)zframe.getData().data())->ori_addr];
bframe = (base_frame*)zframe.getData().data();
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))))
addr_check = bframe->des_addr == _protocol->self_addr;
id_check = node->first.id == 0 || ((bframe->id > node->first.id && bframe->id<=BASE_FRAME_RESET_NUM));
reset_flag_check = bframe->reset_num==0xDD;
if (is_demo || addr_check && (id_check||reset_flag_check))
{
node->first.addr = bframe->ori_addr;
node->first.id = bframe->id;
@ -83,13 +87,18 @@ void ZigBeeDataResolver::des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, b
}
else
{
QString error_str;
QJsonObject object;
if (!addr_check)
error_str += "地址错误包目的地址为0x" + QString::number(bframe->des_addr, 16).toUpper();
if(!(id_check||reset_flag_check))
error_str += "包id错误且重置标志位未标记为生效当前包ID为" + QString::number(bframe->id) + "系统存储ID为" + QString::number(node->first.id);
object.insert("text",QJsonValue(QString(zdata.toHex(' ').toUpper())));
object.insert("note_text",QJsonValue("请注意节点0x"+QString::number(node->first.addr,16).toUpper()+"发送的该数据包损坏"));
object.insert("note_text",QJsonValue("请注意节点0x"+QString::number(node->first.addr,16).toUpper()+"发送的该数据包损坏"+error_str));
object.insert("recieved", true);
object.insert("sender", sender);
object.insert("type","zigbee_identify_data");
emit data_send("zigbee_identify_data_view",object);
object.insert("type","zigbee_recv_data");
emit data_send("zigbee_recv_data",object);
return;
}
switch (zframe.getDesPort()) {
@ -212,23 +221,43 @@ void ZigBeeDataResolver::des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, b
QJsonObject object;
if (node->first.verified)
{
zigbee_protocol::ZigbeeFrame dzf = zframe;
new_data_frame(72) ndata;
uint8_t data_len = 0;
memset(&ndata,0,sizeof(ndata));
if (*(u16 *)frame == CRYPTO_ZDATA_FRAME_HEAD)
{
czdata = (crypto_zdata_frame*)frame;
_protocol->zigbee_data_dectypt((uint8_t*)&ndata, &data_len, czdata, Crypto::SM4_decrypt);
dzf.setData((char*)&ndata,ndata.data_length + DATA_FRAME_PREFIX_LEN);
zdata = QByteArray((char *)dzf.data(), dzf.size());
object.insert("decrypted_text", QJsonValue(QString(zdata.toHex(' ').toUpper())));
}
object.insert("sender", sender);
object.insert("text",QJsonValue(QString(zdata.toHex(' ').toUpper())));
object.insert("note_text",QJsonValue("收到节点0x"+sender+"发送的数据"));
object.insert("recieved", true);
object.insert("type","zigbee_recv_data");
if (*(u16 *)frame == CRYPTO_ZDATA_FRAME_HEAD)
{
QString note_text = "解密数据为按照未加密传输重新打包的原始数据,因此数据长度会有差异\n";
new_base_frame(sizeof(ndata)) nbframe;
memcpy(&nbframe, bframe, BASE_FRAME_PREFIX_LEN);
zigbee_protocol::ZigbeeFrame nzframe = zframe;
czdata = (crypto_zdata_frame*)frame;
_protocol->zigbee_data_dectypt((uint8_t*)&ndata, &data_len, czdata, Crypto::SM4_decrypt);
memcpy(nbframe.data, &ndata, ndata.data_length + DATA_FRAME_PREFIX_LEN);
nbframe.length = BASE_FRAME_PREFIX_LEN + ndata.data_length + DATA_FRAME_PREFIX_LEN;
nzframe.setData((char*)&nbframe,nbframe.length);
zdata = QByteArray((char *)nzframe.data(), nzframe.size());
object.insert("decrypted_text", QJsonValue(QString(zdata.toHex(' ').toUpper())));
switch (ndata.type) {
case SENSOR_DATA_TYPE:
{
note_text += "传感器数据:";
sensor_data* sdata = (sensor_data*)ndata.data;
note_text += "PPM:" + QString::number(sdata->ppm) + ' ';
note_text += "Temperature:" + QString::number(sdata->temp) + ' ';
note_text += "Humidity:" + QString::number(sdata->humi) + ' ';
note_text += "Flare:" + QString::number(sdata->flare) + ' ';
break;
}
default:
break;
}
object.insert("note_text",QJsonValue(note_text));
}
if (QRandomGenerator::global()->bounded(2)!=0 && is_demo)
object.insert("decrypted_text", QJsonValue(QString(zdata.toHex(' ').toUpper())));
emit data_send("zigbee_recv_data_view",object);
@ -258,6 +287,7 @@ void ZigBeeDataResolver::des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, b
object.insert("type","zigbee_recv_data");
emit data_send("zigbee_recv_data_view",object);
}
break;
}
default:
break;

View File

@ -1,5 +1,4 @@
#include "zigbeeparser.h"
#include "crypto.h"
#include <QMutex>
#include <QThread>
#include <QRandomGenerator>