message.go 3.4 KB

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