yh001399/smart-desktop-ai-terminal
智能桌面 AI 终端重建工程
这是物联网工程综合课程设计的新基线工程。旧项目不再继续补丁式开发,本仓库从统一协议、状态机和分层验收重新搭建。
目标
构建一个基于 STM32F103、XIAO ESP32S3 Sense、SYN6288 TTS 和 RC522 RFID 的桌面级智能 AI 终端:
- STM32:本地传感器采集、OLED、RGB、蜂鸣器、风扇、舵机、SYN6288 播报。
- ESP32S3 Sense:WiFi、RFID、STM32 UART 桥接,并通过本机 HTTP relay 接入公网后端。
- FastAPI 后端:设备状态、RFID 用户、AI 对话、动作规划、实时诊断、Web/移动端控制台。
- 应用层:Web 控制台和移动端页面,满足课程设计对 PC/移动应用端的要求。
当前答辩主线不是“播放预设录音”,而是“用户真实输入文本或语音 -> 后端 AI 生成回复 -> STM32 执行并 ACK”的智能对话闭环。
当前重建原则
- 当前答辩主链使用 ESP32S3 -> 本机 HTTP relay -> Hugging Face;WebSocket 保留给网页实时事件和兼容链路。
- 先稳定文本闭环:
用户问题 -> 后端 Agent -> STM32 命令 -> TTS/OLED/执行器。 - 音频流在文本闭环稳定后接入,优先采用 WebSocket 二进制帧或有 ACK 的分片。
- RFID 独立验收后再并入主链路,避免调试复杂度叠加。
- 所有状态灯必须来自统一会话状态,不再用“绿灯亮”代表系统健康。
快速启动
python -m pip install -r backend/requirements.txt
python .\tools\start_backend.py启动脚本会在后端可用后主动请求 /api/health,并打印类似结果:
{
"status": "ok",
"protocol": "smart-desktop-realtime-v1",
"ai_provider": "mock",
"ai_model": "local-rules",
"cloud_ready": false,
"device_id": "desktop-agent-001",
"edge_id": "esp32s3-sense-001"
}如果只运行原始 uvicorn 前台命令,它只会启动服务和打印访问日志,不会自动调用健康检查接口;需要另开终端请求健康检查。
终端 1:
cd backend
python -m uvicorn app.main:app --host 0.0.0.0 --port 8083 --reload终端 2:
cd backend
Invoke-RestMethod http://127.0.0.1:8083/api/health | ConvertTo-Json页面:
http://127.0.0.1:8083/consolehttp://127.0.0.1:8083/mobilehttp://127.0.0.1:8083/docs
语音演示:
- 先刷已注册 RFID 卡,或在本次网页会话输入控制口令并选择用户上下文
- 双击
tools\start_laptop_realtime_listener.cmd,它默认进入 KEY2 PTT 模式 - 按住 STM32
KEY2/PB13说话,松开后电脑麦克风录音立即上传,后端继续走 AI/TTS/ACK 闭环;短按 KEY2 只终止当前播报
云端模型冒烟测试:
python .\tools\cloud_dialogue_smoke.py --base-url http://127.0.0.1:8083输出里的 cloud_ready=true 表示后端已使用 DashScope OpenAI-compatible qwen-plus;如果是 false,系统仍会安全退回本地规则,硬件闭环可继续演示,但不算真实云端模型对话。脚本默认最多等待 10 秒,让 STM32 ACK 回传后再汇总。 云端对话现在会区分完整展示回复 reply 和播报短句 speech:Web/小程序保留完整文本,SYN6288 优先播报更短的口语句,后端仍保留 120 字节截断兜底。
如果要在答辩前强制检查“必须是真实云端模型”,加上 --require-cloud。
答辩现场的只读实时就绪检查:
python .\tools\realtime_readiness_check.py该脚本默认访问已部署的 Hugging Face 服务,只读取健康、设备状态和诊断接口;它要求云端就绪、ESP32 在线、UART 正常、最近上报不超过 20 秒,并检测至少两项真实传感器字段。"verdict": "PASS" 才表示可以把页面数据作为当场实时数据展示。ESP32 刚重新插入或重启时,先预留 1—3 分钟完成 Wi-Fi/UART 保活启动,再运行此检查。
整套答辩启动(relay、实时自检、网页控制台与语音前端):
.\tools\start_defense_demo.cmd启动器不会重复开启已监听的 relay;通过实时自检后才会打开控制台,并在用户确认后启动 KEY2 触发的笔记本麦克风 PTT 前端。详见 答辩演示脚本。
测试:
python -m pytest backend/tests -qRFID 用户、卡片绑定、会话和对话上下文会持久化到本机 backend/data/context.sqlite3,旧版 backend/data/rfid_users.json 只作为迁移来源;这些文件不包含 backend/.env 中的任何密钥。 已注册卡刷卡后进入该用户自己的上下文;未知卡或未刷卡状态不能访问用户上下文,除非网页/小程序携带 CONTROL_TOKEN。在线注册通过网页/小程序发起后,等待真实 RC522 下一次刷卡完成绑定;手动 UID 仅保留为备选调试入口。真实 ESP32S3 RFID 上报使用独立 DEVICE_TOKEN。
目录
docs/:课程要求、总架构、硬件接线、协议、测试计划和重建禁区。backend/:FastAPI 后端最小可运行闭环。edge/esp32s3/:ESP32S3 Sense 固件脚手架和主链路说明。firmware/stm32/:STM32 协议执行器脚手架。tools/:启动与诊断脚本。
关键文档
- 行动大纲
- 环境与实物基线
- AI 与 ASR 选型决策
- 课程任务书要求整理
- 总体架构
- 硬件接线基线
- 通信协议
- 微信小程序路线
- 本地密钥与配置
- 答辩演示脚本
- 答辩现场运行卡
- 已安装技能与项目应用方式
- 测试计划
- 重建禁区
- 答辩验收清单
最短验收闭环
用户:你好小智
STM32/SYN6288:请说话
用户:你是谁
后端:生成 AI 回复与 NET:TTS 命令
ESP32S3:转发 NET:CMD:<id>:NET:TTSHEX:<utf8_hex>
STM32:执行并回复 BT:ACK:<id>:OK
Web 控制台:显示 ASR/文本、回复、命令、ACK 和设备状态