weather-station/main.go
2025-08-07 20:12:28 +08:00

193 lines
6.4 KiB
Go

package main
import (
"encoding/hex"
"fmt"
"log"
"os"
"strings"
"time"
"weatherstation/model"
)
func main() {
// 检查是否有命令行参数
if len(os.Args) > 1 && os.Args[1] == "parse" {
if len(os.Args) > 2 {
// 解析指定的十六进制数据
hexData := os.Args[2]
parseHexData(hexData)
} else {
fmt.Println("用法: ./weatherstation parse <十六进制数据>")
fmt.Println("示例: ./weatherstation parse \"24 F2 10 02 C7 48 10 03 00 6A 03 E8 05 F5 96 10 3F 01 83 2D B1 00 29 9B A4\"")
}
} else {
fmt.Println("请使用新的启动程序:")
fmt.Println(" ./weatherstation_launcher # 同时启动UDP和Web服务器")
fmt.Println(" ./weatherstation_launcher -web # 只启动Web服务器")
fmt.Println(" ./weatherstation_launcher -udp # 只启动UDP服务器")
}
}
// parseHexData 解析十六进制字符串数据
func parseHexData(hexStr string) {
// 移除所有空格
hexStr = strings.ReplaceAll(hexStr, " ", "")
// 将十六进制字符串转换为字节数组
data, err := hex.DecodeString(hexStr)
if err != nil {
log.Printf("解析十六进制字符串失败: %v", err)
return
}
// 打印原始数据
log.Println("=== 原始数据分析 ===")
log.Printf("输入的十六进制字符串: %s", hexStr)
log.Printf("解析后的字节数组长度: %d", len(data))
log.Printf("字节数组内容: %v", data)
// 按索引打印每个字节
for i, b := range data {
log.Printf("索引[%2d]: 0x%02X (%d)", i, b, b)
}
// 检查数据有效性
if !model.ValidateRS485Data(data) {
log.Printf("无效的RS485数据格式: 长度=%d, 起始字节=%02X", len(data), data[0])
return
}
log.Println("\n=== 使用Protocol.go标准解析 ===")
// 创建协议解析器
protocol := model.NewProtocol(data)
rs485Protocol := model.NewRS485Protocol(data)
// 1. 解析设备ID
log.Println("--- 设备ID解析 ---")
idParts, err := protocol.GetCompleteID()
if err != nil {
log.Printf("获取设备ID失败: %v", err)
return
}
log.Printf("HSB (索引21): 0x%02X = %d", data[21], data[21])
log.Printf("MSB (索引22): 0x%02X = %d", data[22], data[22])
log.Printf("LSB (索引1): 0x%02X = %d", data[1], data[1])
log.Printf("完整设备ID: %s", idParts.Complete.Hex)
// 2. 解析温度
log.Println("--- 温度解析 ---")
temp, err := protocol.GetTemperature()
if err != nil {
log.Printf("获取温度失败: %v", err)
} else {
log.Printf("TMP_H (bit29-31): %s (0x%X)", temp.TmpH.Binary, temp.TmpH.Value)
log.Printf("TMP_M (bit32-35): %s (0x%X)", temp.TmpM.Binary, temp.TmpM.Value)
log.Printf("TMP_L (bit36-39): %s (0x%X)", temp.TmpL.Binary, temp.TmpL.Value)
log.Printf("原始值: 0x%X = %d", temp.Complete.RawValue, temp.Complete.RawValue)
log.Printf("温度: %.2f°C", temp.Complete.Value)
}
// 3. 解析湿度
log.Println("--- 湿度解析 ---")
humidity, err := protocol.GetHumidity()
if err != nil {
log.Printf("获取湿度失败: %v", err)
} else {
log.Printf("HM_H (bit40-43): %s (0x%X)", humidity.HmH.Binary, humidity.HmH.Value)
log.Printf("HM_L (bit44-47): %s (0x%X)", humidity.HmL.Binary, humidity.HmL.Value)
log.Printf("原始值: 0x%02X = %d", humidity.Complete.RawValue, humidity.Complete.RawValue)
log.Printf("湿度: %d%%", humidity.Complete.Value)
}
// 4. 解析风速
log.Println("--- 风速解析 ---")
windSpeed, err := protocol.GetWindSpeed()
if err != nil {
log.Printf("获取风速失败: %v", err)
} else {
log.Printf("WSP_FLAG: %v", windSpeed.WspFlag.Value)
log.Printf("WSP_H (bit48-51): %s (0x%X)", windSpeed.WspH.Binary, windSpeed.WspH.Value)
log.Printf("WSP_L (bit52-55): %s (0x%X)", windSpeed.WspL.Binary, windSpeed.WspL.Value)
log.Printf("原始值: 0x%X = %d", windSpeed.Complete.RawValue, windSpeed.Complete.RawValue)
log.Printf("风速: %.5f m/s", windSpeed.Complete.Value)
}
// 5. 解析风向
log.Println("--- 风向解析 ---")
windDir, err := protocol.GetWindDirection()
if err != nil {
log.Printf("获取风向失败: %v", err)
} else {
log.Printf("DIR_H: %s (0x%X)", windDir.DirH.Binary, windDir.DirH.Value)
log.Printf("DIR_M: %s (0x%X)", windDir.DirM.Binary, windDir.DirM.Value)
log.Printf("DIR_L: %s (0x%X)", windDir.DirL.Binary, windDir.DirL.Value)
log.Printf("原始值: 0x%X = %d", windDir.Complete.Value, windDir.Complete.Value)
log.Printf("风向: %.1f°", windDir.Complete.Degree)
}
// 6. 解析降雨量
log.Println("--- 降雨量解析 ---")
rainfall, err := protocol.GetRainfall()
if err != nil {
log.Printf("获取降雨量失败: %v", err)
} else {
log.Printf("原始值: 0x%X = %d", rainfall.Complete.RawValue, rainfall.Complete.RawValue)
log.Printf("降雨量: %.3f mm", rainfall.Complete.Value)
}
// 7. 解析光照
log.Println("--- 光照解析 ---")
light, err := protocol.GetLight()
if err != nil {
log.Printf("获取光照失败: %v", err)
} else {
log.Printf("原始值: 0x%X = %d", light.Complete.RawValue, light.Complete.RawValue)
log.Printf("光照: %.1f lux", light.Complete.Value)
}
// 8. 解析UV指数
log.Println("--- UV指数解析 ---")
uv, err := protocol.GetUVIndex()
if err != nil {
log.Printf("获取UV指数失败: %v", err)
} else {
log.Printf("原始值: 0x%X = %d", uv.Complete.RawValue, uv.Complete.RawValue)
log.Printf("UV指数: %.1f uW/c㎡", uv.Complete.Value)
}
// 9. 解析气压
log.Println("--- 气压解析 ---")
pressure, err := protocol.GetPressure()
if err != nil {
log.Printf("获取气压失败: %v", err)
} else {
log.Printf("原始值: 0x%X = %d", pressure.Complete.RawValue, pressure.Complete.RawValue)
log.Printf("气压: %.2f hPa", pressure.Complete.Value)
}
log.Println("\n=== RS485协议统一解析结果 ===")
// 使用修正后的RS485解析
rs485Data, err := rs485Protocol.ParseRS485Data()
if err != nil {
log.Printf("解析RS485数据失败: %v", err)
return
} else {
rs485Data.DeviceID = idParts.Complete.Hex
rs485Data.ReceivedAt = time.Now()
rs485Data.RawDataHex = fmt.Sprintf("%X", data)
log.Printf("设备ID: RS485-%s", rs485Data.DeviceID)
log.Printf("温度: %.2f°C", rs485Data.Temperature)
log.Printf("湿度: %.1f%%", rs485Data.Humidity)
log.Printf("风速: %.5f m/s", rs485Data.WindSpeed)
log.Printf("风向: %.1f°", rs485Data.WindDirection)
log.Printf("降雨量: %.3f mm", rs485Data.Rainfall)
log.Printf("光照: %.1f lux", rs485Data.Light)
log.Printf("紫外线: %.1f", rs485Data.UV)
log.Printf("气压: %.2f hPa", rs485Data.Pressure)
}
}