// 示例 13:多用户模式(bridge 包) // // 演示 Pool + UserBridge 门面,外部只需 import bridge 一个包。 // 不直接依赖 xiaomi / devices / miot。 package main import ( "context" "encoding/json" "fmt" "log" "os" "os/signal" "xiaomihome/bridge" "xiaomihome/xiaomi" ) type UserCfg struct { UID int64 `json:"uid,string"` UUID string `json:"uuid"` Auth xiaomi.AuthInfo `json:"auth"` DataDir string `json:"data_dir"` HomeIDs []int64 `json:"home_ids,omitempty"` } func loadUsers(path string) ([]UserCfg, error) { data, _ := os.ReadFile(path) var users []UserCfg if err := json.Unmarshal(data, &users); err != nil { return nil, err } return users, nil } func main() { allUsers, err := loadUsers("users.json") if err != nil || len(allUsers) == 0 { log.Fatalf("请创建 users.json: %v", err) } ctx := context.Background() pool := bridge.NewPool() for _, u := range allUsers { b, err := pool.Add(ctx, u.UID, u.UUID, u.Auth, u.DataDir, u.HomeIDs) if err != nil { log.Printf("用户 %d 初始化失败: %v", u.UID, err) continue } // 注册全局回调 → 推送到 NATS / WebSocket / 数据库 b.OnPropsChanged(func(id int64, did, deviceType, changed string, state interface{}) { log.Printf("[%d] %s/%s changed=%s → %+v", id, did, deviceType, changed, state) }) // 下单 MQTT 订阅 b.StartReceiving() // 云端拉初始状态 b.FetchAllStates(ctx) } defer pool.Close() log.Printf("\n%d 个用户就绪", len(allUsers)) // 演示:操作某台空调 demoControl(ctx, pool, 2897121707, "2053225728") ch := make(chan os.Signal, 1) signal.Notify(ch, os.Interrupt) <-ch log.Println("退出") } func demoControl(ctx context.Context, pool *bridge.Pool, id int64, did string) { b, ok := pool.Get(id) if !ok { log.Printf("id %d 不存在", id) return } ac, err := b.AC(did) if err != nil { log.Printf("设备 %s 不是空调: %v", did, err) return } // 读缓存 state := ac.GetProps() fmt.Printf("[demo] 缓存: on=%v mode=%s target=%.1f current=%.1f\n", state.On, state.Mode, state.TargetTemperature, state.Temperature) // 云端刷新 state2, err := ac.FetchProps(ctx) if err != nil { log.Printf("[demo] 云端刷新失败: %v", err) return } fmt.Printf("[demo] 云端: on=%v mode=%s target=%.1f current=%.1f\n", state2.On, state2.Mode, state2.TargetTemperature, state2.Temperature) // 控制 ac.TurnOn(ctx) ac.SetMode(ctx, "cool") ac.SetTargetTemp(ctx, 26) }