《数智方舟》项目对接文档

发布时间:2026/7/20 11:34:23
《数智方舟》项目对接文档 目前接入的七牛云平台API 参考文档通用文档https://linx.qiniu.com/docs/灵犀平台 OTA/协议接口核心https://linx.qiniu.com/docs/xrobot/platform/管理后台参考https://xrobo.qiniu.com/#/home1. 设备联网方式硬件ESP32-P4 (主控) ESP32-C6 (WiFi协处理器)两者通过SDIO/SDMMC总线连接。C6 作为 SDIO slaveP4 通过 ESP-Hosted 驱动控制 C6 的 WiFi 功能。软件栈ESP-IDF v5.4 ESP-Hosted (SDIO host driver)C6 运行独立的 WiFi 协处理器固件 (当前版本 2.3.0)P4 主控运行应用代码、音频处理、LVGL 显示、协议层联网流程上电 → C6 初始化 SDIO 连接 (~621ms)P4 建立 SDIO transport 与 C6 通信 (~978ms)P4 通过 C6 执行 WiFi 扫描/连接获取 IP 后发起 OTA 版本检查 → 获取 MQTT/WebSocket 配置 → 建立协议连接2. 遇到的问题 (核心矛盾)SD卡 和 C6 WiFi 共享同一块 SDMMC 硬件外设SD卡C6 WiFiSDMMC 通道Slot 0Slot 1时钟源共享 SDMMC 时钟同一时钟初始化时机需要尽早挂载 (800ms)host_init 最早 (621ms)问题表现首次上电无 WiFi 凭证C6 不主动扫描SDMMC 总线空闲 → SD 卡正常挂载 ✅WiFi 配对后重启C6 拥有保存的 WiFi 凭证上电自动初始化 SDIO → 锁死 SDMMC 时钟 → SD 卡挂载失败 ❌sdkconfig 中 AUTO_CONNECT_ON_STA_START 已关闭但 C6 固件 v2.3.0 在 flash 中有凭证时仍会自主初始化当前临时方案SD 卡在构造函数中同步挂载~713ms早于 SDIO transport在 WiFi 启动前预打开全部 22 个表情 MJPEG 文件播放时从已打开的 FILE* 流式读取避免二次 fopen缺点C6 固件版本旧行为不完全可控窗口期窄~100ms理想解决升级 C6 固件到与 ESP-Hosted 匹配的版本 (v2.12.0)或改用独立 SPI 外设但板子硬件走线限制3. OTA 平台需求接口3.1 版本检查接口当前 OTA URLhttps://api.tenclass.net/xiaozhi/ota/(可通过 Kconfig 或 NVS 修改)请求POST {ota_url}/api/v1/ota/check推测路径具体看服务端实现HeadersActivation-Version: 1 或 2 Device-Id: MAC地址 Client-Id: UUID User-Agent: 板子类型/固件版本 Accept-Language: zh_CN Content-Type: application/jsonRequest Body(JSON){application:{version:0.1.0,elf_sha256:12345678...},board:{type:guition-jc4880p443,name:guition-jc4880p443,ssid:royal7,rssi:0},mac_address:AA:BB:CC:DD:EE:FF,uuid:xxxx-xxxx-xxxx,chip_model_name:esp32p4,flash_size:16777216,psram_size:33554432,version:0,chip_info:{model:0,cores:0,revision:0,features:0},partition_table:[{label:,type:0,subtype:0,address:0,size:0}]}Response(JSON服务端需返回以下全部字段){activation:{message:设备已激活或请扫描二维码激活,code:激活码(首次激活时),challenge:验证挑战码,timeout_ms:60000},mqtt:{endpoint:mqtt://your-server:1883,client_id:...,username:...,password:...,publish_topic:/xiaozhi/audio/up,subscribe_topic:/xiaozhi/audio/down,udp_server:your-server,udp_port:8888},websocket:{url:ws://your-server:8080/xiaozhi/ws},server_time:{timestamp:1752912456000},firmware:{version:0.2.0,url:https://your-server/firmware/guition-jc4880p443_v0.2.0.bin}}3.2 协议说明服务端通过mqtt或websocket二选一配置协议MQTT 模式MQTT 传输 JSON 消息 (信令)UDP 传输 OPUS 编码的实时音频流上行音频P4 → 服务端 (UDP)下行音频服务端 → P4 (UDP)WebSocket 模式单个 WebSocket 同时传输 JSON 消息和音频音频以二进制帧传输3.3 服务端需实现的功能服务端在对话中通过 JSON 消息发送以下类型消息类型字段用途ttstype:tts 音频流语音合成消息设备播放stttype:stttext:...语音识别结果显示在屏幕llmtype:llmemotion:thinking控制 22 个表情动画mcptype:mcppayload:{...}MCP 设备控制 (亮度/音量/LED等)systemtype:systemcommand:reboot系统指令 (如 OTA 后重启)alerttype:alert emotion/message警告通知3.4 平台能力总结OTA 版本管理接收设备 POST 请求返回固件版本和下载 URL设备激活新设备首次连接时返回激活码/二维码MQTT Broker 或 WebSocket Server连接设备、收发消息LLM 对接选择模型 → 生成回复 → 返回type:llm消息 emotion字段控制表情TTS 语音合成LLM 文本 → 语音 → OPUS 编码 → 通过 MQTT/WebSocket 发送音频STT 语音识别设备上传 OPUS 音频 → 服务端解码 → 转文本MCP 协议解析/生成设备控制 JSON简而言之需要一个能接收 HTTP POST (设备注册/版本检查)、运行 MQTT Broker 或 WebSocket Server、对接 LLM TTS STT 模型、并能通过 JSON 消息控制 22 个表情动画的后端平台。4. 22 个表情列表我处理设备本地有这 22 个 125 帧 MJPEG 动画文件在 SD 卡上angry, awake, confident, confused, cool, crying, delicious, embarrassed, funny, happy, kissy, laughing, loving, neutral, relaxed, sad, shocked, silly, sleepy, surprised, thinking, winking服务端只需在 LLM 消息中发送emotion: happy即可切换。