Skip to content

v0.44.0 · 在 God 里开关米家灯

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 28 Oct 14:08
· 8 commits to robbywang/god-android since this release
f09a27b

「功能 → 工具」新增「米家灯光」:God 在家里的 Wi-Fi 下直接用 miIO 协议控制一盏米家 Wi-Fi 灯,可以开关、调亮度和色温。和米家 App 在局域网里的做法一样,指令直接发给灯,不经过小米云,也不经过 God 服务器。

  • 协议:先向灯的 UDP 54321 发 hello,拿到设备 ID 和时钟;之后每条指令是 AES-128-CBC 加密的 JSON(key = md5(token),iv = md5(key + token)),包头带 MD5 校验,和 python-miio 的封包一致。单元测试用 openssl 独立加密的测试向量逐字节比对。
  • 读写:按 MIoT 灯光服务(siid 2)的属性 get_properties / set_properties。先用 miIO.info 读出型号,再按型号在 miot-spec.org 的定义选亮度、色温的 piid 和色温范围;默认是 lamp22(显示器挂灯1S)的布局:开关 p1、亮度 p2、色温 p3(2700–6500K)。属性对不上时提示布局不同,不会乱发指令。
  • 设置:本人填灯的局域网地址和 32 位 token。地址只接受 10、172.16–31、192.168 网段的 IPv4;token 用 Android Keystore 加密,存在本机私有的 mijia-light 里,不同步、不备份。God 不登录米家账号,token 要本人自己获取。
  • 失败提示:握手没回应时提示检查 Wi-Fi、地址和电源;握手通了但指令没回应时提示 token 多半不对;灯拒绝指令时给出错误码。
  • 所有网络操作在后台线程,下拉刷新会重新读取。改了设置后,还在路上的旧请求结果会被丢弃,并立即用新设置重读;每条指令只接受属于自己的回复(握手必须是 32 字节包头,指令回复必须能用当前 token 解开且请求编号一致),迟到的旧回复会被跳过。
  • 滑杆拖动时松手发送;TalkBack 的调节和键盘方向键停 0.5 秒后发送一次。

验证:303 项 JVM 测试通过(新增 MiioLightTest 14 项:hello、测试向量、校验和与错误 token、末尾的空字符、只认当前请求的回复、型号布局、读写参数、回复解析、地址校验),Debug/Release 构建和 lint 通过,lint 0 错误。真机用小米 MIX Flip(HyperOS / Android 16,和灯在同一个 Wi-Fi):预览版在浅色、深色、1.6 倍字体下检查了页面和设置弹窗;用 preview_real_light 连真实的灯,握手成功,假 token 的指令被灯忽略,页面给出 token 提示。正式签名包覆盖安装到 Flip,安装文件 SHA256 与构建一致,启动后没有崩溃日志。本人用自己取到的真实 token 在 Flip 的正式版里设置了这盏灯,确认开关、亮度和色温都能正常控制。键盘调滑杆在预览版上验证过(方向键把亮度从 80% 调到 95%)。

限制与未验证:本人真机控制用的是评审修复前的构建(062d424),之后的三处修复(丢弃旧设置的结果、键盘与 TalkBack 发送、只认当前请求的回复)只有单元测试和预览版验证;只支持一盏灯;手机不在家里 Wi-Fi 时无法控制;Find X9 Ultra 当天不在线,没有安装。仍为预览版。

验证:GitHub Actions 自动构建(https://github.com/robbywang25/robby-console-android/actions/runs/40702533070)。303 项 JVM 测试、Debug/Release 构建与 lint 通过;签名证书 SHA-256 与正式证书一致,Release 附件下载回读后校验通过。

附 APK 与 SHA256SUMS,Android 11 及以上,可覆盖旧版。