package report import ( "MeterService/core/logger" "MeterService/data" "MeterService/dataStruct" "MeterService/database/meterCalcParam" "MeterService/service/downStreamService/proto" "MeterService/service/reportService" "fmt" "strconv" "time" ) type ycHj212 struct { } func NewYcHj212ReportHandler() proto.ReportHandler { return &ycHj212{} } func (*ycHj212) Adapter(colDataArray *[]*dataStruct.CollectData) { for _, colData := range *colDataArray { processData(colData) } } func processData(colData *dataStruct.CollectData) { // 从机的配置需要保存到采集数据中,上报需要使用配置 cfg := colData.Slave // 计算电表数据 logger.Debug("计算电表数据: %s", cfg.NO) calc := &dataStruct.MeterCalcParam{} now := time.Now() today, _ := strconv.Atoi(now.Format("20060102")) tms := int64(today) if x, ok := data.CalcParam.Get(cfg.NO); ok { calc = x.(*dataStruct.MeterCalcParam) //logger.Debug("[%s][%d] 查询到电表计算参数: [%v]", cfg.NO, today, calc) if calc.Time != tms { calc.ClearDayEnergy() } } else { logger.Debug("[%s][%d] 没有查询到电表计算参数。", cfg.NO, today) calc.ClearDayEnergy() } // 计算电表数据 logger.Debug("[%d]计算前: [%v]", today, *calc) calc.Time = tms colData.CalcWithParam(calc) logger.Debug("[%d]计算后: [%v]", today, *calc) // 更新电表计算参数 data.CalcParam.Add(cfg.NO, calc) db := meterCalcParam.NewMeterCalcParamDb() if db != nil { calcEt := &meterCalcParam.MeterCalcParam{ Id: cfg.NO, Time: tms, SumPower: calc.PowerRate.SumPower, MaxPower: calc.PowerRate.MaxPower, Count: calc.PowerRate.Count, Tps: calc.TotalEnergy.Tp, Tqs: calc.TotalEnergy.Tq, Fps: calc.TotalEnergy.Fp, Fqs: calc.TotalEnergy.Fq, Tpe: calc.DayTotalEnergy.Tp, Tqe: calc.DayTotalEnergy.Tq, Fpe: calc.DayTotalEnergy.Fp, Fqe: calc.DayTotalEnergy.Fq, } err := db.AddOrUpdate(calcEt) if err != nil { logger.Error("更新电表计算参数失败: %s", err.Error()) } } } func (*ycHj212) Report(dataArray *[]*dataStruct.CollectData, config *dataStruct.DtuConfig) { bs := &dataStruct.HJBaseInfo{ Host: config.IP, ST: config.St, CN: config.Cn, PW: config.Pw, MN: config.Mn, Port: strconv.Itoa(config.Port), } if strArray, ok := packYcHj212(bs, dataArray); ok { for _, str := range strArray { if receive, err := reportService.UpToServer(bs.Host, bs.Port, str); err != nil { logger.Error("[%s:%s]上报数据失败: [ %s ] %s", bs.Host, bs.Port, str, err.Error()) } else { logger.Debug("上报数据 SEND -> %s", str) logger.Info("上报数据 RECE <- %s", receive) } } } } func packYcHj212(bs *dataStruct.HJBaseInfo, dataArray *[]*dataStruct.CollectData) ([]string, bool) { array := make([]string, 0) if len(*dataArray) == 0 { return array, false } now := time.Now() nt := fmt.Sprintf("%04d%02d%02d%02d%02d00", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute()) for _, d := range *dataArray { body := fmt.Sprintf("%s=%s", d.Slave.GetBmYzKey("p"), getBmYzFloatValue(d.P)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pa"), getBmYzFloatValue(d.Pa)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pb"), getBmYzFloatValue(d.Pb)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pc"), getBmYzFloatValue(d.Pc)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("q"), getBmYzFloatValue(d.Q)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("qa"), getBmYzFloatValue(d.Qa)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("qb"), getBmYzFloatValue(d.Qb)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("qc"), getBmYzFloatValue(d.Qc)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pf"), getBmYzFloatValue(d.Pf)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pfa"), getBmYzFloatValue(d.Pfa)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pfb"), getBmYzFloatValue(d.Pfb)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pfc"), getBmYzFloatValue(d.Pfc)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ia"), getBmYzFloatValue(d.Ia)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ib"), getBmYzFloatValue(d.Ib)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ic"), getBmYzFloatValue(d.Ic)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("iz"), getBmYzFloatValue(d.Iz)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ua"), getBmYzFloatValue(d.Ua)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ub"), getBmYzFloatValue(d.Ub)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uc"), getBmYzFloatValue(d.Uc)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uab"), getBmYzFloatValue(d.Uab)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ubc"), getBmYzFloatValue(d.Ubc)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uca"), getBmYzFloatValue(d.Uca)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("dp"), getBmYzFloatValue(d.Dp)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("pv"), getBmYzFloatValue(d.Pv)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("f"), getBmYzFloatValue(d.Freq)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fw"), getBmYzFloatValue(d.Fw)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tps"), getBmYzFloatValue(d.Tps)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tqs"), getBmYzFloatValue(d.Tqs)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fps"), getBmYzFloatValue(d.Fps)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fqs"), getBmYzFloatValue(d.Fqs)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tpe"), getBmYzFloatValue(d.Tpe)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("tqe"), getBmYzFloatValue(d.Tqe)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fpe"), getBmYzFloatValue(d.Fpe)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("fqe"), getBmYzFloatValue(d.Fqe)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uaw"), getBmYzFloatValue(d.Uaw)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ubw"), getBmYzFloatValue(d.Ubw)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ucw"), getBmYzFloatValue(d.Ucw)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("uabw"), getBmYzFloatValue(d.Uabw)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ubcw"), getBmYzFloatValue(d.Ubcw)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("ucaw"), getBmYzFloatValue(d.Ucaw)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("inbalance"), getBmYzFloatValue(d.IUnbalance)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("unbalance"), getBmYzFloatValue(d.UUnbalance)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t"), getBmYzFloatValue(d.TemperatureA)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t2"), getBmYzFloatValue(d.TemperatureB)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t3"), getBmYzFloatValue(d.TemperatureC)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("t4"), getBmYzFloatValue(d.TemperatureZ)) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hua"), packYcHj212Hx(d.Hua, d.HarUa, d.BaseUa, "baseu")) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hub"), packYcHj212Hx(d.Hub, d.HarUb, d.BaseUb, "baseu")) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("huc"), packYcHj212Hx(d.Huc, d.HarUc, d.BaseUc, "baseu")) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hia"), packYcHj212Hx(d.Hia, d.HarIa, d.BaseIa, "basei")) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hib"), packYcHj212Hx(d.Hib, d.HarIb, d.BaseIb, "basei")) + fmt.Sprintf("&%s=%s", d.Slave.GetBmYzKey("hic"), packYcHj212Hx(d.Hic, d.HarIc, d.BaseIc, "basei")) cn := bs.CN if d.Slave.Cn != "" { cn = d.Slave.Cn } str := fmt.Sprintf("st=%s;cn=%s;datatime=%s;cphh=&&tid=%s&%s&", bs.ST, cn, nt, d.Slave.NO, body) crc16 := calCRC16HJ212([]byte(str)) str1 := fmt.Sprintf("##00%04d", len(str)) + str + fmt.Sprintf("%04X", crc16) + "\r\n" array = append(array, str1) } return array, 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) } // HJ212 计算crc func calCRC16HJ212(data []byte) uint16 { var ( crc uint16 = 0xFFFF iNum uint16 = 0 ) length := len(data) for i := 0; i < length; i++ { iNum = uint16(data[i]) crc = (crc >> 8) & 0x00FF crc = crc ^ iNum for j := 0; j < 8; j++ { flag := crc % 2 crc = crc >> 1 if flag == 1 { crc = crc ^ 0xA001 } } } return crc }