迅思维智能宠物喂食器 - 数据存储与设备状态说明
版本:v1.1.0
日期:2024-04-14
🏗️ 系统架构概览
┌─────────────────────────────────────────────────────────────────┐
│ 用户手机 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 手机 App │ │
│ │ • 用户交互界面 │ │
│ │ • 本地数据缓存(SQLite / SharedPreferences) │ │
│ │ • 调用服务器 API │ │
│ └─────────────────────────────────────────────────────────┘ │
└──────────────────────────┬────────────────────────────────────┘
│ HTTP/MQTT
▼
┌─────────────────────────────────────────────────────────────────┐
│ 云端服务器 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 服务器 │ │
│ │ • 用户数据管理(账户、宠物、家庭) │ │
│ │ • 设备管理(绑定、状态监控) │ │
│ │ • 喂食计划存储与下发 │ │
│ │ • 消息推送 │ │
│ │ • 数据库(MySQL/PostgreSQL + Redis) │ │
│ └─────────────────────────────────────────────────────────┘ │
└──────────────────────────┬────────────────────────────────────┘
│ MQTT / HTTP
▼
┌─────────────────────────────────────────────────────────────────┐
│ 喂食器设备 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 设备固件 │ │
│ │ • 本地存储(喂食计划、WiFi配置) │ │
│ │ • 定时执行喂食(离线也执行) │ │
│ │ • 状态上报 │ │
│ │ • Flash 存储(~1MB) │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
📊 三层数据存储对照表
| 数据类型 |
手机App |
服务器 |
设备固件 |
说明 |
| 喂食计划 |
🟡缓存 |
🔴存储 |
🔴存储 |
核心数据,三端同步 |
| WiFi配置 |
- |
- |
🔴存储 |
设备联网凭证 |
| 设备基础配置 |
🟡缓存 |
🔴存储 |
🔴存储 |
名称、开关等 |
| 宠物信息 |
🟡缓存 |
🔴存储 |
🟡缓存 |
App显示用 |
| 用户账户 |
🟡缓存 |
🔴存储 |
- |
无关设备 |
| 家庭成员 |
🟡缓存 |
🔴存储 |
- |
纯云端数据 |
| 消息记录 |
🟡缓存 |
🔴存储 |
- |
App显示用 |
| 相册照片/视频 |
🟡缓存 |
🔴存储 |
- |
CDN存储 |
| 喂食记录 |
🟡缓存 |
🔴存储 |
🔴存储 |
最近N条本地 |
| 设备实时状态 |
🟡缓存 |
🔴存储 |
🔴存储 |
在线/电量/粮量 |
| 用户设置 |
🟡缓存 |
🔴存储 |
🟡缓存 |
App配置 |
🔴 = 必须存储 | 🟡 = 缓存/可选 | - = 不需要
🔴 设备固件层(喂食器硬件)
存储内容
| 数据 |
大小 |
说明 |
| 喂食计划 |
~2KB |
最多20条计划 |
| WiFi配置 |
~100B |
SSID + 加密密码 |
| 设备配置 |
~500B |
名称、默认出粮量等 |
| 喂食记录 |
~80KB |
最近1000条 |
| 设备状态 |
~100B |
在线/离线/电量/粮量 |
核心职责
- ✅ 定时执行喂食(设备离线也执行!)
- ✅ 本地存储喂食计划
- ✅ 上报设备状态到服务器
- ✅ 响应服务器指令(设备在线时)
- ✅ 断网后自动重连
离线行为
设备离线时:
┌─────────────────────────────────────────┐
│ 喂食计划到期 → 本地执行 → 出粮 ✅ │
│ 用户App手动喂食 → 指令发不出去 → 失败 ❌ │
│ 设备重新联网 → 自动同步计划 → 正常 ✅ │
└─────────────────────────────────────────┘
🟡 App层(手机端)
存储内容(本地缓存)
| 数据 |
存储方式 |
说明 |
| 用户Token |
SharedPreferences |
登录凭证 |
| 喂食计划列表 |
SQLite |
离线显示 |
| 宠物列表 |
SQLite |
离线显示 |
| 设备状态 |
SQLite |
上次同步的状态 |
| 消息记录 |
SQLite |
最近100条 |
| 用户设置 |
SharedPreferences |
App偏好 |
核心职责
- ✅ 用户交互界面
- ✅ 缓存服务器数据(加速加载、离线可看)
- ✅ 调用服务器API
- ✅ 显示设备状态(来自缓存,非实时)
离线行为
App离线时:
┌─────────────────────────────────────────┐
│ 打开App → 显示本地缓存数据 ✅ │
│ 添加喂食计划 → 保存到本地 + 待同步队列 │
│ 设备离线标记 → 显示灰色/离线状态 ✅ │
│ 手动喂食 → 提示"设备离线" ❌ │
└─────────────────────────────────────────┘
🔴 服务器层(云端)
存储内容
| 数据 |
数据库 |
说明 |
| 用户账户 |
users |
手机号、密码Hash、Token |
| 设备信息 |
devices |
SN、名称、绑定状态 |
| 喂食计划 |
feeding_plans |
全部计划 |
| 宠物信息 |
pets |
宠物档案 |
| 家庭成员 |
family_members |
家庭关系 |
| 消息记录 |
messages |
通知消息 |
| 相册 |
media |
照片/视频元数据 |
| 喂食记录 |
feeding_logs |
历史记录 |
| 用户设置 |
user_settings |
通知开关等 |
核心职责
- ✅ 数据存储(唯一真实来源)
- ✅ 业务逻辑处理
- ✅ 设备状态管理
- ✅ 喂食计划下发到设备
- ✅ 消息推送
⚡ 操作分类(三端视角)
✅ 设备离线也能执行的操作
| 操作 |
App(手机) |
服务器 |
设备固件 |
说明 |
| 查看喂食计划 |
🟡本地缓存 |
✅处理 |
- |
显示缓存数据 |
| 查看宠物列表 |
🟡本地缓存 |
✅处理 |
- |
显示缓存数据 |
| 查看设备状态 |
🟡本地缓存 |
✅处理 |
- |
显示上次状态,非实时 |
| 查看历史消息 |
🟡本地缓存 |
✅处理 |
- |
显示缓存消息 |
| 添加喂食计划 |
🟡本地+待同步 |
✅存储 |
❌未收到 |
设备联网后才执行 |
| 编辑喂食计划 |
🟡本地+待同步 |
✅存储 |
❌未更新 |
同上 |
| 删除喂食计划 |
🟡本地删除 |
✅删除 |
❌未删除 |
同上 |
| 添加宠物 |
🟡本地缓存 |
✅存储 |
🟡同步后缓存 |
设备联网后同步 |
| 家庭成员管理 |
✅纯云端 |
✅处理 |
- |
不涉及设备 |
| 查看用户设置 |
🟡本地缓存 |
✅处理 |
- |
显示缓存 |
❌ 必须设备在线才能执行的操作
| 操作 |
App(手机) |
服务器 |
设备固件 |
离线结果 |
| 手动喂食 |
✅发送指令 |
✅转发 |
✅执行 |
❌失败 |
| 设备绑定 |
✅配网页面 |
✅处理 |
✅响应 |
❌失败 |
| 设备解绑 |
✅发送请求 |
✅处理 |
✅确认 |
❌失败 |
| 实时监控视频 |
✅显示画面 |
✅转发 |
✅推流 |
❌失败 |
| 语音对讲 |
✅通话界面 |
✅转发 |
✅接收 |
❌失败 |
| 固件升级 |
✅下载固件 |
✅提供 |
✅接收安装 |
❌失败 |
| 查看实时状态 |
🟡请求→等待 |
✅查询 |
✅上报 |
❌超时 |
⏳ 设备离线时的数据同步时序
用户添加喂食计划(设备离线):
──────────────────────────────────────────────────────────
[App] [服务器] [设备]
│ │ │
│ 1.点击"添加计划" │ │
│─────────────────────────→│ │
│ │ │
│ 2.保存到云端数据库 │ │
│ ─────────────────────────→ │
│ │ │
│ 3.返回"添加成功" │ │
│←─────────────────────────│ │
│ │ │
│ 4.存入本地待同步队列 │ │
│ (等待设备上线) │ │
│ │ │
│ │ 5.设备上线 │
│ │←───────────────────────│
│ │ │
│ │ 6.下发喂食计划 │
│ │───────────────────────│
│ │ │
│ │ 7.设备本地存储 │
│ │←───────────────────────│
│ │ │
│ 8.App刷新 → 显示最新计划 │ │
│←─────────────────────────│ │
│ │ │
🔄 数据同步策略
设备 → 服务器(上报)
| 数据 |
触发时机 |
离线处理 |
| 设备状态 |
定时30秒/变化时 |
本地记录,联网补传 |
| 喂食记录 |
喂食完成后 |
本地缓存,联网同步 |
| 设备告警 |
触发时 |
本地记录,联网补传 |
| 心跳 |
定时60秒 |
- |
服务器 → 设备(下发)
| 数据 |
触发时机 |
离线处理 |
| 喂食计划 |
添加/修改时 |
存入队列,联网下发 |
| 设备配置 |
修改时 |
存入队列,联网下发 |
| 固件推送 |
用户触发 |
设备在线时下载 |
App ↔ 服务器
| 数据 |
App缓存策略 |
说明 |
| 喂食计划 |
SQLite存储 |
离线可查看 |
| 宠物列表 |
SQLite存储 |
离线可查看 |
| 设备状态 |
SQLite存储 |
非实时 |
| 消息记录 |
SQLite存储 |
最近100条 |
📋 接口对应三端职责
| 接口 |
App职责 |
服务器职责 |
设备职责 |
| /api/feeding/list |
显示缓存 |
存储+返回 |
- |
| /api/feeding/add |
发起请求 |
存储+下发 |
接收+存储 |
| /api/feeding/update |
发起请求 |
更新+下发 |
更新本地 |
| /api/feeding/delete |
发起请求 |
删除+通知 |
删除本地 |
| /api/feeding/manual |
发起请求 |
转发指令 |
执行 |
| /api/device/detail |
显示缓存 |
查询+返回 |
- |
| /api/device/bind |
配网引导 |
验证+绑定 |
响应配网 |
| /api/album/capture |
发起请求 |
保存文件 |
执行抓拍 |
| /api/message/list |
显示缓存 |
返回消息 |
- |
📝 开发注意事项
App开发
- 离线状态感知 - 设备离线时,App应显示"离线"标签
- 本地缓存更新 - 操作成功后,乐观更新本地缓存
- 同步队列 - 离线操作存入队列,联网后自动同步
- 状态刷新 - 设备上线后,App应主动刷新数据
服务器开发
- 消息推送 - 设备状态变化时,通过MQTT推送
- 计划下发 - 喂食计划变更时,立即下发到设备
- 离线补偿 - 设备重新连接时,发送离线期间的变化
- 冲突处理 - 设备本地时间和服务器时间冲突,以设备为准
设备固件开发
- 本地存储 - 使用Flash存储喂食计划,支持断电保存
- 定时执行 - RTC时钟控制,即使断网也按时喂食
- 状态上报 - 联网时定时上报状态到服务器
- 自动重连 - 断网后自动重连,接收离线期间的下发数据
版本历史:
- v1.1.0 - 2024-04-14:增加三层架构对照表,明确区分App/服务器/设备固件
- v1.0.0 - 2024-04-13:初始版本