From 8fd1605b8645818df45d815395e05a51a5df6b00 Mon Sep 17 00:00:00 2001 From: fengyarnom Date: Thu, 15 May 2025 16:27:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/tcp/sensor.go | 122 ++++++++++++++++++++++++++--------------- 1 file changed, 77 insertions(+), 45 deletions(-) diff --git a/internal/tcp/sensor.go b/internal/tcp/sensor.go index 737aba9..53a4c7b 100644 --- a/internal/tcp/sensor.go +++ b/internal/tcp/sensor.go @@ -57,10 +57,85 @@ func (s *SensorComm) sendQuery() error { return nil } +// 处理连接 +func handleConnection(sensor *SensorComm) { + defer sensor.Close() + + logger.Logger.Printf("新连接建立: %s", sensor.address) + + // 发送首次查询 + if err := sensor.sendQuery(); err != nil { + return + } + + // 设置定时器,每分钟查询一次 + ticker := time.NewTicker(time.Minute * 5) + defer ticker.Stop() + + // 读取数据的缓冲区 + buffer := make([]byte, 1024) + done := make(chan bool) + + // 处理接收数据的goroutine + go func() { + for { + // 设置读取超时 + sensor.conn.SetReadDeadline(time.Now().Add(time.Second * 30)) + + n, err := sensor.conn.Read(buffer) + if err != nil { + logger.Logger.Printf("读取数据失败: %v", err) + done <- true + return + } + + if n > 0 { + // 记录原始数据 + logger.Logger.Printf("接收到原始数据 [%s]: % X", sensor.address, buffer[:n]) + + // 只处理符合预期长度的响应(37字节) + if n == 37 { + if sensorData := sensor.handleData(buffer[:n]); sensorData != nil { + logger.Logger.Printf("处理数据成功: %+v", sensorData) + } + } else { + logger.Logger.Printf("数据长度不符合要求: %d != 37", n) + } + } + } + }() + + // 主循环 + for { + select { + case <-ticker.C: + if err := sensor.sendQuery(); err != nil { + return + } + case <-done: + return + } + } +} + // 处理接收到的数据 func (s *SensorComm) handleData(data []byte) *model.SensorData { - if len(data) < 37 { - logger.Logger.Printf("数据长度不足: %d", len(data)) + // 检查数据长度 + if len(data) != 37 { + logger.Logger.Printf("数据长度错误: %d != 37", len(data)) + return nil + } + + // 验证数据格式 + // 1. 检查起始字节是否为 0x01 0x03 + if data[0] != 0x01 || data[1] != 0x03 { + logger.Logger.Printf("数据格式错误: 起始字节不是0x01 0x03") + return nil + } + + // 2. 检查数据长度字节(第3个字节)是否为0x20 + if data[2] != 0x20 { + logger.Logger.Printf("数据格式错误: 长度字节不是0x20") return nil } @@ -135,49 +210,6 @@ func StartTCPServer(dao *dao.SensorDAO) error { } } -// 处理连接 -func handleConnection(sensor *SensorComm) { - defer sensor.Close() - - // 发送首次查询 - if err := sensor.sendQuery(); err != nil { - return - } - - // 设置定时器,每分钟查询一次 - ticker := time.NewTicker(time.Minute) - defer ticker.Stop() - - // 读取数据的缓冲区 - buffer := make([]byte, 1024) - - for { - // 设置读取超时 - sensor.conn.SetReadDeadline(time.Now().Add(time.Second * 30)) - - n, err := sensor.conn.Read(buffer) - if err != nil { - logger.Logger.Printf("读取数据失败: %v", err) - return - } - - if n > 0 { - logger.Logger.Printf("接收数据: %X", buffer[:n]) - if sensorData := sensor.handleData(buffer[:n]); sensorData != nil { - logger.Logger.Printf("处理数据成功: %+v", sensorData) - } - } - - select { - case <-ticker.C: - if err := sensor.sendQuery(); err != nil { - return - } - default: - } - } -} - // 辅助函数:将十六进制字符串转换为字节数组 func hexStringToBytes(s string) []byte { // 移除空格