雷鸟:升级任务获取接口at测试验证,还差ota包下载 2203/1 2203/head 2204/target/1
authorluozheng <1732036298@qq.com>
Thu, 4 Sep 2025 03:15:16 +0000 (11:15 +0800)
committerluozheng <1732036298@qq.com>
Thu, 4 Sep 2025 03:15:16 +0000 (11:15 +0800)
code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api.h

index f46655b..488bc5a 100644 (file)
@@ -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)
index 0f7f763..eb8055e 100644 (file)
@@ -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);
index 9cd6a8d..6ecfa2a 100644 (file)
@@ -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
 {