message.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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 data []byte
  24. if message.Body != nil && !reflect.ValueOf(message.Body).IsNil() {
  25. data, err = message.Body.Encode(nil)
  26. if err != nil {
  27. return nil, err
  28. }
  29. }
  30. // 二进制转义
  31. buffer := bytes.NewBuffer(nil)
  32. message.write(buffer, data)
  33. return buffer.Bytes(), nil
  34. }
  35. // 协议解码
  36. func (message *Message) Decode(ctx *PacketContext, data []byte) (result string, err error) {
  37. // 检验标志位
  38. length := len(data)
  39. if length == 0 {
  40. return result, errors.ErrInvalidMessage
  41. }
  42. for i := 0; i <= length; i++ {
  43. if data[i] == SendByte {
  44. continue
  45. } else {
  46. data = data[i:length]
  47. glog.Debugf("收到数据:%2X", data)
  48. break
  49. }
  50. }
  51. if data[0] != ReceiveByte {
  52. return result, nil
  53. }
  54. if !message.checkSum(data) {
  55. return result, errors.ErrInvalidCheckSum
  56. }
  57. //处理注册包
  58. if data[0] == RegisterByte {
  59. header := Header{}
  60. _ = json.Unmarshal(data, &header)
  61. header.IccID, err = strconv.ParseUint(header.Imei, 10, 64)
  62. header.MsgID = 0x0040 //消息ID
  63. if err != nil {
  64. if err != nil {
  65. glog.Errorf("解析报文失败:%s", err.Error())
  66. }
  67. }
  68. message.Body = nil
  69. message.Header = header
  70. return result, nil
  71. }
  72. if len(data) < 8 {
  73. if err != nil {
  74. glog.Errorf("解析报文失败:%s", errors.ErrInvalidBody)
  75. }
  76. }
  77. if data[8] == 0x93 {
  78. _, err := message.decode(ctx, uint32(0x93), data[:])
  79. if err != nil {
  80. glog.Errorf("解析报文失败:%s", err.Error())
  81. }
  82. } else {
  83. msgID := MsgID(binary.BigEndian.Uint32(data[10:15])) //消息ID
  84. result, err = message.decode(ctx, uint32(msgID), data[:]) //解析实体对象 entity buffer : 为消息标识
  85. if err != nil {
  86. glog.Errorf("解析报文失败:%s", err.Error())
  87. }
  88. }
  89. return result, nil
  90. }
  91. //--->
  92. func (message *Message) decode(ctx *PacketContext, dataType uint32, data []byte) (result string, err error) {
  93. creator, ok := entityMapper[dataType]
  94. if !ok {
  95. return result, errors.ErrTypeNotRegistered
  96. }
  97. entity := creator()
  98. result, err = entity.Decode(ctx, data) //解析data数据
  99. if err != nil {
  100. return result, err
  101. }
  102. return result, err
  103. }
  104. // 写入二进制数据
  105. func (message *Message) write(buffer *bytes.Buffer, data []byte) *Message {
  106. for _, b := range data {
  107. if b == PrefixID {
  108. buffer.WriteByte(EscapeByte)
  109. buffer.WriteByte(EscapeByteSufix2)
  110. } else if b == EscapeByte {
  111. buffer.WriteByte(EscapeByte)
  112. buffer.WriteByte(EscapeByteSufix1)
  113. } else {
  114. buffer.WriteByte(b)
  115. }
  116. }
  117. return message
  118. }
  119. // 和校验
  120. func (message *Message) checkSum(data []byte) bool {
  121. var checkSum byte
  122. for _, b := range data[:len(data)-2] {
  123. checkSum += b
  124. }
  125. checkSum = checkSum & 0xFF
  126. if checkSum == data[len(data)-2] {
  127. return true
  128. }
  129. return false
  130. }