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_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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
#include "zigbeeparser.h"
|
||||
#include "crypto.h"
|
||||
#include <QMutex>
|
||||
#include <QThread>
|
||||
#include <QRandomGenerator>
|
||||
|
|
Loading…
Reference in New Issue