Compare commits
4 Commits
74b2334b40
...
cc08435a3a
Author | SHA1 | Date |
---|---|---|
|
cc08435a3a | |
|
dcdf352bbc | |
|
794b6c19c6 | |
|
7ae6fb01c8 |
|
@ -15,7 +15,8 @@ SerialDataResolver::SerialDataResolver(QObject *parent)
|
||||||
{
|
{
|
||||||
_zigbee->init(_serial, _serial->baudRate());
|
_zigbee->init(_serial, _serial->baudRate());
|
||||||
zigbee_protocol::Protocol::getInstance()->self_addr = _zigbee->read_addr();
|
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
|
else
|
||||||
{
|
{
|
||||||
|
@ -109,7 +110,8 @@ void SerialDataResolver::open(QString port_name, QString baudrate, QString datab
|
||||||
{
|
{
|
||||||
_zigbee->init(_serial, _serial->baudRate());
|
_zigbee->init(_serial, _serial->baudRate());
|
||||||
zigbee_protocol::Protocol::getInstance()->self_addr = _zigbee->read_addr();
|
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);
|
serial_opened(false);
|
||||||
disconnect(_serial,&QSerialPort::aboutToClose,this,&SerialDataResolver::close);
|
disconnect(_serial,&QSerialPort::aboutToClose,this,&SerialDataResolver::close);
|
||||||
disconnect(_zigbee, &zigbee_protocol::DLLN3X::recved, this, &SerialDataResolver::zigbee_callback);
|
disconnect(_zigbee, &zigbee_protocol::DLLN3X::recved, this, &SerialDataResolver::zigbee_callback);
|
||||||
|
|
||||||
if(_serial->isOpen())
|
if(_serial->isOpen())
|
||||||
{
|
{
|
||||||
_serial->clear();
|
_serial->clear();
|
||||||
|
|
|
@ -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();
|
QString sender = QString::number(((base_frame *)zframe.getData().data())->ori_addr,16).toUpper();
|
||||||
device temp,self;
|
device temp,self;
|
||||||
QPair<device,device>* node = nullptr;
|
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(temp));
|
||||||
memset(&temp,0,sizeof(self));
|
memset(&temp,0,sizeof(self));
|
||||||
self.addr = _protocol->self_addr;
|
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];
|
node = &nodes[((base_frame *)zframe.getData().data())->ori_addr];
|
||||||
bframe = (base_frame*)zframe.getData().data();
|
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.addr = bframe->ori_addr;
|
||||||
node->first.id = bframe->id;
|
node->first.id = bframe->id;
|
||||||
|
@ -83,13 +87,18 @@ void ZigBeeDataResolver::des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, b
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
QString error_str;
|
||||||
QJsonObject object;
|
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("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("recieved", true);
|
||||||
object.insert("sender", sender);
|
object.insert("sender", sender);
|
||||||
object.insert("type","zigbee_identify_data");
|
object.insert("type","zigbee_recv_data");
|
||||||
emit data_send("zigbee_identify_data_view",object);
|
emit data_send("zigbee_recv_data",object);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (zframe.getDesPort()) {
|
switch (zframe.getDesPort()) {
|
||||||
|
@ -212,23 +221,43 @@ void ZigBeeDataResolver::des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, b
|
||||||
QJsonObject object;
|
QJsonObject object;
|
||||||
if (node->first.verified)
|
if (node->first.verified)
|
||||||
{
|
{
|
||||||
zigbee_protocol::ZigbeeFrame dzf = zframe;
|
|
||||||
new_data_frame(72) ndata;
|
new_data_frame(72) ndata;
|
||||||
uint8_t data_len = 0;
|
uint8_t data_len = 0;
|
||||||
memset(&ndata,0,sizeof(ndata));
|
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("sender", sender);
|
||||||
object.insert("text",QJsonValue(QString(zdata.toHex(' ').toUpper())));
|
object.insert("text",QJsonValue(QString(zdata.toHex(' ').toUpper())));
|
||||||
object.insert("note_text",QJsonValue("收到节点0x"+sender+"发送的数据"));
|
object.insert("note_text",QJsonValue("收到节点0x"+sender+"发送的数据"));
|
||||||
object.insert("recieved", true);
|
object.insert("recieved", true);
|
||||||
object.insert("type","zigbee_recv_data");
|
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)
|
if (QRandomGenerator::global()->bounded(2)!=0 && is_demo)
|
||||||
object.insert("decrypted_text", QJsonValue(QString(zdata.toHex(' ').toUpper())));
|
object.insert("decrypted_text", QJsonValue(QString(zdata.toHex(' ').toUpper())));
|
||||||
emit data_send("zigbee_recv_data_view",object);
|
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");
|
object.insert("type","zigbee_recv_data");
|
||||||
emit data_send("zigbee_recv_data_view",object);
|
emit data_send("zigbee_recv_data_view",object);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#include "zigbeeparser.h"
|
#include "zigbeeparser.h"
|
||||||
#include "crypto.h"
|
|
||||||
#include <QMutex>
|
#include <QMutex>
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
#include <QRandomGenerator>
|
#include <QRandomGenerator>
|
||||||
|
|
Loading…
Reference in New Issue