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