From e0124c6670c7d49a044f80cc8f8abb2a20761fda Mon Sep 17 00:00:00 2001 From: penglei <1624952103@qq.com> Date: Sun, 28 Sep 2025 14:23:53 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96GNSS=20HTTP=E6=9C=8D=E5=8A=A1?= =?utf8?q?=E5=88=9B=E5=BB=BA=EF=BC=8C=E4=BC=98=E5=8C=96EG810=E8=8E=B7?= =?utf8?q?=E5=8F=96ICCID=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../brandy/brandy_standard/thread_pri_init.c | 2 +- .../src/EphemerisDownloadModel.cpp | 2 +- .../src/EphemerisDownloadModel.cpp | 2 +- .../src/EphemerisDownloadModel.cpp | 2 +- .../4g/cat1Service/Service/cat1_server.c | 7 +- .../services/gnss/inc/gnss_http_server.h | 4 + .../gnss/sample/pgnss_sample/pgnss_sample.c | 19 ++- .../services/gnss/src/gnss_http_server.c | 158 +++++++++++++++++- 8 files changed, 178 insertions(+), 18 deletions(-) diff --git a/code/sdk/application/brandy/brandy_standard/thread_pri_init.c b/code/sdk/application/brandy/brandy_standard/thread_pri_init.c index 2ec1c9291..2dcde317b 100644 --- a/code/sdk/application/brandy/brandy_standard/thread_pri_init.c +++ b/code/sdk/application/brandy/brandy_standard/thread_pri_init.c @@ -618,7 +618,7 @@ static void thread_main(const void *unused) #ifdef SUPPORT_GNSS gnss_uart_init(); - uapi_gnss_http_server_init(); + // uapi_gnss_http_server_init(); #endif #ifdef SUPPORT_OHOSFWK diff --git a/code/sdk/application/wearable/fd230/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp b/code/sdk/application/wearable/fd230/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp index ebfd88540..e7189fe77 100644 --- a/code/sdk/application/wearable/fd230/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp +++ b/code/sdk/application/wearable/fd230/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp @@ -48,7 +48,7 @@ void EphemerisDownloadModel::DownloadEphemeris() { #endif ephemerisDownloadStatus = EphemerisDownloadStatus::DOWNLOADING; #if defined(SUPPORT_GNSS) - do_gnss_http_server_send_data(GNSS_HTTP_SERVICE_CMD_DOWNLOAD_AGNSS, NULL, 0); + uapi_gnss_start_agnss_download(); #endif } /* diff --git a/code/sdk/application/wearable/fd272/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp b/code/sdk/application/wearable/fd272/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp index 5ecf495cd..68ef854f6 100644 --- a/code/sdk/application/wearable/fd272/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp +++ b/code/sdk/application/wearable/fd272/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp @@ -47,7 +47,7 @@ void EphemerisDownloadModel::DownloadEphemeris() { #endif ephemerisDownloadStatus = EphemerisDownloadStatus::DOWNLOADING; #if defined(SUPPORT_GNSS) - do_gnss_http_server_send_data(GNSS_HTTP_SERVICE_CMD_DOWNLOAD_AGNSS, NULL, 0); + uapi_gnss_start_agnss_download(); #endif } /* diff --git a/code/sdk/application/wearable/n9/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp b/code/sdk/application/wearable/n9/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp index 5ecf495cd..68ef854f6 100644 --- a/code/sdk/application/wearable/n9/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp +++ b/code/sdk/application/wearable/n9/nativeapp/nativeui/ephemeris_download/src/EphemerisDownloadModel.cpp @@ -47,7 +47,7 @@ void EphemerisDownloadModel::DownloadEphemeris() { #endif ephemerisDownloadStatus = EphemerisDownloadStatus::DOWNLOADING; #if defined(SUPPORT_GNSS) - do_gnss_http_server_send_data(GNSS_HTTP_SERVICE_CMD_DOWNLOAD_AGNSS, NULL, 0); + uapi_gnss_start_agnss_download(); #endif } /* diff --git a/code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c b/code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c index 9f07fbaae..1151dc72e 100644 --- a/code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c +++ b/code/sdk/zhihui/4g/cat1Service/Service/cat1_server.c @@ -652,9 +652,6 @@ static int decodeNetStat(char* msg) { update++; cat1_api_runtime_set_cat1_imei(ppbuf); - - cat1_print_info("IMEI received, sending AT+ICCID command\n"); - cat1_at_cmd("AT+ICCID"); } continue; }else if(strncmp(s,"sim:",4) == 0) @@ -1391,6 +1388,10 @@ static int udp_packet_parse(char *rx_buffer, int len) restart_time_sync(); cat1_getsignal(); + + cat1_print_info("IMEI received, sending AT+ICCID command\n"); + cat1_at_cmd("AT+ICCID"); + if (g_msg_callback_func!=NULL) { g_msg_callback_func(MESSAGE_4G_POWERON,NULL,0); diff --git a/code/sdk/zhihui/services/gnss/inc/gnss_http_server.h b/code/sdk/zhihui/services/gnss/inc/gnss_http_server.h index 880d797fa..a970c6f09 100644 --- a/code/sdk/zhihui/services/gnss/inc/gnss_http_server.h +++ b/code/sdk/zhihui/services/gnss/inc/gnss_http_server.h @@ -36,6 +36,7 @@ // void do_gnss_http_server_send_data(int cmd,int *data,uint32_t len); errcode_t uapi_gnss_http_server_init(void); +errcode_t uapi_gnss_http_server_deinit(void); void do_gnss_http_server_send_data(int cmd,char *data,uint32_t len); // 返回值: 过期返回0,有效返回剩余时间的分钟数,错误返回-1 @@ -52,6 +53,9 @@ int gnss_start_agnss_download_simple(void); // 测试函数 int gnss_test_agnss_status_simple(void); + +// 封装的AGNSS下载接口:初始化服务并开始下载 +errcode_t uapi_gnss_start_agnss_download(void); #ifdef __cplusplus #if __cplusplus diff --git a/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.c b/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.c index a7768cc35..175b41c3b 100644 --- a/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.c +++ b/code/sdk/zhihui/services/gnss/sample/pgnss_sample/pgnss_sample.c @@ -777,9 +777,13 @@ static int pgnss_startup_check(void) printf("4G is powered on. Starting AGNSS download process...\n"); - // 第一次发送下载指令 - printf("Sending first download command...\n"); - do_gnss_http_server_send_data(GNSS_HTTP_SERVICE_CMD_DOWNLOAD_AGNSS, NULL, 0); + printf("Starting AGNSS download with integrated interface...\n"); + errcode_t download_ret = uapi_gnss_start_agnss_download(); + if (download_ret != ERRCODE_SUCC) { + printf("ERROR: Failed to start AGNSS download: %d\n", download_ret); + return 1; + } + printf("AGNSS download started successfully\n"); // 每10秒检查一次,最多检查6次(60秒) int check_count = 0; @@ -796,13 +800,17 @@ static int pgnss_startup_check(void) if (!check_agnss_folder_expired()) { printf("✓ AGNSS files downloaded successfully after %d seconds\n", check_count * 10); printf("=== PGNSS Startup Check Passed ===\n"); + + printf("Deinitializing GNSS HTTP server...\n"); + uapi_gnss_http_server_deinit(); + printf("GNSS HTTP server deinitialized successfully\n"); return 0; // 检查通过,可以正常启动PGNSS } // 在第3次检查后(30秒)发送重试指令 if (check_count == 3 && !retry_sent) { - printf("No files found after 30s. Sending second download command...\n"); + printf("No files found after 30s. Sending retry download command...\n"); do_gnss_http_server_send_data(GNSS_HTTP_SERVICE_CMD_DOWNLOAD_AGNSS, NULL, 0); retry_sent = 1; } @@ -811,6 +819,9 @@ static int pgnss_startup_check(void) // 60秒后还没有数据,降级为冷启动 printf("ERROR: No AGNSS files downloaded after 60 seconds. Need cold start mode\n"); + printf("Deinitializing GNSS HTTP server...\n"); + uapi_gnss_http_server_deinit(); + printf("GNSS HTTP server deinitialized successfully\n"); return 1; // 检查失败,需要冷启动 } diff --git a/code/sdk/zhihui/services/gnss/src/gnss_http_server.c b/code/sdk/zhihui/services/gnss/src/gnss_http_server.c index 4b7b4b10d..2c7f96034 100644 --- a/code/sdk/zhihui/services/gnss/src/gnss_http_server.c +++ b/code/sdk/zhihui/services/gnss/src/gnss_http_server.c @@ -60,6 +60,11 @@ static unsigned long g_app_send_queue= 0xFFFFFFFF; static app_task_definition_t send_taskcfg={0}; static app_task_definition_t recv_taskcfg={0}; +// 线程状态管理 +static int g_gnss_http_server_initialized = 0; +static osThreadId_t g_send_thread_id = NULL; +static osThreadId_t g_recv_thread_id = NULL; + static void cleanup_agnss_response_buffer(void); static void agnss_accumulate_data(const char *data, size_t len); @@ -1770,38 +1775,69 @@ static void create_gnss_http_recv_queue(void) } } -#define GNSS_HTTP_BOARD_TASK_SIZE 0x2000 + errcode_t uapi_gnss_http_server_init(void) { PRINT("uapi_gnss_http_server_init !\r\n"); + // 检查是否已经初始化 + if (g_gnss_http_server_initialized) { + PRINT("GNSS HTTP server already initialized\r\n"); + return ERRCODE_SUCC; + } + + // 配置发送线程 send_taskcfg.create_queue_handle = create_gnss_http_send_queue; send_taskcfg.attr.name="gnss_http_server_send_task"; - send_taskcfg.attr.priority = osPriorityNormal; - send_taskcfg.attr.stack_size = GNSS_HTTP_BOARD_TASK_SIZE; + send_taskcfg.attr.priority = osPriorityNormal1; + send_taskcfg.attr.stack_size = 0x1000; send_taskcfg.func = gnss_http_server_send_task; send_taskcfg.use_mem = USE_EXTEND_MEM; - errcode_t ret=uapi_create_osThread_custom(&send_taskcfg); + // 创建发送线程 + errcode_t ret = uapi_create_osThread_custom(&send_taskcfg); if(ret != ERRCODE_SUCC) { PRINT("create gnss_send_service failed %d!\r\n",ret); return ERRCODE_FAIL; } + g_send_thread_id = send_taskcfg.task_handle; + PRINT("GNSS send thread created, ID: %p\r\n", g_send_thread_id); + // 配置接收线程 recv_taskcfg.create_queue_handle = create_gnss_http_recv_queue; recv_taskcfg.attr.name="gnss_http_server_recv_task"; - recv_taskcfg.attr.priority = osPriorityNormal1; - recv_taskcfg.attr.stack_size = GNSS_HTTP_BOARD_TASK_SIZE; + recv_taskcfg.attr.priority = osPriorityNormal; + recv_taskcfg.attr.stack_size = 0x2000; recv_taskcfg.func = gnss_http_server_recv_task; recv_taskcfg.use_mem = USE_EXTEND_MEM; - ret=uapi_create_osThread_custom(&recv_taskcfg); + // 创建接收线程 + ret = uapi_create_osThread_custom(&recv_taskcfg); if(ret != ERRCODE_SUCC) { PRINT("create gnss_recv_service failed %d!\r\n",ret); + + // 创建接收线程失败,需要清理发送线程 + if (g_send_thread_id != NULL) { + osThreadTerminate(g_send_thread_id); + g_send_thread_id = NULL; + } + + // 清理发送队列 + if (g_app_send_queue != 0xFFFFFFFF) { + osal_msg_queue_delete(g_app_send_queue); + g_app_send_queue = 0xFFFFFFFF; + } + return ERRCODE_FAIL; } + g_recv_thread_id = recv_taskcfg.task_handle; + PRINT("GNSS recv thread created, ID: %p\r\n", g_recv_thread_id); + + // 标记为已初始化 + g_gnss_http_server_initialized = 1; + PRINT("GNSS HTTP server initialized successfully\r\n"); return ERRCODE_SUCC; } @@ -2203,3 +2239,111 @@ int gnss_start_agnss_download_simple(void) printf("=== Simple AGNSS Download Completed ===\n"); return 0; } + +/** + * @brief GNSS HTTP服务去初始化函数 + * @return ERRCODE_SUCC 成功,ERRCODE_FAIL 失败 + */ +errcode_t uapi_gnss_http_server_deinit(void) +{ + PRINT("uapi_gnss_http_server_deinit !\r\n"); + + // 检查是否已经初始化 + if (!g_gnss_http_server_initialized) { + PRINT("GNSS HTTP server not initialized\r\n"); + return ERRCODE_SUCC; + } + int ret = 0; + // 清理全局状态 + g_download_status = 0; + g_has_valid_json_data = 0; + g_processing_count = 0; + g_total_files = 0; + g_downloaded_files = 0; + + // 清理响应缓冲区 + cleanup_agnss_response_buffer(); + + // 终止发送线程 + if (g_send_thread_id != NULL) { + // PRINT("Terminating GNSS send thread: %p\r\n", g_send_thread_id); + ret = osThreadTerminate(g_send_thread_id); + if(!ret) + { + PRINT("Terminating GNSS send thread failed\r\n"); + } + g_send_thread_id = NULL; + } + + // 终止接收线程 + if (g_recv_thread_id != NULL) { + // PRINT("Terminating GNSS recv thread: %p\r\n", g_recv_thread_id); + ret = osThreadTerminate(g_recv_thread_id); + if(!ret) + { + PRINT("Terminating GNSS recv thread failed\r\n"); + } + g_recv_thread_id = NULL; + } + + // 删除发送队列 + if (g_app_send_queue != 0xFFFFFFFF) { + PRINT("Deleting GNSS send queue\r\n"); + osal_msg_queue_delete(g_app_send_queue); + g_app_send_queue = 0xFFFFFFFF; + } + + // 删除接收队列 + if (g_app_recv_queue != 0xFFFFFFFF) { + PRINT("Deleting GNSS recv queue\r\n"); + osal_msg_queue_delete(g_app_recv_queue); + g_app_recv_queue = 0xFFFFFFFF; + } + + // 清理CAT1资源 +#ifdef SUPPORT_CAT1_SERVICE + cat1_api_remove_cat1_vote(); + cat1_api_keep_wakeup(0); + cat1_api_wakeup_cat1(0); + cat1_api_disable_cat1_cmd(0); + PRINT("CAT1 resources cleaned up\r\n"); +#endif + + // 重置任务配置结构体 + memset(&send_taskcfg, 0, sizeof(send_taskcfg)); + memset(&recv_taskcfg, 0, sizeof(recv_taskcfg)); + + // 标记为未初始化 + g_gnss_http_server_initialized = 0; + + PRINT("GNSS HTTP server deinitialized successfully\r\n"); + return ERRCODE_SUCC; +} + +/** + * @brief 封装的AGNSS下载接口:初始化服务并开始下载 + * @return ERRCODE_SUCC 成功启动下载,ERRCODE_FAIL 启动失败 + * @note 此函数会自动初始化GNSS HTTP服务并发送下载命令 + * 下载完成后需要调用 uapi_gnss_http_server_deinit() 清理资源 + */ +errcode_t uapi_gnss_start_agnss_download(void) +{ + PRINT("uapi_gnss_start_agnss_download: Starting AGNSS download process\r\n"); + + // 1. 初始化GNSS HTTP服务 + PRINT("Initializing GNSS HTTP server...\r\n"); + errcode_t init_ret = uapi_gnss_http_server_init(); + if (init_ret != ERRCODE_SUCC) { + PRINT("ERROR: Failed to initialize GNSS HTTP server: %d\r\n", init_ret); + return ERRCODE_FAIL; + } + PRINT("GNSS HTTP server initialized successfully\r\n"); + + // 2. 发送AGNSS下载命令 + PRINT("Sending AGNSS download command...\r\n"); + do_gnss_http_server_send_data(GNSS_HTTP_SERVICE_CMD_DOWNLOAD_AGNSS, NULL, 0); + PRINT("AGNSS download command sent successfully\r\n"); + + PRINT("uapi_gnss_start_agnss_download: AGNSS download started successfully\r\n"); + return ERRCODE_SUCC; +} -- 2.17.1