优化文件接收逻辑。添加重复包判定。 469/2 469/head
authorSnickerSun <snickersun@163.com>
Fri, 5 Jul 2024 13:48:56 +0000 (21:48 +0800)
committerSnickerSun <snickersun@163.com>
Fri, 5 Jul 2024 13:48:56 +0000 (21:48 +0800)
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c

index 712f4cc..e452be9 100644 (file)
@@ -360,6 +360,8 @@ typedef struct
     uint32_t last_timestamp;// last package receive time\r
     uint8_t receive_file_flag;//1 接收文件 0 不接收文件\r
     file_recv_stat_t file_recv_stat;\r
+    uint8_t last_data_sample[5]; //专门给文件传输过程中重复包判定用。目前只是取前5个字节,实际应该再做优化算法。\r
+    uint16_t last_data_size;//专门给传输过程中重复包判定用,记录上一个包的长度,至少长度相同才有判断重复的必要。同时也可以作为少于5个字节的包的判定依据。\r
 } ble_read_data;\r
 \r
 #define MAX_HANDLE_NUM 10\r
@@ -6108,13 +6110,50 @@ void Set_OTA_recv_value()
     return;\r
 }\r
 \r
+static errcode_t save_package_sample(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size)\r
+{\r
+\r
+    int cmp_len = 5;\r
+    if (event_size < 5)\r
+    {\r
+        cmp_len = event_size;\r
+    }\r
+    memset(buffer_handle->last_data_sample,0,sizeof(buffer_handle->last_data_sample));\r
+    buffer_handle->last_data_size = event_size;\r
+    memcpy_s(buffer_handle->last_data_sample,sizeof(buffer_handle->last_data_sample),data,cmp_len);\r
+\r
+    return ERRCODE_SUCC;\r
+}\r
+static errcode_t check_package_same(uint8_t* lastdata,uint8_t *newdata , uint16_t cmp_size)\r
+{\r
+\r
+    int cmp_len = 5;\r
+    if (cmp_size < 5)\r
+    {\r
+        cmp_len = cmp_size;\r
+    }\r
+    if (memcmp(lastdata,newdata,cmp_len)==0)\r
+    {\r
+        return ERRCODE_SUCC;\r
+    }else{\r
+        return ERRCODE_FAIL;\r
+    }\r
+}\r
 errcode_t handle_recv_file(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size)\r
 {\r
 \r
     if( event_size == 0 || data == NULL ) return ERRCODE_FAIL;\r
     \r
-\r
+    if (buffer_handle->last_data_size == event_size)\r
+    {\r
+        if (check_package_same(buffer_handle->last_data_sample,data,event_size) == ERRCODE_SUCC)\r
+        {\r
+            return ERRCODE_FAIL;\r
+        }\r
+    }\r
     printf("handle_recv_file %d\n",event_size);\r
+    save_package_sample(buffer_handle,data,event_size);\r
+\r
 \r
     //第一帧要创建文件\r
     if((buffer_handle->file_recv_stat.recv_file_stat <= 0) && buffer_handle->file_recv_stat.file == NULL )\r