message.go 3.5 KB

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