- 改动:go.mod module 声明与全部内部导入路径补全为完整域名路径,README 同步 - 原因:裸模块名无法被 go get 解析,发版前必须修正为 GOPRIVATE 可拉取路径
108 lines
3.3 KiB
Go
108 lines
3.3 KiB
Go
// E8 — MIoT device spec parser example.
|
|
// Demonstrates: parse a device URN → iterate services/properties/actions → query value lists.
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"git.zeroonesoft.cn/golib/xiaomihome/miot"
|
|
)
|
|
|
|
func main() {
|
|
// 1. Create storage (needed for spec caching)
|
|
storage := miot.NewMIoTStorage("./data")
|
|
|
|
// 2. Create spec parser
|
|
parser := miot.NewMIoTSpecParser("zh-Hans", storage, "specs")
|
|
fmt.Println("Spec 解析器已创建")
|
|
|
|
// 3. Parse a sample device URN
|
|
urn := "urn:miot-spec-v2:device:light:0000A001:yeelink-light1:1"
|
|
fmt.Printf("\n解析 URN: %s\n", urn)
|
|
|
|
instance, err := parser.Parse(urn, "")
|
|
if err != nil {
|
|
fmt.Printf("Parse error: %v\n", err)
|
|
fmt.Println("\n提示: 请先在 ./specs/ 目录下放置对应的 JSON 规格文件")
|
|
return
|
|
}
|
|
|
|
// 4. Print instance info
|
|
fmt.Printf("\n=== 设备规格 ===\n")
|
|
fmt.Printf("URN: %s\n", instance.URN)
|
|
fmt.Printf("Type: %s\n", instance.Type)
|
|
fmt.Printf("Description: %s\n", instance.DescriptionTrans)
|
|
fmt.Printf("Services: %d\n", len(instance.Services))
|
|
|
|
// 5. Iterate each service
|
|
for _, svc := range instance.Services {
|
|
fmt.Printf("\n--- Service: %s ---\n", svc.DescriptionTrans)
|
|
fmt.Printf(" Type: %s\n", svc.Type)
|
|
fmt.Printf(" IID: %d\n", svc.IID)
|
|
fmt.Printf(" Description: %s\n", svc.Description)
|
|
|
|
// Properties
|
|
if len(svc.Properties) > 0 {
|
|
fmt.Printf(" Properties (%d):\n", len(svc.Properties))
|
|
for _, prop := range svc.Properties {
|
|
fmt.Printf(" [%d.%d] %s\n", prop.SIID, prop.PIID, prop.DescriptionTrans)
|
|
fmt.Printf(" Format: %s, Access: %v", prop.Format, prop.Access)
|
|
if prop.Writable() {
|
|
fmt.Printf(" [可写]")
|
|
}
|
|
if prop.Readable() {
|
|
fmt.Printf(" [可读]")
|
|
}
|
|
fmt.Println()
|
|
|
|
if prop.ValueRange != nil {
|
|
fmt.Printf(" Range: [%v, %v], Step: %v\n",
|
|
prop.ValueRange.Min, prop.ValueRange.Max, prop.ValueRange.Step)
|
|
}
|
|
|
|
if len(prop.ValueList) > 0 {
|
|
fmt.Printf(" ValueList (%d items):\n", len(prop.ValueList))
|
|
names := prop.ValueList.Names()
|
|
for i, item := range prop.ValueList {
|
|
fmt.Printf(" - %s: %v (%s)\n", names[i], item.Value, item.Desc)
|
|
}
|
|
|
|
// Demonstrate GetValueByDescription
|
|
if firstDesc := prop.ValueList[0].Desc; firstDesc != "" {
|
|
v := prop.ValueList.GetValueByDescription(firstDesc)
|
|
fmt.Printf(" GetValueByDescription(%q) = %v\n", firstDesc, v)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Actions
|
|
if len(svc.Actions) > 0 {
|
|
fmt.Printf(" Actions (%d):\n", len(svc.Actions))
|
|
for _, act := range svc.Actions {
|
|
fmt.Printf(" [%d.%d] %s\n", act.SIID, act.AIID, act.DescriptionTrans)
|
|
if len(act.In) > 0 {
|
|
fmt.Printf(" In: %v\n", act.In)
|
|
}
|
|
if len(act.Out) > 0 {
|
|
fmt.Printf(" Out: %v\n", act.Out)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// 6. Demonstrate ValuePrecision / ValueFormat
|
|
if len(instance.Services) > 0 && len(instance.Services[0].Properties) > 0 {
|
|
prop := instance.Services[0].Properties[0]
|
|
fmt.Printf("\n=== 值转换演示 (property: %s) ===\n", prop.DescriptionTrans)
|
|
raw := prop.ValueFormat("1")
|
|
fmt.Printf(" ValueFormat(\"1\") = %v (type: %T)\n", raw, raw)
|
|
prec := prop.ValuePrecision(3.14159)
|
|
fmt.Printf(" ValuePrecision(3.14159) = %v\n", prec)
|
|
expr := prop.EvalExpr(100.0)
|
|
fmt.Printf(" EvalExpr(100.0) = %v\n", expr)
|
|
}
|
|
|
|
fmt.Println("\n示例结束")
|
|
}
|