Feat/mac launchagent lnp - #472
Conversation
|
👋 感谢提交 PR @HCl8!维护者会尽快 review。 提交前请确认:
|
e927b10 to
58f3ec6
Compare
[PR #472]: Feat/mac launchagent lnp — 接入本地中枢网关 + macOS LaunchAgent 迁移作者: HCl8 修改方案要解决的问题 Miloco 控制设备此前只有云端一条路径,延迟高、断网即失能。小米的「中枢网关」在同一局域网内支持 mTLS 直连,但 SDK 从未接入。macOS 上还叠加了一道 Local Network Privacy(LNP)障碍——按进程签名身份拦截用户态进程的局域网 TCP,导致即便本地控制逻辑写对了也连不上网关。 整体方案(7 条主线)
关键设计原则
测试覆盖
复核上轮 ci-bot 的问题上轮 ci-bot(2026-07-30)的 3 条 🟡 + 4 条 🔵 均已在当前代码中修复验证,不重复报:
复核 Zirconi 的 2 条 P1均已修复:
问题无新的 🔴 / 🟡 / 🔵 问题。 经完整复核:
结论LGTM — 上轮 ci-bot 和 Zirconi 发现的全部问题均已修复验证,代码质量高,测试覆盖全面,可以合入。 由 review-pr skill v1.6 生成 |
5ea2bd2 to
aafefc7
Compare
aafefc7 to
50ecf59
Compare
6c48ffa to
d1cb57a
Compare
fc9b3ef to
7e96afa
Compare
|
/allow-dependencies-change 4111ab4 |
|
Review 结论:整体方向 OK,但建议先修 2 个 P1 问题再合。 PR 主要内容
FindingsP1:首登/换号后本地中枢不会连接自动选中的家庭
影响:新用户首登或换号后,mDNS 发现到的中枢网关会因为 group_id 不在 建议: 相关位置:
P1:macOS
|
774d608 to
5249422
Compare
60015a0 to
ba47a69
Compare
在 miot SDK 接入小米本地中枢网关,实现设备的局域网低延迟控制与实时推送、云端兜底: - mDNS 发现:纯 Python legacy-unicast 子网定向广播、逐网卡(取代 zeroconf/dns-sd,跨平台) - 家庭归属过滤:只连 Miloco 启用的家庭,静态网关也校验归属;切换家庭重置作用域 - mTLS MQTT + MIPS TLV RPC 本地控制/推送;控制路由下沉到 MIoTClient,业务层薄委托 - 本地失败按类型分流(对齐 xiaomi-ha:可用则本地、失败不双发、冷却期走云端) - 切号/登出清理本地身份;0x87 Not authorized 给可操作提示;首连失败周期性重连自愈 - 含 P0 单元/集成 + 边界场景单测
macOS Local Network Privacy 拦用户态后端连中枢网关的 TCP(Errno 65),仅 root 例外。 让 python 作为签名 app(com.xiaomi.miloco.backend)的子进程运行,LNP 按 app 身份授权、 一次即通、跨重启/发版持久。 - launcher/:通用签名 C stub → miloco.app(通用二进制 arm64+x86_64,adhoc 签名,vendored 入库) - cli service.py:darwin 用 launchd 全功能替代 supervisord(start/stop/restart/status/kill 走 launchctl;EnvironmentVariables 复刻并补 HOME/PATH;处理 bootout→bootstrap 的 EIO 竞态) - openclaw/hermes 调 miloco-cli service 透明驱动同一 LaunchAgent,运行时无需改 - build.sh/sync-to-remote.sh/install.py:打包 + 部署落地 miloco.app;darwin 跳过 supervisor - install-hermes.sh --diagnose:改走 miloco-cli service status(兼容 launchd) - 文档 knowledge/03-features/macos-launchagent-lnp.md(含 mermaid 流程图) 真机(cat@mac)E2E:sync + 完整安装器两条路径均通,中枢 CONNACK success + device table +8。
ba47a69 to
4111ab4
Compare
本 PR 含两条独立主线,分别对应两个 commit。
1. 接入本地中枢网关(miot SDK 侧)
在 miot SDK 接入小米本地中枢网关,实现设备的局域网低延迟控制与实时推送、云端兜底:
2. macOS LaunchAgent + 签名启动器
macOS Local Network Privacy 拦用户态后端连中枢网关的 TCP(Errno 65),仅 root 例外。
让 python 作为签名 app(com.xiaomi.miloco.backend)的子进程运行,LNP 按 app 身份授权、
一次即通、跨重启/发版持久。
launcher/:通用签名 C stub →miloco.app(通用二进制 arm64+x86_64,adhoc 签名,vendored 入库的预编译二进制,~101 KB)cli service.py:darwin 用 launchd 全功能替代 supervisord(start/stop/restart/status/kill 走 launchctl;EnvironmentVariables 复刻并补 HOME/PATH;处理 bootout→bootstrap 的 EIO 竞态)miloco-cli service透明驱动同一 LaunchAgent,运行时无需改build.sh/sync-to-remote.sh/install.py:打包 + 部署落地miloco.app;darwin 跳过 supervisorinstall-hermes.sh --diagnose:改走miloco-cli service status(兼容 launchd)knowledge/03-features/macos-launchagent-lnp.md(含 mermaid 流程图)