博客

我如何借助 GitHub Copilot 打造 Baby Monitor Timmy

AI 帮助我更快推进工作,但 Timmy 的相关责任仍由我承担。

Baby Monitor Timmy 源于一个简单的想法:打造一款尊重家庭隐私的婴儿监护器。 不在云端保存录音,也不会让数据通过不必要的路径传出宝宝房间。很多人不知道的是:我在苏黎世独自开发 Timmy,而 GitHub Copilot 是我反应非常快的编程搭档。

人机协作流程

分工很明确:我定义功能、设定优先级,并作出架构决策。 Copilot 协助完成实现工作:编写代码、补充测试、缩小排查 bug 的范围,以及准备发布步骤。

我一次典型的迭代大致是这样:

  1. 功能说明: 我会说明这个功能应该做什么,包括边界情况和限制条件。
  2. 实现: Copilot 提出代码建议,并遵循项目已有的规范。
  3. 测试: 自动化端到端测试会在两台模拟器上运行,检查真实的宝宝端与家长端连接。
  4. 分发: 测试通过后,会为相应的应用商店和测试渠道准备 Android 和 iOS 构建版本。

这个循环会不断用于新功能和 bug 修复。我不会亲自写下每一行代码,但我决定 做什么为什么 要做,以及某个建议是否适合 Timmy。

从概念到 WebRTC

最核心的技术任务从一开始就很明确:让两部手机之间实现实时音视频。 WebRTC 是显而易见的选择,但要把它集成到 Flutter 并不简单:ICE 候选项、 SDP 协商、TURN 回退和 DataChannel 都必须按正确的顺序协同工作。

Copilot 帮我一步步把这些部分整合起来:设置对等连接, 保证关键顺序正确(先创建 DataChannel 再创建 offer,先 onTrack 再 setRemoteDescription), 并将信令放在 Firebase Firestore 上。每一部分都必须先在两台模拟器上运行通过,我才会继续下一步。

使用 ECDH 的安全配对

最关键的功能之一是 安全配对系统。 两台设备需要建立彼此信任,而不能依赖中央服务器为其身份背书。 解决方案是:通过 Firebase 进行 ECDH P-256 密钥交换,并结合可视化验证号码(SAS)来检测中间人攻击。

Copilot 协助实现了这条加密链路:密钥生成、公钥交换、 共享密钥派生、SAS 计算,以及对之后所有信令数据采用 AES-256-GCM 加密。 我不会将配对密钥发送到后端;只会将它的 SHA-256 哈希用作 Firestore 文档标识符。

安全审计:发现并修复漏洞

对我来说,AI 辅助开发不只是打字更快,也能帮助系统地排查 bug。 在一次专门的安全审计迭代中,Copilot 分析了代码库,并发现了 六个问题 需要我修复:

这六项都在同一次迭代中修复了。这正是 Copilot 擅长的地方:阅读大量文件、比对模式,并标记出我需要仔细检查的位置。

迭代开发:应用如何演进

Timmy 通过快速但边界清晰的迭代不断成长。部分里程碑包括:

每次迭代都遵循同样的基本模式:描述目标、审查建议、自动化测试,然后推送给测试人员。

跨设备 E2E 测试

无法只用一台设备就充分测试婴儿监护器。我需要一台宝宝端设备和一台家长端设备。 项目最初是在两台 Android 模拟器上同时运行,现在又补充了本地 iOS 模拟器和真机检查。 自动化 Android 测试脚本仍会:

  1. 在两台模拟器上安装应用
  2. 在两台设备上完成配对流程
  3. 验证音频和视频连接是否建立
  4. 测试按键通话、摄像头控制和其他功能

由于两台模拟器共享同一个 IP 地址(10.0.2.15),无法通过 STUN 建立直接的点对点连接。 每次测试都必须经过 Cloudflare TURN 中继。这确实麻烦,但也很有用:每次都会测试最复杂的连接路径。

我的收获

借助 AI 编程搭档开发一款完整应用,让我学到了几件事:

展望未来

Baby Monitor Timmy 仍在不断进化。iOS 版本即将发布;之后会加入更多传感器功能,并持续强化安全性。 工作流程仍然类似:我设定方向和边界,Copilot 协助快速实现和检查。

与安全相关的基础模块如今都置于 清晰的 边界 之下,并收录在公开的 baby-monitor-timmy-core 代码库。 配对、信令和后端接口相关的架构决策也记录在那里。


更多文章