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
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