优化ble发送数据代码结构解决可能出现刚好满mtu导致发送空包问题,已经可能存在参数过多导致的安全隐患 809/1
authorhcj <1224667075@qq.com>
Wed, 28 Aug 2024 07:53:32 +0000 (15:53 +0800)
committerhcj <1224667075@qq.com>
Wed, 28 Aug 2024 07:53:32 +0000 (15:53 +0800)
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h

index 56678a5..43d0de0 100644 (file)
@@ -360,25 +360,27 @@ void sendDataNow(uint8_t *buf,uint16_t len)
     }\r
 }\r
 \r
-void send_big_data(uint8_t flag, char *data, uint16_t datalen, uint32_t total, uint32_t Packet_id, uint32_t packet_total, uint8_t type_id, uint8_t type)\r
+void send_big_data(ble_data_type type,char *data, uint16 datalen)\r
 {\r
     // 动态分配内存空间,防止堆栈溢出\r
-    uint8_t *buf = ym_malloc(17 + datalen + 1); \r
-    if (buf == NULL) {\r
+    uint8_t *buf =NULL;\r
+    buf = ym_malloc(17 + datalen + 1); \r
+    memset_s(buf,500,0,17 + datalen + 1);\r
+    if (buf == NULL && datalen!=0) {\r
         printf("内存分配失败\n");\r
         return;\r
     }\r
-    if(Packet_id>=2)\r
+    if(type.Packet_id>=2)\r
     {\r
         msleep(10);//多包数据发送增加延迟\r
     }\r
     // 设置消息头部信息\r
     buf[0] = 0x72; // 消息头\r
-    buf[1] = type; // 类型\r
-    buf[2] = type_id; // 类型ID\r
-    memcpy(buf + 3, &packet_total, 4); // 总包数\r
-    memcpy(buf + 7, &total, 4); // 总数据长度\r
-    memcpy(buf + 11, &Packet_id, 4); // 数据包ID\r
+    buf[1] = type.type; // 类型\r
+    buf[2] = type.type_id; // 类型ID\r
+    memcpy(buf + 3, &type.packet_total, 4); // 总包数\r
+    memcpy(buf + 7, &type.total, 4); // 总数据长度\r
+    memcpy(buf + 11, &type.Packet_id, 4); // 数据包ID\r
     memcpy(buf + 15, &datalen, 2); // 包数据长度\r
 \r
     // 处理数据和计算CRC\r
@@ -391,7 +393,7 @@ void send_big_data(uint8_t flag, char *data, uint16_t datalen, uint32_t total, u
     }\r
 \r
     // 根据标志位选择发送数据的方式\r
-    if (flag) {\r
+    if (1) {\r
         sendDataNow(buf, 17 + datalen + 1); // 直接发送数据\r
     } else {\r
         sendBleData(buf, 17 + datalen + 1); // 判断是否在传输或接收多包数据\r
@@ -409,7 +411,8 @@ void sendtraningstatedata(uint8_t state ,uint16_t time)
     data[0]=state;\r
     memcpy(&data[1],&time,2);\r
     printf("发送训练状态数据%d %d\r\n",data[0],time);\r
-    send_big_data(0,data,data_len,data_len,1,1,0x50,5);\r
+    ble_data_type type={0x05,0x50,data_len,1,1};\r
+    send_big_data(type,data,data_len);\r
     \r
 }\r
 \r
@@ -420,7 +423,10 @@ void sendtraningstateend(void)
     uint32_t data_len=1;\r
     data[0]=0;  //[0 结束]\r
     printf("发送训练状态结束%d\r\n",data[0]);\r
-    send_big_data(0,data,data_len,data_len,1,1,0x51,5);\r
+    \r
+    ble_data_type type={0x05,0x51,data_len,1,1};\r
+    send_big_data(type,data,data_len);\r
+    //end_big_data(0,data,data_len,data_len,1,1,0x51,5);\r
 }\r
 \r
 void sendtraningdata(msg_get_train_data_info_t *data)\r
@@ -457,7 +463,9 @@ void sendtraningdata(msg_get_train_data_info_t *data)
     }\r
     \r
     printf("发送训练实时数据 %d %s\n", data_len, jsonString);\r
-    send_big_data(0, jsonString, data_len, data_len, 1, 1, 0x0f, 1);\r
+    ble_data_type type={0x01,0x0f,data_len,1,1};\r
+    send_big_data(type,data,data_len);\r
+    //send_big_data(0, jsonString, data_len, data_len, 1, 1, 0x0f, 1);\r
     \r
     cJSON_free(jsonString);\r
 }\r
@@ -471,7 +479,10 @@ void send_AI_is_ready(uint8_t type)
 {\r
   \r
     printf("发送AI准备就绪\r\n");\r
-    send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x05, 5);\r
+     ble_data_type type_={0x05,0x05,1,1,1};\r
+    send_big_data(type_,(char *)&type,1);\r
+\r
+    //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x05, 5);\r
 }\r
 //查询AI 模型是否可用,结果通过2AE4返回\r
 /*使用模型:\r
@@ -483,7 +494,9 @@ void inquire_AI_is_ready(uint8_t type)
 {\r
   \r
     printf("查询AI模型,是否准备就绪\r\n");\r
-    send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x06, 5);\r
+    ble_data_type type_={0x05,0x06,1,1,1};\r
+    send_big_data(type_,(char *)&type,1);\r
+    //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x06, 5);\r
 }\r
 \r
 void cancel_AI_cur_chat(void)\r
@@ -491,7 +504,10 @@ void cancel_AI_cur_chat(void)
   \r
     printf("取消当前AI对话\r\n");\r
     uint8_t data=1;\r
-    send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5);\r
+    ble_data_type type_={0x05,0x07,data_len,1,1};\r
+    send_big_data(type_,(char *)&data,data_len);\r
+\r
+    //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5);\r
 }\r
 \r
 \r
@@ -894,6 +910,7 @@ static uint8_t *GetwatchSaveName(void)//获取手表本地保存的手机设备
     }\r
     \r
 }\r
+\r
 void cleanUnbindInfor(uint8_t flag)//和旧手机解绑清除配对信息\r
 {\r
     uint8_t value[19];\r
@@ -2630,7 +2647,10 @@ void APP_send_schedule_Cmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *tota
 \r
 void GetGPSCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)\r
 {\r
-   send_big_data(1,NULL,0,0,1,1,0x4f,2);\r
+    ble_data_type type_={0x02,0x4f,0,1,1};\r
+    send_big_data(type_,NULL,0);\r
+\r
+   //send_big_data(1,NULL,0,0,1,1,0x4f,2);\r
 }\r
 \r
 void query_dial_installed(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
@@ -3218,7 +3238,9 @@ void GetCurDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,ui
 {\r
     if(!Check_CRC(data,len,crcvalue))\r
     {\r
-        send_big_data(1,NULL,0,0,1,1,0x06,1);\r
+        int data_len=0;\r
+        ble_data_type type_={0x01,0x06,data_len,1,1};\r
+        send_big_data(type_,NULL,0);\r
         return;\r
     }\r
     cJSON *dataJSON = cJSON_CreateObject();\r
@@ -3291,14 +3313,21 @@ void GetCurDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,ui
         if(surplus_len>=pack_size)\r
         {\r
             surplus_len=surplus_len-pack_size;\r
-            send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,0x06,1);\r
+\r
+\r
+            ble_data_type type_={0x01,0x06,data_len,pack,pack_id};\r
+            send_big_data(type_,json_format+offset,pack_size);\r
+\r
+            //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,0x06,1);\r
             offset+=pack_size;\r
         }\r
         else\r
         {\r
             \r
             printf("%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
-            send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,0x06,1);\r
+             ble_data_type type_={0x01,0x06,data_len,pack,pack_id};\r
+            send_big_data(type_,json_format+offset,surplus_len);\r
+            //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,0x06,1);\r
             break;\r
         }\r
         pack_id++;\r
@@ -3635,7 +3664,10 @@ void sendRealTimeDataToAPP(uint8_t flag)
 {\r
     if(flag == 0)//校验失败\r
     {\r
-        send_big_data(0,NULL,0,0,1,1,0x0f,1);\r
+        ble_data_type type_={0x01,0x0f,0,1,1};\r
+        send_big_data(type_,NULL,0);\r
+\r
+        //send_big_data(0,NULL,0,0,1,1,0x0f,1);\r
 \r
     }else \r
     {\r
@@ -4336,7 +4368,9 @@ static void GetAllDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *to
             printf( "GetAllDialUidCmd yes\r\n");\r
 \r
         }\r
-        send_big_data(0,dail_uid_buf,data_size,temp_data_size,1,1,0x2a,1);\r
+        ble_data_type type_={0x01,0x2a,temp_data_size,1,1};\r
+        send_big_data(type_,dail_uid_buf,data_size);\r
+        //send_big_data(0,dail_uid_buf,data_size,temp_data_size,1,1,0x2a,1);\r
 \r
         free(dail_uid_buf);\r
         \r
@@ -4554,8 +4588,14 @@ static void GetAiRecordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *tota
         {\r
             memset_s(data,num+1,0,num+1);\r
             read_size=fread(data,1,num,fp);\r
-            \r
-            send_big_data(1,data,read_size,file_size,pack_id,pack,0x34,1);\r
+\r
+            if(read_size!=0)\r
+            {\r
+                ble_data_type type_={0x01,0x34,file_size,pack,pack_id};\r
+                send_big_data(type_,data,read_size);\r
+            }\r
+\r
+            //send_big_data(1,data,read_size,file_size,pack_id,pack,0x34,1);\r
             pack_id++;\r
             msleep(SEND_AIVOICE_PACKAGE_DELAY);\r
 \r
@@ -4807,14 +4847,20 @@ static void Send_json_Data_Cmd(uint8_t day,uint16_t pack_size,uint8_t id)
            if(surplus_len>=pack_size)\r
            {\r
                 surplus_len=surplus_len-pack_size;\r
-                send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,id,1);\r
+\r
+                ble_data_type type_={0x01,id,data_len,pack,pack_id};\r
+                send_big_data(type_,json_format+offset,pack_size);\r
+\r
+                //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,id,1);\r
                 offset+=pack_size;\r
            }\r
            else\r
            {\r
                 \r
                 printf("%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
-                send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,id,1);\r
+                ble_data_type type_={0x01,id,data_len,pack,pack_id};\r
+                send_big_data(type_,json_format+offset,surplus_len);\r
+                //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,id,1);\r
                 break;\r
            }\r
            pack_id++;\r
@@ -5305,7 +5351,11 @@ void Send_Sleep_Bin_Data(uint8_t day, uint16_t num)
 \r
     if(data==NULL || file_size==1)\r
     {\r
-        send_big_data(1,NULL,0,0,1,1,0x4b,1);\r
+        ble_data_type type_={0x01,0x4b,0,1,1};\r
+        send_big_data(type_,NULL,0);\r
+\r
+        //send_big_data(1,NULL,0,0,1,1,0x4b,1);\r
+        \r
         sendbigDataBufState = false;//分包同步数据不允许打断\r
         return;\r
     }\r
@@ -5329,7 +5379,10 @@ void Send_Sleep_Bin_Data(uint8_t day, uint16_t num)
         {\r
             surplus_len=surplus_len-num;\r
             printf("%d %d %d %d\r\n",num,file_size,pack_id,pack);\r
-            send_big_data(1,data+offset,num,file_size,pack_id,pack,0x4b,1);\r
+\r
+            ble_data_type type_={0x01,0x4b,file_size,pack,pack_id};\r
+            send_big_data(type_,data+offset,num);\r
+            //send_big_data(1,data+offset,num,file_size,pack_id,pack,0x4b,1);\r
             offset+=num;\r
         }\r
         else\r
@@ -5337,7 +5390,10 @@ void Send_Sleep_Bin_Data(uint8_t day, uint16_t num)
             //#ifdef BLE_LOG\r
                 printf("%d %d %d %d\r\n",surplus_len,file_size,pack_id,pack);\r
             //#endif\r
-            send_big_data(1,data+offset,surplus_len,file_size,pack_id,pack,0x4b,1);\r
+            ble_data_type type_={0x01,0x4b,file_size,pack,pack_id};\r
+            send_big_data(type_,data+offset,surplus_len);\r
+\r
+            //send_big_data(1,data+offset,surplus_len,file_size,pack_id,pack,0x4b,1);\r
             break;\r
         }\r
         pack_id++;\r
@@ -5373,6 +5429,13 @@ bool Read_Health_BIN_file_buf_send_bin_Data(uint8_t day, uint16_t num,uint16_t i
     fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾\r
     file_size = ftell(fp);       // 获取当前文件指针位置,即文件大小\r
     fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头\r
+\r
+    int num=file_size%5;\r
+    if(num!=0)\r
+    {\r
+        printf("数据有误 %d \r\n",id);\r
+        return false;\r
+    }\r
     \r
     buf = (char *)ym_malloc(sizeof(char)*num+1);\r
     if(buf==NULL){fclose(fp); return false;}\r
@@ -5388,7 +5451,14 @@ bool Read_Health_BIN_file_buf_send_bin_Data(uint8_t day, uint16_t num,uint16_t i
     {\r
         memset_s(buf,num+1,0,num+1);\r
         read_size=fread(buf,1,num,fp);\r
-        send_big_data(1,buf,read_size,file_size,pack_id,pack,id,1);\r
+        if(read_size!=0)\r
+        {\r
+            ble_data_type type_={0x01,id,file_size,pack,pack_id};\r
+            send_big_data(type_,buf,read_size);\r
+        }\r
+        \r
+\r
+        //send_big_data(1,buf,read_size,file_size,pack_id,pack,id,1);\r
         pack_id++;\r
     } while (read_size==num);\r
 \r
@@ -5407,10 +5477,32 @@ void Read_BIN_file_buf_send_bin_Data(uint8_t day,uint32_t pack_size,uint16_t id)
 \r
     if(data==NULL)\r
     {\r
-        send_big_data(1,NULL,0,0,1,1,id,1);\r
-        printf("Read_BIN_file_buf_send_bin_Data is NULL");\r
+        ble_data_type type_={0x01,id,0,1,1};\r
+        send_big_data(type_,NULL,0);\r
+\r
+        //send_big_data(1,NULL,0,0,1,1,id,1);\r
+        sendbigDataBufState = false;//分包同步数据不允许打断\r
         return;\r
     }\r
+    uint8_t single_data=8;\r
+    if(id==0x44)\r
+    {\r
+        single_data=6;\r
+    }\r
+    else if (id==0x45)\r
+    {\r
+        single_data=4;\r
+    }\r
+    int check_num=data_len%single_data;\r
+    if(check_num!=0)\r
+    {\r
+        printf("数据有误 %d \r\n",id);\r
+\r
+        ble_data_type type_={0x01,id,0,1,1};\r
+        send_big_data(type_,NULL,0);\r
+\r
+        return ;\r
+    }\r
 \r
     uint32_t surplus_len=data_len;\r
     uint32_t pack;\r
@@ -5430,7 +5522,9 @@ void Read_BIN_file_buf_send_bin_Data(uint8_t day,uint32_t pack_size,uint16_t id)
         if(surplus_len>=pack_size)\r
         {\r
             surplus_len=surplus_len-pack_size;\r
-            send_big_data(1,data+offset,pack_size,data_len,pack_id,pack,id,1);\r
+            ble_data_type type_={0x01,id,data_len,pack,pack_id};\r
+            send_big_data(type_,data+offset,pack_size);\r
+            //send_big_data(1,data+offset,pack_size,data_len,pack_id,pack,id,1);\r
             offset+=pack_size;\r
         }\r
         else\r
@@ -5438,7 +5532,11 @@ void Read_BIN_file_buf_send_bin_Data(uint8_t day,uint32_t pack_size,uint16_t id)
             #ifdef BLE_LOG\r
                 printf("%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
             #endif\r
-            send_big_data(1,data+offset,surplus_len,data_len,pack_id,pack,id,1);\r
+\r
+            ble_data_type type_={0x01,id,data_len,pack,pack_id};\r
+            send_big_data(type_,data+offset,surplus_len);\r
+\r
+            //send_big_data(1,data+offset,surplus_len,data_len,pack_id,pack,id,1);\r
             break;\r
         }\r
         pack_id++;\r
@@ -5485,14 +5583,21 @@ void readDevDataBle(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,u
                 printf("同步心率数据,每包最多:%d 数据 data:%d %d\r\n",num,data[0],len);\r
                 #endif\r
                 if(!Read_Health_BIN_file_buf_send_bin_Data(data[0],num,0x40))\r
-                send_big_data(1,NULL,0,0,1,1,0x40,1);\r
+                {\r
+                    ble_data_type type_={0x01,0x40,0,1,1};\r
+                    send_big_data(type_,NULL,0);\r
+                }\r
+                //send_big_data(1,NULL,0,0,1,1,0x40,1);\r
 \r
                 break;\r
             case 0x41://同步血氧历史数据\r
                 num=(ble_nus_max_data_len-18);\r
                 if(num>482)num=482;\r
                 if(!Read_Health_BIN_file_buf_send_bin_Data(data[0],num,0x41))\r
-                send_big_data(1,NULL,0,0,1,1,0x41,1);\r
+                {\r
+                    ble_data_type type_={0x01,0x41,0,1,1};\r
+                    send_big_data(type_,NULL,0);\r
+                }\r
 \r
                 break;\r
             case 0x43: //同步步数历史数据\r
@@ -6602,8 +6707,14 @@ bool Read_tar_file_buf_send_Data(uint16_t pack_size,uint8_t id)
     {\r
         memset_s(data,pack_size+1,0,pack_size+1);\r
         read_size=fread(data,1,pack_size,fp);\r
+        if(read_size!=0)\r
+        {\r
+            ble_data_type type_={0x05,id,read_size,pack,pack_id};\r
+            send_big_data(type_,(char *)&data,read_size);\r
+        }\r
         \r
-        send_big_data(1,data,read_size,file_size,pack_id,pack,id,5);\r
+\r
+        //send_big_data(1,data,read_size,file_size,pack_id,pack,id,5);\r
         pack_id++;\r
         msleep(50);\r
     } while (read_size==pack_size);\r
@@ -6622,7 +6733,10 @@ bool read_dir_send_json()
     send_buf=tar_dir_to_json_buf_malloc_(file_name,&file_size);\r
     if( send_buf!=NULL)\r
     {\r
-        send_big_data(1,send_buf,strlen(send_buf),strlen(send_buf),1,1,0x26,0x04);\r
+        //send_big_data(1,send_buf,strlen(send_buf),strlen(send_buf),1,1,0x26,0x04);\r
+        ble_data_type type_={0x04,0x26,strlen(send_buf),1,1};\r
+        send_big_data(type_,(char *)&send_buf,strlen(send_buf));\r
+\r
         free(send_buf);\r
         return true;\r
     }\r
index 3f8f1f3..16a2514 100644 (file)
@@ -575,6 +575,20 @@ typedef struct
 }msg_get_other_target_info_t;//获取其他目标设置
 #pragma pack()
 
+
+typedef struct
+{
+    uint8_t type;
+    uint8_t type_id;
+    uint32_t total;
+    uint32_t packet_total;
+    uint32_t Packet_id;
+   
+
+}ble_data_type;//获取其他目标设置
+
+
+
 /*********************ANCS********安卓指令********************/
 #define ANDROID_ANCS_CMD 0x0301