report.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package report
  2. import (
  3. "MeterService/core/logger"
  4. "MeterService/dataStruct"
  5. "MeterService/service/reportService"
  6. "fmt"
  7. "strconv"
  8. "time"
  9. )
  10. func YcHj212Report(dataArray []*dataStruct.CollectData, config *dataStruct.DtuConfig) {
  11. bs := &dataStruct.HJBaseInfo{
  12. Host: config.IP,
  13. ST: config.St,
  14. CN: config.Cn,
  15. PW: config.Pw,
  16. MN: config.Mn,
  17. Port: strconv.Itoa(config.Port),
  18. }
  19. if strArray, ok := packYcHj212(bs, dataArray); ok {
  20. for _, str := range strArray {
  21. if receive, err := reportService.UpToServer(bs.Host, bs.Port, str); err != nil {
  22. logger.Error("[%s:%s]上报数据失败: [ %s ] %s", bs.Host, bs.Port, str, err.Error())
  23. } else {
  24. logger.Debug("上报数据 SEND -> %s", str)
  25. logger.Info("上报数据 RECE <- %s", receive)
  26. }
  27. }
  28. }
  29. }
  30. func packYcHj212(bs *dataStruct.HJBaseInfo, dataArray []*dataStruct.CollectData) ([]string, bool) {
  31. array := make([]string, 0)
  32. if len(dataArray) == 0 {
  33. return array, false
  34. }
  35. now := time.Now()
  36. nt := fmt.Sprintf("%04d%02d%02d%02d%02d00", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute())
  37. for _, d := range dataArray {
  38. body := fmt.Sprintf("%s=%s", d.Slave.GetBmYzKey("p"), getBmYzFloatValue(d.P)) +
  39. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pa"), getBmYzFloatValue(d.Pa)) +
  40. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pb"), getBmYzFloatValue(d.Pb)) +
  41. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pc"), getBmYzFloatValue(d.Pc)) +
  42. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("q"), getBmYzFloatValue(d.Q)) +
  43. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("qa"), getBmYzFloatValue(d.Qa)) +
  44. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("qb"), getBmYzFloatValue(d.Qb)) +
  45. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("qc"), getBmYzFloatValue(d.Qc)) +
  46. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pf"), getBmYzFloatValue(d.Pf)) +
  47. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pfa"), getBmYzFloatValue(d.Pfa)) +
  48. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pfb"), getBmYzFloatValue(d.Pfb)) +
  49. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pfc"), getBmYzFloatValue(d.Pfc)) +
  50. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ia"), getBmYzFloatValue(d.Ia)) +
  51. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ib"), getBmYzFloatValue(d.Ib)) +
  52. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ic"), getBmYzFloatValue(d.Ic)) +
  53. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("iz"), getBmYzFloatValue(d.Iz)) +
  54. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ua"), getBmYzFloatValue(d.Ua)) +
  55. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ub"), getBmYzFloatValue(d.Ub)) +
  56. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uc"), getBmYzFloatValue(d.Uc)) +
  57. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uab"), getBmYzFloatValue(d.Uab)) +
  58. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ubc"), getBmYzFloatValue(d.Ubc)) +
  59. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uca"), getBmYzFloatValue(d.Uca)) +
  60. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("dp"), getBmYzFloatValue(d.Dp)) +
  61. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pv"), getBmYzFloatValue(d.Pv)) +
  62. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("f"), getBmYzFloatValue(d.Freq)) +
  63. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fw"), getBmYzFloatValue(d.Fw)) +
  64. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tps"), getBmYzFloatValue(d.Tps)) +
  65. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tqs"), getBmYzFloatValue(d.Tqs)) +
  66. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fps"), getBmYzFloatValue(d.Fps)) +
  67. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fqs"), getBmYzFloatValue(d.Fqs)) +
  68. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tpe"), getBmYzFloatValue(d.Tpe)) +
  69. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tqe"), getBmYzFloatValue(d.Tqe)) +
  70. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fpe"), getBmYzFloatValue(d.Fpe)) +
  71. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fqe"), getBmYzFloatValue(d.Fqe)) +
  72. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uaw"), getBmYzFloatValue(d.Uaw)) +
  73. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ubw"), getBmYzFloatValue(d.Ubw)) +
  74. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ucw"), getBmYzFloatValue(d.Ucw)) +
  75. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uabw"), getBmYzFloatValue(d.Uabw)) +
  76. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ubcw"), getBmYzFloatValue(d.Ubcw)) +
  77. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ucaw"), getBmYzFloatValue(d.Ucaw)) +
  78. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("inbalance"), getBmYzFloatValue(d.IUnbalance)) +
  79. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("unbalance"), getBmYzFloatValue(d.UUnbalance)) +
  80. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t"), getBmYzFloatValue(d.TemperatureA)) +
  81. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t2"), getBmYzFloatValue(d.TemperatureB)) +
  82. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t3"), getBmYzFloatValue(d.TemperatureC)) +
  83. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t4"), getBmYzFloatValue(d.TemperatureZ)) +
  84. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hua"), packYcHj212Hx(d.Hua, d.HarUa, d.BaseUa, "baseu")) +
  85. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hub"), packYcHj212Hx(d.Hub, d.HarUb, d.BaseUb, "baseu")) +
  86. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("huc"), packYcHj212Hx(d.Huc, d.HarUc, d.BaseUc, "baseu")) +
  87. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hia"), packYcHj212Hx(d.Hia, d.HarIa, d.BaseIa, "basei")) +
  88. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hib"), packYcHj212Hx(d.Hib, d.HarIb, d.BaseIb, "basei")) +
  89. fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hic"), packYcHj212Hx(d.Hic, d.HarIc, d.BaseIc, "basei"))
  90. str := fmt.Sprintf("st=%s;cn=%s;datatime=%s;cphh=&&tid=%s&%s&", bs.ST, bs.CN, nt, d.Slave.NO, body)
  91. crc16 := calCRC16HJ212([]byte(str))
  92. str1 := fmt.Sprintf("##00%04d", len(str)) + str + fmt.Sprintf("%04X", crc16) + "\r\n"
  93. array = append(array, str1)
  94. }
  95. return array, true
  96. }
  97. func packYcHj212Hx(val [15]float32, hall, base float32, baseStr string) string {
  98. ret := ""
  99. for i, v := range val {
  100. ret += fmt.Sprintf("h%d:%s,", i*2+1, getBmYzFloatValue(v))
  101. }
  102. ret += fmt.Sprintf("hall:%s,%s:%s", getBmYzFloatValue(hall), baseStr, getBmYzFloatValue(base))
  103. return ret
  104. }
  105. func getBmYzFloatValue(value float32) string {
  106. return strconv.FormatFloat(float64(value), 'f', 3, 32)
  107. }
  108. // HJ212 计算crc
  109. func calCRC16HJ212(data []byte) uint16 {
  110. var (
  111. crc uint16 = 0xFFFF
  112. iNum uint16 = 0
  113. )
  114. length := len(data)
  115. for i := 0; i < length; i++ {
  116. iNum = uint16(data[i])
  117. crc = (crc >> 8) & 0x00FF
  118. crc = crc ^ iNum
  119. for j := 0; j < 8; j++ {
  120. flag := crc % 2
  121. crc = crc >> 1
  122. if flag == 1 {
  123. crc = crc ^ 0xA001
  124. }
  125. }
  126. }
  127. return crc
  128. }