175 lines
3.2 KiB
Go
175 lines
3.2 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:10002"
|
|
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)
|
|
}
|
|
}()
|
|
|
|
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)
|
|
}
|