feat: 新增数据校验
This commit is contained in:
parent
0323f18c9a
commit
8fd1605b86
@ -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 {
|
||||
// 移除空格
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user