【免费下载链接】local_roborock_server
Local HTTPS and MQTT cloud emulator for Roborock vacuums without rooting or hardware modifications
Roborock Local Server是一个运行在内网的本地 HTTPS + MQTT 云端模拟器,让你的石头(Roborock)扫地机在不刷机、不改动硬件的情况下,完全脱离官方云也能拥有实时地图和摄像头直播。本文以带摄像头机型为例,手把手带你配置WebRTC + TURN 中继,实现真正的本地实时摄像头直播,全程无需互联网。
为什么需要这套组合:本地直播的三要素 🎥
官方方案里,扫地机的摄像头画面要先上传到 Roborock 云端,你的手机再从云端拉流。而本地化之后,流媒体链路必须完全落在家庭网络内,它由三个部分协作完成:
- Bootstrap(引导):扫地机通过本地服务器上的
/fwapi/createca接口完成摄像头握手,并领取中继凭证。 - TURN 中继:WebRTC 媒体流在 NAT 环境下的兜底通道。石头机型无法直接打洞时,画面会经由 TURN 服务器中转。
- WebRTC 播放器:在本地(如 NAS 或树莓派)运行 go2rtc,用
roborock://信源接收并播放实时画面。
三者缺一不可:只搭服务器不开 TURN,很多机型会出现"握手成功但没有画面"的情况。
前提准备:服务器运行 + 扫地机完成配网
在配置摄像头之前,请确认你已完成以下两件事:
- 按照 安装文档 部署了 Roborock Local Server(Docker Compose 或 Home Assistant 插件均可)
- 按照 配网文档 完成了扫地机的引导配网,并在
/admin面板执行过云数据导入
如果你还没有域名、DNS 劫持和证书的基础环境,建议先熟悉 安装文档 中的网络配置部分。
第一步:理解 TURN 的三种模式
TURN 配置写在config.toml的[turn]段中,参考模板见 config.example.toml。mode有三个可选值(配置数据结构定义在 TurnConfig):
| 模式 | 含义 | 适用场景 |
|---|---|---|
provided | 在服务器容器内直接启动 coturn | 大多数用户的推荐选择 |
external | 复用你自己已有的 TURN 服务器 | 已有中继服务的情况 |
disabled | 关闭 TURN(默认值) | 不需要摄像头直播 |
provided模式下的典型配置如下:
[turn] mode = "provided" # disabled | provided | external host = "api-rr.example.com" # 机器和播放器都能访问到的地址 port = 3478 username = "rrturn" password = "a-long-random-secret" realm = "api-rr.example.com" ttl = 86400💡 小贴士:
host必须能从扫地机所在网络解析到服务器,启动时服务器会用 DNS 解析它,把解析出的 IPv4 地址作为对外宣传地址写入 coturn 配置(见 turn_relay.py)。
第二步:发布 UDP 端口(最容易踩坑的一步)⚠️
coturn 需要监听 UDP3478以及中继端口范围UDP 49160–49179,且必须做 1:1 的端口映射(映射逻辑定义在 turn_relay.py)。
Docker Compose 用户
项目提供了现成的端口覆盖文件 compose.turn.yaml,启动命令为:
docker compose -f compose.yaml -f compose.turn.yaml up -d默认情况下 Compose不会发布这些 TURN 端口(避免与外部模式冲突),只有显式叠加compose.turn.yaml才会生效。如果修改了turn.port,记得同步设置环境变量ROBOROCK_SERVER_TURN_PORT。
Home Assistant 插件用户
在插件的 Network 设置中启用 UDP 3478 以及 UDP 49160–49179 的映射,并在配置里选择turn_mode = provided(相关字段见 addon config.yaml)。切换到其他模式后请记得手动关闭这些映射。
第三步:相机域名与证书的细节 ⚡
这是新手最容易卡住的环节。固件对"相机域名"输入有严格限制:
- 固件会把输入截断到 15 个字符并自动拼接
iot.roborock.com,所以带端口的输入必须以/结尾,且总长度不超过 15 字符(例如vac.cc:555/) - 不同机型取用不同入口:部分固件(如 Saros 10R)使用
country_domain,部分(如 Qrevo MaxV)使用带端口的token.r,详见 camera.md - 证书必须覆盖相机域名本身——通配符
*.vac.cc覆盖api-vac.cc但不覆盖vac.cc,需要vac.cc + *.vac.cc双证书才能同时覆盖 - 建议用 ZeroSSL 自动签发"基础域名 + 通配符",省去手动续期
DNS 需要在扫地机所在网络也能解析成功,而不只是你的电脑能解析。如果通过反向代理暴露服务,先阅读 reverse_proxy.md,并注意后端端口不要直接暴露到公网。
第四步:用 go2rtc 播放实时画面
在任意局域网设备(NAS、树莓派都行)上部署 go2rtc,配置一个roborock://信源,即可把扫地机画面接入 Home Assistant、浏览器或任何支持 RTSP/FLV 的播放器。
远程观看认证直接沿用 Roborock App 里已有的远程查看 PIN。如果 App 里设的是九宫格图案,按绘制顺序把图案转换成数字即可,对照网格:
1 2 3 4 5 6 7 8 9
另外,部分机型(如实测的 Saros 10R)需要双键激活:先设置远程查看 PIN,再通过set_camera_status发起激活请求,然后在约 60 秒内按下机身上的 Power 键。激活流程因机型而异,请以实测为准。
常见问题排查清单 🔍
| 症状 | 排查方向 |
|---|---|
| 扫地机没有任何 bootstrap 请求 | 检查 DNS 解析、受信证书、结尾斜杠、15 字符长度限制,以及扫地机网络侧的路由 |
| 握手成功但没有画面 | 检查 UDP 49160–49179 映射、防火墙规则、对外宣传的 IPv4 地址,并强制播放器走中继候选地址验证真实分配 |
| 预览被拒绝 | 核对远程查看 PIN 是否正确,确认该机型是否需要额外激活步骤 |
| coturn 启动失败 | 查看容器 stdout 日志;HTTPS 与 MQTT 不受影响,中继健康状态会单独上报失败 |
一个关键认知:bootstrap 接口能返回中继凭证 ≠ 媒体链路一定通。验收标准是做一次认证后的 TURN 分配测试,并强制播放器使用 relay 候选地址确认收到真实帧。
参考资料
- 摄像头完整文档:docs/camera.md
- 基础安装:docs/installation.md
- 配网流程:docs/onboarding.md
- 反向代理:docs/reverse_proxy.md
- TURN 配置示例:config.example.toml
- TURN 中继实现:src/roborock_local_server/turn_relay.py
- 已测机型列表:docs/tested_vacuums.md
按照以上四步完成配置后,你的石头扫地机就能在内网里完成从引导、中继到播放的全本地化直播——实时地图、房间清洁和摄像头画面,再也不需要经过任何官方服务器。
【免费下载链接】local_roborock_server
Local HTTPS and MQTT cloud emulator for Roborock vacuums without rooting or hardware modifications
相关推荐
如何用jsqrcode实现WebRTC摄像头实时QR码扫描:完整指南 🚀
如何用jsqrcode实现WebRTC摄像头实时QR码扫描:完整指南 🚀 想要在网页中实现实时二维码扫描功能吗?jsqrcode是一个强大的JavaScrip
计算机视觉OpCore Simplify:三分钟搞定黑苹果EFI配置的开源神器
OpCore Simplify:三分钟搞定黑苹果EFI配置的开源神器 还在为复杂的黑苹果配置头疼吗?面对OpenCore EFI中繁琐的ACPI补丁、内核扩展选
开发工具CLImacOS菜单栏里的多路摄像头直播:Itsyhome摄像头网格面板完整使用指南
macOS菜单栏里的多路摄像头直播:Itsyhome摄像头网格面板完整使用指南 Itsyhome 是一款原生 macOS 菜单栏智能家居控制应用,它的摄像头网格
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考