--- /dev/null
+#include "ln_api.h"
+#include "cJSON.h"
+#include "custom_utils.h"
+
+/* 从下发JSON中提取userId */
+void ln_ws_ack_user_id_from_json(const char *json_str)
+{
+ if (json_str && json_str[0])
+ {
+ cJSON *root = cJSON_Parse(json_str);
+ if (root)
+ {
+ cJSON *data_obj = cJSON_GetObjectItem(root, "data");
+ if (data_obj && cJSON_IsObject(data_obj))
+ {
+ cJSON *uid = cJSON_GetObjectItem(data_obj, "userId");
+ if (uid && cJSON_IsString(uid) && uid->valuestring)
+ {
+ uapi_ln_set_user_id(uid->valuestring);
+ }
+ }
+ cJSON_Delete(root);
+ }
+ }
+}
+
+/* 发送设备绑定应答 DeviceBindAck */
+int ln_ws_send_device_bind_ack(const char *user_id, bool success, const char *msg)
+{
+ if (ln_ws_get_connection_state() != 2)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Cannot send DeviceBindAck, connection state: %d\n", ln_ws_get_connection_state());
+ return -1;
+ }
+
+ uint32_t timestamp;
+ uapi_get_timestampe_ss(×tamp);
+
+ cJSON *json = cJSON_CreateObject();
+ if (!json)
+ return -1;
+
+ cJSON_AddStringToObject(json, "deviceId", uapi_ln_get_device_id());
+ cJSON_AddNumberToObject(json, "timestamp", (double)timestamp);
+
+ char message_id[64];
+ snprintf(message_id, sizeof(message_id), "ack_bind_%u", timestamp);
+ cJSON_AddStringToObject(json, "messageId", message_id);
+ cJSON_AddStringToObject(json, "command", "DeviceBindAck");
+
+ cJSON *data = cJSON_CreateObject();
+ if (!data)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+ cJSON_AddStringToObject(data, "userId", (user_id && user_id[0]) ? user_id : "");
+ cJSON_AddBoolToObject(data, "success", success);
+ cJSON_AddStringToObject(data, "message", msg ? msg : (success ? "绑定成功" : "绑定失败"));
+ cJSON_AddItemToObject(json, "data", data);
+
+ char *json_string = cJSON_Print(json);
+ if (!json_string)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+
+ int ret = uapi_ws_send_text(json_string);
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Sent DeviceBindAck: %s\n", json_string);
+
+ cJSON_free(json_string);
+ cJSON_Delete(json);
+ return ret;
+}
+
+/* 发送设备解绑应答 DeviceUnbindAck */
+int ln_ws_send_device_unbind_ack(const char *user_id, bool success, const char *msg)
+{
+ if (ln_ws_get_connection_state() != 2)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Cannot send DeviceUnbindAck, connection state: %d\n", ln_ws_get_connection_state());
+ return -1;
+ }
+
+ uint32_t timestamp;
+ uapi_get_timestampe_ss(×tamp);
+
+ cJSON *json = cJSON_CreateObject();
+ if (!json)
+ return -1;
+
+ cJSON_AddStringToObject(json, "deviceId", uapi_ln_get_device_id());
+ cJSON_AddNumberToObject(json, "timestamp", (double)timestamp);
+
+ char message_id[64];
+ snprintf(message_id, sizeof(message_id), "ack_unbind_%u", timestamp);
+ cJSON_AddStringToObject(json, "messageId", message_id);
+ cJSON_AddStringToObject(json, "command", "DeviceUnbindAck");
+
+ cJSON *data = cJSON_CreateObject();
+ if (!data)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+ cJSON_AddStringToObject(data, "userId", (user_id && user_id[0]) ? user_id : "");
+ cJSON_AddBoolToObject(data, "success", success);
+ cJSON_AddStringToObject(data, "message", msg ? msg : (success ? "解绑成功" : "解绑失败"));
+ cJSON_AddItemToObject(json, "data", data);
+
+ char *json_string = cJSON_Print(json);
+ if (!json_string)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+
+ int ret = uapi_ws_send_text(json_string);
+
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Sent DeviceUnbindAck: %s\n", json_string);
+
+ cJSON_free(json_string);
+ cJSON_Delete(json);
+ return ret;
+}
+
+/* 发送角色切换应答 CharacterChangeAck */
+int ln_ws_send_character_change_ack(const char *character_id, bool success, const char *msg)
+{
+ if (ln_ws_get_connection_state() != 2)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Cannot send CharacterChangeAck, connection state: %d\n", ln_ws_get_connection_state());
+ return -1;
+ }
+
+ uint32_t timestamp;
+ uapi_get_timestampe_ss(×tamp);
+
+ cJSON *json = cJSON_CreateObject();
+ if (!json)
+ return -1;
+
+ cJSON_AddStringToObject(json, "deviceId", uapi_ln_get_device_id());
+ cJSON_AddNumberToObject(json, "timestamp", (double)timestamp);
+
+ char message_id[64];
+ snprintf(message_id, sizeof(message_id), "ack_char_change_%u", timestamp);
+ cJSON_AddStringToObject(json, "messageId", message_id);
+ cJSON_AddStringToObject(json, "command", "CharacterChangeAck");
+
+ cJSON *data = cJSON_CreateObject();
+ if (!data)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+ cJSON_AddStringToObject(data, "characterId", (character_id && character_id[0]) ? character_id : "");
+ cJSON_AddBoolToObject(data, "success", success);
+ cJSON_AddStringToObject(data, "message", msg ? msg : (success ? "角色切换成功" : "角色切换失败"));
+ cJSON_AddItemToObject(json, "data", data);
+
+ char *json_string = cJSON_Print(json);
+ if (!json_string)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+
+ int ret = uapi_ws_send_text(json_string);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Sent CharacterChangeAck: %s\n", json_string);
+ cJSON_free(json_string);
+ cJSON_Delete(json);
+ return ret;
+}
+
+/* 发送角色配置更改应答 CharacterConfigChangeAck */
+int ln_ws_send_character_config_change_ack(const char *character_id, bool success, const char *msg)
+{
+ if (ln_ws_get_connection_state() != 2)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Cannot send CharacterConfigChangeAck, connection state: %d\n", ln_ws_get_connection_state());
+ return -1;
+ }
+
+ uint32_t timestamp;
+ uapi_get_timestampe_ss(×tamp);
+
+ cJSON *json = cJSON_CreateObject();
+ if (!json)
+ return -1;
+
+ cJSON_AddStringToObject(json, "deviceId", uapi_ln_get_device_id());
+ cJSON_AddNumberToObject(json, "timestamp", (double)timestamp);
+
+ char message_id[64];
+ snprintf(message_id, sizeof(message_id), "ack_config_%u", timestamp);
+ cJSON_AddStringToObject(json, "messageId", message_id);
+ cJSON_AddStringToObject(json, "command", "CharacterConfigChangeAck");
+
+ cJSON *data = cJSON_CreateObject();
+ if (!data)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+ cJSON_AddStringToObject(data, "characterId", (character_id && character_id[0]) ? character_id : "");
+ cJSON_AddBoolToObject(data, "success", success);
+ cJSON_AddStringToObject(data, "message", msg ? msg : (success ? "配置更新成功" : "配置更新失败"));
+ cJSON_AddItemToObject(json, "data", data);
+
+ char *json_string = cJSON_Print(json);
+ if (!json_string)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+
+ int ret = uapi_ws_send_text(json_string);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Sent CharacterConfigChangeAck: %s\n", json_string);
+ cJSON_free(json_string);
+ cJSON_Delete(json);
+ return ret;
+}
+
+/* 发送哄睡模式开始应答 SleepModeStartAck */
+int ln_ws_send_sleep_mode_start_ack(bool success, const char *msg)
+{
+ if (ln_ws_get_connection_state() != 2)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Cannot send SleepModeStartAck, connection state: %d\n", ln_ws_get_connection_state());
+ return -1;
+ }
+
+ uint32_t timestamp;
+ uapi_get_timestampe_ss(×tamp);
+
+ cJSON *json = cJSON_CreateObject();
+ if (!json)
+ return -1;
+
+ cJSON_AddStringToObject(json, "deviceId", uapi_ln_get_device_id());
+ cJSON_AddNumberToObject(json, "timestamp", (double)timestamp);
+
+ char message_id[64];
+ snprintf(message_id, sizeof(message_id), "ack_sleep_start_%u", timestamp);
+ cJSON_AddStringToObject(json, "messageId", message_id);
+ cJSON_AddStringToObject(json, "command", "SleepModeStartAck");
+
+ cJSON *data = cJSON_CreateObject();
+ if (!data)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+ cJSON_AddBoolToObject(data, "success", success);
+ cJSON_AddStringToObject(data, "message", msg ? msg : (success ? "哄睡模式已启动" : "哄睡模式启动失败"));
+ cJSON_AddItemToObject(json, "data", data);
+
+ char *json_string = cJSON_Print(json);
+ if (!json_string)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+
+ int ret = uapi_ws_send_text(json_string);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Sent SleepModeStartAck: %s\n", json_string);
+ cJSON_free(json_string);
+ cJSON_Delete(json);
+ return ret;
+}
+
+/* 发送哄睡模式结束应答 SleepModeEndAck */
+int ln_ws_send_sleep_mode_end_ack(bool success, const char *msg)
+{
+ if (ln_ws_get_connection_state() != 2)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Cannot send SleepModeEndAck, connection state: %d\n", ln_ws_get_connection_state());
+ return -1;
+ }
+
+ uint32_t timestamp;
+ uapi_get_timestampe_ss(×tamp);
+
+ cJSON *json = cJSON_CreateObject();
+ if (!json)
+ return -1;
+
+ cJSON_AddStringToObject(json, "deviceId", uapi_ln_get_device_id());
+ cJSON_AddNumberToObject(json, "timestamp", (double)timestamp);
+
+ char message_id[64];
+ snprintf(message_id, sizeof(message_id), "ack_sleep_end_%u", timestamp);
+ cJSON_AddStringToObject(json, "messageId", message_id);
+ cJSON_AddStringToObject(json, "command", "SleepModeEndAck");
+
+ cJSON *data = cJSON_CreateObject();
+ if (!data)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+ cJSON_AddBoolToObject(data, "success", success);
+ cJSON_AddStringToObject(data, "message", msg ? msg : (success ? "哄睡模式已结束" : "哄睡模式结束失败"));
+ cJSON_AddItemToObject(json, "data", data);
+
+ char *json_string = cJSON_Print(json);
+ if (!json_string)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+
+ int ret = uapi_ws_send_text(json_string);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Sent SleepModeEndAck: %s\n", json_string);
+ cJSON_free(json_string);
+ cJSON_Delete(json);
+ return ret;
+}
+
+/* 发送日程提醒应答 ScheduleReminderAck */
+int ln_ws_send_schedule_reminder_ack(int schedule_id, bool success, const char *msg)
+{
+ if (ln_ws_get_connection_state() != 2)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Cannot send ScheduleReminderAck, connection state: %d\n", ln_ws_get_connection_state());
+ return -1;
+ }
+
+ uint32_t timestamp;
+ uapi_get_timestampe_ss(×tamp);
+
+ cJSON *json = cJSON_CreateObject();
+ if (!json)
+ return -1;
+
+ cJSON_AddStringToObject(json, "deviceId", uapi_ln_get_device_id());
+ cJSON_AddNumberToObject(json, "timestamp", (double)timestamp);
+
+ char message_id[64];
+ snprintf(message_id, sizeof(message_id), "ack_reminder_%u", timestamp);
+ cJSON_AddStringToObject(json, "messageId", message_id);
+ cJSON_AddStringToObject(json, "command", "ScheduleReminderAck");
+
+ cJSON *data = cJSON_CreateObject();
+ if (!data)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+ cJSON_AddNumberToObject(data, "scheduleId", schedule_id);
+ cJSON_AddBoolToObject(data, "success", success);
+ cJSON_AddStringToObject(data, "message", msg ? msg : (success ? "提醒已播放" : "提醒播放失败"));
+ cJSON_AddItemToObject(json, "data", data);
+
+ char *json_string = cJSON_Print(json);
+ if (!json_string)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+
+ int ret = uapi_ws_send_text(json_string);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Sent ScheduleReminderAck: %s\n", json_string);
+ cJSON_free(json_string);
+ cJSON_Delete(json);
+ return ret;
+}
+
+/* 发送日程提醒配置应答 ScheduleReminderConfigAck */
+int ln_ws_send_schedule_reminder_config_ack(int schedule_id, bool success, const char *msg)
+{
+ if (ln_ws_get_connection_state() != 2)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Cannot send ScheduleReminderConfigAck, connection state: %d\n", ln_ws_get_connection_state());
+ return -1;
+ }
+
+ uint32_t timestamp;
+ uapi_get_timestampe_ss(×tamp);
+
+ cJSON *json = cJSON_CreateObject();
+ if (!json)
+ return -1;
+
+ cJSON_AddStringToObject(json, "deviceId", uapi_ln_get_device_id());
+ cJSON_AddNumberToObject(json, "timestamp", (double)timestamp);
+
+ char message_id[64];
+ snprintf(message_id, sizeof(message_id), "ack_reminder_config_%u", timestamp);
+ cJSON_AddStringToObject(json, "messageId", message_id);
+ cJSON_AddStringToObject(json, "command", "ScheduleReminderConfigAck");
+
+ cJSON *data = cJSON_CreateObject();
+ if (!data)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+ cJSON_AddNumberToObject(data, "scheduleId", schedule_id);
+ cJSON_AddBoolToObject(data, "success", success);
+ cJSON_AddStringToObject(data, "message", msg ? msg : (success ? "配置已更新" : "配置更新失败"));
+ cJSON_AddItemToObject(json, "data", data);
+
+ char *json_string = cJSON_Print(json);
+ if (!json_string)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+
+ int ret = uapi_ws_send_text(json_string);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Sent ScheduleReminderConfigAck: %s\n", json_string);
+ cJSON_free(json_string);
+ cJSON_Delete(json);
+ return ret;
+}
+
+/* 发送删除表情应答 DeleteEmojiAck */
+int ln_ws_send_delete_emoji_ack(const char *character_id, const char *eyesColor, const char *eyesShape, bool success, const char *msg)
+{
+ if (ln_ws_get_connection_state() != 2)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Cannot send DeleteEmojiAck, connection state: %d\n", ln_ws_get_connection_state());
+ return -1;
+ }
+
+ uint32_t timestamp;
+ uapi_get_timestampe_ss(×tamp);
+
+ cJSON *json = cJSON_CreateObject();
+ if (!json)
+ return -1;
+
+ cJSON_AddStringToObject(json, "deviceId", uapi_ln_get_device_id());
+ cJSON_AddNumberToObject(json, "timestamp", (double)timestamp);
+
+ char message_id[64];
+ snprintf(message_id, sizeof(message_id), "ack_delete_emoji_%u", timestamp);
+ cJSON_AddStringToObject(json, "messageId", message_id);
+ cJSON_AddStringToObject(json, "command", "DeleteEmojiAck");
+
+ cJSON *data = cJSON_CreateObject();
+ if (!data)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+ cJSON_AddStringToObject(data, "characterId", character_id ? character_id : "");
+ cJSON_AddStringToObject(data, "eyesColor", eyesColor ? eyesColor : "");
+ cJSON_AddStringToObject(data, "eyesShape", eyesShape ? eyesShape : "");
+ cJSON_AddBoolToObject(data, "success", success);
+ cJSON_AddStringToObject(data, "message", msg ? msg : (success ? "表情已删除" : "表情删除失败"));
+ cJSON_AddItemToObject(json, "data", data);
+
+ char *json_string = cJSON_Print(json);
+ if (!json_string)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+
+ int ret = uapi_ws_send_text(json_string);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Sent DeleteEmojiAck: %s\n", json_string);
+ cJSON_free(json_string);
+ cJSON_Delete(json);
+ return ret;
+}
+
+/* 发送下载表情应答 DownloadEmojiAck */
+int ln_ws_send_download_emoji_ack(const char *character_id, const char *eyesColor, const char *eyesShape, bool success, const char *msg)
+{
+ if (ln_ws_get_connection_state() != 2)
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Cannot send DownloadEmojiAck, connection state: %d\n", ln_ws_get_connection_state());
+ return -1;
+ }
+
+ uint32_t timestamp;
+ uapi_get_timestampe_ss(×tamp);
+
+ cJSON *json = cJSON_CreateObject();
+ if (!json)
+ return -1;
+
+ cJSON_AddStringToObject(json, "deviceId", uapi_ln_get_device_id());
+ cJSON_AddNumberToObject(json, "timestamp", (double)timestamp);
+
+ char message_id[64];
+ snprintf(message_id, sizeof(message_id), "ack_download_emoji_%u", timestamp);
+ cJSON_AddStringToObject(json, "messageId", message_id);
+ cJSON_AddStringToObject(json, "command", "DownloadEmojiAck");
+
+ cJSON *data = cJSON_CreateObject();
+ if (!data)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+ cJSON_AddStringToObject(data, "characterId", character_id ? character_id : "");
+ cJSON_AddStringToObject(data, "eyesColor", eyesColor ? eyesColor : "");
+ cJSON_AddStringToObject(data, "eyesShape", eyesShape ? eyesShape : "");
+ cJSON_AddBoolToObject(data, "success", success);
+ cJSON_AddStringToObject(data, "message", msg ? msg : (success ? "表情下载成功" : "表情下载失败"));
+ cJSON_AddItemToObject(json, "data", data);
+
+ char *json_string = cJSON_Print(json);
+ if (!json_string)
+ {
+ cJSON_Delete(json);
+ return -1;
+ }
+
+ int ret = uapi_ws_send_text(json_string);
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Sent DownloadEmojiAck: %s\n", json_string);
+ cJSON_free(json_string);
+ cJSON_Delete(json);
+ return ret;
+}
\ No newline at end of file