report_el-hj212.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package iotElProtocol
  2. import (
  3. "IotAdmin/common/global"
  4. "IotAdmin/core/logger"
  5. "IotAdmin/core/sdk"
  6. "IotAdmin/core/tools/utils"
  7. iotInterface "IotAdmin/iot/interface"
  8. iotMap "IotAdmin/iot/map"
  9. iotProtocol "IotAdmin/iot/protocol"
  10. iotReportService "IotAdmin/iot/service/reportService"
  11. iotStruct "IotAdmin/iot/struct"
  12. "IotAdmin/iot/struct/electric"
  13. "encoding/json"
  14. "fmt"
  15. "strconv"
  16. "time"
  17. )
  18. type elHj212 struct {
  19. }
  20. func NewElHj212ReportHandler() iotProtocol.ReportHandler {
  21. return &elHj212{}
  22. }
  23. func (*elHj212) Adapter(data *iotStruct.CollectData) {
  24. processData(data)
  25. }
  26. func processData(colData *iotStruct.CollectData) {
  27. // 从机的配置需要保存到采集数据中,上报需要使用配置
  28. cfg := colData.SlaveConfig
  29. // 计算电表数据
  30. logger.Debugf("计算电表数据: %s", cfg.No)
  31. now := time.Now()
  32. today, _ := strconv.Atoi(now.Format("20060102"))
  33. tms := today
  34. var calc iotInterface.MeterCalc
  35. //var elMeterData interface{}
  36. var err error
  37. if x, ok := iotMap.MapMeterCalc.Get(cfg.No); ok {
  38. calc = *x
  39. //elMeterData = (*x).GetData()
  40. } else {
  41. logger.Debugf("[%s][%d] 没有查询到电表计算参数。", cfg.No, today)
  42. calc = nil
  43. }
  44. var elMeter electric.MeterElectric
  45. switch cfg.Protocol {
  46. case iotProtocol.MeterAdw300:
  47. if calc == nil {
  48. calc, err = electric.NewMeterADW300(cfg.No, tms, "", cfg.OtherConfig)
  49. if err != nil {
  50. logger.Errorf("创建电表[%s]-[$s] 计算参数失败: %s %v", cfg.No, cfg.Protocol, err.Error())
  51. return
  52. }
  53. }
  54. if p, ok := (calc.GetData()).(*electric.MeterADW300); ok {
  55. elMeter = (*p).MeterElectric
  56. }
  57. case iotProtocol.MeterPmc350b:
  58. if calc == nil {
  59. calc, err = electric.NewMeterPMC350B(cfg.No, tms, "", cfg.OtherConfig)
  60. if err != nil {
  61. logger.Errorf("创建电表[%s]-[$s] 计算参数失败: %s %v", cfg.No, cfg.Protocol, err.Error())
  62. return
  63. }
  64. }
  65. if p, ok := (calc.GetData()).(*electric.MeterPMC350B); ok {
  66. elMeter = (*p).MeterElectric
  67. }
  68. default:
  69. logger.Errorf("不支持的协议: %s", cfg.Protocol)
  70. return
  71. }
  72. // 计算电表数据
  73. logger.Debugf("[%d]计算前: [%v]", today, calc)
  74. elMeter.Time = tms
  75. elMeter.CalcMeterData(colData)
  76. logger.Debugf("[%d]计算后: [%v]", today, calc)
  77. // 更新电表计算参数
  78. calc.SetCalc(elMeter)
  79. updateMeterCalc(elMeter, &calc)
  80. }
  81. func updateMeterCalc(elMeter electric.MeterElectric, calc *iotInterface.MeterCalc) {
  82. q := sdk.Runtime.GetMemoryQueue("")
  83. data, err := json.Marshal(elMeter)
  84. if err != nil {
  85. logger.Errorf("更新电表计算参数失败: %s", err.Error())
  86. return
  87. }
  88. mp := make(map[string]interface{})
  89. mp["data"] = string(data)
  90. mp["id"] = elMeter.Id
  91. mp["time"] = elMeter.Time
  92. message, err := sdk.Runtime.GetStreamMessage("", global.UpdateMeterCalc, mp)
  93. if err != nil {
  94. logger.Errorf("构建更新表计计算参数 message [%s]失败: %v", global.UpdateMeterCalc, err)
  95. return
  96. }
  97. err = q.Append(message)
  98. if err != nil {
  99. return
  100. }
  101. iotMap.MapMeterCalc.Add(elMeter.Id, calc)
  102. }
  103. func (*elHj212) Report(data *iotStruct.CollectData, config *iotStruct.ReportConfig) {
  104. if str, ok := packHj212(data, config); ok {
  105. if receive, err := iotReportService.UpToServer(config.Host, str); err != nil {
  106. logger.Errorf("[%s:%s]上报数据失败: [ %s ] %s", config.Host, str, err.Error())
  107. } else {
  108. logger.Debugf("上报数据 SEND -> %s", str)
  109. logger.Infof("上报数据 RECE <- %s", receive)
  110. }
  111. }
  112. }
  113. func packHj212(d *iotStruct.CollectData, cfg *iotStruct.ReportConfig) (string, bool) {
  114. now := time.Now()
  115. nt := fmt.Sprintf("%04d%02d%02d%02d%02d00", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute())
  116. body := fmt.Sprintf("%s=%s", cfg.GetBmYzKey("p"), getBmYzFloatValue(d.P)) +
  117. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pa"), getBmYzFloatValue(d.Pa)) +
  118. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pb"), getBmYzFloatValue(d.Pb)) +
  119. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pc"), getBmYzFloatValue(d.Pc)) +
  120. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("q"), getBmYzFloatValue(d.Q)) +
  121. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("qa"), getBmYzFloatValue(d.Qa)) +
  122. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("qb"), getBmYzFloatValue(d.Qb)) +
  123. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("qc"), getBmYzFloatValue(d.Qc)) +
  124. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pf"), getBmYzFloatValue(d.Pf)) +
  125. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pfa"), getBmYzFloatValue(d.Pfa)) +
  126. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pfb"), getBmYzFloatValue(d.Pfb)) +
  127. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pfc"), getBmYzFloatValue(d.Pfc)) +
  128. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ia"), getBmYzFloatValue(d.Ia)) +
  129. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ib"), getBmYzFloatValue(d.Ib)) +
  130. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ic"), getBmYzFloatValue(d.Ic)) +
  131. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("iz"), getBmYzFloatValue(d.Iz)) +
  132. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ua"), getBmYzFloatValue(d.Ua)) +
  133. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ub"), getBmYzFloatValue(d.Ub)) +
  134. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("uc"), getBmYzFloatValue(d.Uc)) +
  135. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("uab"), getBmYzFloatValue(d.Uab)) +
  136. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ubc"), getBmYzFloatValue(d.Ubc)) +
  137. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("uca"), getBmYzFloatValue(d.Uca)) +
  138. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("dp"), getBmYzFloatValue(d.Dp)) +
  139. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pv"), getBmYzFloatValue(d.Pv)) +
  140. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("f"), getBmYzFloatValue(d.Freq)) +
  141. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("fw"), getBmYzFloatValue(d.Fw)) +
  142. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("tps"), getBmYzFloatValue(d.Tps)) +
  143. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("tqs"), getBmYzFloatValue(d.Tqs)) +
  144. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("fps"), getBmYzFloatValue(d.Fps)) +
  145. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("fqs"), getBmYzFloatValue(d.Fqs)) +
  146. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("tpe"), getBmYzFloatValue(d.Tpe)) +
  147. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("tqe"), getBmYzFloatValue(d.Tqe)) +
  148. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("fpe"), getBmYzFloatValue(d.Fpe)) +
  149. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("fqe"), getBmYzFloatValue(d.Fqe)) +
  150. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("uaw"), getBmYzFloatValue(d.Uaw)) +
  151. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ubw"), getBmYzFloatValue(d.Ubw)) +
  152. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ucw"), getBmYzFloatValue(d.Ucw)) +
  153. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("uabw"), getBmYzFloatValue(d.Uabw)) +
  154. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ubcw"), getBmYzFloatValue(d.Ubcw)) +
  155. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ucaw"), getBmYzFloatValue(d.Ucaw)) +
  156. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("inbalance"), getBmYzFloatValue(d.IUnbalance)) +
  157. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("unbalance"), getBmYzFloatValue(d.UUnbalance)) +
  158. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("t"), getBmYzFloatValue(d.TemperatureA)) +
  159. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("t2"), getBmYzFloatValue(d.TemperatureB)) +
  160. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("t3"), getBmYzFloatValue(d.TemperatureC)) +
  161. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("t4"), getBmYzFloatValue(d.TemperatureZ)) +
  162. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("hua"), packYcHj212Hx(d.Hua, d.HarUa, d.BaseUa, "baseu")) +
  163. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("hub"), packYcHj212Hx(d.Hub, d.HarUb, d.BaseUb, "baseu")) +
  164. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("huc"), packYcHj212Hx(d.Huc, d.HarUc, d.BaseUc, "baseu")) +
  165. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("hia"), packYcHj212Hx(d.Hia, d.HarIa, d.BaseIa, "basei")) +
  166. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("hib"), packYcHj212Hx(d.Hib, d.HarIb, d.BaseIb, "basei")) +
  167. fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("hic"), packYcHj212Hx(d.Hic, d.HarIc, d.BaseIc, "basei"))
  168. str := fmt.Sprintf("st=%s;cn=4;datatime=%s;cphh=&&tid=%s&%s&", cfg.ST, nt, cfg.MN, body)
  169. crc16 := utils.CalCRC16HJ212([]byte(str))
  170. str1 := fmt.Sprintf("##00%04d", len(str)) + str + fmt.Sprintf("%04X", crc16) + "\r\n"
  171. return str1, true
  172. }
  173. func packYcHj212Hx(val [15]float32, hall, base float32, baseStr string) string {
  174. ret := ""
  175. for i, v := range val {
  176. ret += fmt.Sprintf("h%d:%s,", i*2+1, getBmYzFloatValue(v))
  177. }
  178. ret += fmt.Sprintf("hall:%s,%s:%s", getBmYzFloatValue(hall), baseStr, getBmYzFloatValue(base))
  179. return ret
  180. }
  181. func getBmYzFloatValue(value float32) string {
  182. return strconv.FormatFloat(float64(value), 'f', 3, 32)
  183. }