package camera import ( "fmt" "log" "sync" "time" "github.com/zeromicro/go-zero/core/logx" ) type CameraEventHandler func(*Manager, string) []byte type Config struct { Addr string Timeout time.Duration MaxRetries int RetryInterval time.Duration } type Manager struct { client *Client config Config mu sync.Mutex listeners map[string]CameraEventHandler } func NewManager(config Config) *Manager { return &Manager{ config: config, listeners: make(map[string]CameraEventHandler), } } func (m *Manager) Start() error { m.client = NewClient(m.config.Addr, m.config.Timeout) err := m.client.ConnectWithRetry(m.config.MaxRetries, m.config.RetryInterval) if err != nil { return err } // 启动监听 go m.listenLoop() return nil } func (m *Manager) listenLoop() { ticker := time.NewTicker(1 * time.Second) defer ticker.Stop() for { select { case <-ticker.C: m.pollEvents() } } } func (m *Manager) pollEvents() { // 模拟检测事件,实际应由 Client 提供事件检测接口 result, err := m.client.GetDetectionResult() if err != nil { log.Printf("获取检测结果失败: %v", err) return } if result != "" { m.handleEvent("detection_result", result) } } func (m *Manager) handleEvent(event string, data string) { m.mu.Lock() handler, exists := m.listeners[event] m.mu.Unlock() if !exists { log.Printf("未注册事件处理器: %s", event) return } logx.Infof("触发相机事件: %s, 数据: %s", event, data) resp := handler(m, data) if resp != nil { // 可选:写回响应 fmt.Println("响应:", string(resp)) } } func (m *Manager) AddListener(event string, handler CameraEventHandler) { m.mu.Lock() defer m.mu.Unlock() m.listeners[event] = handler } func (m *Manager) GetClient() *Client { return m.client } func (m *Manager) Close() { if m.client != nil { m.client.Close() } }