From 0ff21a19774c96dfd03940b0fa2b6b67774839ff Mon Sep 17 00:00:00 2001 From: luozheng <1732036298@qq.com> Date: Thu, 4 Sep 2025 11:15:16 +0800 Subject: [PATCH] =?utf8?q?=E9=9B=B7=E9=B8=9F=EF=BC=9A=E5=8D=87=E7=BA=A7?= =?utf8?q?=E4=BB=BB=E5=8A=A1=E8=8E=B7=E5=8F=96=E6=8E=A5=E5=8F=A3at?= =?utf8?q?=E6=B5=8B=E8=AF=95=E9=AA=8C=E8=AF=81=EF=BC=8C=E8=BF=98=E5=B7=AEo?= =?utf8?q?ta=E5=8C=85=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../zhihui/leiniao/imsl_ln/leiniao_api_at.c | 10 ++ code/sdk/zhihui/leiniao/imsl_ln/ln_api.c | 94 ++++++++++++++++++- code/sdk/zhihui/leiniao/imsl_ln/ln_api.h | 4 + 3 files changed, 103 insertions(+), 5 deletions(-) diff --git a/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c b/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c index f46655b04..488bc5a6c 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c @@ -615,6 +615,15 @@ static uint32_t ln_device_get_userid_at(uint8_t *para, uint32_t paraLen, char *s return ERRCODE_SUCC; } +/* OTA-获取升级任务:AT^LN_OTA_GET_TASK */ +static uint32_t ln_ota_get_task_at(uint8_t *para, uint32_t paraLen, char *strCommonCmd) +{ + VAD_UNUSED(para); VAD_UNUSED(paraLen); VAD_UNUSED(strCommonCmd); + printf("[LN][OTA_GET_TASK]\n"); + do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_OTA_GET_TASK, NULL, 0); + return ERRCODE_SUCC; +} + static const at_cmd_table_t g_ln_api_cmd[] = { /* ----------------------------------- VAD ---------------------------------- */ @@ -637,6 +646,7 @@ static const at_cmd_table_t g_ln_api_cmd[] = { {(char *)"AT^LN_STORY_FINISH", ln_story_finish_at, (char *)"确认结束哄睡(JSON): AT^LN_STORY_FINISH"}, {(char *)"AT^LN_DEV_CHARACTER", ln_device_get_character_at, (char *)"获取设备角色信息(JSON,GET): AT^LN_DEV_CHARACTER"}, {(char *)"AT^LN_DEV_USERID", ln_device_get_userid_at, (char *)"获取设备绑定用户ID(JSON,GET): AT^LN_DEV_USERID"}, + {(char *)"AT^LN_OTA_GET_TASK", ln_ota_get_task_at, (char *)"获取OTA升级任务(JSON,GET): AT^LN_OTA_GET_TASK"}, }; at_cmd_table_t *get_leiniao_api_cmd_table(uint32_t *cmd_count) diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c index 0f7f76347..eb8055ebd 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.c @@ -83,12 +83,14 @@ void uapi_ln_clear_device_token(void) #define LN_STORY_FINISH_PATH "/v1/story/finishSleepMode" #define LN_DEVICE_GET_CHARACTER_PATH "/v1/device/getCharacter" #define LN_DEVICE_GET_USER_ID_PATH "/v1/device/getUserId" +#define LN_OTA_GET_TASK_PATH "/v1/upgrade/getTask" #define LN_STORY_CHOOSE_URL LN_BASE_URL LN_STORY_CHOOSE_PATH #define LN_STORY_RANDOM_URL LN_BASE_URL LN_STORY_RANDOM_PATH #define LN_STORY_EXIT_INQUIRY_URL LN_BASE_URL LN_STORY_EXIT_INQUIRY_PATH #define LN_STORY_FINISH_URL LN_BASE_URL LN_STORY_FINISH_PATH #define LN_DEVICE_GET_CHARACTER_URL LN_BASE_URL LN_DEVICE_GET_CHARACTER_PATH #define LN_DEVICE_GET_USER_ID_URL LN_BASE_URL LN_DEVICE_GET_USER_ID_PATH +#define LN_OTA_GET_TASK_URL LN_BASE_URL LN_OTA_GET_TASK_PATH #define LN_SIGN_SECRET "vDdXVXgPUEUM6_piUjz5AEhMvYTSFzQdPaN-ogKnSus=" /* 生成[a-zA-Z0-9]随机串 */ @@ -789,6 +791,7 @@ static uint32_t ln_story_random_http(const char *device_id, /* 发送 POST 请求 */ HTTPC_RESULT res = HttpClientPostRequest(&client, LN_STORY_RANDOM_URL, &clientData); + printf("story random: send POST request result: %d\n", res); if (res != HTTP_SUCCESS) { if (res == HTTP_EAGAIN) { /* 驱动状态机直到成功或失败 */ @@ -809,6 +812,8 @@ static uint32_t ln_story_random_http(const char *device_id, } } + printf("story random: send POST request success\n"); + /* 检查 HTTP 响应码 */ int http_code = HttpClientGetResponseCode(&client); if (http_code != 200) { @@ -828,14 +833,19 @@ static uint32_t ln_story_random_http(const char *device_id, return ERRCODE_FAIL; } + printf("story random: HTTP response code (%d)\n", http_code); + /* 循环接收 SSE 分块数据(带累积处理)*/ int loop_guard = 0; char sse_acc[4096] = {0}; // SSE 数据累积缓冲区 int sse_acc_len = 0; const int MAX_LOOP = 2000; // 约 40 秒超时(20ms * 2000) - while (loop_guard++ < MAX_LOOP) { + while (loop_guard++ < MAX_LOOP) + { HTTPC_RESULT recv_res = HttpClientRecvResponse(&client, &clientData); - if (recv_res == HTTP_SUCCESS || recv_res == HTTP_EAGAIN) { + printf("story random: recv response result: %d\n", recv_res); + if (recv_res == HTTP_SUCCESS || recv_res == HTTP_EAGAIN) + { if (clientData.responseBuf && clientData.responseBufLen > 0) { // 累积并分发 SSE 数据 ln_sse_accumulate_and_dispatch(LN_HTTP_RECV_STORY_RANDOM, @@ -847,7 +857,9 @@ static uint32_t ln_story_random_http(const char *device_id, LOS_Msleep(20); // 无数据时短暂休眠 } continue; - } else { + } + else + { printf("story random: SSE receive ended (code: %d)\n", recv_res); break; } @@ -1123,6 +1135,71 @@ end: +/* ============================ OTA 升级任务接口 Start ============================ */ +/* 设备-获取OTA升级任务(GET, JSON,带查询参数 deviceId, sourceVersion)*/ +static uint32_t ln_ota_get_task_http(const char *device_id, + const char *device_token, + const char *source_version) +{ + if (!device_id || !device_token || !source_version) return ERRCODE_FAIL; + + /* CAT1 保活 */ + cat1_api_add_cat1_vote(); cat1_api_wakeup_cat1(1); cat1_api_keep_wakeup(1); cat1_api_disable_cat1_cmd(0); + + HttpClient client = (HttpClient){0}; HttpClientData clientData = (HttpClientData){0}; + client.isHttp = false; client.remotePort = 443; + + /* 头:与 device info 一致,额外带 model/version 可辅助服务端日志定位 */ + char header_buf[512]; + int hdr = snprintf(header_buf, sizeof(header_buf), + "deviceId: %s\r\n" + "deviceToken: %s\r\n" + "deviceModel: %s\r\n" + "deviceVersion: %s\r\n" + "Content-Type: application/json\r\n", + device_id, device_token, + (uapi_ln_get_device_model() ? uapi_ln_get_device_model() : "abmybox_1"), + (uapi_ln_get_device_version() ? uapi_ln_get_device_version() : "1.0.0")); + if (hdr <= 0 || hdr >= (int)sizeof(header_buf)) return ERRCODE_FAIL; + HttpClientSetCustomHeader(&client, header_buf); + + HTTPC_RESULT prep = ln_http_prepare_auto(&clientData, 2048, 8 * 1024); + if (prep != HTTP_SUCCESS) return ERRCODE_FAIL; + + /* 拼 GET URL 参数 */ + char url_with_params[512]; + int ulen = snprintf(url_with_params, sizeof(url_with_params), + "%s?deviceId=%s&sourceVersion=%s", + LN_OTA_GET_TASK_URL, device_id, source_version); + if (ulen <= 0 || ulen >= (int)sizeof(url_with_params)) { HttpClientUnprepare(&clientData); return ERRCODE_FAIL; } + + printf("[OTA] GET %s\n", url_with_params); + + HTTPC_RESULT res = HttpClientGetRequest(&client, url_with_params, &clientData); + if (res != HTTP_SUCCESS) { printf("[OTA] getTask failed %d\n", res); goto end; } + + int code = HttpClientGetResponseCode(&client); + printf("[OTA] HTTP %d\n", code); + if (code != 200) { + if (clientData.responseBuf && clientData.responseBufLen > 0) { + int real_len = clientData.responseContentLen > 0 ? clientData.responseContentLen : clientData.responseBufLen; + do_ln_http_server_recv_data(LN_HTTP_RECV_OTA_TASK, clientData.responseBuf, (uint32_t)real_len); + } + goto end; + } + + if (clientData.responseBuf && clientData.responseBufLen > 0) { + int real_len = clientData.responseContentLen > 0 ? clientData.responseContentLen : clientData.responseBufLen; + do_ln_http_server_recv_data(LN_HTTP_RECV_OTA_TASK, clientData.responseBuf, (uint32_t)real_len); + } + +end: + HttpClientUnprepare(&clientData); HttpClientClse(&client); return ERRCODE_SUCC; +} +/* ============================ OTA 升级任务接口 End ============================ */ + + + // 发送队列 static void ln_http_server_send_task(void const *arg) { @@ -1195,6 +1272,11 @@ static void ln_http_server_send_task(void const *arg) printf("LN_HTTP_SERVICE_CMD_GET_USER_ID\n"); ln_device_get_user_id_http(uapi_ln_get_device_id(), uapi_ln_get_device_token()); } + else if (mail.cmd == LN_HTTP_SERVICE_CMD_OTA_GET_TASK) + { + printf("LN_HTTP_SERVICE_CMD_OTA_GET_TASK\n"); + ln_ota_get_task_http(uapi_ln_get_device_id(), uapi_ln_get_device_token(), uapi_ln_get_device_version()); + } if (mail.data != NULL) { printf("free(mail.data)\n"); @@ -1225,7 +1307,8 @@ static void ln_http_server_recv_task(void const *arg) || mail.cmd == LN_HTTP_RECV_STORY_EXIT || mail.cmd == LN_HTTP_RECV_STORY_FINISH || mail.cmd == LN_HTTP_RECV_DEVICE_CHARACTER - || mail.cmd == LN_HTTP_RECV_DEVICE_USER_ID) + || mail.cmd == LN_HTTP_RECV_DEVICE_USER_ID + || mail.cmd == LN_HTTP_RECV_OTA_TASK) { if (mail.data && mail.len) { @@ -1236,7 +1319,8 @@ static void ln_http_server_recv_task(void const *arg) (mail.cmd == LN_HTTP_RECV_STORY_EXIT) ? "STORY_EXIT" : (mail.cmd == LN_HTTP_RECV_STORY_FINISH) ? "STORY_FINISH" : (mail.cmd == LN_HTTP_RECV_DEVICE_CHARACTER) ? "DEVICE_CHARACTER" : - (mail.cmd == LN_HTTP_RECV_DEVICE_USER_ID) ? "DEVICE_USER_ID" : "UNKNOWN"; + (mail.cmd == LN_HTTP_RECV_DEVICE_USER_ID) ? "DEVICE_USER_ID" : + (mail.cmd == LN_HTTP_RECV_OTA_TASK) ? "OTA_TASK" : "UNKNOWN"; printf("[%s] SSE raw len=%u\n", tag, mail.len); /* 确保可打印:追加\0 */ char *buf = (char *)malloc(mail.len + 1); diff --git a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h index 9cd6a8da2..6ecfa2a04 100644 --- a/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h +++ b/code/sdk/zhihui/leiniao/imsl_ln/ln_api.h @@ -35,6 +35,10 @@ typedef struct /* 设备信息相关接收命令 */ #define LN_HTTP_RECV_DEVICE_CHARACTER 0x40 /* 设备角色信息 接收 */ #define LN_HTTP_RECV_DEVICE_USER_ID 0x41 /* 设备绑定用户ID 接收 */ +/* OTA 升级相关命令 */ +#define LN_HTTP_SERVICE_CMD_OTA_GET_TASK 0x50 /* 获取OTA升级任务(JSON, GET,带查询参数)*/ +/* OTA 升级相关接收命令 */ +#define LN_HTTP_RECV_OTA_TASK 0x60 /* OTA 升级任务 接收 */ typedef struct { -- 2.17.1