#define WS_STATE_CONNECTED 2 // 连接成功
/* WebSocket命令枚举 */
-typedef enum {
- WS_CMD_UNKNOWN = 0,
- WS_CMD_CHARACTER_CHANGE,
- WS_CMD_CHARACTER_CONFIG_CHANGE,
- WS_CMD_SLEEP_MODE_START,
- WS_CMD_SLEEP_MODE_END,
- WS_CMD_DEVICE_BIND,
- WS_CMD_DEVICE_UNBIND,
- WS_CMD_SCHEDULE_REMINDER,
- WS_CMD_SCHEDULE_REMINDER_CFG,
- WS_CMD_DOWNLOAD_EMOJI,
- WS_CMD_DELETE_EMOJI,
- WS_CMD_PING,
- WS_CMD_PONG,
- WS_CMD_MAX
-} ws_command_t;
-
-/* 统一的消息数据结构 */
-typedef struct {
- char device_id[64];
- uint32_t timestamp;
- char message_id[64];
- ws_command_t command;
- char command_str[32];
- char *raw_json; // 原始JSON字符串,用于需要完整数据的场景
-} ws_data_msg_t;
static volatile int g_ws_running = 0;
static volatile unsigned int g_ws_reconnect_count = 0; /* 断线后递增,用于URL reconnect参数 */
static osMessageQueueId_t g_ws_msg_queue = NULL;
+static ws_message_callback_t g_ws_message_callback = NULL; /* 消息处理回调函数 */
static void ln_ws_build_url(char *out, size_t out_size);
int ln_ws_send_ping(void);
static int ln_ws_parse_data_message(const char *json_str, ws_data_msg_t *data_msg);
static int ln_ws_queue_data_message(const ws_data_msg_t *data_msg);
static void ln_ws_free_data_message(ws_data_msg_t *data_msg);
+static void ln_ws_default_message_handler(const ws_data_msg_t *data_msg, ws_command_t type);
+static void ln_ws_process_message_with_callback(const ws_data_msg_t *data_msg);
/* 队列创建函数 */
void ln_ws_queue_init(void)
data_msg->device_id, data_msg->timestamp, data_msg->message_id,
data_msg->command, data_msg->command_str);
- // 根据命令类型进行具体处理
- switch (data_msg->command) {
- case WS_CMD_PONG:
- printf("[LN][WS] Processing Pong message\n");
- // 更新心跳状态、记录响应时间等
- break;
- case WS_CMD_CHARACTER_CHANGE:
- printf("[LN][WS] Processing CharacterChange message\n");
- break;
- case WS_CMD_SLEEP_MODE_START:
- printf("[LN][WS] Processing SleepModeStart message\n");
- break;
- case WS_CMD_SLEEP_MODE_END:
- printf("[LN][WS] Processing SleepModeEnd message\n");
- break;
- case WS_CMD_DEVICE_BIND:
- printf("[LN][WS] Processing DeviceBind message\n");
- break;
- case WS_CMD_DEVICE_UNBIND:
- printf("[LN][WS] Processing DeviceUnbind message\n");
- break;
- case WS_CMD_SCHEDULE_REMINDER:
- printf("[LN][WS] Processing ScheduleReminder message\n");
- break;
- case WS_CMD_SCHEDULE_REMINDER_CFG:
- printf("[LN][WS] Processing ScheduleReminderConfig message\n");
- break;
- default:
- printf("[LN][WS] Processing unknown command: %d\n", data_msg->command);
- break;
- }
+ // 使用回调函数处理消息
+ ln_ws_process_message_with_callback(data_msg);
// 释放消息内存
ln_ws_free_data_message(data_msg);
/*
* 启动:开启监督线程与心跳机制(心跳线程首次连接成功后会自然启动)
* - 若已在运行则直接返回成功
+ * - callback: 消息处理回调函数,可以为NULL使用默认处理
*/
-int ln_ws_start(void)
+int ln_ws_start(ws_message_callback_t callback)
{
if (g_ws_running) {
return 0;
g_ws_running = 1;
g_ws_reconnect_count = 0; /* 启动时从0开始 */
g_ws_connected = WS_STATE_DISCONNECTED; /* 启动时重置连接状态 */
+
+ // 注册回调函数
+ g_ws_message_callback = callback;
+ if (callback != NULL) {
+ printf("[LN][WS] Message callback registered successfully\n");
+ } else {
+ printf("[LN][WS] Using default message handler\n");
+ }
if (!g_ws_main_thread) {
app_task_definition_ext_t main_task = {
.attr = {
}
}
+/* ============================ 公共回调函数接口 ============================ */
+
+/**
+ * @brief 注册消息处理回调函数(公共接口)
+ * @param callback 回调函数
+ */
+void ln_ws_register_message_callback(ws_message_callback_t callback)
+{
+ g_ws_message_callback = callback;
+ if (callback != NULL) {
+ printf("[LN][WS] Message callback registered successfully\n");
+ } else {
+ printf("[LN][WS] Message callback unregistered\n");
+ }
+}
+
/* ============================ 统一消息解析和队列处理 ============================ */
/**
}
}
+/* ============================ 回调函数管理 ============================ */
+
+/**
+ * @brief 默认消息处理器
+ * @param data_msg 消息数据
+ * @param type 消息类型
+ */
+static void ln_ws_default_message_handler(const ws_data_msg_t *data_msg, ws_command_t type)
+{
+ if (!data_msg) return;
+
+ printf("[LN][WS] Default handler: Processing %s message (type: %d)\n", data_msg->command_str, type);
+
+ switch (type) {
+ case WS_CMD_PONG:
+ printf("[LN][WS] Default: Processing Pong message\n");
+ // 更新心跳状态、记录响应时间等
+ break;
+ case WS_CMD_CHARACTER_CHANGE:
+ printf("[LN][WS] Default: Processing CharacterChange message\n");
+ break;
+ case WS_CMD_SLEEP_MODE_START:
+ printf("[LN][WS] Default: Processing SleepModeStart message\n");
+ break;
+ case WS_CMD_SLEEP_MODE_END:
+ printf("[LN][WS] Default: Processing SleepModeEnd message\n");
+ break;
+ case WS_CMD_DEVICE_BIND:
+ printf("[LN][WS] Default: Processing DeviceBind message\n");
+ break;
+ case WS_CMD_DEVICE_UNBIND:
+ printf("[LN][WS] Default: Processing DeviceUnbind message\n");
+ break;
+ case WS_CMD_SCHEDULE_REMINDER:
+ printf("[LN][WS] Default: Processing ScheduleReminder message\n");
+ break;
+ case WS_CMD_SCHEDULE_REMINDER_CFG:
+ printf("[LN][WS] Default: Processing ScheduleReminderConfig message\n");
+ break;
+ default:
+ printf("[LN][WS] Default: Processing unknown command: %d\n", type);
+ break;
+ }
+}
+
+/**
+ * @brief 使用回调函数处理消息
+ * @param data_msg 消息数据
+ */
+static void ln_ws_process_message_with_callback(const ws_data_msg_t *data_msg)
+{
+ if (!data_msg) return;
+
+ ws_command_t type = data_msg->command;
+
+ // 如果有注册回调函数,调用它;否则使用默认处理
+ if (g_ws_message_callback != NULL) {
+ g_ws_message_callback(data_msg, type);
+ } else {
+ ln_ws_default_message_handler(data_msg, type);
+ }
+}
+