1. 完成了语音识别的C++业务层封装,测试通过

2. 试着测试了一下LVGL_GIF渲染+音乐播放+语音识别的组合简单优化后,
          发现lvgl渲染略显卡顿,语音识别有缓冲区空警告,不过无伤大雅,还需要进一步深度优化。
This commit is contained in:
Misaki
2025-09-23 03:17:23 +08:00
parent 4cc761aab3
commit 48f208b2e6
19 changed files with 587 additions and 94 deletions
+24 -10
View File
@@ -6,7 +6,6 @@
#include <string>
#include <functional>
#include <mutex>
#include <queue>
#include <condition_variable>
@@ -37,6 +36,11 @@ using JsonDataCallback = std::function<void(cJSON* json)>;
// 事件回调
using EventCallback = std::function<void(WebSocketEvent event, const std::string& message)>;
// 在此说明一下上面的两个回调函数的作用,主要目的还是为了解耦,在handleReceivedData有对这两个回调的调用
// 对于JSON数据回调,如果来自客户端的数据被解析为了数据,那么就会调用JSON数据回调,并将解析后的json数据传给JSON数据回调,回调函数内部只需要访问并释放json数据
// 对于WebSocket事件回调,会有所不同,重点需要关注DATA_RECEIVED事件,这是非json数据的情况,其他的见下面的示例
// 实际上对于本项目,几乎99%的情况都是只使用JSON数据回调
/* 回调函数示例:
// JSON数据回调示例
void onJsonData(cJSON* json) {
@@ -86,7 +90,7 @@ public:
WebSocketManager& operator=(const WebSocketManager&) = delete;
// 初始化WebSocket管理器
bool initialize(const WebSocketConfig& config);
bool initialize(const WebSocketConfig& ws_config);
// 连接到WebSocket服务器
bool connect();
@@ -94,26 +98,26 @@ public:
// 断开连接
void disconnect();
// 发送JSON数据
// 发送JSON数据,注意此成员函数会释放json数据,调用之后请不要再次释放json数据
bool sendJson(cJSON* json);
// 发送原始字符串数据
bool sendRaw(const std::string& data);
// 设置JSON数据回调
void setJsonCallback(JsonDataCallback callback);
void setJsonCallback(const JsonDataCallback &callback);
// 设置事件回调
void setEventCallback(EventCallback callback);
void setEventCallback(const EventCallback &callback);
// 获取连接状态
bool isConnected() const;
[[nodiscard]] bool isConnected() const;
// 获取配置信息
WebSocketConfig getConfig() const;
[[nodiscard]] WebSocketConfig getConfig() const;
// 更新配置
void updateConfig(const WebSocketConfig& config);
void updateConfig(const WebSocketConfig& ws_config);
// 获取统计信息
struct Stats {
@@ -122,7 +126,7 @@ public:
uint32_t connection_attempts; /// 连接尝试次数
uint32_t successful_connections; /// 成功连接次数
};
Stats getStats() const;
[[nodiscard]] Stats getStats() const;
private:
WebSocketManager(); // 私有构造函数
@@ -143,7 +147,7 @@ private:
* @param data 数据
* @param len 数据长度
*/
void handleReceivedData(const char* data, int len);
void handleReceivedData(const char* data, int len) const;
// 重连线程函数
void reconnectThread();
@@ -196,4 +200,14 @@ private:
// WiFi实例
WifiConnectors* wifi;
// sn码和设备信息
static std::string sn; /// sn码会在设备首次连网后连接服务器后经过服务器计算后返回唯一的sn码
/// 在首次连接服务器后会提交设备的芯片序列号和mac地址,以用于计算唯一sn码
/// 在计算后,服务器首先会把计算好的sn码返回给设备,并保存起来
/// 客户端会将服务器返回的sn码存在设备flash当中
/// 这样客户端和服务端之间就都有sn码了
/// 当客户端再次连接服务器的时候,会先从flash中读取sn码,如果sn码存在,则将sn码发送给服务器以建立连接
/// 如此下来服务器也方便找到设备保存的信息
std::string device_info = "esp32s3"; /// 可以根据不同的设备进行修改,在本项目中使用的是esp32s3
};