angle_dtu/udp_server.go
2025-05-15 13:34:47 +08:00

67 lines
1.6 KiB
Go
Raw 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 main
import (
"fmt"
"net"
)
// StartUDPServer 启动UDP服务器
func StartUDPServer(address string) error {
addr, err := net.ResolveUDPAddr("udp", address)
if err != nil {
return fmt.Errorf("解析UDP地址失败: %v", err)
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
return fmt.Errorf("监听UDP地址失败: %v", err)
}
defer conn.Close()
startClientCleanup()
Logger.Printf("UDP服务器已启动正在监听 %s\n", address)
buffer := make([]byte, 1024)
for {
n, remoteAddr, err := conn.ReadFromUDP(buffer)
if err != nil {
Logger.Printf("从UDP客户端读取失败: %v", err)
continue
}
go handleUDPPacket(conn, remoteAddr, buffer[:n])
}
}
// handleUDPPacket 处理UDP数据包
func handleUDPPacket(conn *net.UDPConn, addr *net.UDPAddr, data []byte) {
remoteAddr := addr.String()
addClient(remoteAddr)
rawData := string(data)
TCPDataLogger.Printf("从UDP客户端 %s 接收到原始数据: %s", remoteAddr, rawData)
sensorID, x, y, z, err := parseData(rawData)
if err == nil {
TCPDataLogger.Printf("解析成功 - UDP客户端: %s, 传感器ID: %d, 值: X=%.3f, Y=%.3f, Z=%.3f",
remoteAddr, sensorID, x, y, z)
if err := SaveSensorData(sensorID, x, y, z); err != nil {
Logger.Printf("保存传感器数据失败: %v", err)
}
} else {
TCPDataLogger.Printf("无法解析从UDP客户端 %s 接收到的数据: %s, 错误: %v", remoteAddr, rawData, err)
}
resp := "OK\n"
if _, err := conn.WriteToUDP([]byte(resp), addr); err != nil {
Logger.Printf("发送响应到UDP客户端 %s 失败: %v", remoteAddr, err)
}
updateClientLastSeen(remoteAddr)
}