package server import ( "log" "net" "weatherstation/model" ) func StartUDPServer(port string) error { addr, err := net.ResolveUDPAddr("udp", ":"+port) if err != nil { return err } conn, err := net.ListenUDP("udp", addr) if err != nil { return err } defer conn.Close() log.Printf("UDP服务器已启动,监听端口 %s", port) buffer := make([]byte, 1024) for { n, remoteAddr, err := conn.ReadFromUDP(buffer) if err != nil { log.Printf("读取UDP数据失败: %v", err) continue } // 处理接收到的数据 go handleUDPData(buffer[:n], remoteAddr) } } func handleUDPData(data []byte, addr *net.UDPAddr) { // 尝试解析为WH65LP数据 weatherData, err := model.ParseUDP10006Data(data) if err != nil { log.Printf("解析数据失败: %v", err) return } // 更新内存中的设备信息 model.UpdateDeviceInMemory(weatherData.StationID, addr, model.DeviceTypeWH65LP) // 注册设备到数据库 err = model.RegisterDeviceInDB(weatherData.StationID, addr) if err != nil { log.Printf("注册设备失败: %v", err) } // 保存数据 err = model.SaveWH65LPData(weatherData, data) if err != nil { log.Printf("保存数据失败: %v", err) return } log.Printf("成功接收并保存来自 %s 的WH65LP数据:\n%s", addr.String(), weatherData.String()) }