header.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package protocol
  2. import (
  3. "dlt645-server/errors"
  4. "dlt645-server/utils"
  5. "strconv"
  6. )
  7. // 封包信息
  8. type Packet struct {
  9. Sum uint16
  10. Seq uint16
  11. }
  12. // 消息头
  13. type Header struct {
  14. MsgID MsgID
  15. Property Property
  16. Ver string `json:"ver"`
  17. Csp uint64 `json:"csp"`
  18. Imei string `json:"imei"`
  19. ICID string `json:"iccid"`
  20. IccID uint64
  21. MsgSerialNo uint16
  22. Packet *Packet
  23. }
  24. // 协议编码
  25. func (header *Header) Encode() ([]byte, error) {
  26. writer := NewWriter()
  27. // 写入消息ID
  28. writer.WriteUint16(uint16(header.MsgID))
  29. // 写入消息体属性
  30. if header.Packet != nil {
  31. header.Property.enablePacket()
  32. }
  33. writer.WriteUint16(uint16(header.Property))
  34. // 写入终端号码
  35. writer.Write(utils.StringToBCD(strconv.FormatUint(header.IccID, 10), 6))
  36. // 写入消息流水号
  37. writer.WriteUint16(header.MsgSerialNo)
  38. // 写入分包信息
  39. if header.Property.IsEnablePacket() {
  40. writer.WriteUint16(header.Packet.Sum)
  41. writer.WriteUint16(header.Packet.Seq)
  42. }
  43. return writer.Bytes(), nil
  44. }
  45. // 协议解码
  46. func (header *Header) Decode(data []byte) error {
  47. if len(data) < MessageHeaderSize {
  48. return errors.ErrInvalidHeader
  49. }
  50. reader := NewReader(data)
  51. // 读取消息ID
  52. msgID, err := reader.ReadUint16()
  53. if err != nil {
  54. return errors.ErrInvalidHeader
  55. }
  56. // 读取消息体属性
  57. property, err := reader.ReadUint16()
  58. if err != nil {
  59. return errors.ErrInvalidHeader
  60. }
  61. // 读取终端号码
  62. temp, err := reader.Read(6)
  63. if err != nil {
  64. return errors.ErrInvalidHeader
  65. }
  66. iccID, err := strconv.ParseUint(utils.BcdToString(temp), 10, 64)
  67. if err != nil {
  68. return err
  69. }
  70. // 读取消息流水号
  71. serialNo, err := reader.ReadUint16()
  72. if err != nil {
  73. return errors.ErrInvalidHeader
  74. }
  75. // 读取分包信息
  76. if Property(property).IsEnablePacket() {
  77. var packet Packet
  78. // 读取分包总数
  79. packet.Sum, err = reader.ReadUint16()
  80. if err != nil {
  81. return err
  82. }
  83. // 读取分包序列号
  84. packet.Seq, err = reader.ReadUint16()
  85. if err != nil {
  86. return err
  87. }
  88. header.Packet = &packet
  89. }
  90. header.MsgID = MsgID(msgID)
  91. header.IccID = iccID
  92. header.Property = Property(property)
  93. header.MsgSerialNo = serialNo
  94. return nil
  95. }