优化蓝牙相关协议内存死机问题:还有一个问题需要胡传军看一下这个函数set_user_data会大概率死机
authorDXY <1731678236@qq.com>
Tue, 14 May 2024 08:01:35 +0000 (16:01 +0800)
committerDXY <1731678236@qq.com>
Tue, 14 May 2024 08:01:35 +0000 (16:01 +0800)
code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp
code/sdk/application/wearable/service/ble_service/blemoder/bletest.h
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h

index 46311d2..09b326a 100644 (file)
@@ -406,28 +406,29 @@ void addressbookTowrite(void)//转化用于·c文件
 // };
 uint8_t ble_falg=0;
 
-void set_user_data(msg_user_info_t data)
+void set_user_data(msg_user_info_t *data)
 {
-    
+    //1.设置用户信息中 设置目标站立会大概率死机 复现方法就 set_user_data@胡传军
+    return;
     OHOS::ConfigModel *p_ConfigModel  =   OHOS::ConfigModel::GetInstance();
-    printf("高:%d\r\n",data.height);
-    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_CUSTOM_DATA_HEIGHT,data.height);
-    printf("重:%d\r\n",data.weight);
-    p_ConfigModel->set_condigData_Double(OHOS::ConfigModel::CONFIGMODEL_ITEM_CUSTOM_DATA_WEIGHT,(double)data.weight);
-    printf("性别:%d\r\n",data.gender);
-    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_CUSTOM_DATA_SEX,data.gender);
-    printf("年纪:%d\r\n",data.age);
-    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_CUSTOM_DATA_AGE,data.age);
-    printf("目标步数:%d\r\n",data.target_step);
-    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SPORTS_GOAL_STEPCOUNT,data.target_step);
+    printf("高:%d\r\n",data->height);
+    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_CUSTOM_DATA_HEIGHT,data->height);
+    printf("重:%d\r\n",data->weight);
+    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_CUSTOM_DATA_WEIGHT,data->weight);
+    printf("性别:%d\r\n",data->gender);
+    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_CUSTOM_DATA_SEX,data->gender);
+    printf("年纪:%d\r\n",data->age);
+    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_CUSTOM_DATA_AGE,data->age);
+    printf("目标步数:%d\r\n",data->target_step);
+    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SPORTS_GOAL_STEPCOUNT,data->target_step);
 
     
     //目标站立
-    printf("目标站立\r\n");
-    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SPORTS_GOAL_STANDUP_TIMES,data.target_stand);
+    printf("目标站立 %d\r\n",data->target_stand);
+    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SPORTS_GOAL_STANDUP_TIMES,data->target_stand);
     //目标燃脂
-    printf("目标燃脂\r\n");
-    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SPORTS_GOAL_DURATION,data.fat_time);
+    printf("目标燃脂 %d\r\n",data->fat_time);
+    p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SPORTS_GOAL_DURATION,data->fat_time);
     /*
     时制
     p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_CUSTOM_DATA_AGE,data.timeformat);
@@ -646,23 +647,29 @@ void set_ble_falg(bool falg)
     ble_falg=falg;
 }
 static char* JSON_F_buf=NULL;
+#define PATH_MAX_LEN 124
 const char *get_health_data_path(void)
 {
     time_t now = time(0);
     tm *ltm = localtime(&now);
     char day[20];
     strftime(day, sizeof(day), "%Y%m%d", ltm);
-    char buf[124]={0};
-    sprintf(buf,"%s%s.json",OHOS::GET_HEALTH_JSON_PATH_C_STR(),day);
-    if(JSON_F_buf!=NULL)
+    char buf[PATH_MAX_LEN]={0};
+    sprintf_s(buf,PATH_MAX_LEN-1,"%s%s.json",OHOS::GET_HEALTH_JSON_PATH_C_STR(),day);
+    if(JSON_F_buf != NULL)
     {
         free(JSON_F_buf);
         JSON_F_buf=NULL;
         
     }
-    JSON_F_buf=(char *)malloc(strlen(buf)+1);
-    strcpy(JSON_F_buf,buf);
-    
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "!!!!!!!!!!!%x strlen(buf):%d",JSON_F_buf,strlen(buf));
+    uint8_t len = PATH_MAX_LEN+1;
+    JSON_F_buf=(char *)malloc(len);
+    memset(JSON_F_buf,0,len);
+    if(JSON_F_buf != NULL)//
+    {
+        strcpy(JSON_F_buf,buf);
+    }
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "%s",JSON_F_buf);
    return JSON_F_buf;
 }
index 8c5315c..4a7dd36 100644 (file)
@@ -106,7 +106,7 @@ void  addressbookTowrite(void);
 const char *get_health_data_path(void);
 void add_addressbookToRead(char *data);
 
-void set_user_data(msg_user_info_t data);
+void set_user_data(msg_user_info_t *data);
 
 int get_goal_stepcount(void);
 
index f5434be..d02674b 100644 (file)
@@ -167,7 +167,7 @@ int ble_recv_msg_callback(uint8_t writ_read,uint16_t msg_typeID, uint8_t *msg_da
                 break;\r
 \r
             case USER_INFOR_CMD:\r
-                set_user_data(user_info);\r
+                \r
                 break;\r
 \r
             \r
@@ -306,7 +306,6 @@ void sendDataNow(uint8_t *buf,uint16_t len)
 void send_big_data(uint8_t flag, char *data, int datalen, int total, uint32_t Packet_id, uint32_t packet_total, uint8_t type_id, uint8_t type)\r
 {\r
     // 动态分配内存空间,防止堆栈溢出\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send_big_data!!!\r\n");\r
     uint8_t *buf = ym_malloc(17 + datalen + 1); \r
     if (buf == NULL) {\r
         printf("内存分配失败\n");\r
@@ -339,7 +338,6 @@ void send_big_data(uint8_t flag, char *data, int datalen, int total, uint32_t Pa
     }\r
 \r
     ym_free(buf); // 释放内存空间\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "send_big_data1111!!!\r\n");\r
 }\r
 //发送训练状态[app发起的运动]\r
 void sendtraningstatedata(uint8_t state ,uint16_t time)\r
@@ -425,66 +423,10 @@ void sendConfirmParieSucess(void)
 }\r
 \r
 uint8_t phoneType = 0;\r
-static uint8_t  jsonCheck_phoneinfor(uint8_t *buf,uint8_t *mac_data,char *devname)//解析手机信息json\r
-{\r
-    uint8_t len = 0;\r
-    uint8_t mac_tmp[6];\r
-    memset(mac_tmp,0,6);\r
-    uint8_t type = 0;\r
-    uint8_t count1 = 0;\r
-    uint8_t count2 = 0;\r
-    uint8_t *json;\r
-    json = buf;\r
-    cJSON* root = cJSON_Parse((const char *)json);\r
-    if (root == NULL) {\r
-        printf("JSON解析错误\n");\r
-        return 0;\r
-    }\r
 \r
-    cJSON* pn = cJSON_GetObjectItem(root, "pn");\r
-    if (cJSON_IsString(pn)) {\r
-        len = strlen(pn->valuestring)+1;   \r
-        if(len -1 > 0){\r
-            pn->valuestring[len-1]='\0';\r
-            memcpy((uint8_t *)devname,(uint8_t *)pn->valuestring,strlen(pn->valuestring));\r
-        }\r
-        \r
-        // printf("设备名称: %s\n", pn->valuestring);\r
-    }\r
-\r
-    cJSON* tp = cJSON_GetObjectItem(root, "tp");\r
-    if (cJSON_IsNumber(tp)) {\r
-        printf("类型: %d\n", tp->valueint);\r
-        type = tp->valueint;\r
-        phoneType = type;\r
-    }\r
-\r
-    cJSON* mac = cJSON_GetObjectItem(root, "mac");\r
-    if (cJSON_IsArray(mac)) {\r
-        printf("MAC地址: ");\r
-        cJSON* macElement = NULL;\r
-        cJSON_ArrayForEach(macElement, mac) {\r
-            if (cJSON_IsNumber(macElement)) {\r
-                printf("%d", macElement->valueint);\r
-                if (macElement->prev != NULL) {\r
-                    phone_mac[count1++] = macElement->valueint;\r
-                    mac_tmp[count2++] = macElement->valueint;\r
-                    printf(", ");\r
-                }\r
-            }\r
-        }\r
-        printf("\n");\r
-    }\r
-    if(mac_tmp[0] == 0 && mac_tmp[1] == 0 && mac_tmp[2] == 0 && mac_tmp[3] == 0 && mac_tmp[4] == 0 && mac_tmp[5] == 0)\r
-    {\r
-        memcpy(mac_data,0,6);\r
-    }else{\r
-        memcpy(mac_data,mac_tmp,6);\r
-    }\r
-    cJSON_Delete(root);\r
-    return len;\r
-    \r
-}\r
+\r
+\r
+\r
 errcode_t UnbindSucessCmd(uint8_t flag)//发送解绑指令,解绑界面调用这个函数 如果点了✓调用这个函数 返回成功后延迟10s再重启设备  \r
 {\r
     errcode_t sendok = ERRCODE_FAIL;\r
@@ -604,83 +546,7 @@ void alarmData(void)
 {\r
 \r
 }\r
-//phonemac 手机app下发手机的mac地址 \r
-//name 手机设备名称\r
-//*len 手机设备名称长度\r
-//*mac_type 手机蓝牙mac地址类型 共有还是私有的\r
-static void getRecvPhoneInfo(uint8_t *phonemac,uint8_t *name,uint8_t *len,uint8_t *mac_type)\r
-{\r
-    uint8_t datalen = 0;\r
-    uint8_t mac[6];\r
-    memset(mac,0,6);\r
-    uint8_t count = 0;\r
-    FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");\r
-    if(jsfile == NULL)\r
-    {\r
-        return;\r
-    }\r
-    if (jsfile != NULL) {\r
-        printf("succes opening file\n");\r
-        fseek(jsfile, 0, SEEK_END);\r
-        long fileSize = ftell(jsfile);\r
-        fseek(jsfile, 0, SEEK_SET);\r
 \r
-        char *jsonData = (char *)ym_malloc(fileSize + 1);\r
-        fread(jsonData, 1, fileSize, jsfile);\r
-        jsonData[fileSize] = '\0';\r
-        fclose(jsfile);\r
-\r
-        // 解析JSON数据\r
-        cJSON *root = cJSON_Parse(jsonData);\r
-        ym_free(jsonData);\r
-\r
-        if (root != NULL) {\r
-            cJSON *modifiedJson = cJSON_GetObjectItem(root,"mac");\r
-            if (cJSON_IsArray(modifiedJson)) {\r
-                printf("MAC地址: ");\r
-                cJSON* macElement = NULL;\r
-                cJSON_ArrayForEach(macElement, modifiedJson) {\r
-                    if (cJSON_IsNumber(macElement)) {\r
-                        if ((macElement->prev != NULL)) {\r
-                            mac[count] = macElement->valueint;\r
-                            count++;\r
-                        }\r
-                        \r
-                    }\r
-                }\r
-                printf("\n");\r
-            }\r
-            if(mac[0] == 0 && mac[1] == 0 && mac[2] == 0 && mac[3] == 0 && mac[4] == 0 && mac[5] == 0)\r
-            {\r
-                memcpy(phonemac,0,6);\r
-            }else\r
-            {\r
-                memcpy(phonemac,mac,6);\r
-\r
-            }\r
-            \r
-            cJSON *pn = cJSON_GetObjectItem(root,"pn");\r
-            if(cJSON_IsString(pn))\r
-            {\r
-                datalen = strlen(pn->valuestring)+1;\r
-                if(datalen-1 > 0){\r
-                    pn->valuestring[datalen-1]='\0';\r
-                    memcpy(name,(uint8_t *)pn->valuestring,strlen(pn->valuestring));\r
-                    datalen = strlen(pn->valuestring);\r
-                    memcpy(&len,&datalen,1);\r
-                }\r
-            }\r
-            cJSON *mactype = cJSON_GetObjectItem(root,"mac_type");\r
-            if(cJSON_IsNumber(mac_type))\r
-            {\r
-                memcpy(&mac_type,&mactype->valueint,1);\r
-            }\r
-        }\r
-        // 释放资源\r
-        cJSON_Delete(root);\r
-    }\r
-   \r
-}\r
 \r
 void getPhoneNameLen(uint8_t *crcnum,uint8_t *datalen)//获取手机设备名称长度\r
 {\r
@@ -695,15 +561,14 @@ void getPhoneNameLen(uint8_t *crcnum,uint8_t *datalen)//获取手机设备名称
             len = strlen(pn->valuestring)+1;   \r
             printf("设备名称: %s len:%d\n", pn->valuestring,len);\r
         }\r
-        memcpy(datalen,&len,1);\r
+        *datalen = len;\r
         cJSON_Delete(root);\r
     } else{\r
         len = 0;\r
-\r
-        memcpy(datalen,&len,1);\r
+        *datalen = len;\r
     }\r
 }\r
-\r
+#define PHONE_NAME_MAX_LEN 50\r
 static uint8_t *getPhoneName(uint8_t *crcnum)//获取手机设备名称\r
 {\r
     uint8_t *json = crcnum;\r
@@ -713,16 +578,22 @@ static uint8_t *getPhoneName(uint8_t *crcnum)//获取手机设备名称
     {\r
         cJSON* pn = cJSON_GetObjectItem(root, "pn");\r
         if (cJSON_IsString(pn)) {\r
-            uint8_t datalen = strlen(pn->valuestring)+1;   \r
+            uint8_t datalen = strlen(pn->valuestring)+1;  \r
+            if(datalen > PHONE_NAME_MAX_LEN) //\r
+            {\r
+                datalen = PHONE_NAME_MAX_LEN;\r
+            }\r
             if(datalen - 1 > 0){\r
-                pn->valuestring[datalen-1]='\0';\r
+                pn->valuestring[datalen]='\0';\r
                 str = ym_malloc(sizeof(char)*datalen);\r
+                if(str != NULL)\r
+                {\r
+                    memcpy(str,(uint8_t *)pn->valuestring,datalen+1);\r
+                }\r
                 savephonename =  ym_malloc(sizeof(char)*datalen);\r
-                memcpy(str,(uint8_t *)pn->valuestring,datalen);\r
-                // strcpy(str,pn->valuestring);\r
-                memcpy(savephonename,(uint8_t *)pn->valuestring,datalen);\r
-                // strcpy(savephonename,pn->valuestring);\r
-                // printf("str:%s savephonename:%s\n",str,savephonename);\r
+                if(savephonename != NULL){\r
+                    memcpy(savephonename,(uint8_t *)pn->valuestring,datalen+1);\r
+                }\r
             }\r
             printf("设备名称: %s\n", pn->valuestring);\r
         }\r
@@ -766,7 +637,7 @@ void getPhoneMac(uint8_t *crcnum,uint8_t *phoneMac)//获取手机设备mac这个
         cJSON_Delete(root);\r
     } \r
     else{\r
-        memcpy(phoneMac,phone_tmp,6);\r
+        memcpy(phoneMac,0,6);\r
     }\r
 }\r
 \r
@@ -811,7 +682,7 @@ void GetwatchSaveMac(uint8_t *mac,uint8_t *mactype)//获取手表本地保存的
             cJSON *mac_type = cJSON_GetObjectItem(root,"mac_type");\r
             if(cJSON_IsNumber(mac_type))\r
             {\r
-                memcpy(&mactype,&mac_type->valueint,1);\r
+                *mactype = mac_type->valueint;\r
             }\r
         }\r
         if(mac_tmp[0] == 0 && mac_tmp[1] == 0 && mac_tmp[2] == 0 && mac_tmp[3] == 0 && mac_tmp[4] == 0 && mac_tmp[5] == 0){\r
@@ -825,8 +696,7 @@ void GetwatchSaveMac(uint8_t *mac,uint8_t *mactype)//获取手表本地保存的
     {\r
         memset(mac_tmp,0,6);\r
         memcpy(mac,mac_tmp,6);\r
-        uint8_t type = 0;\r
-        memcpy(&mactype,&type,1);\r
+        *mactype = 0;\r
     }\r
 }\r
 static void GetwatchSaveNameLen(uint8_t *datalen)//获取手表本地保存的手机设备名称长度\r
@@ -855,12 +725,13 @@ static void GetwatchSaveNameLen(uint8_t *datalen)//获取手表本地保存的
                 printf("GetwatchSaveNameLen;%d",len);\r
             }\r
         };\r
-        memcpy(datalen,&len,1);\r
+        *datalen  = len;\r
+        // memcpy(datalen,&len,1);\r
         // 释放资源\r
         cJSON_Delete(root);\r
     }else{\r
         len = 0;\r
-       memcpy(datalen,&len,1); \r
+        *datalen  = len;\r
     }\r
 }\r
 static uint8_t *GetwatchSaveName(void)//获取手表本地保存的手机设备名称\r
@@ -888,12 +759,18 @@ static uint8_t *GetwatchSaveName(void)//获取手表本地保存的手机设备
             if(cJSON_IsString(pn))\r
             {\r
                 uint8_t showname_len = strlen(pn->valuestring)+1;\r
+                if(showname_len > 50)\r
+                {\r
+                    showname_len = PHONE_NAME_MAX_LEN;\r
+                }\r
                 if(showname_len-1 > 0){\r
                     str = ym_malloc(sizeof(char)*showname_len);\r
-                    pn->valuestring[showname_len-1]='\0';\r
-                    str[showname_len]=0;\r
-                    memcpy(str,(uint8_t *)pn->valuestring,showname_len);\r
-                    // strcpy(str,pn->valuestring);\r
+                    if(str != NULL)\r
+                    {\r
+                        pn->valuestring[showname_len]='\0';\r
+                        memcpy(str,(uint8_t *)pn->valuestring,showname_len+1);\r
+                    }\r
+                    \r
                     printf("GetwatchSaveName:%s",pn->valuestring);\r
                 }\r
             }\r
@@ -1915,7 +1792,6 @@ uint8_t jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气
         fputs((char *)buf,fp);\r
         fclose(fp);\r
     #endif\r
-    printf("开始解析天气数据 %x\n",json);\r
     cJSON* root = cJSON_Parse((const char *)json);\r
     if (root == NULL) {\r
         printf("天气 JSON解析错误\n");\r
@@ -1963,8 +1839,7 @@ uint8_t jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气
         set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i);\r
     }\r
     cJSON_Delete(root);\r
-    flag = 1;\r
-    memcpy(check,&flag,1);\r
+    *check = 1;\r
     return 1;\r
 }\r
 \r
@@ -2015,33 +1890,39 @@ void getUserInfo(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,ui
     \r
     if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
-        \r
+        printf("getUserInfo:!!!!!!!!\r\n");\r
+        msg_user_info_t user_info={0};\r
         ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
         memset(&user_info,0,sizeof(msg_user_info_t));\r
-        if(func != NULL)\r
+        \r
+        for(uint8_t i = 0;i<len;i++)\r
         {\r
-            func(READ_FLASH_DATA,cmd,&user_info,sizeof(msg_user_info_t));\r
+            printf("%x ",crcnum[i]);\r
         }\r
         user_info.age = crcnum[0];\r
         user_info.gender = crcnum[1];\r
         user_info.height  = crcnum[2];\r
+        printf("getUserInfo:!!!!!!!!5555\r\n");\r
         memcpy(&user_info.weight,crcnum+3,2);\r
         //memcpy(crcnum+3,&user_info.weight,2);\r
         memcpy(&user_info.target_step,crcnum+5,4);\r
+         printf("getUserInfo:!!!!!!!!666\r\n");\r
         //memcpy(crcnum+5,&user_info.target_step,4);\r
         memcpy(&user_info.fat_time,crcnum+9,2);\r
         user_info.target_stand = crcnum[11];\r
         user_info.timeformat = crcnum[12];\r
-        uint16_t target_kcal = 0;\r
-        memcpy(&target_kcal,&crcnum[13],2);\r
+        uint32_t target_kcal = 0;\r
+        memcpy(&target_kcal,crcnum+13,2);\r
+        printf("getUserInfo:!!!!!!!!99\r\n");\r
         set_goal_caloriescount(target_kcal);\r
+        printf("getUserInfo:!!!!!!!!22\r\n");\r
         uint8_t target_km = crcnum[15];\r
+        printf("getUserInfo:!!!!!!!!22\r\n");\r
         set_goal_discount(target_km);\r
-         if(func != NULL)\r
-        {\r
-            func(WRITE_FLASH_DATA,cmd,&user_info,sizeof(msg_user_info_t));\r
-        }\r
-\r
+        printf("getUserInfo:!!!!!!!!333\r\n",user_info.age,user_info.gender,user_info.height,user_info.weight,user_info.target_step,user_info.fat_time,user_info.target_stand,\r
+        user_info.timeformat,user_info.timeformat);\r
+        set_user_data(&user_info);\r
+        printf("getUserInfo:!!!!!!!!444\r\n");\r
         value[17] = 0x01;\r
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
@@ -2189,7 +2070,7 @@ void getAPPaddressbook(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalD
 void type2AE4Data(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue)\r
 {\r
     uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];\r
-    // printf("type2AE4Data typeID:0x%x\r\n",typeID);\r
+    printf("type2AE4Data typeID:0x%x\r\n",typeID);\r
     switch (typeID) //ID\r
     {\r
         case USER_INFOR_CMD://app下发的获取用户信息\r
@@ -2402,7 +2283,7 @@ static void aboutDeviceCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *to
     if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         memcpy(value+17,(uint8_t *)json_format,data_len);//17+69 = 86\r
-        cJSON_free(json_format);\r
+        \r
         value[data_len+17] = Calculate_CRC(value,data_len+17);//\r
         // printf("data_len:%d %x %d!!!!!\r\n",data_len,value[data_len+17],data_len+17);\r
         sendBleData(value,data_len+18);\r
@@ -2413,7 +2294,7 @@ static void aboutDeviceCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *to
         value[18] = lrc;\r
         sendBleData(value,19);\r
     }\r
-    \r
+    cJSON_free(json_format);\r
 }\r
 //查找手表 01 04\r
 //设置查找手表的状态,1 校验成 2手表已找到,停止查找手表\r
@@ -2524,7 +2405,7 @@ static void GetCurDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
     if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         memcpy(value+17,(uint8_t *)json_format,data_len);\r
-        cJSON_free(json_format);\r
+        \r
         uint8_t lrc = Calculate_CRC(value,data_len+17);\r
         printf("lrc:%d",lrc);\r
         value[data_len+18] = lrc;\r
@@ -2536,6 +2417,7 @@ static void GetCurDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
         value[18] = lrc;\r
         sendBleData(value,19);\r
     }\r
+    cJSON_free(json_format);\r
 }\r
 //获取当手表电池电量\r
 static void GetBatteryLevelCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
@@ -4156,7 +4038,7 @@ void type2AE3Data(uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *tota
         case SYN_BASIC_TRANIN_HISTORY_DATA_CMD://同步基础训练历史数据\r
         case SYN_SLEEP_HISTORY_DATA_CMD://睡眠历史数据\r
         case ALARM_CMD://获取手表闹钟//同步闹钟\r
-             readDevDataBle(totaldata,datalen+18,crcvalue);\r
+            readDevDataBle(cmd,data,datalen,totaldata,crcvalue);\r
             break;\r
         \r
         default:\r
@@ -4262,12 +4144,13 @@ void Read_file_buf_send_bin_Data(uint8_t num,uint16_t id,char *data_item)
     if(fp==NULL)\r
     {\r
         send_big_data(1,NULL,0,0,1,1,id,1);\r
-        printf("打开文件失败%s\r\n",path);\r
+        printf("打开文件失败 %s \r\n",path);\r
         if(path)\r
         {\r
             free(path);\r
             path = NULL;\r
         }\r
+\r
         sendbigDataBufState = false;//分包同步数据不允许打断\r
         return;\r
     }\r
@@ -4280,6 +4163,12 @@ void Read_file_buf_send_bin_Data(uint8_t num,uint16_t id,char *data_item)
         ret=fread(buf+512*count,1,512,fp);\r
         count++;\r
     }\r
+    fclose(fp);\r
+    if(path)\r
+    {\r
+        free(path);\r
+        path = NULL;\r
+    }\r
     cJSON *heart_data=cJSON_Parse(buf);\r
     ym_free(buf);\r
 \r
@@ -4354,26 +4243,32 @@ void Read_file_buf_send_bin_Data(uint8_t num,uint16_t id,char *data_item)
     cJSON_Delete(heart_data);\r
     \r
 }\r
-//type\r
-void realSyncSportData(uint8_t typeid)\r
-{\r
-    int num;\r
-    num=(ble_nus_max_data_len-18);\r
-    if(num>482)\r
-    {\r
-        num=482;\r
-    }\r
-    Send_json_Data_Cmd(num,typeid);\r
-}\r
 \r
 //手机app下发读设备数据指令\r
-void readDevDataBle(uint8_t *crcnum,uint16_t len,uint8_t crcvalue)\r
+void readDevDataBle(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)\r
 {\r
-    if(Check_CRC(crcnum+17,len-18,crcvalue))\r
+    uint8_t sendBuf[19];\r
+    memset(sendBuf,0,19);\r
+    uint8_t type = cmd/256;\r
+    uint8_t typeID = cmd-((cmd/256)*256);\r
+    uint32_t totaldata_pack = 1;\r
+    uint32_t totaldata_packlen = 0;\r
+    uint32_t pack_count = 0;\r
+    uint16_t pack_datalen = 0;\r
+    sendBuf[0]=0x72;\r
+    sendBuf[1]=type;\r
+    sendBuf[2]=typeID;\r
+    memcpy(sendBuf+3,&totaldata_pack,4);//总的数据包\r
+    memcpy(sendBuf+7,&totaldata_packlen,4);//总的数据包长度\r
+    memcpy(sendBuf+11,&pack_count,4);//分包索引号\r
+    memcpy(sendBuf+15,&pack_datalen,2);//分包数据长度\r
+\r
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
-        bleSendTypeID=crcnum[2];\r
+        bleSendTypeID=cmd-((cmd/256)*256);\r
+        // printf("同步第%d天的数据\r\n",crcnum[0]);\r
         int num;\r
-        switch (crcnum[2])\r
+        switch (bleSendTypeID)\r
         {\r
             case 0x40://同步心率历史数据\r
                 EACH_DATA_LEN = HEART_DATA_LEN;\r
@@ -4382,7 +4277,7 @@ void readDevDataBle(uint8_t *crcnum,uint16_t len,uint8_t crcvalue)
                 {\r
                     num=96;\r
                 }\r
-                printf("同步心率数据,每包最多:%d 条数据\r\n",num);\r
+                printf("同步心率数据,每包最多:%d 条数据 crcnum:%d\r\n",num,crcnum[0]);\r
                 Read_file_buf_send_bin_Data(num,0x40,"heart_data_list");\r
                 break;\r
             case 0x41://同步血氧历史数据\r
@@ -4446,10 +4341,8 @@ void readDevDataBle(uint8_t *crcnum,uint16_t len,uint8_t crcvalue)
         }\r
         //sendReadData();\r
     }else{\r
-        crcnum[0] = 0x72;\r
-        crcnum[len-1] = 0;\r
-        crcnum[len] = 0;\r
-        sendBleData(crcnum,len);\r
+        sendBuf[18] = 0;\r
+        sendBleData(sendBuf,19);\r
     }\r
 }\r
 \r
@@ -4772,7 +4665,7 @@ uint8_t jscheck_ancs(uint8_t *data)
         hasCode_t = hasCode->valueint;\r
     }\r
     cJSON_Delete(root);\r
-    // message_data(uid_t,appid_t,titleBuf,msgBuf,hasCode_t);\r
+    message_data(uid_t,appid_t,titleBuf,msgBuf,hasCode_t);\r
     if(titleBuf != NULL){\r
         ym_free(titleBuf);\r
         titleBuf = NULL;\r
@@ -4897,19 +4790,19 @@ void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)
                     packdataLen = event_size-17;//多包数据第一包数据不带CRC校验和的\r
                     handle_l[i].data = ym_malloc(totalDataLen+1);\r
                     if(handle_l[i].data != NULL){\r
-                        printf("bleDataRecv!!!!!!!%d\r\n",totalDataLen);\r
+                        printf("bleDataRecv long data %d\r\n",totalDataLen);\r
                         if(handle_l[i].totalDataLen < packdataLen)\r
                         {\r
                             printf("packdataLen error!!!!!!!%d\r\n",packdataLen);\r
                             packdataLen=handle_l[i].totalDataLen;\r
                         }\r
                         memcpy(handle_l[i].data,totalData+17,packdataLen);//从第十七个字节开始接收数据data\r
-                        handle_l[i].data_len = packdataLen;\r
+                        handle_l[i].data_len = packdataLen;//当前包的数据长度\r
                         memset(handle_l[i].cmd_data,0,17);\r
                         memcpy(handle_l[i].cmd_data,totalData,17);\r
                     } \r
                 }else{//一包数据\r
-                    printf("bleDataRecv one %d\r\n",totalDataLen);\r
+                    printf("bleDataRecv short data %d\r\n",totalDataLen);\r
                     packdataLen = event_size-18;\r
                     if(totalDataLen != 0)\r
                     {\r
@@ -4925,11 +4818,12 @@ void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)
             }else//多包数据存储\r
             {\r
 \r
-                uint32_t packStartAddrLen = handle_l[i].data_len;//\r
+                uint32_t packStartAddrLen = handle_l[i].data_len;//每一包接收的数据长度起始地址\r
                 handle_l[i].data_len = handle_l[i].data_len+event_size;\r
                 printf("muilt 133333 handle_l[i].data_len:%d\r\n",handle_l[i].data_len);\r
                 if(handle_l[i].data_len >= handle_l[i].totalDataLen)//接收完整的数据\r
                 {\r
+                    handle_l[i].data_len = handle_l[i].data_len -1;//最后一包要减去最后的CRC的那一位\r
                     //这是最后一包的起始地址\r
                     if(handle_l[i].totalDataLen -packStartAddrLen < event_size-1)\r
                     {\r
@@ -4939,7 +4833,7 @@ void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)
                     memcpy(handle_l[i].data+packStartAddrLen,totalData,event_size-1);//为了不把CRC copy到data所以多一步操作\r
                     handle_l[i].crcvalue = totalData[event_size-1];//最后一个字节为总的数据包的CRC\r
                     read_data_tmp = &handle_l[i];\r
-                }else{\r
+                }else{ //还没接收完 有 3 4 5包.........\r
                     if(handle_l[i].totalDataLen -packStartAddrLen < event_size)\r
                     {\r
                         printf("event_size error!!!!!!!%d\r\n",event_size);\r
@@ -4978,6 +4872,7 @@ void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)
 }\r
 void free_ble_data(void)//以防断开蓝牙没有释放数据类型\r
 {\r
+    return;\r
     totalpack = 0;\r
     muiltFlag = 0; \r
     packdataLen = 0;\r
index 900f001..4613903 100644 (file)
@@ -547,7 +547,7 @@ typedef struct
     uint8_t timeformat;//时间制 0 24小时制 1 12小时制
     
 }msg_user_info_t;//获取用户信息 身高体重 
-
+#pragma pack()
 /******************************************
  * 
 */
@@ -625,7 +625,7 @@ void cameraSend(uint8_t flag);//发送拍照指令给app 2进行拍照 3退出
 
 void senfindphoneSend(uint8_t flag);
 
-void readDevDataBle(uint8_t *crcnum,uint16_t len,uint8_t crcvalue);
+void readDevDataBle(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue);
 
 void free_ble_data(void);