81 lines
2.2 KiB
Go
81 lines
2.2 KiB
Go
package main
|
||
|
||
import (
|
||
"time"
|
||
)
|
||
|
||
// 传感器数据结构
|
||
type SensorData struct {
|
||
WindSpeed int
|
||
WindForce int
|
||
WindDirection8 int
|
||
WindDirection360 int
|
||
Humidity int
|
||
Temperature int
|
||
Noise int
|
||
PM25 int
|
||
PM10 int
|
||
AtmPressure int
|
||
Lux20WH int
|
||
Lux20WL int
|
||
Light20W int
|
||
OpticalRain int
|
||
CompassAngle int
|
||
SolarRadiation int
|
||
Timestamp time.Time
|
||
}
|
||
|
||
// 解析传感器数据
|
||
func parseData(data []byte) *SensorData {
|
||
// 检查响应格式是否正确
|
||
if len(data) < 37 || data[0] != 0x01 || data[1] != 0x03 || data[2] != 0x20 {
|
||
logger.Println("响应格式无效")
|
||
return nil
|
||
}
|
||
|
||
// 提取数据部分
|
||
dataBytes := data[3:35] // 跳过地址码、功能码、长度,不包括CRC
|
||
|
||
sensorData := SensorData{
|
||
WindSpeed: bytesToInt(dataBytes[0:2]),
|
||
WindForce: bytesToInt(dataBytes[2:4]),
|
||
WindDirection8: bytesToInt(dataBytes[4:6]),
|
||
WindDirection360: bytesToInt(dataBytes[6:8]),
|
||
Humidity: bytesToInt(dataBytes[8:10]),
|
||
Temperature: bytesToInt(dataBytes[10:12]),
|
||
Noise: bytesToInt(dataBytes[12:14]),
|
||
PM25: bytesToInt(dataBytes[14:16]),
|
||
PM10: bytesToInt(dataBytes[16:18]),
|
||
AtmPressure: bytesToInt(dataBytes[18:20]),
|
||
Lux20WH: bytesToInt(dataBytes[20:22]),
|
||
Lux20WL: bytesToInt(dataBytes[22:24]),
|
||
Light20W: bytesToInt(dataBytes[24:26]),
|
||
OpticalRain: bytesToInt(dataBytes[26:28]),
|
||
CompassAngle: bytesToInt(dataBytes[28:30]),
|
||
SolarRadiation: bytesToInt(dataBytes[30:32]),
|
||
Timestamp: time.Now(),
|
||
}
|
||
|
||
return &sensorData
|
||
}
|
||
|
||
// 记录传感器数据到日志
|
||
func logSensorData(data SensorData) {
|
||
logger.Printf("[传感器] 时间: %s, 温度: %.1f°C, 湿度: %.1f%%, 风速: %.2fm/s (%d°), 雨量: %.1fmm, PM2.5: %dμg/m³",
|
||
data.Timestamp.Format("2006-01-02 15:04:05"),
|
||
float64(data.Temperature)/10.0,
|
||
float64(data.Humidity)/10.0,
|
||
float64(data.WindSpeed)/100.0,
|
||
data.WindDirection360,
|
||
float64(data.OpticalRain)/10.0,
|
||
data.PM25)
|
||
}
|
||
|
||
// 将两个字节转换为整数
|
||
func bytesToInt(bytes []byte) int {
|
||
if len(bytes) != 2 {
|
||
return 0
|
||
}
|
||
return int(bytes[0])<<8 | int(bytes[1])
|
||
}
|