imaznation/cradlewise-bridge

GitHub: imaznation/cradlewise-bridge

一个基于 Python 的 Cradlewise 智能婴儿床只读互操作库,提供状态轮询与 WebRTC 流处理能力。

Stars: 1 | Forks: 0

# cradlewise-bridge [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) [![Buy Me a Coffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-support-yellow?logo=buy-me-a-coffee)](https://buymeacoffee.com/imaznation) 一个用于 [Cradlewise](https://cradlewise.com/) 的非官方互操作库 智能婴儿床。使用您自己的 Cradlewise 凭据订阅婴儿床已发布到 Cradlewise 云端的实时视频和音频流, 以便您可以将其集成到您自己的监控、家庭自动化或分析管道中。 **状态:** 可用,处于 Alpha 阶段,由单个维护者开发。不与 Cradlewise Inc. 关联。 ## 功能 * **REST 状态轮询。** 读取每个婴儿床的完整设备影子(温度、婴儿存在、睡眠状态、跳动、音乐、灯光等)。 基于 [`pycradlewise`](https://github.com/jlamendo/pycradlewise) 进行身份验证。 * **实时 WebRTC 视频 + 音频。** 连接到 Cradlewise 的 Janus 网关,使用 HMAC 签名的 WebSocket 标头进行身份验证, 并通过 [`aiortc`](https://github.com/aiortc/aiortc) 订阅婴儿床的 H.264 视频 + Opus 音频流。 * **连续录制。** 将视频降采样到可配置的 FPS(默认 2),写入 5 分钟 MP4 段,在 SQLite 中建立索引,并在 48 小时后清除 (可配置)。 * **自适应音频峰值检测。** 指数移动平均环境基线 + 乘数阈值 + 延迟后峰值捕获 — 保存以哭泣/烦躁/大声事件为中心的 10 秒 WAV 片段。 * **多婴儿床。** 并发连接到账户中的每个婴儿床,并具有独立的重连循环。 * **只读设计。** 绝不会发送控制命令。 跳动、音乐、灯光、双向音频 — 均不在考虑范围内。 ## 安装 ``` pip install -e . # 或 pip install -r requirements.txt ``` 需要 Python 3.10+。依赖项包括 `pycradlewise`、`aiortc`、`aiohttp`、 `boto3`、`numpy`、`Pillow`、`imageio[ffmpeg]`。 ## 快速入门 ``` import asyncio, os from cradlewise_bridge import CradlewiseBridge, CribConfig from pycradlewise import CradlewiseAuth, CradlewiseClient, get_app_config async def main(): email, password = os.environ["CRADLEWISE_EMAIL"], os.environ["CRADLEWISE_PASSWORD"] # One-time discovery to map cradle_id -> device_id app = await get_app_config() auth = CradlewiseAuth(email, password, app_config=app) await auth.authenticate() cradles = await CradlewiseClient(auth).discover_cradles() bridge = CradlewiseBridge( email=email, password=password, cribs=[ CribConfig(name=(c.baby_name or cid[:8]).lower(), cradle_id=cid, device_id=c.device_id) for cid, c in cradles.items() ], ) async def on_spike(crib, wav): print(f"[{crib}] cry: {wav}") async def on_segment(crib, mp4): print(f"[{crib}] saved: {mp4}") bridge.on_audio_spike = on_spike bridge.on_segment_flushed = on_segment await bridge.run() asyncio.run(main()) ``` 请参阅 `examples/` 目录下的四个可运行脚本: | 脚本 | 功能说明 | |------------------------------------|------------------------------------------------| | `state_polling.py` | 打印设备影子状态(无视频) | | `connect_and_snapshot.py` | 连接并抓取 10 帧,保存为 JPG | | `detect_audio_spikes.py` | 检测到哭声/响亮声音时保存 WAV 文件 | | `record_continuously.py` | 全天候滚动录制(自动重连) | ## 设计说明 * 唯一需要真正逆向工程的部分是 Janus 网关层 — WebSocket HMAC 签名、视频房间握手、 将 trickle ICE 注入 SDP。该部分已在 [`PROTOCOL.md`](./PROTOCOL.md) 中完整记录。 * 该层之上的所有内容(分段录制、自适应哭声检测、多婴儿床监控)均为标准工程实现, 不涉及 Cradlewise 特定逻辑。你可以完全忽略这些模块,仅使用 `janus.py` + `rest.py`,如果你有自己的媒体管道。 * `pycradlewise` 负责所有的 Cognito / SigV4 认证工作;我们不会重新实现。 功劳应归于原作者。 ## 与 pycradlewise 的区别 `pycradlewise` 是一个 REST 与 MQTT 客户端 — 它读取设备影子并暴露类型化属性。 它**不**提供对视频或音频流的访问。`cradlewise-bridge` 增加了: * Janus 视频房间激活调用(AWS SigV4 REST 端点)。 * 带有 HMAC 签名升级标头的 Janus WebSocket 客户端。 * 视频房间订阅流程与 trickle ICE 处理。 * 通过 aiortc 进行 WebRTC 对等连接以实际接收媒体。 * 基于之上的录制与音频分析管道。 它依赖 `pycradlewise` 进行身份验证和影子访问。 ## 法律与伦理框架 本项目存在的目的是让 Cradlewise 婴儿床的所有者能够使用自己的凭据监控自己的设备。 它不与 Cradlewise Inc. 关联、背书或支持。 **本代码的作用与不作用** * **使用您自己的账户。** 该库以您的身份进行身份验证,使用您提供的凭据。 它不会绕过身份验证、冒充其他用户或访问他人的婴儿床。 * **只读设计。** 它订阅视频/音频流并读取 REST 状态。 它永远不会发送控制命令(跳动、音乐、灯光、双向音频)。 文档化的 API 存在 — 本项目只是从非移动客户端消费它。 * **不包含凭据、令牌或设备标识符。** 签名方案和协议框架以算法形式记录;运行时配置(API 基础、地区、房间密钥) 从 Cradlewise 自己的端点使用您的凭据获取,方式与官方移动应用完全一致。 **法律依据(美国,仅供参考)** * 逆向工程您拥有的产品以实现 *互操作性* 在 17 U.S.C. §1201(f)(DMCA 互操作性例外)下是明确允许的, 并已在个人和研究用途中得到广泛支持(Sega v. Accolade, Sony v. Connectix)。 * 《计算机欺诈和滥用法》(CFAA)针对的是 *未经授权* 的访问。 认证到您自己的账户并访问您自己的设备属于定义上的授权访问。 * 发布从您自己的已认证会话中获得的干净室观察所得的协议文档属于受保护的言论; 不会误用商业秘密(来自您所拥有的产品的公共网络流量不是商业秘密)。 **服务条款警告** Cradlewise 的服务条款可能禁止使用非官方客户端。 使用本库可能导致 Cradlewise 在其 discretion 下终止您的账户。 这是您使用本库所承担的风险。如果您不希望承担此风险,请勿使用本库。 **商标** “Cradlewise” 是 Cradlewise Inc. 的商标。 此处使用它是为了名义上标识该库与之互操作的产物,并不表示背书。 **无担保,不适用于安全关键用途** 本软件按原样提供,遵循 MIT 许可证。 **不要依赖它进行安全关键型婴儿监控。** 请使用官方 Cradlewise 应用并遵循其安全指南。 作者不对因使用本软件造成的任何伤害、财务损失或服务终止承担责任。 ## 贡献 欢迎提交问题和 PR。 我愿意接受的范围包括: * Janus / WebRTC 流程中的错误修复。 * 更优的重连逻辑与错误分类。 * 更多示例(HomeAssistant 桥接、Frigate 侧车等)。 * 协议文档改进。 我不愿接受的范围包括: * 任何向婴儿床发送控制命令的内容。 * 任何分发凭据、令牌或每账户标识符的内容。 * 任何使该库被用作大规模抓取工具的内容。 ## 致谢 * [`pycradlewise`](https://github.com/jlamendo/pycradlewise) by Jon Lamendola — AWS Cognito SRP 认证、AWS IoT MQTT、设备影子访问。 * [`aiortc`](https://github.com/aiortc/aiortc) by Jeremy Lainé — 支持 Python WebRTC 的 WebRTC 栈。 * [Janus Gateway](https://janus.conf.meetecho.com/) — 媒体管道的服务端(与本项目无关联,仅供 Cradlewise 使用)。 ## 支持 如果本项目帮助您更好地使用 Cradlewise,请考虑请我喝杯咖啡! [![Buy Me a Coffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-support-yellow?logo=buy-me-a-coffee&style=for-the-badge)](https://buymeacoffee.com/imaznation) ## 许可证 MIT。参见 [`LICENSE`](./LICENSE)。
标签:aiohttp, aiortc, BeEF, boto3, FFmpeg, HMAC, imageio, Janus, MP4, NumPy, Pillow, pycradlewise, Python, REST API, SQLite, WebRTC, WebSocket, 事件捕获, 依赖分析, 只读, 哭声检测, 多设备并发, 婴儿监控, 实时音视频, 家庭自动化, 异常检测, 影子设备, 数据集成, 无后门, 智能家居, 流媒体, 爬虫, 物联网, 状态轮询, 监控平台, 自适应阈值, 视频监控, 连续录制, 逆向工具, 音频处理, 音频尖峰, 音频检测