feat: 新增数据校验

This commit is contained in:
fengyarnom 2025-05-15 16:27:40 +08:00
parent 0323f18c9a
commit 8fd1605b86

View File

@ -57,10 +57,85 @@ func (s *SensorComm) sendQuery() error {
return nil 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 { 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 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 { func hexStringToBytes(s string) []byte {
// 移除空格 // 移除空格