首页 / 文档中心 / 宠物喂食器(ODM 案例) / APP详细功能设计文档

APP详细功能设计文档

宠物喂食器(ODM 案例) · 设计文档

迅思维智能宠物喂食器 App

详细功能设计文档

文档版本: v2.1
更新日期: 2026-04-23
产品名称: 迅思维智能宠物喂食器
App 版本: v1.0.0


目录

  1. 文档说明
  2. 角色说明与缩略语
  3. 数据存储规格说明
  4. 功能模块总览
  5. 模块一:认证与账号
  6. 模块二:首页与设备概览
  7. 模块三:设备详情与实时监控
  8. 模块四:相册(抓拍与录像)
  9. 模块五:定时喂食计划
  10. 模块六:宠物管理
  11. 模块七:设备设置
  12. 模块八:家庭管理
  13. 模块九:消息中心
  14. 模块十:设备配网与绑定
  15. 模块十一:我的(个人中心)

1. 文档说明

1.1 目的

本文档为迅思维智能宠物喂食器 App 的详细功能设计说明,旨在明确 App 端、服务端、设备端在每个功能点上的具体职责、数据流转与状态管理,并对应 HTML 设计稿中的具体页面截图进行功能说明,为开发团队提供完整、可执行的功能规格参考。

1.2 适用范围

  • 开发团队:App 端(iOS/Android)、服务端、设备端三方协同开发

1.3 阅读说明

  • 每个功能模块均按 App端、服务端、设备端 三个视角展开
  • 部分模块附有 设计稿截图索引,说明该功能在 HTML 设计稿中对应的页面位置
  • 符号说明:
  • 🟢 = 该端需处理
  • ⚪ = 该端不参与
  • ⭐ = 重点/关键逻辑

1.4 设计稿截图索引说明

本文档中每个模块标题下方均标注「设计稿对应页面」

开发/测试人员可打开 HTML 文件,定位到页面,查看该功能模块的视觉设计稿。


2. 角色说明与缩略语

2.1 系统角色

角色 说明 设计稿对应
管理员 家庭创建者,拥有设备管理、成员管理、喂食计划管理的全部权限,可删除/编辑所有计划 家庭管理页面(模块八)
成员 被邀请加入家庭的账号,可查看设备状态、触发手动喂食、查看消息通知,不可编辑他人计划 首页设备卡片(模块二)
设备 迅思维宠物喂食器硬件终端,通过 WiFi/蓝牙与 App 连接 设备详情页(模块三)

2.2 设备型号规格

项目 规格
设备型号 暂无
设备名称格式 XSW-型号-{随机4位字母}(例:XSW-PF200-AB12)
固件命名 xsw-pf200-v{x.y.z}.bin
支持系统 iOS 12.0+ / Android 8.0+

2.3 设备状态定义

状态 描述 显示文字 设计稿样式
online 设备已联网,正常运行 🟢 正常 / 🟢 在线 首页卡片角标绿色
offline 设备断网,无法连接 🔴 离线 首页卡片角标灰色
feeding 正在出粮 ⏳ 出粮中 首页卡片加载动画
error 设备异常(卡粮、通信故障等) ❌ 异常 首页卡片红色告警

2.4 缩略语

缩略语 全称 说明
BLE Bluetooth Low Energy 低功耗蓝牙,用于设备配网
MQTT Message Queuing Telemetry Transport 物联网消息传输协议
OSS Object Storage Service 对象存储服务(阿里云/腾讯云)
CDN Content Delivery Network 内容分发网络
OTA Over-The-Air 空中固件升级
RTC Real-Time Clock 实时时钟,设备本地定时
RTMP Real-Time Messaging Protocol 实时消息传输协议(设备视频推流)
HLS HTTP Live Streaming HTTP 直播流(App 拉流)
RTSP Real Time Streaming Protocol 实时流协议(局域网直连拉流)
JPEG JPEG 图片压缩格式
AAC Advanced Audio Coding 音频编码格式
ACK Acknowledgement 确认响应
JWT JSON Web Token 用户身份令牌
Redis Redis 内存数据库(验证码/会话存储)

3. 数据存储规格说明

3.1 用户数据存储

3.1.1 照片存储

项目 规格 对应设计稿元素
单张图片大小 ~200KB(JPEG 压缩,1280×960,质量 70%) 相册页面网格展示(模块四)
色彩格式 JPEG(RGB) —
每用户照片上限 50 张 相册页面「已存 8/50 张」统计
保存时长 7 天(自动清理,超期服务端删除,App 端同步清除本地缓存) —
存储位置 服务端对象存储(OSS)+ CDN 加速 —
删除策略 后台定时任务(每日 03:00 UTC+8)按创建时间清理超过 7 天的记录 —
本地缓存 App 本地不持久化照片,仅缓存缩略图(首次查看时缓存,缓存上限 20MB) 相册页面图片占位符

3.1.2 视频存储

项目 规格 对应设计稿元素
单段视频时长 最长 30 秒(超过 30 秒自动截断) 设备详情页录像按钮(按住录制 UI 提示)
单段视频大小 ~5MB(H.264,640×480,15fps,码率 ~1.5Mbps) —
视频格式 MP4(H.264 视频 / AAC 音频) —
每用户视频上限 5 段 相册页面「已存 2/5 段」统计
保存时长 3 天(自动清理,超期服务端删除,App 端同步清除本地缓存) —
存储位置 服务端对象存储(OSS) —
删除策略 后台定时任务(每日 04:00 UTC+8)按创建时间清理超过 3 天的记录 —

3.1.3 设备状态数据结构

// 设备实时状态上报(MQTT / HTTP 轮询备用)
{
  "device_id": "PF200-ABC123",
  "sn": "XSW20260408PF200",
  "model": "PF200",
  "firmware_version": "v2.1.0",
  "online": true,
  "power_mode": "plug",
  "battery_level": 100,
  "food_level": 75,
  "food_weight_g": 750,
  "last_feeding_time": "2026-04-23T10:30:00+08:00",
  "today_feeding_count": 3,
  "today_feeding_total_g": 85,
  "total_feeding_count": 128,
  "total_feeding_g": 3840,
  "runtime_hours": 12,
  "network_rssi": -45,
  "error_code": 0,
  "error_message": "",
  "camera_stream_url": "rtmp://media.xswei.com/live/PF200-ABC123",
  "camera_status": "active",
  "microphone_status": "active",
  "speaker_status": "active",
  "timestamp": "2026-04-23T11:55:00+08:00"
}

设备错误码定义:

error_code 说明 严重级别 用户提示
0 无错误 — —
101 粮仓未安装 中 请正确安装粮仓
102 粮仓未关闭 中 请关闭粮仓盖
201 卡粮检测 高 出粮异常,请检查并清理出粮口
202 电机过载 高 电机异常,请联系客服
301 摄像头故障 低 摄像头异常,但喂食功能正常
302 麦克风故障 低 语音功能异常
303 扬声器故障 低 语音播放功能异常
401 WiFi 连接断开 中 请检查网络连接
402 云端连接断开 中 请检查网络连接
403 OTA 升级失败 中 固件升级失败,请重试
501 电池电量耗尽 高 设备电量耗尽,请充电

3.1.4 喂食记录存储

字段 类型 说明
id UUID 记录唯一标识
device_id String 设备 ID
user_id String 操作用户 ID
pet_id String 关联宠物 ID(可选,为 null 表示未关联宠物)
family_id String 家庭 ID
feed_type Enum manual(手动)/ scheduled(定时)
feed_plan_id UUID 关联的喂食计划 ID(定时喂食时有值)
feed_amount_g Integer 出粮量(克),实际出粮量(可能与计划不符,如卡粮时)
feed_time DateTime 喂食时间
result Enum success / fail
fail_reason String 失败原因(result=fail 时有值)
actual_weight_g Integer 称重传感器实测重量(出粮后粮仓减少量)
food_level_after Integer 喂食后余粮百分比
  • 存储时长:喂食记录永久保存,支持用户按月/按设备导出
  • 查询限制:App 端单次查询最多返回 100 条,支持游标分页
  • 设计稿对应:首页「今日统计」模块展示今日喂食次数和总克数;设备详情页展示今日/本周/本月统计

3.1.5 家庭数据存储

字段 说明 设计稿对应
family_id 家庭唯一 ID —
family_name 家庭名称(如「小贝一家」) 首页顶部切换家庭下拉
owner_id 创建者(管理员)用户 ID 家庭管理成员列表
created_at 创建时间 —
address 家庭地址(选填) —
timezone 时区(默认 Asia/Shanghai) —
member_count 成员数量(含管理员) 我的页面「家庭×1」统计

4. 功能模块总览

# 模块名称 App端 服务端 设备端 优先级 设计稿对应页面
1 认证与账号 ✅ ✅ ⚪ P0 登录/注册页
2 首页与设备概览 ✅ ✅ ⚪ P0 首页
3 设备详情与实时监控 ✅ ✅ ✅ P0 设备详情页
4 相册(抓拍与录像) ✅ ✅ ✅ P1 相册页
5 定时喂食计划 ✅ ✅ ✅ P0 喂食计划页
6 宠物管理 ✅ ✅ ⚪ P1 宠物页
7 设备设置 ✅ ✅ ✅ P1 设备设置页
8 家庭管理 ✅ ✅ ⚪ P1 家庭管理页
9 消息中心 ✅ ✅ ⚪ P1 消息页
10 设备配网与绑定 ✅ ✅ ✅ P0 添加设备页
11 我的(个人中心) ✅ ✅ ⚪ P2 我的页

5. 模块一:认证与账号

对应页面名称:登录/注册页面(auth-page)
设计稿截图说明:页面采用全屏渐变背景(深青→青→浅青),顶部居中 Logo + 应用名称,下方白色圆角卡片承载登录/注册表单。主Tab切换「登录」与「注册」,子Tab切换「验证码登录」与「密码登录」。

!image-20260423163202366


5.1 模块概述

支持手机号 + 验证码登录、手机号 + 密码登录两种方式,以及新用户注册流程。账号体系为家庭共享制,同一手机号可加入多个家庭。


5.2 功能 1:验证码登录

功能描述:用户输入手机号,获取短信验证码,完成登录。

设计稿对应元素(HTML 第 530~600 行):
- 输入框:手机号输入框(带 +86 前缀标识)
- 获取验证码按钮(点击后显示60秒倒计时)
- 验证码6位数字输入框
- 登录按钮

维度 说明
App端 🟢 输入手机号(11位,中国大陆格式,+86前缀显示)→ 请求发送验证码 → 输入6位验证码 → 调用登录API → 存储JWT token → 跳转首页
服务端 🟢 验证手机号格式 → 生成6位数字验证码(不可重复使用)→ 存储Redis(key=sms:login:{phone},TTL=300s)→ 调用短信网关发送 → 验证用户输入 → 查找/创建用户记录 → 颁发JWT token
设备端 ⚪ 不参与

数据规格:

项目 规格
验证码长度 6位数字
验证码有效期 5分钟(300秒)
同一手机号发送频率 最快60秒/次
错误重试限制 连续错误5次,锁定15分钟
锁定期间 返回错误码 ERR_CODE_LOCKED,不发送短信
JWT access_token 有效期 7天
JWT refresh_token 有效期 30天

5.3 功能 2:密码登录

功能描述:用户输入手机号和密码,完成登录。

设计稿对应元素

  • 手机号输入框
  • 密码输入框(带显示/隐藏切换图标)
  • 记住账号复选框
  • 忘记密码文字链接
  • 登录按钮
维度 说明
App端 🟢 输入手机号 + 密码 → 勾选「记住账号」(本地存储手机号)→ 调用登录API → 存储token → 跳转首页
服务端 🟢 验证账号存在 → 验证密码(bcrypt 加密比对)→ 颁发JWT
设备端 ⚪ 不参与

密码规则:6-20位,支持字母、数字、符号混合,必须包含字母和数字。


5.4 功能 3:注册

功能描述:新用户通过手机号注册账号,注册成功后自动创建第一个家庭。

设计稿对应元素:

  • 手机号输入框(+86前缀)
  • 获取验证码按钮 + 验证码输入框
  • 设置密码输入框(带显示/隐藏切换)
  • 确认密码输入框
  • 用户协议勾选框(链接到协议页)
  • 注册按钮
维度 说明
App端 🟢 输入手机号 → 获取验证码 → 设置密码(6-20位,含字母和数字)→ 确认密码(与密码相同)→ 勾选同意协议 → 提交注册
服务端 🟢 验证手机号唯一性(未注册)→ 创建用户记录 → 颁发JWT → 自动创建第一个家庭(默认名称=「{昵称}的家庭」,可编辑)
设备端 ⚪ 不参与

数据规格:

项目 规格
手机号 11位中国大陆手机号(正则 /^1[3-9]\d{9}$/)
密码 6-20位,必须包含字母和数字
确认密码 必须与密码完全一致
验证码 6位,有效期5分钟,同一手机号注册频率30天/次
昵称 选填,2-20字符,注册时默认取「用户{手机号后4位}」

注册后自动行为:
1. 颁发 JWT token(用户直接进入首页,无需重新登录)
2. 自动创建一个家庭(家庭名默认「{昵称}的家庭」)
3. 记录注册来源(iOS/Android/App版本)


5.5 功能 4:账号安全

功能描述:修改密码、绑定手机

设计稿对应:「我的」页面 → 设置入口 → 账号安全设置页

维度 说明
App端 🟢 展示当前绑定信息(手机号脱敏显示 138****1234)→ 修改密码需验证旧密码
服务端 🟢 密码修改(校验旧密码后更新,bcrypt重加密)
设备端 ⚪ 不参与

6. 模块二:首页与设备概览

对应页面名称:首页(home-page)
设计稿截图说明:顶部渐变导航栏(青→深青),左上角应用 Logo + 「小贝一家」家庭名称(可点击展开切换),右上角消息图标(带未读数字红点)。主区域为设备卡片列表,每张卡片包含:设备缩略图(占位图)、设备名称、在线状态角标、今日喂食次数和总量。底部固定Tab栏(首页/相册/喂食/宠物/我的)。

!image-20260423163501832


6.1 模块概述

首页是用户打开 App 后的第一个页面,展示已绑定设备的状态概览、快捷操作入口(手动喂食、定时计划入口)、家庭成员/宠物数量统计,以及宠物卡片展示。


6.2 功能 1:首页设备卡片

功能描述:展示设备名称、实时监控缩略图(占位图)、在线状态、今日喂食统计。

设计稿对应元素:

  • 导航栏:家庭名称(带下拉箭头)+ 消息图标(红点未读数)
  • 设备卡片:缩略图区(圆角矩形占位图)+ 设备名称 + 状态角标(在线/离线)+ 今日统计行(🍚今日喂食×3次,共85g)+ 底部快捷操作行
  • 快捷操作行:📷 录像 ⏰ 计划 ⚙️ 设置
维度 说明
App端 🟢 页面加载时请求设备列表 API → 展示设备卡片(名称、状态、余粮%、今日喂食次数)→ 点击卡片跳转设备详情 → 点击快捷操作图标分别跳转对应子页面
服务端 🟢 GET /api/v1/devices(查询当前用户有权限的设备列表,含实时状态);状态缓存策略:设备状态缓存 30 秒(Redis),减少设备端 MQTT 上报压力
设备端 ⚪ 不参与

设备卡片数据结构:

字段 类型 说明
device_id String 设备唯一ID
device_name String 用户设置的设备名称
online Boolean 是否在线
food_level Integer 余粮百分比(0-100)
today_feeding_count Integer 今日喂食次数
today_feeding_total_g Integer 今日喂食总量(克)
thumbnail_url String 设备监控缩略图 URL(最新帧)
camera_status String active=正常 / offline=故障 / disabled=已关闭

6.3 功能 2:手动喂食(快捷操作)

功能描述:在首页设备卡片下方提供「手动喂食」按钮,一键触发出粮。

设计稿对应元素:设备详情页设备卡片右下角「🍚 手动喂食」按钮(主题色按钮,点击后变为加载状态)

维度 说明
App端 🟢 点击「手动喂食」→ 显示加载态(按钮变灰+转圈)→ 请求 API → 等待设备响应(最多5秒)→ Toast 提示成功/失败结果 → 更新今日统计数据
服务端 🟢 接收请求 → 验证用户对设备操作权限(家庭成员关系查询)→ 验证设备在线状态 → 转发 MQTT 消息到设备 → 等待设备 ACK(超时5秒)→ 记录喂食日志
设备端 🟢 接收 MQTT 消息(topic=device/{device_id}/feed)→ 执行出粮动作(步进电机旋转指定角度)→ 称重传感器确认出粮量 → 上报出粮结果

手动喂食规格:

项目 规格
触发方式 点击按钮一次,出粮一份
默认出粮量 设备设置中的「默认出粮量」(范围 5-200g,可在设备设置页修改)
出粮前检测 粮仓余量 < 默认出粮量时,弹出确认提示「余粮不足,是否继续?」
操作频率限制 同一设备两次手动喂食间隔 ≥ 1 分钟(防误触)
成员权限 家庭成员均可触发手动喂食

6.4 功能 3:家庭切换

功能描述:同一账号可属于多个家庭,首页顶部显示当前家庭,点击可展开切换面板。

设计稿对应元素:导航栏左侧「🏠 小贝一家 ▾」(点击展开下拉面板,列出所有家庭+当前勾选标记)

维度 说明
App端 🟢 点击家庭名称展开切换面板 → 显示家庭列表(带勾选标记当前家庭)→ 选择后保存到本地(下次启动默认此家庭)+ 请求新家庭设备列表 → 刷新首页
服务端 🟢 GET /api/v1/families(返回用户所属全部家庭列表,含每家庭下的设备数量)→ 切换时 GET /api/v1/devices?family_id=xxx
设备端 ⚪ 不参与

7. 模块三:设备详情与实时监控

对应页面名称:设备详情页(live-page / device-detail-page)
设计稿截图说明:页面顶部为视频监控区(黑色背景16:9比例),左上角返回按钮,左上叠加设备名称标签,右上叠加「LIVE」红点+当前时间。视频下方为监控控制栏:抓拍按钮、录像按钮(全屏)、对讲按钮、全屏按钮。余粮进度条(大号环形图)+ 今日喂食统计卡片 + 快捷操作按钮组(设备设置/喂食计划/分享/更多)。

!image-20260423163640968


7.1 模块概述

设备详情页是 App 的核心交互页面,包含实时视频监控画面、监控控制栏(抓拍/录像/对讲/全屏)、余粮/喂食统计、设备快捷操作入口。


7.2 功能 1:实时监控视频流

功能描述:显示设备摄像头实时画面(RTMP 推流 + HLS 拉流),左上角显示 LIVE 标识和当前时间,支持多码流切换。

设计稿对应元素:

  • 视频区域:黑色16:9背景,摄像头画面填充
  • 左上角:「📹 设备名称」白色半透明标签
  • 右上角:「🔴 LIVE」红点标签 + 时间显示「14:32:05」
  • 视频加载时:居中显示加载动画(旋转圆圈)
  • 视频断开时:显示断连图标 + 「视频连接中断,点击重试」
  • 音频:默认静音,开启对讲前保持静音
维度 说明
App端 🟢 使用视频播放器组件(iOS: AVPlayer / Android: ExoPlayer)→ 连接 HLS 流地址(.m3u8)→ 播放实时画面 → 音频默认静音 → 断流自动重连(3次重试,间隔5秒,超限后显示手动重试按钮)
服务端 🟢 提供 RTMP 接收地址(设备推流到 media server)→ 转 HLS(.m3u8 + .ts 分片,每个分片4秒)→ 流地址带临时 token(有效期10分钟,App 每8分钟刷新一次 token)
设备端 🟢 摄像头采集视频 → H.264 编码 → 通过 RTMP 协议推流到服务端 media server(rtmp://media.xswei.com/live/{device_id})→ 设备端码率自适应(256kbps-2Mbps)

⭐ 摄像头通道与多码流支持:

项目 规格
设备摄像头通道 单通道(内置摄像头,不可外接扩展)
设备支持码流 设备端同时输出两路码流:主码流(高清,1920×1080)和 子码流(标清,640×480)
默认码流 子码流(标清,节省带宽和设备资源)
App 码流切换 在设备设置页选择「标清 640×480」(默认)或「高清 1920×1080」,选择后服务端切换转码参数
推流协议 RTMP(设备→服务端 media server)
App 拉流协议 HLS(.m3u8 + .ts 分片,4秒一片,共缓存8片)
端到端延迟 ≤3秒(标清)/ ≤4秒(高清)

视频流规格:

项目 规格(标清) 规格(高清) 说明
编码格式 H.264 H.264 —
分辨率 640×480 1920×1080 设备设置中可切换
帧率 15fps 15fps —
码率 512kbps(自适应 256k-1M) 1Mbps(自适应 512k-2M) 网络差时自动降码率
音频 AAC 32kbps 单声道 AAC 32kbps 单声道 —
HLS分片时长 4秒 4秒 —
离线判断 设备断网后,App端最多等待30秒自动显示离线状态 — —

流地址刷新机制:

步骤 操作
1 App 首次加载视频页 → GET /api/v1/devices/{id}/stream-url
2 服务端返回: {hls_url: "https://.../live.m3u8?token=xxx", expires_at: "+10min"}
3 App 播放 HLS 流(AVPlayer / ExoPlayer)
4 定时器每8分钟(或 expires_at 前2分钟)刷新 token
5 GET /api/v1/devices/{id}/stream-url(刷新)→ 播放器切换到新地址(无缝切换,不中断播放)

7.3 功能 2:抓拍照片

功能描述:在监控画面上点击「抓拍」按钮,截取当前视频帧保存为 JPEG 图片,上传到服务端并存入相册。

设计稿对应元素:

  • 监控控制栏第一个图标按钮「📷 抓拍」(圆形,蓝色渐变填充)
  • 点击后:屏幕闪白一下(模拟快门效果)+ 右上角 Toast「✅ 抓拍成功,已保存到相册」
  • 抓拍数量统计 +1(如「已存 9/50 张」)

设计稿对应元素(HTML 第 1325~1340 行):
- 设备详情页底部「抓拍与录像」入口卡片,显示缩略图预览 + 「12张照片 · 3个视频」统计

维度 说明
App端 🟢 点击抓拍 → 从当前视频流解码当前帧(AVCaptureVideoDataOutput / VideoFrame)→ JPEG 压缩(1280×960,质量70%,约200KB)→ 显示本地预览(可选删除)→ 上传到服务端 → 保存到相册 → 更新本地统计
服务端 🟢 接收图片上传( multipart/form-data,单次≤500KB)→ 存储到 OSS → 生成 CDN URL → 写入数据库(关联 device_id、user_id、family_id、timestamp)→ 检查用户照片数量是否达到50张上限 → 超限则删除最早的1张
设备端 ⚪ 不参与(App 端直接截取视频流帧,无需设备配合)

⭐ 抓拍本地缓存策略:

阶段 行为
点击抓拍 立即截取视频帧(< 100ms 响应),显示快门效果(闪白100ms)
生成JPEG App 本地压缩(不请求服务端,< 500ms)
本地预览 显示缩略图预览(1秒后自动消失,或用户手动删除)
上传 后台上传(不阻塞用户继续操作),上传失败时本地保留3天并重试
本地临时文件 抓拍后立即上传,上传成功则删除本地临时文件;上传失败则保留并最多重试3次(间隔30秒/1分钟/5分钟)

抓拍规格:

项目 规格
图片格式 JPEG(RGB)
分辨率 1280×960(固定,不受视频流分辨率影响)
压缩质量 70%
单张大小 ~200KB
每用户上限 50 张(超过自动删除最早的,不弹窗)
保存时长 7 天(每日 03:00 UTC+8 后台清理)
上传方式 HTTPS POST multipart/form-data
上传超时 10秒,超时提示「上传失败,点击重试」
快门响应时延 < 100ms(从点击到屏幕闪白效果呈现)
图片来源 截取当前视频播放器的解码帧,非设备端截图

7.4 功能 3:录像

功能描述:按住「录像」按钮开始录制,松开停止,生成最长 30 秒的 MP4 视频文件,上传到服务端并存入相册。

设计稿对应元素:

  • 监控控制栏第二个图标按钮「🎬 录像」(圆形,红色填充)
  • 按住时按钮变红色 + 显示 REC 标识 + 录制时长倒计时「⏺ REC 00:24 / 00:30」
  • 下方文字提示「长按录像,最长30秒」
维度 说明
App端 🟢 按住录像按钮 → 请求麦克风权限(如无权限先申请)→ 开始录制本地临时视频文件(H.264,640×480,15fps)→ 屏幕顶部显示 REC 红点 + 时长倒计时 → 松手(或达到30秒)停止 → 视频压缩完成 → 上传到服务端 → 保存到相册 → Toast 提示
服务端 🟢 接收视频上传(multipart/form-data,≤10MB)→ 存储到 OSS → 写入数据库 → 检查视频数量是否达到5段上限 → 超限则删除最早的1段
设备端 ⚪ 不参与(录像在 App 端本地完成,使用 App 自身摄像头和麦克风录制监控画面)

⭐ 录像来源说明:

项目 说明
录像画面来源 截取设备监控视频流(App 端解码 H.264 帧并重新编码为 MP4)
录像音频来源 App 端麦克风采集(环境声音,即宠物和周围环境的声音)
非设备端录音 录像中的声音是 App 端设备麦克风采集的声音,不是从设备端扬声器发出的声音
摄像头通道 固定使用当前设备的主码流(设备固件推流通道)进行录制,不可切换到其他通道

⭐ 录像上传路径分级策略:

阶段 存储位置 说明
录制中 App 本地临时文件(.mp4) 写入 App 临时目录(如 tmp/),防崩溃丢失
录制完成 App 本地缓存(.mp4,保留至上传成功) 上传期间本地保留备份
上传中 服务端 OSS(临时目录) multipart 分片上传,支持断点续传
上传完成 服务端 OSS(正式目录) 同时生成视频缩略图(FFmpeg 提取第1秒帧)
用户查看 CDN 加速分发(缩略图 + 视频流) CDN URL 下发到 App

录像断点续传机制:

场景 处理方式
上传中途网络断开 记录已上传分片 index,下次网络恢复后从断点继续(HTTP Range)
App 被系统杀掉 重新打开 App 时检测本地未上传完成的文件,自动续传
上传超过3次失败 保留本地文件,向用户提示「录像上传失败,请检查网络后重试」
每次上传重试间隔 30秒 → 1分钟 → 5分钟

录像规格:

项目 规格
视频格式 MP4(H.264 视频 / AAC 音频)
分辨率 640×480(固定,与视频流标清一致)
帧率 15fps
码率 ~1.5Mbps(录制时实时编码)
最长时长 30秒(超过自动截断)
单段大小 ~5MB
每用户上限 5段(超过自动删除最早的,不弹窗)
保存时长 3天(每日 04:00 UTC+8 后台清理)
上传方式 HTTPS POST multipart/form-data(大文件分片,每片1MB)
上传超时 60秒(单片),整体上传无超时限制(后台执行)
缩略图生成 服务端 FFmpeg 从视频第1秒提取一帧(JPEG,320×240)
本地临时保留 上传成功前本地保留,上传成功后删除临时文件

7.5 功能 4:双向语音对讲

功能描述:点击「对讲」按钮,弹出对讲面板,支持按住说话将声音从设备端扬声器播放,同时设备端声音(宠物叫声等)传输到 App。

设计稿对应元素:

  • 监控控制栏第三个图标按钮「🎤 对讲」(圆形,白色描边)
  • 点击后:对讲面板从底部滑出(半透明遮罩 + 圆形说话按钮)
  • 说话按钮居中,上方文字「按住说话,松开结束」
  • 说话时按钮显示音量波形动画
  • 对讲激活时,设备详情页视频画面左上角显示「🎤 对讲中」绿色标签
维度 说明
App端 🟢 点击对讲按钮 → 弹出对讲面板 → App→设备方向:按住说话按钮 → 麦克风采集音频(Opus编码,16kHz单声道)→ 实时通过 WebSocket 发送到服务端 → 服务端转发到设备;设备→App方向:接收设备端音频流(WebSocket)→ Opus解码 → 扬声器/耳机播放
服务端 🟢 中转 App 端音频流到设备(WebSocket 连接池)→ 中转设备端音频流到 App → 音频流不存储(即用即弃)
设备端 🟢 接收音频流(WebSocket 接收 Opus 包)→ Opus解码 → 通过扬声器播放(音量可调)→ 设备端麦克风采集声音(16kHz单声道)→ Opus编码 → WebSocket 上报到服务端

对讲规格:

项目 规格
编码格式 Opus(App↔服务端)/ G.711 ulaw(备选兼容)
采样率 16kHz
声道 单声道
码率 32kbps(Opus)
传输协议 WebSocket(全双工实时)
延迟要求 ≤500ms(端到端)
对讲超时 单次最长60秒(防止忘记松手一直占用)
设备端扬声器 可在设备设置中关闭(speaker_status=disabled)
设备端麦克风 可在设备设置中关闭(microphone_status=disabled)

⭐ 全双工 vs 半双工:本设计采用半双工(同一时间只能一方说话),避免回声和干扰。设备端检测到环境音量过大(宠物叫声等)时,可自动降低上行音频码率。


7.6 功能 5:全屏模式

功能描述:点击「全屏」按钮,视频画面横屏全屏播放,控制栏隐藏,点击屏幕恢复竖屏。

设计稿对应元素:监控控制栏第四个图标按钮「⛶ 全屏」(圆形,白色描边),点击后屏幕旋转为横屏,视频铺满屏幕,顶部状态栏隐藏。

维度 说明
App端 🟢 触发屏幕旋转为横屏(Landscape)→ 隐藏顶部导航栏和底部Tab栏 → 视频画面铺满屏幕 → 控制栏缩小悬浮在右下角(抓拍/录像图标)→ 点击屏幕任意位置呼出控制栏,3秒无操作再次隐藏
服务端 ⚪ 不参与
设备端 ⚪ 不参与

7.7 功能 6:余粮统计与今日喂食统计

设计稿对应元素:

  • 余粮环形进度条(大号,显示百分比数字如「75%」,颜色渐变:>50%绿色,20-50%橙色,<20%红色)
  • 下方文字「粮仓余量 / 约750g」(以克为单位展示实际重量)
  • 今日统计卡片:今日喂食「3次」+ 总计「85g」
维度 说明
App端 🟢 页面加载时从设备状态数据获取 food_level 和 food_weight_g → 环形进度条按比例显示 → 低于20%时显示橙色警告 + 卡片顶部弹出「余粮不足」提示条
服务端 🟢 设备状态上报时携带 food_level(百分比)和 food_weight_g(实际克数)
设备端 🟢 称重传感器实时监测粮仓重量 → MQTT 上报 food_level 和 food_weight_g

8. 模块四:相册(抓拍与录像)

对应页面名称:相册页(album-page / gallery-page)
设计稿截图说明:顶部导航栏「📷 相册」+ 右上角「筛选」图标。筛选Tab:「全部 / 照片 / 视频」。主体为网格布局(3列),照片显示缩略图(圆角),视频缩略图叠加播放图标(▶)+ 时长标签(如「0:25」)。存储统计栏:「已存 10/50 张照片 · 2/5 段视频」。

!image-20260423164016822


8.1 模块概述

相册页面集中管理用户在设备详情页抓拍的照片和录制的视频,提供筛选、预览、删除功能,并展示存储用量统计。


8.2 功能 1:相册列表展示

功能描述:以网格形式展示照片和视频缩略图,支持「全部/照片/视频」三种筛选。

设计稿对应元素:

  • 筛选Tab栏(全部/照片/视频)
  • 存储统计栏(显示「已存 10/50 张照片 · 2/5 段视频」,HTML 中无此文字元素但布局保留)
  • 网格区域(3列,间距4px,照片/视频混合展示,)
  • 视频缩略图叠加播放图标(▶)+ 时长标签(如「0:25」)
  • 照片缩略图叠加抓拍时间(相对时间,如「3分钟前」)

设计稿对应元素:设备详情页底部「抓拍与录像」入口卡片:

  • 左侧图标区(橙色渐变背景,照片图标)+ 标题「抓拍与录像」+ 统计文字「12张照片 · 3个视频」
  • 右侧缩略图预览(3张圆形小图)
  • 点击跳转到相册页
维度 说明
App端 🟢 请求相册列表 API(GET /api/v1/media?type=all/photo/video&page=1&limit=20)→ 网格展示(3列)→ 视频缩略图叠加播放图标 + 时长 → 下拉刷新、上拉加载更多(20条/页)→ 首次加载显示骨架屏
服务端 🟢 查询当前用户相册记录(按时间倒序,按 media_type 过滤)→ 分页返回 → 视频额外返回缩略图 URL(服务端使用 FFmpeg 从视频第1秒提取帧作为缩略图)
设备端 ⚪ 不参与

数据规格:

字段 类型 说明
media_id UUID 媒体记录唯一标识
media_type Enum photo / video
cdn_url String CDN 访问 URL(照片原图 / 视频播放地址)
thumbnail_url String 缩略图 URL(照片小图 / 视频第一帧 JPEG)
device_id String 来源设备 ID
device_name String 来源设备名称(用户设置名)
duration Integer 视频时长(秒,仅 video 类型有值)
duration_label String 格式化时长标签,如「0:25」
created_at DateTime 创建时间 ISO 8601
relative_time String 相对时间描述,如「3分钟前」「昨天」
photo_limit Integer 用户照片上限(固定50)
video_limit Integer 用户视频上限(固定5)
total_photo Integer 当前照片数量
total_video Integer 当前视频数量

8.3 功能 2:照片预览与删除

功能描述:点击照片进入全屏预览,支持左右滑动切换照片,点击删除按钮并确认后删除。

设计稿对应元素(交互元素由 JS 控制):

  • 全屏预览(黑色背景,图片居中,底部半透明信息栏)
  • 底部信息栏:设备名称「小贝的喂食器」+ 抓拍时间「2026年4月23日 14:30」
  • 右上角删除图标(🗑 红色)
  • 左滑/右滑切换照片
  • 底部操作栏:分享按钮 / 删除按钮
维度 说明
App端 🟢 点击照片 → 全屏预览 → 支持左滑/右滑切换(横向滚动,无限循环)→ 点击右上角删除图标 → 确认弹窗「确定删除这张照片?删除后无法恢复」→ 调用删除 API → 刷新当前列表
服务端 🟢 DELETE /api/v1/photos/{photo_id} → 删除 OSS 文件(异步任务)→ 删除数据库记录 → 返回成功
设备端 ⚪ 不参与

8.4 功能 3:视频预览与删除

功能描述:点击视频缩略图调用系统播放器全屏播放,点击删除按钮并确认后删除。

设计稿对应元素:

  • 点击后直接全屏播放(调用系统播放器,或 App 内嵌 ExoPlayer/AVPlayer)
  • 播放界面:视频画面 + 进度条 + 时长显示 + 播放/暂停按钮
  • 暂停时右上角显示删除图标(🗑)
  • 删除确认弹窗「确定删除这段录像?删除后无法恢复」
维度 说明
App端 🟢 点击视频 → 调用系统播放器(AVPlayer / ExoPlayer)全屏播放 → 播放完成或点击删除 → 确认弹窗 → 调用删除 API → 刷新列表
服务端 🟢 DELETE /api/v1/videos/{video_id} → 删除 OSS 文件(异步)→ 删除数据库记录 → 返回成功
设备端 ⚪ 不参与

8.5 功能 4:分享功能

功能描述:照片或视频支持分享到微信、朋友圈、QQ等。

设计稿对应元素:照片/视频预览页底部操作栏「分享」按钮

维度 说明
App端 🟢 点击分享 → 调起系统分享面板(ShareSheet)→ 支持分享图片(JPEG URL)或视频(本地文件路径)
服务端 ⚪ 不参与

8.6 存储规格总表(相册模块)

媒体类型 格式 分辨率 单文件大小 用户上限 保存时长 自动清理时间
照片 JPEG 1280×960 ~200KB 50张 7天 每日 03:00 UTC+8
视频 MP4 (H.264) 640×480, 15fps ~5MB/段 5段 3天 每日 04:00 UTC+8

存储超限静默处理:达到上限后自动删除最早的记录,不弹窗提示用户,不打断当前操作流程。


9. 模块五:定时喂食计划

对应页面名称:喂食计划页(feeding-plan-page)
设计稿截图说明:顶部导航栏「⏰ 喂食计划」+ 右上角「+」添加按钮。主体为计划列表,每条计划卡片显示:宠物头像(emoji)/ 默认图标 + 宠物名称 + 喂食时间(加粗大字如「08:00」)+ 喂食份量「30g」+ 重复周期标签(周一至周日图标,高亮今日)+ 开关按钮(ON/OFF)。底部有「+ 添加计划」悬浮按钮。

!image-20260423164207392


9.1 模块概述

管理员可创建、编辑、删除定时喂食计划(支持每日重复/按工作日/按指定星期重复)。设备端根据服务端下发的计划自动执行出粮,无需 App 在线。


9.2 功能 1:计划列表

功能描述:展示当前设备的所有喂食计划,显示时间、份量、宠物、重复周期、开关状态。

设计稿对应元素:

  • 计划卡片:宠物图标 + 宠物名称 + 时间「08:00」(加粗)+ 份量「30g」+ 重复周期(周一到周日小圆点,当日为实心高亮)+ 开关按钮
  • 空列表状态:「暂无喂食计划」+ 图标 + 「点击下方按钮添加」
  • 管理员可见:编辑(✏️)和删除(🗑)操作入口
  • 成员可见:仅显示列表,无法编辑
维度 说明
App端 🟢 请求计划列表 API(GET /api/v1/feeding-plans?device_id=xxx)→ 列表展示(按时间排序)→ 管理员显示编辑/删除按钮;成员仅可开关计划
服务端 🟢 查询设备关联的计划列表 → 按计划时间排序返回 → 带上用户角色信息供 App 判断操作权限
设备端 ⚪ 不参与

9.3 功能 2:新建计划

功能描述:管理员填写喂食计划表单,设置时间、宠物、份量、重复周期。

设计稿对应元素(表单页):添加计划页表单:

  • 设备选择(如果家庭有多个设备,当前设备默认选中)
  • 宠物选择(可跳过,显示「未关联宠物」)
  • 喂食时间选择器(时钟样式,滚轮选择「08 : 00」)
  • 出粮量选择器(滑块或数字输入,范围 5-200g,步进5g,显示刻度)
  • 重复周期选择(周一到周日图标按钮组,点击切换选中状态)
  • 保存按钮
维度 说明
App端 🟢 表单填写 → 验证必填项 → 提交 POST /api/v1/feeding-plans → 成功后返回列表页
服务端 🟢 创建计划记录 → 立即通过 MQTT 推送到设备端(设备本地存储)→ 记录操作日志
设备端 🟢 接收计划 MQTT 消息(topic=device/{device_id}/plan/update)→ 存储到本地 Flash → 按计划定时执行出粮(RTC 唤醒)

新建计划数据规格:

项目 规格
出粮量范围 5-200g,步进 5g
时间选择 00:00-23:59,精确到分钟
重复周期 周一至周日任意组合,至少选1天
常用快捷 「每天」一键选中周一到周日 / 「工作日」一键选中周一到周五
宠物关联 选填(不选=未关联宠物)
每设备计划上限 20个

9.4 功能 3:编辑/删除计划

功能描述:管理员可编辑已有计划的任意字段;可删除计划(需二次确认)。

设计稿对应元素:

  • 编辑:点击计划卡片或编辑按钮 → 进入编辑表单页(内容同新建,自动填充)
  • 删除:点击删除按钮 → 弹出确认框「确定删除「08:00 · 30g」计划?删除后无法恢复」
维度 说明
App端 🟢 编辑:GET 填充表单 → PUT /api/v1/feeding-plans/{id};删除:确认弹窗 → DELETE → 刷新列表
服务端 🟢 更新/删除计划 → 立即 MQTT 通知设备端
设备端 🟢 接收 MQTT → 更新/删除本地 Flash 中对应计划

9.5 功能 4:计划开关(成员权限)

功能描述:所有家庭成员(包括普通成员)可开启/关闭某个喂食计划。

设计稿对应元素(每条计划右侧 Toggle Switch)

维度 说明
App端 🟢 点击开关 → PATCH /api/v1/feeding-plans/{id} {enabled: true/false} → 更新本地状态 → 成功则完成,失败则回滚开关状态
服务端 🟢 更新 enabled 字段 → MQTT 通知设备端
设备端 🟢 接收 MQTT → 更新本地计划 enabled 状态 → enabled=false 时跳过该计划执行

⭐ 权限规则:只有管理员可编辑/删除计划,普通成员仅可操作开关(开启/关闭某个计划),不可编辑时间/份量等核心字段。


9.6 功能 5:设备端定时执行

功能描述:设备端根据本地存储的计划,在设定时间到达时自动执行出粮动作。

维度 说明
服务端 🟢 不直接控制设备,设备自主执行;服务端记录每次计划喂食的执行结果(由设备上报)
设备端 🟢 RTC 定时器监控(每分钟唤醒检查一次)→ 时间到达 + 当天 repeat_days 包含当前星期 → 步进电机出粮 → 称重传感器确认出粮量 → 与计划出粮量比对(误差±10g可接受)→ 上报执行结果 MQTT

断网处理:
- 设备本地存储完整计划列表,断网期间 RTC 仍按计划执行出粮
- 联网后设备端立即上报断网期间的喂食记录(topic=device/{device_id}/feed/batch-report)
- 服务端接收后补录喂食记录,用户可在 App 中查看

卡粮处理:
- 称重传感器检测:出粮后若实际出粮量 < 计划量 - 10g,判定为卡粮
- 设备端自动重试(最多3次,每次间隔10秒)
- 重试仍失败:上报 error_code=201,App 推送告警消息「出粮异常,请检查并清理出粮口」


10. 模块六:宠物管理

对应页面名称:宠物页(pet-page)
设计稿截图说明:顶部导航栏「🐾 我的宠物」+ 右上角「+」添加按钮。主体为宠物卡片列表,每张卡片:宠物头像(大emoji或自定义图片,圆形)+ 宠物名称(加粗)+ 宠物类型/品种「小狗 · 柯基」+ 年龄/性别标签 + 底部操作「🍚 喂食记录」按钮。空列表状态:空白占位图 + 「还没有宠物,点击添加」+ 添加按钮。

!image-20260423164501579


10.1 模块概述

管理家庭中的宠物档案(头像、名称、类型、品种、年龄、性别),宠物与喂食计划关联,便于记录每次喂食对应的宠物。


10.2 功能 1:宠物列表

功能描述:展示家庭所有宠物卡片(头像、名称、类型/品种/年龄/性别)。

设计稿对应元素:

  • 宠物卡片:圆形头像(emoji 或自定义图片)+ 宠物名称 + 类型/品种行 + 年龄/性别标签
  • 卡片底部:「🍚 喂食记录」按钮
  • 管理员显示:编辑(✏️)和删除(🗑)操作入口
  • 成员显示:仅查看,无法编辑
维度 说明
App端 🟢 请求宠物列表 API(GET /api/v1/pets?family_id=xxx)→ 卡片展示
服务端 🟢 查询家庭关联的宠物列表,按创建时间排序
设备端 ⚪ 不参与

10.3 功能 2:添加宠物

功能描述:填写宠物档案信息,选择/上传宠物头像。

设计稿对应元素(表单页):

  • 头像选择区(顶部居中,圆形大头像选择框)
  • 第一行:预设 emoji 头像网格(🐶🐱🐰🐹🐸🐦等12种)
  • 第二行:「📷 上传图片」按钮(自定义图片,1MB以内)
  • 宠物名称输入框(2-20字符)
  • 宠物类型选择(小狗 / 猫咪 / 其他 → 二级选项)
  • 品种输入框(选填)
  • 生日选择器(选填)
  • 性别选择(公 / 母 / 未知)
  • 保存按钮
维度 说明
App端 🟢 选择 emoji 头像或上传自定义图片(JPEG/PNG,1MB以内,App端压缩到200KB)→ 填写表单 → POST /api/v1/pets
服务端 🟢 创建宠物记录 → 存储头像图片到 OSS(自定义头像时)
设备端 ⚪ 不参与

10.4 功能 3:编辑宠物

功能描述:编辑已有宠物的档案信息(头像、名称、类型、品种、年龄、性别)。

设计稿对应元素:宠物卡片点击 → 编辑表单页(内容同添加,自动填充现有数据)

维度 说明
App端 🟢 GET 宠物详情 → 填充表单 → PUT /api/v1/pets/{id}
服务端 🟢 更新宠物记录
设备端 ⚪ 不参与

10.5 功能 4:删除宠物

功能描述:删除宠物档案,同时解除与喂食计划的关联(pet_id 置空,不删除计划本身)。

设计稿对应元素:宠物卡片 → 删除按钮 → 确认弹窗「确定删除「小贝」?删除后所有关联的喂食计划将取消与该宠物的关联,但计划本身不会删除。」

维度 说明
App端 🟢 确认弹窗 → DELETE /api/v1/pets/{id} → 刷新列表
服务端 🟢 删除宠物记录 → 解除喂食计划关联(pet_id 置空)
设备端 ⚪ 不参与

10.6 功能 5:宠物喂食记录

功能描述:点击宠物卡片的「🍚 喂食记录」按钮,查看该宠物的历史喂食记录。

设计稿对应元素:喂食记录列表页(时间倒序):
- 每条记录:时间标签「4月23日 08:05」+ 份量「30g」+ 喂食方式标签(手动/定时)+ 设备名称「小贝的喂食器」+ 状态(成功✅/失败❌)

维度 说明
App端 🟢 GET /api/v1/feeding-records?pet_id=xxx → 列表展示 → 分页加载
服务端 🟢 查询 pet_id 关联的喂食记录,按时间倒序分页返回
设备端 ⚪ 不参与

11. 模块七:设备设置

对应页面名称:设备设置页(device-settings-page)
设计稿截图说明:顶部导航栏「⚙️ 设备设置」+ 返回按钮。设置分组列表:基本设置 / 喂食设置 / 摄像头设置 / 语音设置 / 设备信息 / 底部危险区(解除绑定)。

!image-20260423164556958


11.1 模块概述

管理单个设备的配置项,包括基本设置、喂食设置、摄像头设置、语音设置和设备信息展示。


11.2 功能 1:基本设置

功能描述:修改设备名称、设置设备位置、显示供电模式。

设计稿对应元素:

  • 设备名称输入框(点击编辑,弹出键盘)
  • 设备位置选择器(6个预设选项圆形图标:客厅/卧室/阳台/厨房/其他)
  • 供电模式显示(插电图标🔌 或电池图标🔋+百分比)
维度 说明
App端 🟢 点击设备名称 → 编辑 → PUT /api/v1/devices/{id} {device_name};点击位置选项 → PUT /api/v1/devices/{id} {location}
服务端 🟢 更新设备配置 → 存储到数据库 → MQTT 下发到设备端(仅 device_name 需下发到设备)
设备端 🟢 接收 device_name → 存储到本地 → 设备显示屏/LCD 显示名称(如有)

11.3 功能 2:喂食设置

功能描述:设置默认出粮量(手动喂食和新建计划的初始值)、喂食声音开关、出粮提醒开关、低粮量提醒阈值。

设计稿对应元素:

  • 默认出粮量滑块(范围 5-200g,步进5g,下方显示刻度标签)
  • 喂食声音开关(开启时出粮播放提示音)
  • 出粮提醒开关(开启时出粮后 App 推送通知)
  • 低粮量提醒阈值滑块(范围 5%-50%,默认20%,下方文字「粮量低于此值时发送提醒」)
维度 说明
App端 🟢 调整滑块/开关 → 实时保存(防抖300ms后调用API)
服务端 🟢 更新设备配置 → MQTT 即时下发到设备端
设备端 🟢 接收配置 → 存储到本地 Flash → 每次出粮时应用配置

11.4 功能 3:摄像头设置

功能描述:设置视频分辨率、红外夜视模式、录像画质。

设计稿对应元素:

  • 画面分辨率选项:「标清 640×480」(默认)/「高清 1280×720」
  • 红外夜视选项:「自动」(根据光线自动切换)/「始终开启」/「关闭」
  • 录像画质选项:「标准画质」(默认)/「高清画质」(仅当分辨率设为高清时可用)
维度 说明
App端 🟢 选择后 PUT /api/v1/devices/{id}/camera {resolution, night_vision_mode, record_quality}
服务端 🟢 更新配置 → MQTT 下发到设备端
设备端 🟢 接收配置 → 摄像头模组调整参数(分辨率切换需要短暂重启摄像头预览)

⭐ 摄像头分辨率切换说明:

项目 标清模式(默认) 高清模式
分辨率 640×480 1280×720
设备编码码率 512kbps(自适应 256k-1M) 1Mbps(自适应 512k-2M)
设备发热 正常 可能增加,建议不要长时间使用
App 流量消耗 ~400MB/小时 ~800MB/小时
录像文件大小 ~5MB/30秒 ~10MB/30秒
服务端转码 标清 HLS 流 高清 HLS 流

11.5 功能 4:语音设置

功能描述:调节对讲音量、开关设备端声音(扬声器)、开关设备端麦克风。

设计稿对应元素:

  • 对讲音量滑块(0-100,默认80)
  • 设备端声音开关(开启后设备可播放 App 发送的语音)
  • 设备端麦克风开关(开启后设备可采集声音发送给 App)
维度 说明
App端 🟢 滑块调整实时生效(发送音量值到设备)→ 开关切换调用 API
服务端 🟢 更新配置 → MQTT 下发到设备端
设备端 🟢 接收音量值 → 实时应用到扬声器输出;接收开关状态 → 控制是否采集/播放音频

11.6 功能 5:设备信息展示

功能描述:展示设备型号、固件版本、设备ID、运行时长、累计喂食统计等只读元信息。

设计稿对应元素:

  • 设备型号:PF200(只读文本)
  • 设备ID:PF200-ABC123(只读文本,可复制)
  • 固件版本:v2.1.0(只读文本,点击进入固件升级页)
  • 设备SN:XSW20260408PF200(只读文本)
  • 运行时长:12小时(「已稳定运行12小时5分钟」)
  • 累计喂食:共128次 / 共3840g(只读文本)
维度 说明
App端 🟢 请求设备详情 API → 展示只读信息(复制按钮调用系统复制功能)
服务端 🟢 提供设备详细信息(含固件版本、SN、运行时长、累计统计)
设备端 🟢 设备端固件存储版本信息,通过状态上报携带

11.7 功能 6:固件升级(OTA)

功能描述:检测新版本固件,下载并升级设备固件。

设计稿对应元素(HTML 第 1900~1920 行,固件升级页):
- 当前版本:v2.1.0(显示)
- 最新版本:v2.2.0(如有新版本,显示)→ 新版本说明「修复了若干bug,提升了稳定性」
- 升级按钮(如有新版本,显示「检查更新」→「立即升级」)
- 升级进度:下载进度条(0-100%)+ 状态文字「正在下载固件…」「正在升级中…请勿断电」

维度 说明
App端 🟢 GET /api/v1/devices/{id}/firmware → 比对版本 → 有新版本时弹窗提示「发现新版本 v2.2.0,是否升级?」→ 用户确认 → 下载固件包(HTTPS 分段下载,支持断点续传)→ 通过 MQTT/TCP 将固件转发到设备 → 显示升级进度 → 设备升级完成重启 → App 检测设备上线 → Toast「升级成功」
服务端 🟢 提供固件版本查询接口 → 提供固件文件下载(CDN 加速,分段下载支持断点续传)
设备端 🟢 接收固件包 → 校验签名(RSA-2048 或 AES 校验)→ 写入 Flash 备份区 → 校验通过后切换启动分区 → 重启 → 运行新固件 → MQTT 上报新版本号

固件升级规格:

项目 规格
固件包格式 .bin(带 RSA-2048 签名头)
最大固件大小 4MB
签名校验 设备端验签通过后才写入 Flash,否则丢弃
升级方式 App 端下载后通过 MQTT 转发到设备(设备在线时);或设备直连 OTA 服务器下载
断点续传 支持(HTTP Range 请求)
升级期间 设备端停止推流和喂食,显示屏显示「升级中…」
升级失败处理 设备自动回滚到旧固件(双分区设计),上报升级失败日志
升级超时 设备端 5 分钟内未完成升级,判定为失败,触发回滚

11.8 功能 7:解除绑定

功能描述:将设备从当前家庭中移除,解除账号与设备的绑定关系。

设计稿对应元素:设备设置页底部「🚨 解除绑定」红色按钮(危险操作区),点击后:

  • 确认弹窗「确定解除绑定「小贝的喂食器」?解除后您将无法通过此 App 控制该设备,其他家庭成员也将失去访问权限。」
  • 二次确认:输入设备名称确认「请输入「小贝的喂食器」确认」
维度 说明
App端 🟢 二次确认输入设备名称 → POST /api/v1/devices/{id}/unbind → 清除本地设备缓存 → 返回首页(设备列表空状态)
服务端 🟢 删除设备绑定记录 → 通知设备端清除配对信息(MQTT)→ 设备端清除配对信息后进入配网模式
设备端 🟢 接收解绑通知 → 清除本地用户绑定信息 → 进入配网模式(蓝色快闪)

12. 模块八:家庭管理

对应页面名称:家庭管理页(family-page)
设计稿截图说明:顶部导航栏「👨‍👩‍👧 家庭管理」+ 返回按钮。主体区域:当前家庭信息卡片(家庭名称 + 成员数量)+ 成员列表(头像 + 昵称 + 角色标签「管理员★」/「成员」)+ 右上角「邀请成员」按钮。底部操作区:「编辑家庭信息」+ 「解散家庭」(仅管理员,无其他成员时可见)。

!image-20260423164717172


12.1 模块概述

管理家庭单元,包括创建/编辑家庭信息、邀请/移除成员、设置成员角色(管理员/成员)。


12.2 功能 1:创建/编辑家庭

功能描述:创建新家庭(填写名称和地址);管理员可编辑家庭信息。

设计稿对应元素:

  • 创建家庭表单:家庭名称输入框(必填,2-20字符)+ 家庭地址输入框(选填)
  • 编辑家庭表单:同创建,自动填充现有数据
维度 说明
App端 🟢 填写表单 → POST /api/v1/families 或 PUT /api/v1/families/{id}
服务端 🟢 创建家庭记录 → 创建者自动成为管理员(角色=owner);更新时仅允许管理员操作
设备端 ⚪ 不参与

12.3 功能 2:邀请成员

功能描述:通过二维码/邀请链接邀请他人加入家庭。

设计稿对应元素:

  • 邀请页:家庭二维码(居中,可保存到相册)+ 复制链接按钮 + 分享到微信/QQ按钮
  • 二维码下方文字:「扫描二维码加入「小贝一家」」「邀请链接有效期7天」
维度 说明
App端 🟢 展示家庭二维码(QRCode 生成,包含邀请链接 URL)→ 提供复制链接分享
服务端 🟢 生成带时效的家庭邀请码(UUID,有效期7天,存入 Redis,TTL=604800s)→ 生成邀请链接 URL → 被邀请人通过邀请链接打开 App → 自动填入邀请码 → 用户确认后加入家庭,角色默认为「成员」
设备端 ⚪ 不参与

邀请规格:

项目 规格
邀请码格式 UUID v4
邀请码有效期 7天(604800秒)
邀请码使用次数 一次性的(加入后立即失效)
邀请方式 二维码(URL 包含邀请码)/ 邀请链接
被邀请人角色 默认「成员」(非管理员)
管理员可邀请上限 无限制

12.4 功能 3:移除成员

功能描述:管理员可移除其他成员(确认弹窗);成员不可移除自己(需联系管理员或退出家庭)。

设计稿对应元素:成员列表每项右侧「移除」按钮(红色文字,管理员操作),点击后:

  • 确认弹窗「确定将「{成员昵称}」移出家庭?移出后该成员将无法访问家庭内的所有设备。」
维度 说明
App端 🟢 管理员点击移除 → 确认弹窗 → DELETE /api/v1/family-members/{member_id}
服务端 🟢 删除成员关系 → 收回该成员对家庭设备的访问权限
设备端 ⚪ 不参与

⭐ 权限规则:

  • 管理员不可移除自己
  • 家庭至少保留 1 名管理员
  • 若管理员要退出家庭,必须先转移管理员权限给其他成员
  • 成员可主动退出家庭(「退出家庭」按钮在成员个人卡片中)

13. 模块九:消息中心

对应页面名称:消息页(message-page)
设计稿截图说明:顶部导航栏「🔔 消息」+ 右上角「⚙️ 消息设置」按钮。筛选Tab:「全部 / 喂食 / 设备 / 系统」。主体为消息列表,每条消息卡片:左侧图标(🔔喂食/⚠️设备/📢系统)+ 消息标题(加粗)+ 消息摘要(灰色小字)+ 时间标签(右侧「3分钟前」/「昨天」)。未读消息左侧有蓝色竖条标记。

!image-20260423164807542


13.1 模块概述

集中展示系统推送通知,包括喂食完成通知、设备告警通知、家庭成员变动通知、系统公告等。


13.2 功能 1:消息列表

功能描述:按时间倒序展示消息,支持按类型筛选(全部/喂食/设备/系统),未读消息有蓝色左侧竖条标记。

设计稿对应元素:

  • 消息列表:每条消息卡片 + 未读蓝色竖条 + 标题 + 摘要 + 时间
  • 筛选Tab(全部/喂食/设备/系统)
  • 消息详情页:点击卡片 → 进入详情页(全屏消息内容+相关操作按钮)
维度 说明
App端 🟢 请求消息列表(GET /api/v1/messages?type=all/feed/device/system&page=1&limit=20)→ 列表展示 → 点击标记已读 → 下拉刷新、上拉加载更多
服务端 🟢 查询用户消息记录(关联 family_id 下的所有消息)→ 按时间倒序分页返回
设备端 ⚪ 不参与

消息已读策略:
- App 端进入消息列表页时,静默将当前屏所有消息标记为已读(批量 PATCH)
- 进入单条消息详情页时,单独标记该消息为已读
- 底部Tab栏消息图标显示未读数字红点(实时更新)


13.3 功能 2:消息推送触发

功能描述:服务端根据事件类型生成并推送消息,同时通过极光/友盟/自建 Push 通道推送到 App。

触发场景 消息类型 推送标题 推送内容示例 消息卡片图标
手动喂食完成 喂食 🍚 喂食完成 「小贝的喂食器已完成出粮 30g」 🍚
定时计划执行完成 喂食 ⏰ 计划喂食 「08:00 计划喂食 30g 已完成」 ⏰
定时计划执行失败 喂食 ⚠️ 喂食异常 「08:00 计划喂食失败:卡粮检测」 ⚠️
粮量低于阈值 设备告警 ⚠️ 余粮不足 「小贝的喂食器余粮仅剩 15%,请及时补充」 ⚠️
设备上线 设备状态 🟢 设备在线 「小贝的喂食器已连接网络」 🟢
设备离线 设备状态 🔴 设备离线 「小贝的喂食器已离线,请检查」 🔴
设备电量低 设备告警 🔋 电量不足 「小贝的喂食器电量仅剩 10%,请充电」 🔋
固件升级完成 设备更新 ✨ 固件升级 「小贝的喂食器已升级到 v2.2.0」 ✨
新成员加入 家庭通知 👋 新成员 「妈妈 已加入家庭「小贝一家」」 👋
成员被移除 家庭通知 👋 成员变动 「您已被移出家庭「小贝一家」」 👋
App 更新 系统通知 📱 更新提示 「App 已更新到最新版本 v1.0.1,点击查看」 📱

13.4 功能 3:消息设置

功能描述:用户可开关各类消息通知(喂食提醒、低粮量提醒、设备离线提醒、低电量提醒、免打扰模式)。

设计稿对应元素(消息设置页):

  • 喂食提醒开关(默认开启)
  • 低粮量提醒开关(默认开启)
  • 设备状态提醒开关(默认开启)
  • 低电量提醒开关(默认开启)
  • 免打扰时段开关(默认关闭):开启后显示时间选择器「22:00 - 08:00」
维度 说明
App端 🟢 Switch 开关 → PUT /api/v1/users/{id}/notification-settings
服务端 🟢 存储用户通知偏好 → 发送推送时检查用户设置
设备端 ⚪ 不参与

免打扰时段规格:
- 默认关闭
- 开启后:22:00 - 08:00(可自定义开始和结束时间)
- 免打扰时段内:暂停喂食提醒、设备状态提醒、低电量提醒
- 强制推送例外:低粮量严重告警(<10%)和设备 error_code 为高严重级别时,即使在免打扰时段内也强制推送


14. 模块十:设备配网与绑定

对应页面名称:添加设备页(add-device-page / add-method-page / bluetooth-add-page / wifi-add-page)
设计稿截图说明:顶部导航栏「➕ 添加设备」+ 返回按钮。主体为配网引导页:步骤指示器「① 选择方式 ② 连接设备 ③ 完成绑定」。下方两个大卡片选项:「📡 蓝牙添加(推荐)」+ 「📶 WiFi添加」。

!image-20260423164854799


14.1 模块概述

用户将新设备添加到 App 的过程,支持蓝牙添加(推荐)和 WiFi 添加两种方式。设备配网是用户首次使用的关键流程。


14.2 功能 1:添加方式选择

功能描述:引导用户选择蓝牙添加或 WiFi 添加,推荐蓝牙方式。

设计稿对应元素:

  • 两个并列大卡片:「📡 蓝牙添加(推荐)」+ 「📶 WiFi添加」
  • 蓝牙卡片带「推荐」标签(绿色小标签)
  • 点击卡片进入对应配网流程
维度 说明
App端 🟢 展示两种添加方式卡片 → 检测手机蓝牙状态(未开启时引导开启)→ 用户选择后进入对应流程
服务端 ⚪ 不参与
设备端 ⚪ 不参与

14.3 功能 2:蓝牙添加(推荐)

功能描述:通过 BLE(低功耗蓝牙)搜索附近设备并连接,完成设备配网和账号绑定。

设计稿对应元素:

  • 步骤1:设备通电 → 说明「长按设备复位键3秒,指示灯蓝色快闪表示进入配网模式」
  • 步骤2:搜索设备 → 显示 BLE 扫描动画(圆形扩散效果)+ 发现的设备列表(名称如「XSW-PF200-AB12」)
  • 步骤3:连接中 → 显示进度「正在连接…」「正在配网…」「绑定成功」
  • 完成页:设备图片 + 「小贝的喂食器 已添加成功」+ 「去看看」按钮
维度 说明
App端 🟢 BLE 扫描(过滤设备名称前缀 XSW-PF200)→ 用户点击选择设备 → BLE 连接 → 发送配网指令 → 设备连接 WiFi 和 MQTT → App 与设备交换认证信息 → 调用绑定 API
服务端 🟢 创建设备绑定记录(device_id + user_id + family_id)→ 下发设备初始配置到 MQTT
设备端 🟢 BLE 接收配网指令 → 连接指定 WiFi(SSID/密码由 App 通过 BLE 下发)→ 连接云端 MQTT 服务器 → 验证配对码 → 发送设备认证信息

设备指示灯状态(蓝牙添加全程):

阶段 指示灯状态 持续时间
出厂状态(未配网) 蓝色缓慢闪烁(2Hz) 持续
BLE 连接中 蓝色快速闪烁(5Hz) 直到 BLE 连接成功
WiFi 连接中 蓝色常亮 直到 WiFi 连接成功
MQTT 连接中 绿色快速闪烁 直到 MQTT 连接成功
绑定成功 绿色常亮 3秒后熄灭
绑定失败 红色闪烁3次 然后恢复出厂状态指示灯

14.4 功能 3:WiFi 添加

功能描述:通过设备热点连接 WiFi 网络,完成配网和绑定(蓝牙不可用时的备选方案)。

设计稿对应元素:

  • 步骤1:设备通电 → 说明「长按设备复位键3秒,指示灯蓝色快闪」
  • 步骤2:连接设备热点 → 说明「在手机 WiFi 设置中连接 XSW-PF200-XXXX 热点」
  • 步骤3:选择 WiFi → App 显示手机当前 WiFi 列表,用户选择家庭 WiFi 并输入密码
  • 步骤4:配网中 → 进度条「正在配置…」
  • 完成页:同蓝牙添加
维度 说明
App端 🟢 引导用户连接设备热点(App 打开系统 WiFi 设置页)→ 获取用户输入的 WiFi SSID/密码 → 通过 HTTP 发送到设备热点 → 设备连接真实 WiFi 后获取 IP → App 检测到设备上线 → 绑定 API
服务端 🟢 同蓝牙添加
设备端 🟢 设备开启热点(SoftAP)→ 接收 App 通过 HTTP POST 下发的 WiFi SSID/密码 → 切换到目标 WiFi → 连接 MQTT → 绑定

15. 模块十一:我的(个人中心)

对应页面名称:我的页面(profile-page / mine-page)
设计稿截图说明:顶部导航栏「👤 我的」或用户头像+昵称区。主体为菜单列表:消息通知 / 家庭管理 / 账号安全 / 清理缓存 / 关于我们 / 退出登录。底部显示 App 版本号。

!image-20260423164929006


15.1 模块概述

展示用户个人信息,提供账号安全、通知设置、缓存清理、关于等辅助功能入口。


15.2 功能 1:个人信息展示

功能描述:展示用户头像、昵称、手机号(脱敏)、家庭数量。

设计稿对应元素:

  • 用户头像(圆形,可点击编辑)
  • 昵称(加粗)
  • 手机号脱敏显示(138****1234)
  • 家庭数量统计(「家庭 ×2」)
维度 说明
App端 🟢 请求用户详情 API(GET /api/v1/users/me)→ 展示个人信息
服务端 🟢 返回用户完整信息(头像 URL、昵称、手机号脱敏、家庭列表)
设备端 ⚪ 不参与

15.3 功能 2:账号安全

功能描述:修改密码、绑定微信、设置生物识别登录(见模块一 5.5 账号安全)。


15.4 功能 3:消息通知设置

功能描述:开关各类消息通知(见模块九 13.4 消息设置)。


15.5 功能 4:清理缓存

功能描述:一键清理 App 本地缓存(缩略图、临时文件)。

设计稿对应元素:

  • 当前缓存大小显示(如「当前缓存 12.5MB」)
  • 「清理缓存」按钮(点击后显示清理进度,清理完成后显示「已清理 0MB」)
维度 说明
App端 🟢 检测本地缓存目录大小 → 用户点击清理 → 删除本地缩略图缓存、临时文件、上传失败的待重试文件 → 显示清理后大小(通常为 0MB 或很小)
服务端 ⚪ 不参与
设备端 ⚪ 不参与

清理范围:

缓存类型 清理策略
缩略图缓存 清理相册缩略图缓存(下次查看时重新下载)
临时文件 清理上传失败的录像临时文件(已上传成功的不保留)
抓拍预览缓存 清理本地生成的 JPEG 预览文件(已上传成功的不保留)
登录 Token 不清理(保留登录状态)
本地设备数据 不清理(保留设备缓存,下次启动更快)

15.6 功能 5:关于我们

功能描述:展示 App 版本号、用户协议、隐私政策、客服联系方式。

设计稿对应元素:

  • App Logo + 版本号(v1.0.0 build 20260423)
  • 用户协议链接
  • 隐私政策链接
  • 客服邮箱 / 电话

15.7 功能 6:退出登录

功能描述:清除本地登录状态,返回登录页。

设计稿对应元素:底部「退出登录」按钮(红色文字)

维度 说明
App端 🟢 弹出确认弹窗「确定退出登录?」→ 确认后清除本地 Token → 跳转到登录页
服务端 🟢 使当前 refresh_token 失效(Redis 删除 key)
设备端 ⚪ 不参与

附录

A. 视频流与媒体文件关键规格汇总

项目 规格
设备推流协议 RTMP(rtmp://media.xswei.com/live/{device_id})
App 拉流协议 HLS(.m3u8 + .ts 分片,每片4秒,共8片缓存)
视频标清码率 256k-1M(自适应)
视频高清码率 512k-2M(自适应)
设备编码 H.264 Main Profile
音频编码 AAC-LC 32kbps 单声道
端到端视频延迟 ≤3秒(标清)/ ≤4秒(高清)
抓拍图片分辨率 1280×960 JPEG,质量70%
抓拍图片大小 ~200KB
录像分辨率 640×480 H.264 + AAC
录像最长时长 30秒
录像文件大小 ~5MB
录像上传方式 HTTPS multipart,分片上传,支持断点续传
照片用户上限 50张(超限自动删除最早的)
视频用户上限 5段(超限自动删除最早的)
照片保存时长 7天
视频保存时长 3天

B. MQTT Topic 规范

Topic 模式 方向 说明
device/{device_id}/status 设备→服务端 设备状态定期上报(30秒/次)
device/{device_id}/feed 服务端→设备 手动喂食指令
device/{device_id}/feed/result 设备→服务端 喂食结果上报
device/{device_id}/feed/batch-report 设备→服务端 断网期间批量喂食记录上报
device/{device_id}/plan/update 服务端→设备 下发喂食计划列表(全量)
device/{device_id}/plan/delete 服务端→设备 删除某个喂食计划
device/{device_id}/config 服务端→设备 下发设备配置更新
device/{device_id}/ota 服务端→设备 OTA 固件升级指令
device/{device_id}/unbind 服务端→设备 解除绑定通知

C. 错误码总表

错误码 说明 App 处理
ERR_PHONE_INVALID 手机号格式不正确 输入框红色提示
ERR_PHONE_NOT_REGISTERED 该手机号未注册 Toast 提示「请先注册账号」
ERR_CODE_INVALID 验证码错误 输入框抖动,剩余N次机会提示
ERR_CODE_EXPIRED 验证码已过期 Toast 提示「验证码已过期,请重新获取」
ERR_CODE_LOCKED 操作过于频繁,请15分钟后再试 全屏遮罩提示倒计时
ERR_NETWORK 网络错误 Toast 提示「网络异常,请检查网络」
ERR_DEVICE_OFFLINE 设备离线 Toast 提示「设备离线,请检查网络」
ERR_DEVICE_NO_RESPONSE 设备无响应 Toast 提示「设备无响应,请检查网络」
ERR_LOW_FOOD 余粮不足 弹出确认提示「余粮不足,是否继续?」
ERR_PLAN_LIMIT 计划数量已达上限 Toast 提示「最多创建20个计划」
ERR_NO_PERMISSION 无操作权限 Toast 提示「您没有权限执行此操作」
这份文档没解决你的问题?联系我们,技术工程师直接对接。

询价咨询

填写这几项,我们 1 个工作日内回传报价与方案

点「生成询价邮件」会打开你的邮件客户端,正文已自动填好;电脑没配邮件客户端,就点「复制内容」粘到网页邮箱发送,收件人 sunshiyang@xstrive.com。