增加数据回调
authorhcj <1224667075@qq.com>
Mon, 8 Dec 2025 09:49:54 +0000 (17:49 +0800)
committerhcj <1224667075@qq.com>
Mon, 8 Dec 2025 09:49:54 +0000 (17:49 +0800)
code/sdk/zhihui/4g/cat1Service/Service/http_file_download_client.c
code/sdk/zhihui/4g/cat1Service/include/http_file_download_client.h

index 30b5b6c..0064923 100644 (file)
@@ -80,6 +80,7 @@ static int g_download_file_fd = -1;  /* 下载文件句柄 */
 static char g_download_file_path[512] = {0};  /* 下载文件路径 */
 static uint32_t g_total_received_bytes = 0;  /* 总接收字节数 */
 static uint32_t g_total_received_packets = 0;  /* 总接收包数 */
+static http_file_download_data_callback_t g_external_data_callback = NULL;  /* 外部数据回调函数 */
 
 /* 前向声明 */
 extern void udp_send_msg_toCat1(uint8_t cmd, char *content);
@@ -125,6 +126,15 @@ static int http_download_spi_data_callback(const uint8_t *data, uint32_t data_le
         cat1_print_info("HTTP download: Packet #%u, data_len=%u, total_bytes=%u (file not open)\n", 
                        packet_num, data_len, g_total_received_bytes);
     }
+    
+    // 调用外部注册的回调函数(如果已注册)
+    if (g_external_data_callback != NULL) {
+        int ret = g_external_data_callback(data, data_len, packet_num);
+        if (ret != 0) {
+            cat1_print_err("HTTP download: External callback returned error: %d\n", ret);
+            return ret;
+        }
+    }
 
     if(data_len!=SPI_PACKET_DATA_SIZE)
     {
@@ -136,18 +146,30 @@ static int http_download_spi_data_callback(const uint8_t *data, uint32_t data_le
 
 /**
  * @brief 初始化HTTP文件下载服务
+ * @param callback 外部数据回调函数指针,NULL表示不使用外部回调
  * @return 0成功,-1失败
  */
-int http_file_download_init(void)
+int http_file_download_init(http_file_download_data_callback_t callback)
 {
     cat1_print_info("HTTP file download service: Initializing...\n");
     
     // 检查是否已经初始化
     if (g_download_complete_sem != NULL) {
         cat1_print_warning("HTTP file download service: Already initialized\n");
+        // 如果已经初始化,仍然可以更新回调函数
+        if (callback != NULL) {
+            g_external_data_callback = callback;
+            cat1_print_info("HTTP file download service: External callback updated\n");
+        }
         return 0;
     }
     
+    // 保存外部回调函数
+    g_external_data_callback = callback;
+    if (callback != NULL) {
+        cat1_print_info("HTTP file download service: External callback registered\n");
+    }
+    
     // 创建下载完成信号量(初始值为0,用于阻塞等待)
     g_download_complete_sem = osSemaphoreNew(1, 0, NULL);
     if (g_download_complete_sem == NULL) {
@@ -202,6 +224,7 @@ void http_file_download_deinit(void)
     g_download_state = HTTP_DOWNLOAD_STATE_IDLE;
     g_total_received_bytes = 0;
     g_total_received_packets = 0;
+    g_external_data_callback = NULL;  /* 清除外部回调函数 */
     
     cat1_print_info("HTTP file download service: Deinitialized successfully\n");
 }
index 6b720ce..0ee4201 100644 (file)
@@ -23,11 +23,22 @@ typedef enum {
     HTTP_DOWNLOAD_STATE_ERROR          /* 下载错误 */
 } http_download_state_t;
 
+/* 外部数据回调函数类型 */
+/**
+ * @brief HTTP下载数据接收回调函数类型
+ * @param data 接收到的数据指针(不包含包头,仅数据部分)
+ * @param data_len 数据长度(从包头解析得到)
+ * @param packet_num 包序号(从1开始递增)
+ * @return 0表示成功,非0表示失败
+ */
+typedef int (*http_file_download_data_callback_t)(const uint8_t *data, uint32_t data_len, uint32_t packet_num);
+
 /**
  * @brief 初始化HTTP文件下载服务
+ * @param callback 外部数据回调函数指针,NULL表示不使用外部回调
  * @return 0成功,-1失败
  */
-int http_file_download_init(void);
+int http_file_download_init(http_file_download_data_callback_t callback);
 
 /**
  * @brief 反初始化HTTP文件下载服务