package adaptors import ( "bytes" "encoding/binary" "encoding/json" "fmt" "goInOut/models" "goInOut/utils" "log" "strconv" "strings" "time" ) // Adaptor_ZD_JSNCGLQL 数据 转换 江苏农村公路桥梁监测系统 type Adaptor_ZD_JSNCGLQL struct { IdMap map[string]string BridgeCode string } func (the Adaptor_ZD_JSNCGLQL) Transform(inTopic, rawMsg string) []NeedPush { zd := models.ZD{} err := json.Unmarshal([]byte(rawMsg), &zd) if err != nil { return nil } lowerTopic := strings.ToLower(inTopic) if strings.Contains(lowerTopic, "zdsl") || strings.Contains(lowerTopic, "cableforce") { return the.ZDSLtoJSNCGLQL(zd) } return the.ZDtoJSNCGLQL(zd) } func (the Adaptor_ZD_JSNCGLQL) ZDtoJSNCGLQL(zd models.ZD) (result []NeedPush) { Atime := time.UnixMilli(zd.Ticks) sensorDataList := zd.AccValues //获取对方系统 id sensorCode := the.getSensorCode(zd.Module) if sensorCode == "" { log.Printf("振动 设备[%s] 无匹配的 江苏农村公路桥梁监测系统 测点id,请检查配置文件", zd.Module) return } topic := fmt.Sprintf("data/%s/%s", the.BridgeCode, sensorCode) //数据秒数 seconds := len(zd.AccValues) / zd.Frequency for i := 0; i < seconds; i++ { var transBytes []byte onceTime := Atime.Add(time.Duration(i) * time.Second) //1.添加时间段 transBytes = append(transBytes, the.getTimeBytes(onceTime)...) startIndex := (0 + i) * zd.Frequency endIndex := (1 + i) * zd.Frequency if endIndex > len(sensorDataList) { endIndex = len(sensorDataList) } subDataList := sensorDataList[startIndex:endIndex] for _, sensorData := range subDataList { //4.添加数据值段 bs := utils.Float32ToBytes(sensorData) transBytes = append(transBytes, bs...) } result = append(result, NeedPush{ Topic: topic, Payload: transBytes, }) } return result } func (the Adaptor_ZD_JSNCGLQL) ZDSLtoJSNCGLQL(zd models.ZD) (result []NeedPush) { Atime := time.UnixMilli(zd.Ticks) sensorDataList := zd.ThemeValue //获取对方系统 id sensorCode := the.getSensorCode(strconv.Itoa(zd.SensorId)) if sensorCode == "" { log.Printf("振动索力 设备[%s] 无匹配的 江苏农村公路桥梁监测系统 测点id,请检查配置文件", zd.Module) return } topic := fmt.Sprintf("data/%s/%s", the.BridgeCode, sensorCode) var transBytes []byte //1.添加时间段 transBytes = append(transBytes, the.getTimeBytes(Atime)...) //数据值段 bs := utils.Float32ToBytes(sensorDataList[0]) transBytes = append(transBytes, bs...) result = append(result, NeedPush{ Topic: topic, Payload: transBytes, }) return result } func (the Adaptor_ZD_JSNCGLQL) getSensorCode(rawSensorName string) string { v, isValid := the.IdMap[rawSensorName] if !isValid { v = "" } return v } func (the Adaptor_ZD_JSNCGLQL) getTimeBytes(sensorTime time.Time) []byte { year := uint16(sensorTime.Year()) month := int8(sensorTime.Month()) day := int8(sensorTime.Day()) hour := int8(sensorTime.Hour()) minute := int8(sensorTime.Minute()) second := int8(sensorTime.Second()) bytesBuffer := bytes.NewBuffer([]byte{}) binary.Write(bytesBuffer, binary.BigEndian, year) binary.Write(bytesBuffer, binary.BigEndian, month) binary.Write(bytesBuffer, binary.BigEndian, day) binary.Write(bytesBuffer, binary.BigEndian, hour) binary.Write(bytesBuffer, binary.BigEndian, minute) binary.Write(bytesBuffer, binary.BigEndian, second) return bytesBuffer.Bytes() }