diff --git a/app_source/include/protocol_data.h b/app_source/include/protocol_data.h index 7c00823..ac39d62 100644 --- a/app_source/include/protocol_data.h +++ b/app_source/include/protocol_data.h @@ -121,6 +121,7 @@ typedef struct crypto_zdata_frame { u16 head; u16 length; + u16 crc; u8 data[100]; }crypto_zdata_frame; diff --git a/app_source/source/protocol.cpp b/app_source/source/protocol.cpp index d8ac27a..81401b9 100644 --- a/app_source/source/protocol.cpp +++ b/app_source/source/protocol.cpp @@ -166,6 +166,7 @@ void Protocol::zigbee_data_encrypt(uint8_t *data, uint8_t data_len, crypto_zdata QByteArray key = QByteArray::fromHex(en_key == "" ? hmac_verify_key.toLatin1() : en_key.toLatin1()); SM4_encrypt((u8 *)key.data(), 16, data, data_len, zdata->data,&len,false); zdata->length = len + CRYPTO_ZDATA_FRAME_PREFIX_LEN; + zdata->crc = crc16_xmodem(data, data_len); } bool Protocol::zigbee_data_dectypt(uint8_t *data, uint8_t *data_len, crypto_zdata_frame *zdata, @@ -179,6 +180,9 @@ bool Protocol::zigbee_data_dectypt(uint8_t *data, uint8_t *data_len, crypto_zdat QByteArray key = QByteArray::fromHex(en_key == "" ? hmac_verify_key.toLatin1() : en_key.toLatin1()); SM4_decrypt((u8 *)key.data(), 16, zdata->data, msglen, data, &len,false); *data_len = len; + u16 crc = crc16_xmodem(data, *data_len); + if (crc != zdata->crc) + return false; return true; } diff --git a/app_source/source/zigbeedataresolver.cpp b/app_source/source/zigbeedataresolver.cpp index 36e9e67..a342261 100644 --- a/app_source/source/zigbeedataresolver.cpp +++ b/app_source/source/zigbeedataresolver.cpp @@ -251,6 +251,7 @@ void ZigBeeDataResolver::des_port_parser(zigbee_protocol::ZigbeeFrame &zframe, b object.insert("note_text",QJsonValue(note_text)); emit data_send("zigbee_recv_data_view",object); node->second.id=0; + node->second.verified=0; new_data_frame(5) dframe; memset(&dframe,0,sizeof (dframe)); _protocol->protocal_wrapper((data_frame *)&dframe, 0, 5, (u8 *)"RESET", false); @@ -324,6 +325,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); node->second.id=0; + node->second.verified=0; new_data_frame(5) dframe; memset(&dframe,0,sizeof (dframe)); _protocol->protocal_wrapper((data_frame *)&dframe, 0, 5, (u8 *)"RESET", false);