feat: 新增 UDP 解析

This commit is contained in:
fengyarnom 2025-05-15 12:17:41 +08:00
parent 5b24835496
commit e87a10c08f
2 changed files with 123 additions and 20 deletions

65
main.go
View File

@ -1,51 +1,76 @@
package main package main
import ( import (
"flag"
"fmt" "fmt"
"log" "log"
"sync" "sync"
) )
func main() { func main() {
// 初始化日志 // 命令行参数解析
if err := InitLogger(); err != nil { serverType := flag.String("server", "tcp", "服务器类型: tcp 或 udp")
log.Fatalf("初始化日志系统失败: %v", err) tcpPort := flag.String("tcpport", "10002", "TCP服务器端口")
} udpPort := flag.String("udpport", "10002", "UDP服务器端口")
defer CloseLogger() httpPort := flag.String("httpport", "10001", "HTTP服务器端口")
// 启动日志轮转 flag.Parse()
StartLogRotation()
// 初始化日志
if err := InitLogger(); err != nil {
log.Fatalf("初始化日志系统失败: %v", err)
}
defer CloseLogger()
// 启动日志轮转
StartLogRotation()
// 初始化数据库 // 初始化数据库
err := InitDB() err := InitDB()
if err != nil { if err != nil {
log.Fatalf("初始化数据库失败: %v", err) log.Fatalf("初始化数据库失败: %v", err)
} }
defer CloseDB() defer CloseDB()
fmt.Println("iProbe 斜侧仪监控系统启动中...") fmt.Println("iProbe 斜侧仪监控系统启动中...")
var wg sync.WaitGroup var wg sync.WaitGroup
// 启动TCP服务器 // 根据选择启动TCP或UDP服务器
wg.Add(1) wg.Add(1)
go func() { go func() {
defer wg.Done() defer wg.Done()
if err := StartTCPServer(":10002"); err != nil { if *serverType == "tcp" {
log.Fatalf("TCP服务器启动失败: %v", err) Logger.Printf("使用TCP服务器模式")
if err := StartTCPServer(":" + *tcpPort); err != nil {
log.Fatalf("TCP服务器启动失败: %v", err)
}
} else if *serverType == "udp" {
Logger.Printf("使用UDP服务器模式")
if err := StartUDPServer(":" + *udpPort); err != nil {
log.Fatalf("UDP服务器启动失败: %v", err)
}
} else {
log.Fatalf("未知的服务器类型: %s", *serverType)
} }
}() }()
// 启动HTTP服务器 // 启动HTTP服务器
wg.Add(1) wg.Add(1)
go func() { go func() {
defer wg.Done() defer wg.Done()
if err := StartHTTPServer(":10001"); err != nil { if err := StartHTTPServer(":" + *httpPort); err != nil {
log.Fatalf("HTTP服务器启动失败: %v", err) log.Fatalf("HTTP服务器启动失败: %v", err)
} }
}() }()
fmt.Println("服务器已启动成功") if *serverType == "tcp" {
fmt.Println("- HTTP接口: http://localhost:10001") fmt.Println("服务器已启动成功")
fmt.Println("- TCP接口: localhost:10002") fmt.Printf("- HTTP接口: http://localhost:%s\n", *httpPort)
fmt.Printf("- TCP接口: localhost:%s\n", *tcpPort)
} else {
fmt.Println("服务器已启动成功")
fmt.Printf("- HTTP接口: http://localhost:%s\n", *httpPort)
fmt.Printf("- UDP接口: localhost:%s\n", *udpPort)
}
wg.Wait() wg.Wait()
} }

78
udp_server.go Normal file
View File

@ -0,0 +1,78 @@
// 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)
}