go_rain_dtu/main.go
2025-05-15 16:01:25 +08:00

94 lines
2.0 KiB
Go

package main
import (
"database/sql"
"fmt"
"net/http"
_ "github.com/go-sql-driver/mysql"
"go_rain_dtu/internal/dao"
"go_rain_dtu/internal/handler"
"go_rain_dtu/internal/tcp"
"go_rain_dtu/pkg/logger"
)
const (
username = "root"
password = "root"
host = "localhost"
port = "3306"
dbName = "rain_db"
)
func main() {
// 初始化日志
if err := logger.InitLogger(); err != nil {
fmt.Printf("初始化日志失败: %v\n", err)
return
}
defer logger.CloseLogger()
logger.StartLogRotation()
// 连接数据库
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true",
username, password, host, port, dbName)
db, err := sql.Open("mysql", dsn)
if err != nil {
logger.Logger.Printf("连接数据库失败: %v", err)
return
}
defer db.Close()
// 初始化数据库表
if err := initDB(db); err != nil {
logger.Logger.Printf("初始化数据库表失败: %v", err)
return
}
// 初始化各层
sensorDAO := dao.NewSensorDAO(db)
sensorHandler := handler.NewSensorHandler(sensorDAO)
// 设置路由
http.HandleFunc("/api/data", sensorHandler.GetAggregatedData)
http.HandleFunc("/", sensorHandler.ServeStatic)
// 启动TCP服务器
go startTCPServer(sensorDAO)
// 启动HTTP服务器
logger.Logger.Println("HTTP服务器启动在 :10003")
if err := http.ListenAndServe(":10003", nil); err != nil {
logger.Logger.Printf("HTTP服务器启动失败: %v", err)
}
}
func initDB(db *sql.DB) error {
query := `
CREATE TABLE IF NOT EXISTS sensor_data (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
timestamp DATETIME NOT NULL,
wind_speed INT,
wind_force INT,
wind_direction_8 INT,
wind_direction_360 INT,
humidity INT,
temperature INT,
atm_pressure INT,
solar_radiation INT,
rainfall INT,
INDEX idx_timestamp (timestamp)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
`
_, err := db.Exec(query)
return err
}
func startTCPServer(dao *dao.SensorDAO) {
if err := tcp.StartTCPServer(dao); err != nil {
logger.Logger.Printf("TCP服务器启动失败: %v", err)
}
}