message.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. package protocol
  2. import (
  3. "bytes"
  4. "dlt645-server/errors"
  5. "encoding/binary"
  6. "encoding/json"
  7. "fmt"
  8. log "github.com/sirupsen/logrus"
  9. "reflect"
  10. "strconv"
  11. )
  12. // 消息包
  13. type Message struct {
  14. Header Header
  15. Body Entity
  16. }
  17. type DHeader struct {
  18. MsgID MsgID
  19. }
  20. // 协议编码
  21. func (message *Message) Encode() ([]byte, error) {
  22. // 编码消息体
  23. var err error
  24. var body []byte
  25. if message.Body != nil && !reflect.ValueOf(message.Body).IsNil() {
  26. body, err = message.Body.Encode()
  27. if err != nil {
  28. return nil, err
  29. }
  30. }
  31. // 二进制转义
  32. buffer := bytes.NewBuffer(nil)
  33. message.write(buffer, body)
  34. return buffer.Bytes(), nil
  35. }
  36. // 协议解码
  37. func (message *Message) Decode(data []byte) error {
  38. // 检验标志位
  39. length := len(data)
  40. if length == 0 {
  41. return errors.ErrInvalidMessage
  42. }
  43. if data[0] != ReceiveByte && data[0] != RegisterByte {
  44. return errors.ErrInvalidMessage
  45. }
  46. if !message.checkSum(data){
  47. return errors.ErrInvalidCheckSum
  48. }
  49. var header Header
  50. var err error
  51. //处理注册包
  52. if data[0] == RegisterByte {
  53. header := Header{}
  54. _ = json.Unmarshal(data, &header)
  55. //fmt.Println(header.Imei)
  56. //fmt.Println()
  57. header.IccID, err = strconv.ParseUint(header.Imei, 10, 64)
  58. header.MsgID = 0x0040 //消息ID
  59. if err == nil {
  60. message.Body = nil
  61. } else {
  62. log.WithFields(log.Fields{
  63. "id": fmt.Sprintf("0x%x", header.MsgID),
  64. "reason": err,
  65. }).Warn("failed to decode message")
  66. }
  67. message.Header = header
  68. return nil
  69. } else if len(data) < 8 {
  70. log.WithFields(log.Fields{
  71. "data": fmt.Sprintf("V:%v", data),
  72. "reason": "error datalen",
  73. }).Warn("failed to decode message")
  74. } else {
  75. header.MsgID = MsgID(binary.BigEndian.Uint32(data[10:15])) //消息ID
  76. entity, _, err := message.decode(uint32(header.MsgID), data[:]) //解析实体对象 entity buffer : 为消息标识
  77. if err == nil {
  78. message.Body = entity
  79. } else {
  80. log.WithFields(log.Fields{
  81. "id": fmt.Sprintf("0x%x", header.MsgID),
  82. "reason": err,
  83. }).Warn("failed to decode message")
  84. }
  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. }