weather-station/server/udp_server.go

62 lines
1.3 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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