You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
3.4 KiB
132 lines
3.4 KiB
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()
|
|
}
|
|
|