diff --git a/cmd/waiter/daemon.go b/cmd/waiter/daemon.go index cf2271d..b4ad6b8 100644 --- a/cmd/waiter/daemon.go +++ b/cmd/waiter/daemon.go @@ -39,7 +39,7 @@ type msgEntry struct { type daemonHandler struct { // homed 连接 - homeMu sync.Mutex + homeMu sync.Mutex homeConn net.Conn homeR *bufio.Reader homeCfg *Config @@ -304,14 +304,14 @@ func startDaemonDeviceBridge(cfg *Config) { if dg == "" || dt == "" { return } - // 设备桥重连循环:WS 断开时自动重连 - go runDeviceBridgeLoop(dg, dt) + // 设备桥重连循环:WS 断开时自动重连,并保留配置中的本地授权状态。 + go runDeviceBridgeLoop(dg, dt, cfg.DeviceAuthorized) } // runDeviceBridgeLoop 无限重连循环:建立设备桥 → 等待断开 → 重连。 -func runDeviceBridgeLoop(gateway, token string) { +func runDeviceBridgeLoop(gateway, token string, authorized bool) { for { - bridge, err := connectDeviceBridge(gateway, token) + bridge, err := connectDeviceBridge(gateway, token, authorized) if err != nil { log.Printf("[daemon] device bridge connect failed: %v, retrying in 5s", err) time.Sleep(5 * time.Second) @@ -325,7 +325,7 @@ func runDeviceBridgeLoop(gateway, token string) { } // connectDeviceBridge 创建并启动一次设备桥,返回 bridge 实例供 Wait()。 -func connectDeviceBridge(gateway, token string) (*client.Bridge, error) { +func connectDeviceBridge(gateway, token string, authorized bool) (*client.Bridge, error) { hostname, _ := os.Hostname() if hostname == "" { hostname = "local" @@ -355,12 +355,17 @@ func connectDeviceBridge(gateway, token string) (*client.Bridge, error) { } bridge := client.New(gw, token, deviceID, hostname, caps, info) + bridge.SetAuthorized(authorized) - // 注册命令处理器 + // 注册命令处理器:cmd_type 是主信号,同时兼容旧版 homeagent-* 文本前缀。 cr := client.NewCmdRouter() cr.Handle("homeagent-", handleHomeagentCmd) cr.HandleDefault(handleShellCmd) - bridge.OnCmd(func(reqID, command string) { + bridge.OnCmd(func(reqID, command, cmdType string) { + if cmdType == "homeagent" { + handleHomeagentCmd(reqID, command) + return + } cr.Dispatch(reqID, command) }) @@ -371,8 +376,6 @@ func connectDeviceBridge(gateway, token string) (*client.Bridge, error) { // 设置全局变量供 sendBridgeResult 使用 deviceBridge = bridge deviceBridgeID = deviceID - auth := true // daemon 模式默认授权(配置已指定) - bridge.SetAuthorized(auth) return bridge, nil } diff --git a/cmd/waiter/device.go b/cmd/waiter/device.go index 69897c1..60dcb15 100644 --- a/cmd/waiter/device.go +++ b/cmd/waiter/device.go @@ -61,10 +61,14 @@ func startDeviceBridge(addr, token string) error { bridge := client.New(gateway, token, deviceID, "HomeAgent CLI", caps, info) cmdRouter = client.NewCmdRouter() - // 注册命令处理器 + // cmd_type 是主路由信号;保留 homeagent-* 文本前缀兼容旧服务端。 cmdRouter.Handle("homeagent-", handleHomeagentCmd) cmdRouter.HandleDefault(handleShellCmd) - bridge.OnCmd(func(reqID, command string) { + bridge.OnCmd(func(reqID, command, cmdType string) { + if cmdType == "homeagent" { + handleHomeagentCmd(reqID, command) + return + } cmdRouter.Dispatch(reqID, command) }) @@ -767,4 +771,4 @@ func sanitizeID(s string) string { } } return sb.String() -} \ No newline at end of file +} diff --git a/internal/devicebridge/client/bridge.go b/internal/devicebridge/client/bridge.go index 4a7f653..be8b275 100644 --- a/internal/devicebridge/client/bridge.go +++ b/internal/devicebridge/client/bridge.go @@ -10,10 +10,12 @@ import ( "time" ) -// CmdHandler 是命令处理回调类型。 -// 当收到 remotedevice 下发的 cmd 时调用,reqID 用于回执,command 是命令内容。 +// CmdHandler 是本地命令路由回调类型。 type CmdHandler func(reqID, command string) +// BridgeCmdHandler 接收服务端明确下发的路由信号(shell 或 homeagent)。 +type BridgeCmdHandler func(reqID, command, cmdType string) + // CmdResult 是命令执行结果回调(用于异步通知 GUI 层)。 type CmdResultHandler func(reqID, status, output, errMsg string) @@ -41,7 +43,7 @@ type Bridge struct { started bool // 回调 - cmdHandler CmdHandler + cmdHandler BridgeCmdHandler resultHandler CmdResultHandler dataHandler DataHandler @@ -135,7 +137,7 @@ func (b *Bridge) Authorized() bool { } // OnCmd 注册命令处理器。当收到 remotedevice 下发的 cmd 时调用。 -func (b *Bridge) OnCmd(handler CmdHandler) { +func (b *Bridge) OnCmd(handler BridgeCmdHandler) { b.mu.Lock() defer b.mu.Unlock() b.cmdHandler = handler @@ -436,7 +438,7 @@ func (b *Bridge) handleMessage(msg map[string]interface{}) { log.Printf("[devicebridge] cmd req=%s type=%s cmd=%s", reqID, cmdType, truncateString(command, 60)) if handler != nil { - handler(reqID, command) + handler(reqID, command, cmdType) } case "hello_ack", "bind_ack":