从居家安全焦虑到能长期运行的小项目:安心守护的设计与上线复盘

随笔 zhaosay 7℃

家里有老人独居时,真正让人不安的往往不是“没人聊天”,而是两件更具体的事:摔倒了没人知道,以及长时间联系不上

现成方案通常要购买专用设备、绑定厂商 App 或持续付费;家人轮流打电话又很难长期坚持。于是我做了一个小项目:安心守护。目标不是替代医疗设备,而是验证一件更朴素的事——一台老人已经在用的 Android 手机,加上一台家中常开的电脑或 NAS,能否组成轻量的居家安全辅助系统。

老人手机定位、跌倒提醒、本地记录
家庭服务端局域网接收、鉴权、保存
家属浏览器状态、轨迹与提醒
NAS 长期运行不依赖开发电脑

先定义问题,而不是先选技术

项目内部代号是 mm。写代码前,先给老人端和家属端定下约束:老人端必须大字体、大按钮、弱网可用、本地优先记录;家属端不安装 App、不注册账号,只需在浏览器打开链接。这个规模是一台手机对应一个家庭,因此没有引入多租户、消息队列和复杂账号体系。

使用方 最重要的约束 对应选择
老人端 少操作、弱网可用、隐私保守 大按钮、本地记录、联网后补同步
家属端 不用安装和注册,随时能看 浏览器访问、配对访问码
家庭环境 一台手机服务一个家庭 不做多租户与复杂平台

这是一次反过度设计。如果场景是成千上万台设备,标准物联网平台和账号体系都有意义;但在一个家庭里,它们会把部署、维护和隐私成本一起带进来。

架构:只保留必要的三段

老人手机(定位 + 跌倒检测 + 本地轨迹)
    ↓ HTTP(局域网)
家庭服务端(接收上报、鉴权、提供查询)
    ↓
家属 Web 页面(浏览器查看状态和轨迹)

服务端用 Python 标准库实现;OSRM 仅作为可选道路吸附能力,失败时直接回退到原始坐标。这里的原则是:辅助功能失效,不应拖垮核心提醒。

跌倒检测:宁可朴素,也要把边界说清楚

跌倒检测没有假装自己是医疗算法。它使用一个启发式规则:先感知到短暂“失重”,再在两秒内检测是否有剧烈撞击;两个条件同时出现,才触发疑似跌倒提醒。

if (magnitude < 0.55f && freeFallAt == 0) {
    freeFallAt = now;
} else if (freeFallAt > 0 && now - freeFallAt <= 2_000L && magnitude > 2.5f) {
    triggerFallAlert();
}

真实的跌倒检测需要大量样本和长期调参。项目没有这些数据,所以把它定位为辅助提醒:手机没带在身上、系统被强制停止或传感器条件不满足时,都可能无法触发。

重要边界:安心守护不是医疗报警设备,不能替代紧急呼叫、专业监护设备或人工照看。安全类项目最重要的体验,不是看起来无所不能,而是让用户知道它何时可能失效。

轨迹记录:先过滤“原地抖动”

每隔 15 到 30 秒定位一次会让轨迹被 GPS 漂移淹没。项目在手机端和服务端各做一次过滤:速度达到约 0.8m/s、位移达到约 80 米,或位移明显超过定位精度范围,才更倾向于记录。若 Wi-Fi 没变化,通常仍在同一活动区域,不必反复写入。

Wi-Fi 标识不会把原始 BSSID 交给服务端,而是先生成截断的 SHA-256 哈希,只用于判断是否仍在同一个网络,减少不必要的原始信息暴露。

地图最难的不是画出来,而是坐标系

项目只在存储层保留一份真值:设备原始 GPS 与 OSRM 处理结果均使用 WGS84;到了展示层,再按地图服务要求转换。百度地图显式按 WGS84 展示,高德地图则在返回前转换为 GCJ-02。这样发生偏移问题时,可以先查原始坐标,不会因为反复转换失去判断依据。

家属授权:配对码比账号体系更合适

家属端没有用户名、密码和找回流程。手机首次启动生成设备令牌,再换取家属访问码;如果服务端已被另一台设备配对,则返回冲突,避免被无意覆盖。对于“一台手机、一个家庭”的场景,访问码能省掉一整套账号管理复杂度。

为什么服务端坚持零第三方依赖

家庭服务端只使用 Python 标准库的 http.server,不需要 Flask,也不需要 pip install。代价是路由、线程安全和 JSON 输出都要自行处理;收获是迁移到 NAS 或旧电脑时不必担心虚拟环境和依赖版本。对于要长期无人维护的小服务,减少依赖面本身就是可靠性设计

OSRM:把外部额度风险变成可选本地能力

轨迹直接连线常会穿过建筑。OSRM 可以把定位点吸附到附近道路。项目裁剪活动范围附近的 OpenStreetMap 路网数据,自建只供家庭服务端使用的 OSRM:它不向公网开放,异常时自动展示原始坐标,不影响主要流程。路网数据预处理一次后即可复用,换机器也不必重新构建。

从开发电脑迁移到 NAS

开发时,服务运行在电脑上;但电脑不可能 24 小时开机。迁移到 NAS 后,手机只需要把服务地址从电脑局域网 IP 改成 NAS IP,其他业务代码不变。OSRM 数据是静态文件,服务端没有依赖安装步骤,配置集中在环境文件中,因此迁移成本很低。这不是运气,而是设计时就没有把服务绑定在开发电脑上。

还没有做完的事,也必须写出来

  • 跌倒检测只是辅助提醒,没有经过真实大样本验证。
  • 部分 Android 设备的网络定位精度可能不理想。
  • App 被系统强制停止后,无法自行恢复守护。
  • 当前按可信局域网设计;公网访问前必须补 HTTPS、访问码轮换与权限机制。
  • 大字体和大按钮尚未经过专业无障碍测试。

复盘:小项目的“合适”,比“先进”更重要

这个项目没有复杂模型、云端平台或庞大后台,但它围绕一个明确尺度做了取舍:一台手机服务一个家庭。零依赖服务端、配对码、启发式跌倒提醒、局域网优先和可迁移部署,单独看都不算炫技;放进真实场景里,它们更容易被理解、部署和长期维护。

先回答谁在用、在哪用、规模多大,再决定需要什么技术。技术应该帮助人减轻焦虑,而不是制造一套新的复杂焦虑。

常见问题

这套系统能替代医疗报警设备吗?

不能。它是居家安全辅助提醒,存在传感器、定位和系统运行状态带来的限制。

为什么不直接使用云端平台?

当前目标是单家庭局域网使用,以减少账户、订阅、数据外发和长期运维成本。

为什么把 OSRM 设为可选?

道路吸附能改善轨迹展示,但不是核心安全能力;可选设计保证它异常时,定位上报与家属查看仍可用。

转载请注明:三五二萌文网 » 从居家安全焦虑到能长期运行的小项目:安心守护的设计与上线复盘