From c1751d96713546e6a31fb91dac0a693dea6bcba3 Mon Sep 17 00:00:00 2001 From: SnickerSun Date: Fri, 5 Jul 2024 21:48:56 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96=E6=96=87=E4=BB=B6=E6=8E=A5?= =?utf8?q?=E6=94=B6=E9=80=BB=E8=BE=91=E3=80=82=E6=B7=BB=E5=8A=A0=E9=87=8D?= =?utf8?q?=E5=A4=8D=E5=8C=85=E5=88=A4=E5=AE=9A=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../service/ble_service/bleservice/bleEvent.c | 41 ++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c index 712f4ccd0..e452be920 100644 --- a/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c +++ b/code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c @@ -360,6 +360,8 @@ typedef struct uint32_t last_timestamp;// last package receive time uint8_t receive_file_flag;//1 接收文件 0 不接收文件 file_recv_stat_t file_recv_stat; + uint8_t last_data_sample[5]; //专门给文件传输过程中重复包判定用。目前只是取前5个字节,实际应该再做优化算法。 + uint16_t last_data_size;//专门给传输过程中重复包判定用,记录上一个包的长度,至少长度相同才有判断重复的必要。同时也可以作为少于5个字节的包的判定依据。 } ble_read_data; #define MAX_HANDLE_NUM 10 @@ -6108,13 +6110,50 @@ void Set_OTA_recv_value() return; } +static errcode_t save_package_sample(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size) +{ + + int cmp_len = 5; + if (event_size < 5) + { + cmp_len = event_size; + } + memset(buffer_handle->last_data_sample,0,sizeof(buffer_handle->last_data_sample)); + buffer_handle->last_data_size = event_size; + memcpy_s(buffer_handle->last_data_sample,sizeof(buffer_handle->last_data_sample),data,cmp_len); + + return ERRCODE_SUCC; +} +static errcode_t check_package_same(uint8_t* lastdata,uint8_t *newdata , uint16_t cmp_size) +{ + + int cmp_len = 5; + if (cmp_size < 5) + { + cmp_len = cmp_size; + } + if (memcmp(lastdata,newdata,cmp_len)==0) + { + return ERRCODE_SUCC; + }else{ + return ERRCODE_FAIL; + } +} errcode_t handle_recv_file(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size) { if( event_size == 0 || data == NULL ) return ERRCODE_FAIL; - + if (buffer_handle->last_data_size == event_size) + { + if (check_package_same(buffer_handle->last_data_sample,data,event_size) == ERRCODE_SUCC) + { + return ERRCODE_FAIL; + } + } printf("handle_recv_file %d\n",event_size); + save_package_sample(buffer_handle,data,event_size); + //第一帧要创建文件 if((buffer_handle->file_recv_stat.recv_file_stat <= 0) && buffer_handle->file_recv_stat.file == NULL ) -- 2.17.1