Compare commits

...

2 Commits

Author SHA1 Message Date
bdbab31181 1. 增加状态池初始化
2. 把状态池注入需要的地方
2025-09-08 23:30:59 +08:00
15f500210f 定义设备状态池 2025-09-08 23:18:12 +08:00
5 changed files with 98 additions and 8 deletions

View File

@@ -56,13 +56,16 @@ type API struct {
// websocketService WebSocket服务 // websocketService WebSocket服务
websocketService *service.WebSocketService websocketService *service.WebSocketService
// deviceStatusPool 设备状态池
deviceStatusPool *service.DeviceStatusPool
// logger 日志记录器 // logger 日志记录器
logger *logs.Logger logger *logs.Logger
} }
// NewAPI 创建并返回一个新的API实例 // NewAPI 创建并返回一个新的API实例
// 初始化Gin引擎和相关配置 // 初始化Gin引擎和相关配置
func NewAPI(cfg *config.Config, userRepo repository.UserRepo, operationHistoryRepo repository.OperationHistoryRepo, deviceControlRepo repository.DeviceControlRepo, deviceRepo repository.DeviceRepo, websocketService *service.WebSocketService) *API { func NewAPI(cfg *config.Config, userRepo repository.UserRepo, operationHistoryRepo repository.OperationHistoryRepo, deviceControlRepo repository.DeviceControlRepo, deviceRepo repository.DeviceRepo, websocketService *service.WebSocketService, deviceStatusPool *service.DeviceStatusPool) *API {
// 设置Gin为发布模式 // 设置Gin为发布模式
gin.SetMode(gin.DebugMode) gin.SetMode(gin.DebugMode)
@@ -93,7 +96,7 @@ func NewAPI(cfg *config.Config, userRepo repository.UserRepo, operationHistoryRe
operationController := operation.NewController(operationHistoryRepo) operationController := operation.NewController(operationHistoryRepo)
// 创建设备控制控制器 // 创建设备控制控制器
deviceController := device.NewController(deviceControlRepo, deviceRepo, websocketService) deviceController := device.NewController(deviceControlRepo, deviceRepo, websocketService, deviceStatusPool)
// 创建WebSocket管理器 // 创建WebSocket管理器
websocketManager := websocket.NewManager(websocketService, deviceRepo) websocketManager := websocket.NewManager(websocketService, deviceRepo)
@@ -114,6 +117,7 @@ func NewAPI(cfg *config.Config, userRepo repository.UserRepo, operationHistoryRe
authMiddleware: authMiddleware, authMiddleware: authMiddleware,
websocketManager: websocketManager, websocketManager: websocketManager,
websocketService: websocketService, websocketService: websocketService,
deviceStatusPool: deviceStatusPool,
logger: logs.NewLogger(), logger: logs.NewLogger(),
} }
} }

View File

@@ -116,15 +116,17 @@ type Controller struct {
deviceControlRepo repository.DeviceControlRepo deviceControlRepo repository.DeviceControlRepo
deviceRepo repository.DeviceRepo deviceRepo repository.DeviceRepo
websocketService *service.WebSocketService websocketService *service.WebSocketService
deviceStatusPool *service.DeviceStatusPool
logger *logs.Logger logger *logs.Logger
} }
// NewController 创建设备控制控制器实例 // NewController 创建设备控制控制器实例
func NewController(deviceControlRepo repository.DeviceControlRepo, deviceRepo repository.DeviceRepo, websocketService *service.WebSocketService) *Controller { func NewController(deviceControlRepo repository.DeviceControlRepo, deviceRepo repository.DeviceRepo, websocketService *service.WebSocketService, deviceStatusPool *service.DeviceStatusPool) *Controller {
return &Controller{ return &Controller{
deviceControlRepo: deviceControlRepo, deviceControlRepo: deviceControlRepo,
deviceRepo: deviceRepo, deviceRepo: deviceRepo,
websocketService: websocketService, websocketService: websocketService,
deviceStatusPool: deviceStatusPool,
logger: logs.NewLogger(), logger: logs.NewLogger(),
} }
} }

View File

@@ -42,6 +42,9 @@ type Application struct {
// WebSocketService WebSocket服务实例 // WebSocketService WebSocket服务实例
WebSocketService *service.WebSocketService WebSocketService *service.WebSocketService
// DeviceStatusPool 设备状态池实例
DeviceStatusPool *service.DeviceStatusPool
// Config 应用配置 // Config 应用配置
Config *config.Config Config *config.Config
@@ -90,13 +93,18 @@ func (app *Application) Start() error {
// 初始化设备仓库 // 初始化设备仓库
app.DeviceRepo = repository.NewDeviceRepo(app.Storage.GetDB()) app.DeviceRepo = repository.NewDeviceRepo(app.Storage.GetDB())
// 初始化设备状态池
app.DeviceStatusPool = service.NewDeviceStatusPool()
// 初始化WebSocket服务 // 初始化WebSocket服务
app.WebSocketService = service.NewWebSocketService(app.DeviceRepo) app.WebSocketService = service.NewWebSocketService(app.DeviceRepo)
// 设置设备状态池
app.WebSocketService.SetDeviceStatusPool(app.DeviceStatusPool)
// 设置WebSocket超时时间 // 设置WebSocket超时时间
app.WebSocketService.SetDefaultTimeout(app.Config.GetWebSocketTimeout()) app.WebSocketService.SetDefaultTimeout(app.Config.GetWebSocketTimeout())
// 初始化API组件 // 初始化API组件
app.API = api.NewAPI(app.Config, app.UserRepo, app.OperationHistoryRepo, app.DeviceControlRepo, app.DeviceRepo, app.WebSocketService) app.API = api.NewAPI(app.Config, app.UserRepo, app.OperationHistoryRepo, app.DeviceControlRepo, app.DeviceRepo, app.WebSocketService, app.DeviceStatusPool)
// 初始化任务执行器组件(使用5个工作协程) // 初始化任务执行器组件(使用5个工作协程)
app.TaskExecutor = task.NewExecutor(5) app.TaskExecutor = task.NewExecutor(5)

View File

@@ -0,0 +1,67 @@
// Package service 提供各种业务服务功能
package service
import (
"sync"
)
// DeviceStatus 设备状态信息
type DeviceStatus struct {
// Active 设备是否启动
Active bool
}
// DeviceStatusPool 设备状态池,用于管理所有设备的当前状态
type DeviceStatusPool struct {
// statuses 设备状态映射 设备ID:状态
statuses map[string]*DeviceStatus
// mutex 读写锁,保证并发安全
mutex sync.RWMutex
}
// NewDeviceStatusPool 创建设备状态池实例
func NewDeviceStatusPool() *DeviceStatusPool {
return &DeviceStatusPool{
statuses: make(map[string]*DeviceStatus),
}
}
// SetStatus 设置设备状态
func (dsp *DeviceStatusPool) SetStatus(deviceID string, status *DeviceStatus) {
dsp.mutex.Lock()
defer dsp.mutex.Unlock()
dsp.statuses[deviceID] = status
}
// GetStatus 获取设备状态
func (dsp *DeviceStatusPool) GetStatus(deviceID string) (*DeviceStatus, bool) {
dsp.mutex.RLock()
defer dsp.mutex.RUnlock()
status, exists := dsp.statuses[deviceID]
return status, exists
}
// DeleteStatus 删除设备状态
func (dsp *DeviceStatusPool) DeleteStatus(deviceID string) {
dsp.mutex.Lock()
defer dsp.mutex.Unlock()
delete(dsp.statuses, deviceID)
}
// GetAllStatuses 获取所有设备状态
func (dsp *DeviceStatusPool) GetAllStatuses() map[string]*DeviceStatus {
dsp.mutex.RLock()
defer dsp.mutex.RUnlock()
// 创建副本以避免外部修改
result := make(map[string]*DeviceStatus)
for id, status := range dsp.statuses {
result[id] = status
}
return result
}

View File

@@ -75,6 +75,14 @@ type WebSocketService struct {
// deviceRepo 设备仓库 // deviceRepo 设备仓库
deviceRepo repository.DeviceRepo deviceRepo repository.DeviceRepo
// deviceStatusPool 设备状态池
deviceStatusPool *DeviceStatusPool
}
// SetDeviceStatusPool 设置设备状态池
func (ws *WebSocketService) SetDeviceStatusPool(pool *DeviceStatusPool) {
ws.deviceStatusPool = pool
} }
// NewWebSocketService 创建WebSocket服务实例 // NewWebSocketService 创建WebSocket服务实例
@@ -84,6 +92,7 @@ func NewWebSocketService(deviceRepo repository.DeviceRepo) *WebSocketService {
logger: logs.NewLogger(), logger: logs.NewLogger(),
defaultTimeout: 5, // 默认5秒超时 defaultTimeout: 5, // 默认5秒超时
deviceRepo: deviceRepo, deviceRepo: deviceRepo,
deviceStatusPool: NewDeviceStatusPool(),
} }
} }