message.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package protocol
  2. import (
  3. "bytes"
  4. "dlt645-server/errors"
  5. "encoding/binary"
  6. "encoding/json"
  7. "github.com/gogf/gf/os/glog"
  8. "reflect"
  9. "strconv"
  10. )
  11. // 消息包
  12. type Message struct {
  13. Header Header
  14. Body Entity
  15. }
  16. type DHeader struct {
  17. MsgID MsgID
  18. }
  19. // 协议编码
  20. func (message *Message) Encode() ([]byte, error) {
  21. // 编码消息体
  22. var err error
  23. var body []byte
  24. if message.Body != nil && !reflect.ValueOf(message.Body).IsNil() {
  25. body, err = message.Body.Encode()
  26. if err != nil {
  27. return nil, err
  28. }
  29. }
  30. // 二进制转义
  31. buffer := bytes.NewBuffer(nil)
  32. message.write(buffer, body)
  33. return buffer.Bytes(), nil
  34. }
  35. // 协议解码
  36. func (message *Message) Decode(data []byte) error {
  37. // 检验标志位
  38. length := len(data)
  39. if length == 0 {
  40. return errors.ErrInvalidMessage
  41. }
  42. if data[0] != ReceiveByte && data[0] != RegisterByte {
  43. return errors.ErrInvalidMessage
  44. }
  45. if !message.checkSum(data) {
  46. return errors.ErrInvalidCheckSum
  47. }
  48. var header Header
  49. var err error
  50. //处理注册包
  51. if data[0] == RegisterByte {
  52. header := Header{}
  53. _ = json.Unmarshal(data, &header)
  54. //fmt.Println(header.Imei)
  55. //fmt.Println()
  56. header.IccID, err = strconv.ParseUint(header.Imei, 10, 64)
  57. header.MsgID = 0x0040 //消息ID
  58. if err != nil {
  59. if err != nil {
  60. glog.Errorf("解析报文失败:%s", err.Error())
  61. }
  62. }
  63. message.Body = nil
  64. message.Header = header
  65. return nil
  66. }
  67. if len(data) < 8 {
  68. if err != nil {
  69. glog.Errorf("解析报文失败:%s", errors.ErrInvalidBody)
  70. }
  71. }
  72. if data[7] == 0x93 {
  73. entity, _, err := message.decode(uint32(0x93), data[:])
  74. if err != nil {
  75. glog.Errorf("解析报文失败:%s", err.Error())
  76. }
  77. message.Body = entity
  78. } else {
  79. header.MsgID = MsgID(binary.BigEndian.Uint32(data[10:15])) //消息ID
  80. entity, _, err := message.decode(uint32(header.MsgID), data[:]) //解析实体对象 entity buffer : 为消息标识
  81. if err != nil {
  82. glog.Errorf("解析报文失败:%s", err.Error())
  83. }
  84. message.Body = entity
  85. }
  86. message.Header = header
  87. return nil
  88. }
  89. //--->
  90. func (message *Message) decode(dataType uint32, data []byte) (Entity, int, error) {
  91. creator, ok := entityMapper[dataType]
  92. if !ok {
  93. return nil, 0, errors.ErrTypeNotRegistered
  94. }
  95. entity := creator()
  96. count, err := entity.Decode(data) //解析data数据
  97. if err != nil {
  98. return nil, 0, err
  99. }
  100. return entity, count, nil
  101. }
  102. // 写入二进制数据
  103. func (message *Message) write(buffer *bytes.Buffer, data []byte) *Message {
  104. for _, b := range data {
  105. if b == PrefixID {
  106. buffer.WriteByte(EscapeByte)
  107. buffer.WriteByte(EscapeByteSufix2)
  108. } else if b == EscapeByte {
  109. buffer.WriteByte(EscapeByte)
  110. buffer.WriteByte(EscapeByteSufix1)
  111. } else {
  112. buffer.WriteByte(b)
  113. }
  114. }
  115. return message
  116. }
  117. // 和校验
  118. func (message *Message) checkSum(data []byte) bool {
  119. var checkSum byte
  120. for _, b := range data[:len(data)-2] {
  121. checkSum += b
  122. }
  123. checkSum = checkSum & 0xFF
  124. if checkSum == data[len(data)-2] {
  125. return true
  126. }
  127. return false
  128. }