dlt645_0x33323535.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package protocol
  2. import (
  3. "encoding/hex"
  4. "fmt"
  5. "github.com/gogf/gf/os/glog"
  6. "strconv"
  7. )
  8. type Dlt_0x33323535 struct {
  9. //接收表号
  10. DeviceAddress []byte
  11. //表号
  12. DeviceID string
  13. // 当前A相电流
  14. CurrentA float64
  15. // 当前B相电流
  16. CurrentB float64
  17. // 当前C相电流
  18. CurrentC float64
  19. }
  20. func (e *Dlt_0x33323535) MsgID() MsgID {
  21. return Msgdlt_0x33323535
  22. }
  23. func (e *Dlt_0x33323535) Encode(ctx *PacketContext) ([]byte, error) {
  24. writer := NewWriter()
  25. // 接收符号
  26. writer.Write([]byte{0x68})
  27. writer.Write(ctx.GetReceiveAddress())
  28. writer.Write([]byte{0x68, 0x11, 0x04, 0x33, 0x32, 0x35, 0x35})
  29. //cs效验位
  30. var one byte
  31. for _, v := range writer.Bytes() {
  32. one += v
  33. }
  34. writer.WriteByte(one)
  35. // 功能码
  36. writer.WriteByte(0x16)
  37. return writer.Bytes(), nil
  38. }
  39. func (e *Dlt_0x33323535) Decode(ctx *PacketContext, dataByte []byte) (data Data, err error) {
  40. bytea := dataByte[1:7]
  41. for i, j := 0, len(bytea)-1; i < j; i, j = i+1, j-1 {
  42. bytea[i], bytea[j] = bytea[j], bytea[i]
  43. }
  44. e.DeviceID = hex.EncodeToString(bytea)
  45. //正向总电能每个字节-33,1-4,分别为,小数位,个位,百位,万位
  46. byteb := make([]byte, 9)
  47. for i := 0; i < 9; i++ {
  48. byteb[i] = dataByte[14+i] - 0x33
  49. }
  50. _ = e.stringToCurrentBlock(hex.EncodeToString(byteb))
  51. glog.Debugf("数据读取成功:表号:%s,当前A相电流:%2fA,B相电流:%2fA,C相电流:%2fA", e.DeviceID, e.CurrentA, e.CurrentB, e.CurrentC)
  52. data.AI = e.CurrentA
  53. data.BI = e.CurrentB
  54. data.CI = e.CurrentC
  55. data.DataType = IsIData
  56. return data, nil
  57. }
  58. func (e *Dlt_0x33323535) stringToCurrentBlock(s string) error {
  59. a0, _ := strconv.ParseFloat(s[0:2], 64)
  60. a1, _ := strconv.ParseFloat(s[2:4], 64)
  61. a2, _ := strconv.ParseFloat(s[4:6], 64)
  62. b0, _ := strconv.ParseFloat(s[6:8], 64)
  63. b1, _ := strconv.ParseFloat(s[8:10], 64)
  64. b2, _ := strconv.ParseFloat(s[10:12], 64)
  65. c0, _ := strconv.ParseFloat(s[12:14], 64)
  66. c1, _ := strconv.ParseFloat(s[14:16], 64)
  67. c2, _ := strconv.ParseFloat(s[16:18], 64)
  68. e.CurrentA, _ = strconv.ParseFloat(fmt.Sprintf("%.4f", a0/1000+a1/10+a2*10), 64)
  69. e.CurrentB, _ = strconv.ParseFloat(fmt.Sprintf("%.4f", b0/1000+b1/10+b2*10), 64)
  70. e.CurrentC, _ = strconv.ParseFloat(fmt.Sprintf("%.4f", c0/1000+c1/10+c2*10), 64)
  71. return nil
  72. }