// Package main demonstrates property and device state subscriptions for all devices. // Press Ctrl+C to exit. package main import ( "context" "log" "os" "os/signal" miotconfig "xiaomihome/miot/examples/config" "xiaomihome/xiaomi" ) func main() { ctx := context.Background() cfg, err := miotconfig.LoadConfig("../../../miot/examples/config.json") if err != nil { log.Fatal("请先运行 miot/examples/cloud_oauth 获取 token:", err) } client, err := xiaomi.NewClient(ctx, xiaomi.Config{ AuthInfo: xiaomi.AuthInfo{ AccessToken: cfg.AuthInfo.AccessToken, RefreshToken: cfg.AuthInfo.RefreshToken, ExpiresIn: int32(cfg.AuthInfo.ExpiresIn), ExpiresTS: cfg.AuthInfo.ExpiresTS, }, DataDir: "./data", UUID: cfg.UUID, UID: cfg.UID, }) if err != nil { log.Fatal(err) } defer client.Close() devList, err := client.GetDevices(ctx, xiaomi.FilterByOnline()) if err != nil { log.Fatal("获取设备列表失败:", err) } if len(devList) == 0 { log.Fatal("未找到任何在线设备") } log.Printf("找到 %d 个在线设备,开始订阅...", len(devList)) for _, dev := range devList { did := dev.DID name := dev.Name // 订阅该设备所有属性 subID, err := client.SubProp(did, 0, 0, func(did string, p *xiaomi.PropertyValue) { log.Printf("[%s] siid=%d piid=%d value=%v", name, p.SIID, p.PIID, p.Value) }) if err != nil { log.Printf("[%s] 订阅失败: %v", name, err) } else { log.Printf("[%s] 已订阅 subID=%s", name, subID) } // 订阅设备在线状态 if err := client.SubDeviceState(did, func(did string, state xiaomi.DeviceState) { log.Printf("[%s] 状态变化: %s", name, state) }); err != nil { log.Printf("[%s] 状态订阅失败: %v", name, err) } } log.Println("\n按 Ctrl+C 退出...") sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, os.Interrupt) <-sigCh log.Println("已退出") }