#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]随机串 */
/* 发送 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) {
/* 驱动状态机直到成功或失败 */
}
}
+ printf("story random: send POST request success\n");
+
/* 检查 HTTP 响应码 */
int http_code = HttpClientGetResponseCode(&client);
if (http_code != 200) {
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,
LOS_Msleep(20); // 无数据时短暂休眠
}
continue;
- } else {
+ }
+ else
+ {
printf("story random: SSE receive ended (code: %d)\n", recv_res);
break;
}
+/* ============================ 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)
{
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");
|| 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)
{
(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);