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) } }