angle_dtu/udp_server.go
2025-05-15 12:17:41 +08:00

79 lines
1.9 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.

// udp_server.go
package main
import (
"fmt"
"net"
)
// StartUDPServer 启动UDP服务器
func StartUDPServer(address string) error {
// 解析UDP地址
addr, err := net.ResolveUDPAddr("udp", address)
if err != nil {
return fmt.Errorf("解析UDP地址失败: %v", err)
}
// 创建UDP连接
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)
}