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) }