dlt645_0x33333635.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package protocol
  2. import (
  3. "encoding/hex"
  4. "github.com/gogf/gf/os/glog"
  5. "strconv"
  6. )
  7. type Dlt_0x33333635 struct {
  8. //接收表号
  9. DeviceAddress []byte
  10. //表号
  11. DeviceID string
  12. //当前总有功功率
  13. ActivePower float64
  14. }
  15. func (e *Dlt_0x33333635) MsgID() MsgID {
  16. return Msgdlt_0x33333635
  17. }
  18. func (e *Dlt_0x33333635) GetData() (string, float64) {
  19. return "当前总有功功率", e.ActivePower
  20. }
  21. func (e *Dlt_0x33333635) Encode(ctx *PacketContext) ([]byte, error) {
  22. writer := NewWriter()
  23. // 接收符号
  24. writer.Write([]byte{0x68})
  25. writer.Write(ctx.GetReceiveAddress())
  26. writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x33, 0x36, 0x35})
  27. //cs效验位
  28. var one byte
  29. for _, v := range writer.Bytes() {
  30. one += v
  31. }
  32. writer.WriteByte(one)
  33. // 功能码
  34. writer.WriteByte(0x16)
  35. return writer.Bytes(), nil
  36. }
  37. func (e *Dlt_0x33333635) Decode(ctx *PacketContext, dataByte []byte) (data Data, err error) {
  38. bytea := dataByte[1:7]
  39. for i, j := 0, len(bytea)-1; i < j; i, j = i+1, j-1 {
  40. bytea[i], bytea[j] = bytea[j], bytea[i]
  41. }
  42. e.DeviceID = hex.EncodeToString(bytea)
  43. //正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
  44. byteb := make([]byte, 3)
  45. for i := 0; i < 3; i++ {
  46. byteb[i] = dataByte[14+i] - 0x33
  47. }
  48. e.ActivePower, err = stringToActivePower(hex.EncodeToString(byteb))
  49. if err != nil {
  50. return data, err
  51. }
  52. glog.Debugf("数据读取成功:表号:%s,当前总有功功率:%2f", e.DeviceID, e.ActivePower)
  53. return data, nil
  54. }
  55. func stringToActivePower(s string) (float64, error) {
  56. a0, _ := strconv.ParseFloat(s[0:2], 64)
  57. a1, _ := strconv.ParseFloat(s[2:4], 64)
  58. a2, _ := strconv.ParseFloat(s[4:6], 64)
  59. res := a0*0.0001 + a1*0.01 + a2
  60. return res, nil
  61. }