data_frame.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #ifndef DATA_FRAME_H
  2. #define DATA_FRAME_H
  3. #include <stdint.h>
  4. #include <QTextCodec>
  5. // 消息体属性.
  6. union MsgBodyAttr {
  7. struct {
  8. uint16_t msglen:10; // 消息体长度, 占用10bit.
  9. uint16_t encrypt:3; // 数据加密方式, 当此三位都为0, 表示消息体不加密, // 当第10位为1, 表示消息体经过RSA算法加密.
  10. uint16_t packet:1; // 分包标记.
  11. uint16_t retain:2; // 保留2位.
  12. }bit;
  13. uint16_t u16val;
  14. };
  15. // 消息内容起始位置.
  16. enum MsgBodyPos {
  17. MSGBODY_NOPACKET_POS = 13, // 短消息体消息内容起始位置.
  18. MSGBODY_PACKET_POS = 17, // 长消息体消息内容起始位置.
  19. };
  20. // 转义相关标识.
  21. enum ProtocolEscapeFlag {
  22. PROTOCOL_SIGN = 0x7E, // 标识位.
  23. PROTOCOL_ESCAPE = 0x7D, // 转义标识.
  24. PROTOCOL_ESCAPE_SIGN = 0x02, // 0x7E<-->0x7D后紧跟一个0x02.
  25. PROTOCOL_ESCAPE_ESCAPE = 0x01, // 0x7D<-->0x7D后紧跟一个0x01.
  26. };
  27. // 消息头.
  28. struct MsgHead_2013 {
  29. uint16_t msg_id; // 消息ID.
  30. MsgBodyAttr msgbody_attr; // 消息体属性.
  31. uint8_t phone_num[6]; // 终端手机号.
  32. uint16_t msg_flow_num; // 消息流水号.
  33. uint16_t total_packet; // 总包数, 分包情况下使用.
  34. uint16_t packet_seq; // 当前包编号, 分包情况下使用.
  35. };
  36. // 消息头.
  37. struct MsgHead_2019
  38. {
  39. uint16_t msg_id; // 消息ID.
  40. MsgBodyAttr msgbody_attr; // 消息体属性.
  41. uint8_t version; // 协议版本.
  42. uint8_t phone_num[10]; // 终端手机号.
  43. uint16_t msg_flow_num; // 消息流水号.
  44. uint16_t total_packet; // 总包数, 分包情况下使用.
  45. uint16_t packet_seq; // 当前包编号, 分包情况下使用.
  46. };
  47. typedef struct MsgHead_txt_2013 {
  48. uint8_t msg_id[4]; // 消息ID.
  49. uint8_t attr[4]; // 消息体属性.
  50. uint8_t phone[12]; // 终端手机号.
  51. uint8_t sn[4]; // 消息流水号.
  52. uint8_t total[4]; // 总包数, 分包情况下使用.
  53. uint8_t sub[4]; // 当前包编号, 分包情况下使用.
  54. }MsgHead_txt_2013;
  55. typedef struct
  56. {
  57. uint16_t frameflag; //帧头 0-1
  58. uint32_t deviceaddr; //4字节扩展地址 2--5
  59. uint16_t functioncode; //读写功能码
  60. uint16_t cmdcode; // 命令码
  61. uint16_t datalength; //数据个数2字节
  62. uint32_t reserved; //保留字4字节 12--15
  63. }Command_Header;
  64. typedef struct
  65. {
  66. uint8_t frameflag[4]; //帧头 0-1
  67. uint8_t deviceaddr[8]; //4字节扩展地址 2--5
  68. uint8_t functioncode[4]; //读写功能码
  69. uint8_t cmdcode[4]; //命令码
  70. uint8_t datalength[4]; //数据个数2字节
  71. uint8_t reserved[8]; //保留字4字节 12--15
  72. }T2C_Header_txt;
  73. void frame_to_ascii(QString in,QString *out);
  74. void frame_decode_jtt808(QString in,QString *out);
  75. void frame_decode_recognize(QString in,QString *out);
  76. #endif // DATA_FRAME_H