header.go 2.2 KB

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