message.go 3.4 KB

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