package iotElProtocol import ( "IotAdmin/common/global" "IotAdmin/core/logger" "IotAdmin/core/sdk" "IotAdmin/core/tools/utils" iotInterface "IotAdmin/iot/interface" iotMap "IotAdmin/iot/map" iotProtocol "IotAdmin/iot/protocol" iotReportService "IotAdmin/iot/service/reportService" iotStruct "IotAdmin/iot/struct" "IotAdmin/iot/struct/electric" "encoding/json" "fmt" "strconv" "time" ) type elHj212 struct { } func NewElHj212ReportHandler() iotProtocol.ReportHandler { return &elHj212{} } func (*elHj212) Adapter(data *iotStruct.CollectData) { processData(data) } func processData(colData *iotStruct.CollectData) { // 从机的配置需要保存到采集数据中,上报需要使用配置 cfg := colData.SlaveConfig // 计算电表数据 logger.Debugf("计算电表数据: %s", cfg.No) now := time.Now() today, _ := strconv.Atoi(now.Format("20060102")) tms := today var calc iotInterface.MeterCalc //var elMeterData interface{} var err error if x, ok := iotMap.MapMeterCalc.Get(cfg.No); ok { calc = *x //elMeterData = (*x).GetData() } else { logger.Debugf("[%s][%d] 没有查询到电表计算参数。", cfg.No, today) calc = nil } var elMeter electric.MeterElectric switch cfg.Protocol { case iotProtocol.MeterAdw300: if calc == nil { calc, err = electric.NewMeterADW300(cfg.No, tms, "", cfg.OtherConfig) if err != nil { logger.Errorf("创建电表[%s]-[$s] 计算参数失败: %s %v", cfg.No, cfg.Protocol, err.Error()) return } } if p, ok := (calc.GetData()).(*electric.MeterADW300); ok { elMeter = (*p).MeterElectric } case iotProtocol.MeterPmc350b: if calc == nil { calc, err = electric.NewMeterPMC350B(cfg.No, tms, "", cfg.OtherConfig) if err != nil { logger.Errorf("创建电表[%s]-[$s] 计算参数失败: %s %v", cfg.No, cfg.Protocol, err.Error()) return } } if p, ok := (calc.GetData()).(*electric.MeterPMC350B); ok { elMeter = (*p).MeterElectric } default: logger.Errorf("不支持的协议: %s", cfg.Protocol) return } // 计算电表数据 logger.Debugf("[%d]计算前: [%v]", today, calc) elMeter.Time = tms elMeter.CalcMeterData(colData) logger.Debugf("[%d]计算后: [%v]", today, calc) // 更新电表计算参数 calc.SetCalc(elMeter) updateMeterCalc(elMeter, &calc) } func updateMeterCalc(elMeter electric.MeterElectric, calc *iotInterface.MeterCalc) { q := sdk.Runtime.GetMemoryQueue("") data, err := json.Marshal(elMeter) if err != nil { logger.Errorf("更新电表计算参数失败: %s", err.Error()) return } mp := make(map[string]interface{}) mp["data"] = string(data) mp["id"] = elMeter.Id mp["time"] = elMeter.Time message, err := sdk.Runtime.GetStreamMessage("", global.UpdateMeterCalc, mp) if err != nil { logger.Errorf("构建更新表计计算参数 message [%s]失败: %v", global.UpdateMeterCalc, err) return } err = q.Append(message) if err != nil { return } iotMap.MapMeterCalc.Add(elMeter.Id, calc) } func (*elHj212) Report(data *iotStruct.CollectData, config *iotStruct.ReportConfig) { if str, ok := packHj212(data, config); ok { if receive, err := iotReportService.UpToServer(config.Host, str); err != nil { logger.Errorf("[%s:%s]上报数据失败: [ %s ] %s", config.Host, str, err.Error()) } else { logger.Debugf("上报数据 SEND -> %s", str) logger.Infof("上报数据 RECE <- %s", receive) } } } func packHj212(d *iotStruct.CollectData, cfg *iotStruct.ReportConfig) (string, bool) { now := time.Now() nt := fmt.Sprintf("%04d%02d%02d%02d%02d00", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute()) body := fmt.Sprintf("%s=%s", cfg.GetBmYzKey("p"), getBmYzFloatValue(d.P)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pa"), getBmYzFloatValue(d.Pa)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pb"), getBmYzFloatValue(d.Pb)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pc"), getBmYzFloatValue(d.Pc)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("q"), getBmYzFloatValue(d.Q)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("qa"), getBmYzFloatValue(d.Qa)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("qb"), getBmYzFloatValue(d.Qb)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("qc"), getBmYzFloatValue(d.Qc)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pf"), getBmYzFloatValue(d.Pf)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pfa"), getBmYzFloatValue(d.Pfa)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pfb"), getBmYzFloatValue(d.Pfb)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pfc"), getBmYzFloatValue(d.Pfc)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ia"), getBmYzFloatValue(d.Ia)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ib"), getBmYzFloatValue(d.Ib)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ic"), getBmYzFloatValue(d.Ic)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("iz"), getBmYzFloatValue(d.Iz)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ua"), getBmYzFloatValue(d.Ua)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ub"), getBmYzFloatValue(d.Ub)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("uc"), getBmYzFloatValue(d.Uc)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("uab"), getBmYzFloatValue(d.Uab)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ubc"), getBmYzFloatValue(d.Ubc)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("uca"), getBmYzFloatValue(d.Uca)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("dp"), getBmYzFloatValue(d.Dp)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("pv"), getBmYzFloatValue(d.Pv)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("f"), getBmYzFloatValue(d.Freq)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("fw"), getBmYzFloatValue(d.Fw)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("tps"), getBmYzFloatValue(d.Tps)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("tqs"), getBmYzFloatValue(d.Tqs)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("fps"), getBmYzFloatValue(d.Fps)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("fqs"), getBmYzFloatValue(d.Fqs)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("tpe"), getBmYzFloatValue(d.Tpe)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("tqe"), getBmYzFloatValue(d.Tqe)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("fpe"), getBmYzFloatValue(d.Fpe)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("fqe"), getBmYzFloatValue(d.Fqe)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("uaw"), getBmYzFloatValue(d.Uaw)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ubw"), getBmYzFloatValue(d.Ubw)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ucw"), getBmYzFloatValue(d.Ucw)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("uabw"), getBmYzFloatValue(d.Uabw)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ubcw"), getBmYzFloatValue(d.Ubcw)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("ucaw"), getBmYzFloatValue(d.Ucaw)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("inbalance"), getBmYzFloatValue(d.IUnbalance)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("unbalance"), getBmYzFloatValue(d.UUnbalance)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("t"), getBmYzFloatValue(d.TemperatureA)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("t2"), getBmYzFloatValue(d.TemperatureB)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("t3"), getBmYzFloatValue(d.TemperatureC)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("t4"), getBmYzFloatValue(d.TemperatureZ)) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("hua"), packYcHj212Hx(d.Hua, d.HarUa, d.BaseUa, "baseu")) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("hub"), packYcHj212Hx(d.Hub, d.HarUb, d.BaseUb, "baseu")) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("huc"), packYcHj212Hx(d.Huc, d.HarUc, d.BaseUc, "baseu")) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("hia"), packYcHj212Hx(d.Hia, d.HarIa, d.BaseIa, "basei")) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("hib"), packYcHj212Hx(d.Hib, d.HarIb, d.BaseIb, "basei")) + fmt.Sprintf("&%s=%s", cfg.GetBmYzKey("hic"), packYcHj212Hx(d.Hic, d.HarIc, d.BaseIc, "basei")) str := fmt.Sprintf("st=%s;cn=4;datatime=%s;cphh=&&tid=%s&%s&", cfg.ST, nt, cfg.MN, body) crc16 := utils.CalCRC16HJ212([]byte(str)) str1 := fmt.Sprintf("##00%04d", len(str)) + str + fmt.Sprintf("%04X", crc16) + "\r\n" return str1, true } func packYcHj212Hx(val [15]float32, hall, base float32, baseStr string) string { ret := "" for i, v := range val { ret += fmt.Sprintf("h%d:%s,", i*2+1, getBmYzFloatValue(v)) } ret += fmt.Sprintf("hall:%s,%s:%s", getBmYzFloatValue(hall), baseStr, getBmYzFloatValue(base)) return ret } func getBmYzFloatValue(value float32) string { return strconv.FormatFloat(float64(value), 'f', 3, 32) }