#ifndef DATA_FRAME_H #define DATA_FRAME_H #include #include // 消息体属性. union MsgBodyAttr { struct { uint16_t msglen:10; // 消息体长度, 占用10bit. uint16_t encrypt:3; // 数据加密方式, 当此三位都为0, 表示消息体不加密, // 当第10位为1, 表示消息体经过RSA算法加密. uint16_t packet:1; // 分包标记. uint16_t retain:2; // 保留2位. }bit; uint16_t u16val; }; // 消息内容起始位置. enum MsgBodyPos { MSGBODY_NOPACKET_POS = 13, // 短消息体消息内容起始位置. MSGBODY_PACKET_POS = 17, // 长消息体消息内容起始位置. }; // 转义相关标识. enum ProtocolEscapeFlag { PROTOCOL_SIGN = 0x7E, // 标识位. PROTOCOL_ESCAPE = 0x7D, // 转义标识. PROTOCOL_ESCAPE_SIGN = 0x02, // 0x7E<-->0x7D后紧跟一个0x02. PROTOCOL_ESCAPE_ESCAPE = 0x01, // 0x7D<-->0x7D后紧跟一个0x01. }; // 消息头. struct MsgHead_2013 { uint16_t msg_id; // 消息ID. MsgBodyAttr msgbody_attr; // 消息体属性. uint8_t phone_num[6]; // 终端手机号. uint16_t msg_flow_num; // 消息流水号. uint16_t total_packet; // 总包数, 分包情况下使用. uint16_t packet_seq; // 当前包编号, 分包情况下使用. }; // 消息头. struct MsgHead_2019 { uint16_t msg_id; // 消息ID. MsgBodyAttr msgbody_attr; // 消息体属性. uint8_t version; // 协议版本. uint8_t phone_num[10]; // 终端手机号. uint16_t msg_flow_num; // 消息流水号. uint16_t total_packet; // 总包数, 分包情况下使用. uint16_t packet_seq; // 当前包编号, 分包情况下使用. }; typedef struct MsgHead_txt_2013 { uint8_t msg_id[4]; // 消息ID. uint8_t attr[4]; // 消息体属性. uint8_t phone[12]; // 终端手机号. uint8_t sn[4]; // 消息流水号. uint8_t total[4]; // 总包数, 分包情况下使用. uint8_t sub[4]; // 当前包编号, 分包情况下使用. }MsgHead_txt_2013; typedef struct { uint16_t frameflag; //帧头 0-1 uint32_t deviceaddr; //4字节扩展地址 2--5 uint16_t functioncode; //读写功能码 uint16_t cmdcode; // 命令码 uint16_t datalength; //数据个数2字节 uint32_t reserved; //保留字4字节 12--15 }Command_Header; typedef struct { uint8_t frameflag[4]; //帧头 0-1 uint8_t deviceaddr[8]; //4字节扩展地址 2--5 uint8_t functioncode[4]; //读写功能码 uint8_t cmdcode[4]; //命令码 uint8_t datalength[4]; //数据个数2字节 uint8_t reserved[8]; //保留字4字节 12--15 }T2C_Header_txt; void frame_to_ascii(QString in,QString *out); void frame_decode_jtt808(QString in,QString *out); void frame_decode_recognize(QString in,QString *out); #endif // DATA_FRAME_H