193 lines
6.4 KiB
Go
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)
|
|
}
|
|
}
|