go_rain_dtu/main.go
2025-05-14 16:56:03 +08:00

176 lines
3.3 KiB
Go

package main
import (
"log"
"net"
"os"
"sync"
"time"
)
var (
logger *log.Logger
logFile *os.File
activeConn net.Conn
activeSensor *SensorComm
activeConnMutex sync.Mutex
clientAddress string
)
func main() {
setupLogging()
defer logFile.Close()
initDB()
defer db.Close()
go startWebServer()
addr := "0.0.0.0:10004"
listener, err := net.Listen("tcp", addr)
if err != nil {
logger.Fatalf("监听端口错误: %v", err)
}
defer listener.Close()
logger.Printf("服务器已启动: %s", addr)
for {
conn, err := listener.Accept()
if err != nil {
logger.Printf("接受连接错误: %v", err)
continue
}
activeConnMutex.Lock()
// 关闭旧连接
if activeConn != nil {
oldConn := activeConn
oldSensor := activeSensor
activeConn = nil
activeSensor = nil
activeConnMutex.Unlock()
if oldSensor != nil {
oldSensor.close()
} else if oldConn != nil {
oldConn.Close()
}
logger.Printf("关闭旧连接,接入新连接: %s", conn.RemoteAddr().String())
} else {
activeConnMutex.Unlock()
logger.Printf("新连接: %s", conn.RemoteAddr().String())
}
sensorComm := newSensorComm(conn)
activeConnMutex.Lock()
activeConn = conn
activeSensor = sensorComm
clientAddress = conn.RemoteAddr().String()
activeConnMutex.Unlock()
go handleConnection(sensorComm)
}
}
func handleConnection(sensor *SensorComm) {
defer func() {
activeConnMutex.Lock()
if activeConn == sensor.conn {
activeConn = nil
activeSensor = nil
clientAddress = ""
}
activeConnMutex.Unlock()
sensor.close()
}()
logger.Printf("处理连接: %s", sensor.address)
nextQuery := getNextQueryTime()
nextReset := getNextHourTime()
var nextEvent time.Time
isQueryEvent := true
if nextQuery.Before(nextReset) {
nextEvent = nextQuery
isQueryEvent = true
} else {
nextEvent = nextReset
isQueryEvent = false
}
timer := time.NewTimer(time.Until(nextEvent))
sensor.sendQuery()
buffer := make([]byte, 1024)
done := make(chan bool)
go func() {
for {
n, err := sensor.conn.Read(buffer)
if err != nil {
logger.Printf("客户端断开: %v", err)
done <- true
return
}
if n >= 37 {
sensorData := sensor.handleData(buffer[:n])
if sensorData != nil {
saveSensorData(*sensorData)
logSensorData(*sensorData)
}
}
logger.Printf("接收数据长度: %d", n)
logger.Printf("Raw Data: %x\n",buffer[:n])
}
}()
for {
select {
case <-timer.C:
if isQueryEvent {
sensor.sendQuery()
nextQuery = getNextQueryTime()
} else {
sensor.resetHourly()
nextReset = getNextHourTime()
}
if nextQuery.Before(nextReset) {
nextEvent = nextQuery
isQueryEvent = true
} else {
nextEvent = nextReset
isQueryEvent = false
}
timer.Reset(time.Until(nextEvent))
case <-done:
return
}
}
}
func setupLogging() {
if err := os.MkdirAll("logs", 0755); err != nil {
log.Fatalf("创建日志目录失败: %v", err)
}
logFileName := "logs/sensor_" + time.Now().Format("2006-01-02") + ".log"
var err error
logFile, err = os.OpenFile(logFileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
log.Fatalf("打开日志文件失败: %v", err)
}
logger = log.New(logFile, "", log.LstdFlags)
}