diff --git a/internal/dao/sensor.go b/internal/dao/sensor.go index 48541b5..c57f6b8 100644 --- a/internal/dao/sensor.go +++ b/internal/dao/sensor.go @@ -67,7 +67,9 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ( ROUND(AVG(temperature)/10, 1) AS avg_temp, MAX(rainfall) - MIN(rainfall) AS rainfall, ROUND(AVG(humidity)/10, 1) AS avg_humidity, - ROUND(AVG(wind_speed)/10, 1) AS avg_wind_speed + ROUND(AVG(wind_speed)/10, 1) AS avg_wind_speed, + ROUND(AVG(atm_pressure)/10, 1) AS avg_atm_pressure, + ROUND(AVG(solar_radiation)/10, 1) AS avg_solar_radiation FROM sensor_data WHERE timestamp BETWEEN ? AND ? GROUP BY bucket_time @@ -92,7 +94,7 @@ func (dao *SensorDAO) GetAggregatedData(start, end time.Time, interval string) ( var data model.AggregatedData var tsStr string err := rows.Scan(&tsStr, &data.AvgTemperature, &data.Rainfall, - &data.AvgHumidity, &data.AvgWindSpeed) + &data.AvgHumidity, &data.AvgWindSpeed, &data.AvgAtmPressure, &data.AvgSolarRadiation) if err != nil { logger.Logger.Printf("扫描数据行失败: %v", err) continue diff --git a/internal/model/sensor.go b/internal/model/sensor.go index de3b1fd..7bd03ac 100644 --- a/internal/model/sensor.go +++ b/internal/model/sensor.go @@ -19,9 +19,11 @@ type SensorData struct { // AggregatedData 聚合数据结构 type AggregatedData struct { - Timestamp time.Time `json:"timestamp"` - AvgTemperature float64 `json:"avg_temperature"` - Rainfall float64 `json:"rainfall"` - AvgHumidity float64 `json:"avg_humidity"` - AvgWindSpeed float64 `json:"avg_wind_speed"` + Timestamp time.Time `json:"timestamp"` + AvgTemperature float64 `json:"avg_temperature"` + Rainfall float64 `json:"rainfall"` + AvgHumidity float64 `json:"avg_humidity"` + AvgWindSpeed float64 `json:"avg_wind_speed"` + AvgAtmPressure float64 `json:"atm_pressure"` // 平均大气压 + AvgSolarRadiation float64 `json:"solar_radiation"` // 平均太阳辐射 } diff --git a/internal/tcp/sensor.go b/internal/tcp/sensor.go index 53a4c7b..656b742 100644 --- a/internal/tcp/sensor.go +++ b/internal/tcp/sensor.go @@ -68,7 +68,7 @@ func handleConnection(sensor *SensorComm) { return } - // 设置定时器,每分钟查询一次 + // 设置定时器,每5分钟查询一次 ticker := time.NewTicker(time.Minute * 5) defer ticker.Stop() @@ -76,14 +76,28 @@ func handleConnection(sensor *SensorComm) { buffer := make([]byte, 1024) done := make(chan bool) + // 设置tcp保持活动状态,防止连接断开 + tcpConn, ok := sensor.conn.(*net.TCPConn) + if ok { + tcpConn.SetKeepAlive(true) + tcpConn.SetKeepAlivePeriod(30 * time.Second) + } + // 处理接收数据的goroutine go func() { for { - // 设置读取超时 - sensor.conn.SetReadDeadline(time.Now().Add(time.Second * 30)) + // 设置读取超时 - 增加超时时间到10分钟,大于查询间隔 + sensor.conn.SetReadDeadline(time.Now().Add(10 * time.Minute)) n, err := sensor.conn.Read(buffer) if err != nil { + if netErr, ok := err.(net.Error); ok && netErr.Timeout() { + // 超时错误不一定意味着连接断开,继续等待 + logger.Logger.Printf("读取超时: %v, 等待下一次查询", err) + continue + } + + // 其他错误才认为连接断开 logger.Logger.Printf("读取数据失败: %v", err) done <- true return @@ -109,6 +123,7 @@ func handleConnection(sensor *SensorComm) { for { select { case <-ticker.C: + logger.Logger.Printf("定时查询触发 [%s]", sensor.address) if err := sensor.sendQuery(); err != nil { return } @@ -174,7 +189,13 @@ func (s *SensorComm) Close() { // 启动TCP服务器 func StartTCPServer(dao *dao.SensorDAO) error { - listener, err := net.Listen("tcp", tcpPort) + // 创建TCP监听器并设置TCP选项 + addr, err := net.ResolveTCPAddr("tcp", tcpPort) + if err != nil { + return fmt.Errorf("解析TCP地址失败: %v", err) + } + + listener, err := net.ListenTCP("tcp", addr) if err != nil { return fmt.Errorf("启动TCP服务器失败: %v", err) } @@ -186,12 +207,17 @@ func StartTCPServer(dao *dao.SensorDAO) error { var mu sync.Mutex for { - conn, err := listener.Accept() + conn, err := listener.AcceptTCP() if err != nil { logger.Logger.Printf("接受连接失败: %v", err) continue } + // 设置TCP连接选项 + conn.SetKeepAlive(true) + conn.SetKeepAlivePeriod(30 * time.Second) + conn.SetLinger(0) // 立即关闭 + mu.Lock() // 关闭旧连接 if currentConn != nil { diff --git a/static/index.html b/static/index.html index 916869c..c8b590e 100644 --- a/static/index.html +++ b/static/index.html @@ -3,7 +3,7 @@ - 气象站数据监控 + 雨量计数据