修改部分变量名称,优化打印信息,方便代码分析。
authorSnickerSun <snickersun@163.com>
Wed, 15 May 2024 08:55:57 +0000 (16:55 +0800)
committerSnickerSun <snickersun@163.com>
Wed, 15 May 2024 08:55:57 +0000 (16:55 +0800)
添加OTA json数据接收和解析。

code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h
code/sdk/application/wearable/service/ble_service/bleservice/bleService.c
code/sdk/application/wearable/service/ble_service/bleservice/bleService.h

index ebf93ce..675585c 100644 (file)
@@ -78,6 +78,21 @@ void malloc_test(void)
     }\r
     app_pkg_msg_send(HEAPINFO, DIAG_CONTROL_FALSE, NULL, 0);\r
 }\r
+#include "bleService.h"\r
+\r
+static const char* getHandlname(uint16_t handle)\r
+{\r
+\r
+    if (data2ae0Cmd == handle) return "data2ae0Cmd";\r
+    if (data2ae1Cmd == handle) return "data2ae1Cmd";\r
+    if (data2ae3Cmd == handle) return "data2ae3Cmd";\r
+    if (data2ae4Cmd == handle) return "data2ae4Cmd";\r
+    if (data2ae5Cmd == handle) return "data2ae5Cmd";\r
+    \r
+    return "unknown handle";\r
+\r
+}\r
+\r
 // typedef void (*hx3695_msg_callback_t)(uint8_t msg_type, uint8_t *msg_data, int32_t msg_datalen);\r
 uint32_t ble_recv_register_msg_callback(ble_recv_msg_callback_t func)\r
 {\r
@@ -206,24 +221,18 @@ void cameram_data(void)//拍照发送数据 调用这个接口即可
 }\r
 \r
 bool bigDataBufState=false;//大数据传输状态\r
-static bool Check_CRC(uint8_t *crcnum,uint16_t len,uint8_t crcvalue)//计算20byte的的校验位\r
+static bool Check_CRC(uint8_t *data,uint16_t len,uint8_t crcvalue)//计算20byte的的校验位\r
 {\r
        uint8_t crcbuf  = 0;\r
     uint8_t lrcValue = 0x00;\r
-    if(crcnum == NULL)\r
+    if(data == NULL)\r
     {\r
-        return true;\r
-        // if(crcvalue == 0x00)\r
-        // {\r
-        //     return true;\r
-        // }else{\r
-        //     return false;\r
-        // }\r
+        return false;   \r
     }\r
        for(uint16_t i = 0; i < len; i++)\r
        {\r
-               lrcValue =lrcValue+ crcnum[i];\r
-        // printf("%02x ",crcnum[i]);\r
+               lrcValue =lrcValue+ data[i];\r
+        // printf("%02x ",data[i]);\r
     }\r
     //"{\"pn\":\"iPhone\",\"tp\":1}";\r
     \r
@@ -232,25 +241,24 @@ static bool Check_CRC(uint8_t *crcnum,uint16_t len,uint8_t crcvalue)//计算20by
        crcbuf = crcbuf%256;\r
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC ret:0x%x len:%d\r\n",crcbuf,len);\r
 \r
-    return true;\r
-       // if(crcbuf == crcvalue)\r
-    // {\r
-    //     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC true:\r\n");\r
-       //     return true;\r
-    // }\r
-       // else{\r
-    //     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC false:\r\n");\r
-       //      return false;\r
-    // }\r
+       if(crcbuf == crcvalue)\r
+    {\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC true:\r\n");\r
+           return true;\r
+    }\r
+       else{\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Check_CRC false:\r\n");\r
+               return false;\r
+    }\r
         \r
 }\r
-static uint8_t Calculate_CRC(uint8_t *crcnum,uint16_t len)//计算20byte\r
+static uint8_t Calculate_CRC(uint8_t *data,uint16_t len)//计算20byte\r
 {\r
     uint8_t crcbuf  = 0;\r
     uint8_t lrcValue = 0x00;\r
        for(uint16_t i = 17; i < len; i++)\r
        {\r
-               lrcValue =lrcValue+ crcnum[i];\r
+               lrcValue =lrcValue+ data[i];\r
     }\r
     // printf("Calculate_CRC:%x,len:%d",lrcValue,len);\r
     crcbuf = lrcValue%256;\r
@@ -258,22 +266,22 @@ static uint8_t Calculate_CRC(uint8_t *crcnum,uint16_t len)//计算20byte
        crcbuf = crcbuf%256;\r
     return crcbuf;\r
 }\r
-static uint8_t cal_sum(uint8_t *crcnum,uint16_t len)//计算20byte\r
+static uint8_t cal_sum(uint8_t *data,uint16_t len)//计算20byte\r
 {\r
     uint8_t lrcValue = 0x00;\r
        for(uint16_t i = 0; i < len; i++)\r
        {\r
-               lrcValue =lrcValue+ crcnum[i];\r
+               lrcValue =lrcValue+ data[i];\r
     }\r
     return lrcValue;\r
 }\r
-static uint8_t Calculate_CRC_Big(uint8_t *crcnum,uint16_t len)//计算20byte\r
+static uint8_t Calculate_CRC_Big(uint8_t *data,uint16_t len)//计算20byte\r
 {\r
     uint8_t crcbuf  = 0;\r
     uint8_t lrcValue = 0x00;\r
        for(uint16_t i = 0; i < len; i++)\r
        {\r
-               lrcValue =lrcValue+ crcnum[i];\r
+               lrcValue =lrcValue+ data[i];\r
     }\r
     crcbuf = lrcValue%256;\r
     crcbuf = 256-crcbuf;\r
@@ -486,9 +494,9 @@ void clearPaireFlag(uint8_t flag)
     UnbindSucessCmd(1);//1确认解绑;\r
     uapi_reboot_device();\r
 }\r
-void clearPaireCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)//发送清除配对指令\r
+void clearPaireCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)//发送清除配对指令\r
 {\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         //弹出清除配对界面不弹出是则发送0x02操作失败 1操作成功 0校验失败\r
         clearPaireFlag(1);\r
@@ -549,10 +557,10 @@ void alarmData(void)
 }\r
 \r
 \r
-void getPhoneNameLen(uint8_t *crcnum,uint8_t *datalen)//获取手机设备名称长度\r
+void getPhoneNameLen(uint8_t *data,uint8_t *datalen)//获取手机设备名称长度\r
 {\r
     uint8_t len = 0;\r
-    uint8_t *json = crcnum;\r
+    uint8_t *json = data;\r
     cJSON* root = cJSON_Parse((const char *)json);\r
     \r
     if(root != NULL)\r
@@ -570,9 +578,9 @@ void getPhoneNameLen(uint8_t *crcnum,uint8_t *datalen)//获取手机设备名称
     }\r
 }\r
 #define PHONE_NAME_MAX_LEN 50\r
-static uint8_t *getPhoneName(uint8_t *crcnum)//获取手机设备名称\r
+static uint8_t *getPhoneName(uint8_t *data)//获取手机设备名称\r
 {\r
-    uint8_t *json = crcnum;\r
+    uint8_t *json = data;\r
     uint8_t *str = NULL; \r
     cJSON* root = cJSON_Parse((const char *)json);\r
     if(root != NULL)\r
@@ -608,9 +616,9 @@ static uint8_t *getPhoneName(uint8_t *crcnum)//获取手机设备名称
     }\r
     \r
 }\r
-void getPhoneMac(uint8_t *crcnum,uint8_t *phoneMac)//获取手机设备mac这个是手表上传给手机的mac地址\r
+void getPhoneMac(uint8_t *data,uint8_t *phoneMac)//获取手机设备mac这个是手表上传给手机的mac地址\r
 {\r
-    uint8_t *json = crcnum;\r
+    uint8_t *json = data;\r
     uint8_t phone_tmp[6];\r
     memset(phone_tmp,0,6);\r
     cJSON* root = cJSON_Parse((const char *)json);\r
@@ -823,7 +831,7 @@ void cleanUnbindInfor(uint8_t flag)//和旧手机解绑清除配对信息
         uapi_reboot_device();\r
     }\r
 }\r
-void sendBindInfor(uint8_t *crcnum)\r
+void sendBindInfor(uint8_t *data)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -853,7 +861,7 @@ void sendBindInfor(uint8_t *crcnum)
     uint8_t MacType = 0;\r
     \r
     GetwatchSaveMac(&save_mac,&MacType);//获取手表设备本地保存的mac地址和mac地址类型 \r
-    getPhoneMac(crcnum,&copare_mac);\r
+    getPhoneMac(data,&copare_mac);\r
     if(save_mac[0] == 0 && save_mac[1] == 0 && save_mac[2] == 0 && save_mac[3] == 0 && save_mac[4] == 0 && save_mac[5] == 0)//只要手表本地存储没有mac地址就走连接流程重新绑定\r
     {\r
         bond = 0x01;//手表未和任何手机绑定过\r
@@ -862,10 +870,10 @@ void sendBindInfor(uint8_t *crcnum)
         sendBleData(value,19);\r
         #ifdef SUPPORT_DEVICE_PAIRING_NOTIFICATION\r
         devnamelen = 0;\r
-        getPhoneNameLen(crcnum,&devnamelen);//获取手机下发的手机设备名称长度\r
+        getPhoneNameLen(data,&devnamelen);//获取手机下发的手机设备名称长度\r
         if(devnamelen > 0 )\r
         {\r
-            devname = getPhoneName(crcnum);\r
+            devname = getPhoneName(data);\r
             printf("devname!!!!!!!!!:%s devnamelen:%d",devname,devnamelen);\r
             if (devname != NULL){\r
                 printf("phone devname is name!!!!!!!!!:");\r
@@ -967,7 +975,7 @@ void sendBindInfor(uint8_t *crcnum)
     value[18] = Calculate_CRC(value,18);\r
     sendBleData(value,19);\r
 }\r
-void getPhoneInfo(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取手机信息\r
+void getPhoneInfo(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取手机信息\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -982,9 +990,9 @@ void getPhoneInfo(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,u
     memcpy(value+15,&tmp_fen,2);\r
     phoneDataFlag = 1;\r
     \r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
-        sendBindInfor(crcnum);\r
+        sendBindInfor(data);\r
     }else{\r
         value[17] = 0x00;\r
         value[18] = Calculate_CRC(value,18);\r
@@ -1184,7 +1192,7 @@ static uint8_t jsonCheck_time(uint8_t *buf)//json 格式解析
 \r
 \r
 \r
-void GetUTCtime(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取时间\r
+void GetUTCtime(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取时间\r
 {\r
     uint32_t tmp = 1;\r
     uint16_t tmp_data = 1;\r
@@ -1198,11 +1206,9 @@ void GetUTCtime(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uin
     memcpy(sendBuf+11,&tmp,4);\r
     memcpy(sendBuf+15,&tmp_data,2);\r
     \r
-       if(Check_CRC(crcnum,len,crcvalue))\r
+       if(Check_CRC(data,len,crcvalue))\r
        {\r
        \r
-        uint8_t *data;\r
-        data = crcnum;\r
         uint8_t set_ok = 1;\r
         set_ok = jsonCheck_time(data);\r
         sendBuf[17] = set_ok;\r
@@ -1270,7 +1276,7 @@ static uint8_t jsonCheck_targetparam(uint8_t *buf)
 }\r
 \r
 \r
-void GetTarinTarget(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取时间\r
+void GetTarinTarget(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取时间\r
 {\r
     uint32_t tmp = 1;\r
     uint16_t tmp_data = 1;\r
@@ -1284,10 +1290,8 @@ void GetTarinTarget(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData
     memcpy(sendBuf+11,&tmp,4);\r
     memcpy(sendBuf+15,&tmp_data,2);\r
     \r
-       if(Check_CRC(crcnum,len,crcvalue))\r
+       if(Check_CRC(data,len,crcvalue))\r
        {\r
-        uint8_t *data;\r
-        data = crcnum;\r
         uint8_t set_ok = 1;\r
         set_ok = jsonCheck_targetparam(data);\r
         sendBuf[17] = set_ok;\r
@@ -1303,7 +1307,7 @@ void GetTarinTarget(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData
     \r
 }\r
 \r
-static void GetOtherTarget(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取其他目标\r
+static void GetOtherTarget(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取其他目标\r
 {\r
     uint32_t tmp = 1;\r
     uint16_t tmp_data = 1;\r
@@ -1317,17 +1321,17 @@ static void GetOtherTarget(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *to
     memcpy(sendBuf+11,&tmp,4);\r
     memcpy(sendBuf+15,&tmp_data,2);\r
     \r
-       if(Check_CRC(crcnum,len,crcvalue))\r
+       if(Check_CRC(data,len,crcvalue))\r
        {\r
         // 73 2 17 1 0 0 0 8 0 0 0 1 0 0 0 8 0 2c 1 a 8 1e 1 1 1 2\r
 \r
-        uint16_t target_kcal = crcnum[0]+crcnum[1]*256;//目标卡路里\r
-        uint8_t target_km = crcnum[2];//目标里程\r
-        uint8_t target_stand = crcnum[3];//目标站立\r
-        uint8_t target_fattime = crcnum[4];//目标燃脂\r
-        uint8_t ring = crcnum[5];//铃声\r
-        uint8_t vibratior = crcnum[6];//振动\r
-        uint8_t notify = crcnum[7];//通知\r
+        uint16_t target_kcal = data[0]+data[1]*256;//目标卡路里\r
+        uint8_t target_km = data[2];//目标里程\r
+        uint8_t target_stand = data[3];//目标站立\r
+        uint8_t target_fattime = data[4];//目标燃脂\r
+        uint8_t ring = data[5];//铃声\r
+        uint8_t vibratior = data[6];//振动\r
+        uint8_t notify = data[7];//通知\r
 \r
         set_goal_caloriescount(target_kcal);\r
         set_goal_discount(target_km);\r
@@ -1399,7 +1403,7 @@ static void jsonCheck_alarm(uint8_t *buf)//json 解析闹钟数据
     \r
 }\r
 \r
-void SetAlarmDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数\r
+void SetAlarmDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数\r
 {\r
     uint32_t tmp = 1;\r
     uint16_t tmp_data = 1;\r
@@ -1413,9 +1417,9 @@ void SetAlarmDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalDat
     memcpy(sendBuf+11,&tmp,4);\r
     memcpy(sendBuf+15,&tmp_data,2);\r
 \r
-       if(Check_CRC(crcnum,len,crcvalue))\r
+       if(Check_CRC(data,len,crcvalue))\r
        {\r
-        jsonCheck_alarm(crcnum);\r
+        jsonCheck_alarm(data);\r
         \r
         sendBuf[17] = 1;\r
         sendBuf[18] = Calculate_CRC(sendBuf,18);\r
@@ -1432,7 +1436,7 @@ void SetAlarmDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalDat
 \r
 \r
 \r
-void GetWatchLcdParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数\r
+void GetWatchLcdParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数\r
 {\r
     uint32_t tmp = 1;\r
     uint16_t tmp_data = 1;\r
@@ -1446,16 +1450,16 @@ void GetWatchLcdParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tota
     memcpy(sendBuf+11,&tmp,4);\r
     memcpy(sendBuf+15,&tmp_data,2);\r
 \r
-       if(Check_CRC(crcnum,len,crcvalue))\r
+       if(Check_CRC(data,len,crcvalue))\r
        {\r
-        uint8_t type = crcnum[0];\r
+        uint8_t type = data[0];\r
         if(type == 0)//只设置屏幕亮度\r
         {\r
-            uint8_t brightness = crcnum[1];\r
+            uint8_t brightness = data[1];\r
             set_brigthness(brightness);\r
         }else if(type == 1)//设置亮屏时长 抬碗亮屏\r
         {\r
-            uint8_t screen_type = crcnum[1];//ms级别\r
+            uint8_t screen_type = data[1];//ms级别\r
             int screen_time = 5*1000;\r
             switch (screen_type)\r
             {\r
@@ -1480,7 +1484,7 @@ void GetWatchLcdParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tota
                 default:\r
                     break;\r
             }\r
-            bool raise = crcnum[2];\r
+            bool raise = data[2];\r
             set_ScreenDuration(screen_time);\r
             Set_RaiseToWake(raise);\r
         }\r
@@ -1499,7 +1503,7 @@ void GetWatchLcdParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tota
 \r
 \r
 \r
-void GetVoiceVibrateParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数\r
+void GetVoiceVibrateParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数\r
 {\r
     uint32_t tmp = 1;\r
     uint16_t tmp_data = 1;\r
@@ -1513,31 +1517,31 @@ void GetVoiceVibrateParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     memcpy(sendBuf+11,&tmp,4);\r
     memcpy(sendBuf+15,&tmp_data,2);\r
 \r
-       if(Check_CRC(crcnum,len,crcvalue))\r
+       if(Check_CRC(data,len,crcvalue))\r
        {\r
        \r
-        uint8_t type = crcnum[0];\r
+        uint8_t type = data[0];\r
         if(type == 0)//只改变系统音量参数 其他还是保持不变 按照原来的参数\r
         {\r
-            int sys_volume = crcnum[1];\r
+            int sys_volume = data[1];\r
             Set_SystemVolume(sys_volume);\r
 \r
         }else if(type == 1)//只改变铃声音量参数 其他还是保持不变 按照原来的参数\r
         {\r
             int ring_volume = 0;\r
-            ring_volume = crcnum[1];\r
+            ring_volume = data[1];\r
             Set_CallVolume(ring_volume);\r
 \r
         }else if(type == 2)//只改变媒体音量\r
         {\r
             int ring_volume = 0;\r
-            ring_volume = crcnum[1];\r
+            ring_volume = data[1];\r
             Set_CallVolume(ring_volume);\r
         }\r
         else if(type == 3)//只改变铃声和振动开关\r
         {\r
-            int bell_on = crcnum[1];\r
-            int vibrate_on = crcnum[2];\r
+            int bell_on = data[1];\r
+            int vibrate_on = data[2];\r
             set_SilentMode(bell_on);\r
             set_vibrationremiander(vibrate_on);\r
         }\r
@@ -1555,7 +1559,7 @@ void GetVoiceVibrateParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     \r
 }\r
 \r
-void GetHrSetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数\r
+void GetHrSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数\r
 {\r
     uint32_t tmp = 1;\r
     uint16_t tmp_data = 1;\r
@@ -1569,7 +1573,7 @@ void GetHrSetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalDa
     memcpy(sendBuf+11,&tmp,4);\r
     memcpy(sendBuf+15,&tmp_data,2);\r
 \r
-       if(Check_CRC(crcnum,len,crcvalue))\r
+       if(Check_CRC(data,len,crcvalue))\r
        {\r
         ble_recv_msg_callback_t func =  ble_recv_get_send_msg_callback_func();\r
         memset(&hr_param,0,sizeof(msg_get_heart_set_param_info_t));\r
@@ -1578,10 +1582,10 @@ void GetHrSetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalDa
             func(READ_FLASH_DATA,cmd,&hr_param,sizeof(msg_get_heart_set_param_info_t));\r
         }\r
         // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
-        hr_param.frequence = crcnum[0];\r
-        hr_param.remind_on = crcnum[1];\r
-        hr_param.max_min = crcnum[2];\r
-        hr_param.heart = crcnum[3];\r
+        hr_param.frequence = data[0];\r
+        hr_param.remind_on = data[1];\r
+        hr_param.max_min = data[2];\r
+        hr_param.heart = data[3];\r
         if(func != NULL)\r
         {\r
             func(WRITE_FLASH_DATA,cmd,&hr_param,sizeof(msg_get_heart_set_param_info_t));\r
@@ -1601,7 +1605,7 @@ void GetHrSetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalDa
 }\r
 \r
 \r
-void GetSpo2SetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)\r
+void GetSpo2SetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)\r
 {\r
     uint32_t tmp = 1;\r
     uint16_t tmp_data = 1;\r
@@ -1615,7 +1619,7 @@ void GetSpo2SetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *total
     memcpy(sendBuf+11,&tmp,4);\r
     memcpy(sendBuf+15,&tmp_data,2);\r
 \r
-       if(Check_CRC(crcnum,len,crcvalue))\r
+       if(Check_CRC(data,len,crcvalue))\r
        {\r
         ble_recv_msg_callback_t func =  ble_recv_get_send_msg_callback_func();\r
         memset(&spo2_param,0,sizeof(msg_get_spo2_set_param_info_t));\r
@@ -1624,11 +1628,11 @@ void GetSpo2SetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *total
             func(READ_FLASH_DATA,cmd,&spo2_param,sizeof(msg_get_spo2_set_param_info_t));\r
         }\r
         // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
-        spo2_param.frequence = crcnum[0];\r
-        spo2_param.remind_on = crcnum[1];\r
+        spo2_param.frequence = data[0];\r
+        spo2_param.remind_on = data[1];\r
         if(spo2_param.remind_on)\r
         {\r
-            spo2_param.spo2 = crcnum[2];\r
+            spo2_param.spo2 = data[2];\r
         }\r
         \r
         if(func != NULL)\r
@@ -1649,7 +1653,7 @@ void GetSpo2SetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *total
     \r
 }\r
 \r
-void SetsleepSetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置睡眠\r
+void SetsleepSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置睡眠\r
 {\r
     uint32_t tmp = 1;\r
     uint16_t tmp_data = 1;\r
@@ -1663,15 +1667,15 @@ void SetsleepSetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tota
     memcpy(sendBuf+11,&tmp,4);\r
     memcpy(sendBuf+15,&tmp_data,2);\r
 \r
-       if(Check_CRC(crcnum,len,crcvalue))\r
+       if(Check_CRC(data,len,crcvalue))\r
        {\r
         msg_get_sleep_param_info_t sleep_info;\r
-        sleep_info.schedule = crcnum[0];\r
-        sleep_info.bedtime_hour= crcnum[1];\r
-        sleep_info.bedtime_min= crcnum[2];\r
-        sleep_info.waketime_hour= crcnum[3];\r
-        sleep_info.waketime_min= crcnum[4];\r
-        sleep_info.bedtime_alarm= crcnum[5];\r
+        sleep_info.schedule = data[0];\r
+        sleep_info.bedtime_hour= data[1];\r
+        sleep_info.bedtime_min= data[2];\r
+        sleep_info.waketime_hour= data[3];\r
+        sleep_info.waketime_min= data[4];\r
+        sleep_info.bedtime_alarm= data[5];\r
         ble_set_sleep_remind(sleep_info);\r
 \r
         sendBuf[17] = 1;\r
@@ -1686,7 +1690,7 @@ void SetsleepSetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tota
     }\r
 }\r
 \r
-void SetDrinkSetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取喝水提醒s设置\r
+void SetDrinkSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取喝水提醒s设置\r
 {\r
     uint32_t tmp = 1;\r
     uint16_t tmp_data = 1;\r
@@ -1700,21 +1704,21 @@ void SetDrinkSetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tota
     memcpy(sendBuf+11,&tmp,4);\r
     memcpy(sendBuf+15,&tmp_data,2);\r
 \r
-       if(Check_CRC(crcnum,len,crcvalue))\r
+       if(Check_CRC(data,len,crcvalue))\r
        {\r
         msg_drink_info_t drink_info;\r
-        drink_info.drink_on = crcnum[0];\r
-        if(crcnum[1])\r
+        drink_info.drink_on = data[0];\r
+        if(data[1])\r
         {\r
             drink_info.drink_on=2;\r
         }\r
-        // drink_info.drink_on = crcnum[1];\r
-         drink_info.goal = crcnum[2]+crcnum[3]*256;\r
-         drink_info.time_start = crcnum[4]<<16|crcnum[5];\r
-        if(crcnum[1])\r
+        // drink_info.drink_on = data[1];\r
+         drink_info.goal = data[2]+data[3]*256;\r
+         drink_info.time_start = data[4]<<16|data[5];\r
+        if(data[1])\r
         {\r
-            drink_info.time_end = crcnum[6]<<16|crcnum[7];\r
-            drink_info.freq = crcnum[8];\r
+            drink_info.time_end = data[6]<<16|data[7];\r
+            drink_info.freq = data[8];\r
            \r
         }\r
         ble_set_drink_remind(drink_info);\r
@@ -1732,7 +1736,7 @@ void SetDrinkSetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tota
     \r
 }\r
 //APP设置步数目标\r
-void SetsteptargetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)\r
+void SetsteptargetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)\r
 {\r
     uint32_t tmp = 1;\r
     uint16_t tmp_data = 1;\r
@@ -1746,14 +1750,14 @@ void SetsteptargetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *to
     memcpy(sendBuf+11,&tmp,4);\r
     memcpy(sendBuf+15,&tmp_data,2);\r
 \r
-       if(Check_CRC(crcnum,len,crcvalue))\r
+       if(Check_CRC(data,len,crcvalue))\r
        {\r
         \r
         uint32_t targetStep;\r
-        memcpy(&targetStep,crcnum,4);\r
-        uint8_t ringOn=crcnum[5];\r
-        uint8_t vibration=crcnum[6];\r
-        uint8_t notify=crcnum[7];\r
+        memcpy(&targetStep,data,4);\r
+        uint8_t ringOn=data[5];\r
+        uint8_t vibration=data[6];\r
+        uint8_t notify=data[7];\r
         printf("设置步数:%d\r\n",targetStep);\r
         \r
         set_goal_stepcount(targetStep);\r
@@ -1845,7 +1849,7 @@ uint8_t jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气
 }\r
 \r
 \r
-void GetWeatherCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取天气数据\r
+void GetWeatherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取天气数据\r
 {\r
     uint32_t tmp = 1;\r
     uint16_t tmp_data = 1;\r
@@ -1858,11 +1862,11 @@ void GetWeatherCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,
     memcpy(sendBuf+7,&tmp,4);\r
     memcpy(sendBuf+11,&tmp,4);\r
     memcpy(sendBuf+15,&tmp_data,2);\r
-    // printf("GetWeatherCmd:len:%d crcnum:%s\r\n",len,crcnum);\r
-       if(Check_CRC(crcnum,len,crcvalue))\r
+    // printf("GetWeatherCmd:len:%d data:%s\r\n",len,data);\r
+       if(Check_CRC(data,len,crcvalue))\r
        {\r
         uint8_t check = 1;\r
-        jsonCheck_weather(crcnum,&check);\r
+        jsonCheck_weather(data,&check);\r
         sendBuf[17] = check;\r
         sendBuf[18] = Calculate_CRC(sendBuf,18);\r
         sendBleData(sendBuf,19);\r
@@ -1876,8 +1880,12 @@ void GetWeatherCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,
     \r
 }\r
 //APP下发设置用户数据\r
-void getUserInfo(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
+void getUserInfo(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
 {\r
+    \r
+    // 用户数据同步死机,暂时跳过 by Snicker\r
+    return;\r
+\r
     uint8_t value[19];\r
     memset(value,0,19);\r
     uint32_t tmp = 1;\r
@@ -1888,8 +1896,7 @@ void getUserInfo(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,ui
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp,2);\r
-    \r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         printf("getUserInfo:!!!!!!!!\r\n");\r
         msg_user_info_t user_info={0};\r
@@ -1898,26 +1905,26 @@ void getUserInfo(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,ui
         \r
         for(uint8_t i = 0;i<len;i++)\r
         {\r
-            printf("%x ",crcnum[i]);\r
+            printf("%x ",data[i]);\r
         }\r
-        user_info.age = crcnum[0];\r
-        user_info.gender = crcnum[1];\r
-        user_info.height  = crcnum[2];\r
+        user_info.age = data[0];\r
+        user_info.gender = data[1];\r
+        user_info.height  = data[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
+        memcpy(&user_info.weight,data+3,2);\r
+        //memcpy(data+3,&user_info.weight,2);\r
+        memcpy(&user_info.target_step,data+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
+        //memcpy(data+5,&user_info.target_step,4);\r
+        memcpy(&user_info.fat_time,data+9,2);\r
+        user_info.target_stand = data[11];\r
+        user_info.timeformat = data[12];\r
         uint32_t target_kcal = 0;\r
-        memcpy(&target_kcal,crcnum+13,2);\r
+        memcpy(&target_kcal,data+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
+        uint8_t target_km = data[15];\r
         printf("getUserInfo:!!!!!!!!22\r\n");\r
         set_goal_discount(target_km);\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
@@ -1934,7 +1941,7 @@ void getUserInfo(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,ui
     }\r
 }\r
 //APP下发快捷辅助功能参数\r
-void get_auxil_fun_parm(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
+void get_auxil_fun_parm(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1948,9 +1955,9 @@ void get_auxil_fun_parm(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *total
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&packtmp,2);\r
     \r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
-        uint8_t paramCnt = crcnum[0];//快捷辅助功能 按照协议文档要区分\r
+        uint8_t paramCnt = data[0];//快捷辅助功能 按照协议文档要区分\r
         set_quick_auxiliary_paramters(paramCnt);\r
         value[17] = 1;\r
         value[18] = Calculate_CRC(value,18);\r
@@ -1961,22 +1968,22 @@ void get_auxil_fun_parm(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *total
         sendBleData(value,19);\r
     }\r
 }\r
-void getTRAIN_TARGETInfo(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
+void getTRAIN_TARGETInfo(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
 {\r
 \r
 }\r
 // #include "phoneaddressmodel.h"\r
 //电话薄解析函数\r
-void  Parse_addressbook_bin(uint8_t *crcnum,uint16_t len)\r
+void  Parse_addressbook_bin(uint8_t *data,uint16_t len)\r
 {\r
-    int num=crcnum[0];//人数\r
+    int num=data[0];//人数\r
     int offset=1;\r
     while (num)\r
     {\r
-        uint8 sex = crcnum[offset];\r
+        uint8 sex = data[offset];\r
         printf("性别: %d\r\n",sex);\r
         offset=offset+1;\r
-        uint8 name_len=crcnum[offset];\r
+        uint8 name_len=data[offset];\r
         printf("name_len %d\r\n",name_len);\r
         char name[32]={0};\r
         if(name_len==0)\r
@@ -1986,7 +1993,7 @@ void  Parse_addressbook_bin(uint8_t *crcnum,uint16_t len)
         }\r
         else\r
         {\r
-            memcpy(name,&crcnum[offset+1],name_len);\r
+            memcpy(name,&data[offset+1],name_len);\r
             printf("姓名: %s\r\n",name);\r
             // for(int i=0;i<name_len;i++)\r
             // {\r
@@ -1995,14 +2002,14 @@ void  Parse_addressbook_bin(uint8_t *crcnum,uint16_t len)
             // printf("r\n");\r
         }\r
         offset=offset+name_len+1;\r
-        uint8 phone_num=crcnum[offset]; \r
+        uint8 phone_num=data[offset]; \r
         offset=offset+1;\r
         for(int i=0;i<phone_num;i++)\r
         { \r
 \r
-            uint8 phonen_len=crcnum[offset];\r
+            uint8 phonen_len=data[offset];\r
             char phonen_name[32]={0};\r
-            memcpy(phonen_name,&crcnum[offset+1],phonen_len);\r
+            memcpy(phonen_name,&data[offset+1],phonen_len);\r
             printf("号码: %s\r\n",phonen_name);\r
             //  for(int i=0;i<phonen_len;i++)\r
             // {\r
@@ -2014,13 +2021,13 @@ void  Parse_addressbook_bin(uint8_t *crcnum,uint16_t len)
         }\r
         for(int i=0;i<phone_num;i++)\r
         {\r
-            uint8 add = crcnum[offset];\r
+            uint8 add = data[offset];\r
             printf("归属地长度: %d\r\n",add);\r
-            memcpy(name,&crcnum[offset+1],add);\r
+            memcpy(name,&data[offset+1],add);\r
             printf("归属地: %s\r\n",name);\r
             offset=offset+add+1;\r
-            uint8 yun = crcnum[offset];\r
-            memcpy(name,&crcnum[offset+1],yun);\r
+            uint8 yun = data[offset];\r
+            memcpy(name,&data[offset+1],yun);\r
             printf("运营商: %s\r\n",name);\r
             offset=offset+yun+1;\r
         }\r
@@ -2029,7 +2036,7 @@ void  Parse_addressbook_bin(uint8_t *crcnum,uint16_t len)
     }\r
      \r
 }\r
-void getAPPaddressbook(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
+void getAPPaddressbook(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -2042,21 +2049,21 @@ void getAPPaddressbook(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalD
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp,2);\r
     \r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         //解析,传来的二进制数据\r
         // char *address_path = addressbook();\r
         // FILE *file = fopen(address_path, "wb+");\r
         // if (file)\r
         // {\r
-        //     size_t len_t = fwrite((void *)crcnum,1,len,file);\r
+        //     size_t len_t = fwrite((void *)data,1,len,file);\r
         //     fclose(file); \r
         //     if(len_t == len){\r
         //         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "fwrite:%d",len_t);\r
                 \r
         //     }\r
         // }\r
-        addressbookToRead((char*)crcnum);\r
+        addressbookToRead((char*)data);\r
         value[17] = 0x01;\r
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
@@ -2139,7 +2146,7 @@ void type2AE4Data(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *total
 }\r
 \r
 //切换表盘\r
-static void switchDialCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void switchDialCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -2153,10 +2160,10 @@ static void switchDialCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
     \r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         uint16_t daila_type = 0;\r
-        memcpy(&daila_type,&crcnum[17],2);\r
+        memcpy(&daila_type,&data[17],2);\r
         value[17] = 1;//校验成功\r
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
@@ -2169,13 +2176,13 @@ static void switchDialCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
 }\r
 \r
 //获取闹钟数据\r
-static void GetAlarmDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetAlarmDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
    \r
     uint32_t tmp = 1;\r
     uint32_t data_len = 1;\r
     uint16_t tmp_data = 1;\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         \r
         cJSON *dataJSON = cJSON_CreateObject();\r
@@ -2253,7 +2260,7 @@ static void GetAlarmDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *t
 \r
 \r
 //关于本机内容\r
-static void aboutDeviceCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void aboutDeviceCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
 \r
     uint8_t _major,_mid,_minor;\r
@@ -2284,7 +2291,7 @@ static void aboutDeviceCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *to
     memcpy(value+7,&data_len,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         memcpy(value+17,(uint8_t *)json_format,data_len);//17+69 = 86\r
         \r
@@ -2319,11 +2326,11 @@ void setFindWatchFlag(uint8_t flag)
     value[18] = Calculate_CRC(value,18);\r
     sendBleData(value,19);\r
 }\r
-static void findWatchCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void findWatchCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
-        uint8_t findFlag = crcnum[0];\r
+        uint8_t findFlag = data[0];\r
         //弹窗界面\r
         if(findFlag)//查找手表弹窗界面\r
         {\r
@@ -2339,7 +2346,7 @@ static void findWatchCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tota
     } \r
 }\r
 //获取sd卡剩余空间\r
-static void GetSDSpaceCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetSDSpaceCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[27];\r
     memset(value,0,27);\r
@@ -2352,7 +2359,7 @@ static void GetSDSpaceCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         uint8_t sdFlag = 0;\r
         if(sdFlag == 1)// 1获取失败 2 获取成功 \r
@@ -2373,7 +2380,7 @@ static void GetSDSpaceCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
     } \r
 }\r
 //获取当前数据\r
-static void GetCurDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetCurDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     cJSON *dataJSON = cJSON_CreateObject();\r
     const char *string_value[8]={"hr","spo2","stress","steps","duration","standup","calories","distance"};\r
@@ -2406,7 +2413,7 @@ static void GetCurDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
     \r
     // uint8_t buf[22] = {0x7b,0x22,0x74,0x70,0x22,0x3a,0x31,0x2c,0x22,0x70,0x6e,0x22,0x3a,0x22,0x69,0x50,0x68,0x6f,0x6e,0x65,0x22,0x7d};\r
     \r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         memcpy(value+17,(uint8_t *)json_format,data_len);\r
         \r
@@ -2424,7 +2431,7 @@ static void GetCurDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
     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
+static void GetBatteryLevelCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -2437,7 +2444,7 @@ static void GetBatteryLevelCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         float voltage = 0.0F;\r
         uint8_t power = 0;\r
@@ -2453,7 +2460,7 @@ static void GetBatteryLevelCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
     }\r
 }\r
 //获取开关消息推送功能\r
-static void GetSwitchMessCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetSwitchMessCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -2466,9 +2473,9 @@ static void GetSwitchMessCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
-        uint8_t switch_on = crcnum[0];//0 关闭 1 开启\r
+        uint8_t switch_on = data[0];//0 关闭 1 开启\r
 \r
         value[17] = 1;\r
         value[18] = Calculate_CRC(value,18);\r
@@ -2481,7 +2488,7 @@ static void GetSwitchMessCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     }\r
 }\r
 //撤销当前文件传输 1 OTA 2MP3 3表盘 3天气 5闹钟\r
-static void RemoveFileCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void RemoveFileCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -2494,9 +2501,9 @@ static void RemoveFileCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
-        uint8_t file_type= crcnum[0];//1 ota 2 MP3\r
+        uint8_t file_type= data[0];//1 ota 2 MP3\r
 \r
         value[17] = 1; //\r
         value[18] = Calculate_CRC(value,18);\r
@@ -2510,7 +2517,7 @@ static void RemoveFileCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
 }\r
 \r
 //获取指定类型文件目录\r
-static void GetFileTypeCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetFileTypeCmd(uint8_t *data,uint16_t len)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -2523,9 +2530,9 @@ static void GetFileTypeCmd(uint8_t *crcnum,uint16_t len)
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,1))\r
+    if(Check_CRC(data,len,1))\r
     {\r
-        uint8_t fileType = crcnum[17];//2 mp3 3 表盘\r
+        uint8_t fileType = data[17];//2 mp3 3 表盘\r
 \r
         value[17] = 1; //1 操作成功 2 操作失败\r
         value[18] = Calculate_CRC(value,18);\r
@@ -2538,7 +2545,7 @@ static void GetFileTypeCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //删除指定类型所有的文件\r
-static void DeleteFileTypeCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void DeleteFileTypeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -2551,7 +2558,7 @@ static void DeleteFileTypeCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         value[17] = 1; //1 操作成功 2 操作失败\r
         value[18] = Calculate_CRC(value,18);\r
@@ -2565,7 +2572,7 @@ static void DeleteFileTypeCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
 }\r
 //开启指定运动模式\r
 \r
-static void OpenSportModeCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void OpenSportModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -2578,11 +2585,11 @@ static void OpenSportModeCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
-        training_ble_data.sportType= crcnum[0];//运动类型 0 健走 1跑步 2骑行 3\r
+        training_ble_data.sportType= data[0];//运动类型 0 健走 1跑步 2骑行 3\r
         training_ble_data.controlmd= START;\r
-        printf("开启指定运动%d\r\n",crcnum[0]);\r
+        printf("开启指定运动%d\r\n",data[0]);\r
         CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
         value[17] = 1; //1 操作成功 2 操作失败\r
         value[18] = Calculate_CRC(value,18);\r
@@ -2595,7 +2602,7 @@ static void OpenSportModeCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     }\r
 }\r
 //结束运动模式\r
-static void StopSportModeCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void StopSportModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -2608,7 +2615,7 @@ static void StopSportModeCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
        \r
         training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3\r
@@ -2627,7 +2634,7 @@ static void StopSportModeCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     }\r
 }\r
 //设置语言\r
-static void SetLanguageCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void SetLanguageCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -2640,9 +2647,9 @@ static void SetLanguageCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *to
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
-        uint8_t language = crcnum[0];\r
+        uint8_t language = data[0];\r
         set_languaage(language);\r
         value[17] = 1; //1 操作成功 2 操作失败\r
         value[18] = Calculate_CRC(value,18);\r
@@ -2655,7 +2662,7 @@ static void SetLanguageCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *to
     }\r
 }\r
 //开启/关闭获取实时训练数据\r
-static void SetRealTimeDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void SetRealTimeDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -2668,9 +2675,9 @@ static void SetRealTimeDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
-        uint8_t autoSportData = crcnum[0];//开关 1开启 0关闭\r
+        uint8_t autoSportData = data[0];//开关 1开启 0关闭\r
          /*进行开启关闭操作*/\r
         printf("进行开启关闭操作 %d\r\n", autoSportData);\r
         set_traning_updata_auto( autoSportData);\r
@@ -2686,7 +2693,7 @@ static void SetRealTimeDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
     }\r
 }\r
 //设置训练数据采集频率\r
-static void SetRTDataFreCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void SetRTDataFreCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -2699,9 +2706,9 @@ static void SetRTDataFreCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *t
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
-        uint8_t Frequence = crcnum[0];//频率单位是s\r
+        uint8_t Frequence = data[0];//频率单位是s\r
         /*设置获取频率*/\r
         printf("设置获取频率 %d\r\n", Frequence);\r
         set_traning_updata_freq(Frequence);\r
@@ -2751,10 +2758,10 @@ void sendRealTimeDataToAPP(uint8_t flag)
     \r
 }\r
 //获取实时训练数据\r
-static void GetRealTimeDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetRealTimeDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     \r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         sendRealTimeDataToAPP(1);\r
     }else\r
@@ -2763,7 +2770,7 @@ static void GetRealTimeDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
     }\r
 }\r
 //设置最高心率提醒\r
-static void SetMaxHrRemindCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void SetMaxHrRemindCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -2776,9 +2783,9 @@ static void SetMaxHrRemindCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))//\r
+    if(Check_CRC(data,len,crcvalue))//\r
     {\r
-        uint8_t maxHr = crcnum[0];\r
+        uint8_t maxHr = data[0];\r
         if(maxHr > 250)maxHr = 250;//最高心率是250\r
         else if(maxHr <= 0) maxHr = 0;\r
         set_traning_heart_max(maxHr);\r
@@ -2796,7 +2803,7 @@ static void SetMaxHrRemindCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
     \r
 }\r
 //训练暂停/恢复\r
-static void GetSportPasueResetCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetSportPasueResetCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -2809,9 +2816,9 @@ static void GetSportPasueResetCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))//\r
+    if(Check_CRC(data,len,crcvalue))//\r
     {\r
-        uint8_t PauseStop = crcnum[0];//0 暂停 1恢复\r
+        uint8_t PauseStop = data[0];//0 暂停 1恢复\r
         if(PauseStop==0)\r
         {\r
             training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3\r
@@ -2841,7 +2848,7 @@ static void GetSportPasueResetCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint
     \r
 }\r
 //发送当前表盘到app\r
-static void SendDialToAppCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void SendDialToAppCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[20];\r
     memset(value,0,20);\r
@@ -2855,7 +2862,7 @@ static void SendDialToAppCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     memcpy(value+7,&datalen,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))//\r
+    if(Check_CRC(data,len,crcvalue))//\r
     {\r
         uint16_t dialNum = 450;//0 暂停 1恢复\r
         memcpy(&value[17],&dialNum,2);\r
@@ -2870,7 +2877,7 @@ static void SendDialToAppCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     \r
 }\r
 //获取手表当前状态\r
-static void GetWatchStatusCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetWatchStatusCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[20];\r
     memset(value,0,20);\r
@@ -2891,7 +2898,7 @@ static void GetWatchStatusCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
     sendBleData(value,19);\r
 }\r
 //获取手表屏幕参数\r
-static void GetScreenParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetScreenParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[21];\r
     memset(value,0,21);\r
@@ -2941,7 +2948,7 @@ static void GetScreenParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
 }\r
 \r
 //App删除表盘 (仅W4手表)\r
-static void DeleteDialUidCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void DeleteDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[20];\r
     memset(value,0,20);\r
@@ -2954,10 +2961,10 @@ static void DeleteDialUidCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         uint16_t deleteDial = 0;//删除的表盘UID \r
-        deleteDial=crcnum[0]+crcnum[1]*256;\r
+        deleteDial=data[0]+data[1]*256;\r
         value[17] = 1;// 1删除成功 2 没有改资源 0指令校验失败\r
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
@@ -2973,7 +2980,7 @@ static void DeleteDialUidCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
 }\r
 \r
 //获取手表声音与振动参数 Sound and Vibration\r
-static void GetSoundVibrationCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetSoundVibrationCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[23];\r
     memset(value,0,23);\r
@@ -2987,7 +2994,7 @@ static void GetSoundVibrationCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8
     memcpy(value+7,&datalen,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
        \r
         int sys_volume = Get_SystemVolume();\r
@@ -3015,7 +3022,7 @@ static void GetSoundVibrationCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8
 }\r
 \r
 //APP获取手表辅助功能参数Auxiliary functions\r
-static void GetWatchAuxFuncCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetWatchAuxFuncCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[23];\r
     memset(value,0,23);\r
@@ -3028,7 +3035,7 @@ static void GetWatchAuxFuncCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         uint8_t paramCmt = 0;//辅助功能 0\r
         paramCmt = get_quick_auxiliary_paramters();\r
@@ -3046,7 +3053,7 @@ static void GetWatchAuxFuncCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
     \r
 }\r
 //APP获取手表心率设置\r
-static void GetHrGetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetHrGetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[22];\r
     memset(value,0,22);\r
@@ -3061,7 +3068,7 @@ static void GetHrGetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     memcpy(value+7,&datalen,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         uint8_t hrfreq = 0;//监测频率\r
         uint8_t hrSwitch = 0;//心率提醒开关\r
@@ -3091,7 +3098,7 @@ static void GetHrGetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     \r
 }\r
 //APP获取手表血氧设置\r
-static void GetSpo2GetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetSpo2GetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[21];\r
     memset(value,0,21);\r
@@ -3105,7 +3112,7 @@ static void GetSpo2GetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
     memcpy(value+7,&datalen,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         uint8_t spo2freq = 0;//监测频率\r
         uint8_t spo2Switch = 0;//心率提醒开关\r
@@ -3142,7 +3149,7 @@ void cameraSend(uint8_t flag)//2进行手势拍照 3退出拍照界面
     sendBleData(value,19);\r
 }\r
 //手势拍照协议\r
-static void carmeraCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void carmeraCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -3155,9 +3162,9 @@ static void carmeraCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totald
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
-        uint8_t carmera_on = crcnum[0]; //0退出拍照界面 1进入拍照界面\r
+        uint8_t carmera_on = data[0]; //0退出拍照界面 1进入拍照界面\r
         //需要加界面弹窗提示\r
         if(carmera_on == 1)//进入拍照界面\r
         {\r
@@ -3179,7 +3186,7 @@ static void carmeraCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totald
 }\r
 \r
 //APP获取手表喝水提醒设置\r
-static void GetDrinkParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetDrinkParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -3203,7 +3210,7 @@ static void GetDrinkParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
 }\r
 \r
 //APP发送恢复出厂设置\r
-static void GetFactoryCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetFactoryCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -3216,7 +3223,7 @@ static void GetFactoryCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         \r
         value[17] = 1;// \r
@@ -3231,7 +3238,7 @@ static void GetFactoryCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
 }\r
 //APP发送重新启动\r
 static uint8_t power_buf[2]={0};\r
-static void GetResetCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetResetCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -3244,7 +3251,7 @@ static void GetResetCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *total
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         \r
         value[17] = 1;// \r
@@ -3261,7 +3268,7 @@ static void GetResetCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *total
     }\r
 }\r
 //APP发送关机\r
-static void GetPowerOffCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetPowerOffCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -3274,7 +3281,7 @@ static void GetPowerOffCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *to
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         \r
         value[17] = 1;// \r
@@ -3295,7 +3302,7 @@ static void GetPowerOffCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *to
 \r
 \r
 //app发送公英制单位\r
-static void GetMetricCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetMetricCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -3308,9 +3315,9 @@ static void GetMetricCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tota
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
-        uint8_t kmileter = crcnum[0];//公英制单位 0 是公英制 1英制单位\r
+        uint8_t kmileter = data[0];//公英制单位 0 是公英制 1英制单位\r
         value[17] = 1;// \r
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
@@ -3323,7 +3330,7 @@ static void GetMetricCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tota
 }\r
 \r
 //app获取睡眠设置\r
-static void GetSleepParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetSleepParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[24];\r
     memset(value,0,24);\r
@@ -3366,7 +3373,7 @@ static void GetSleepParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
 }\r
 \r
 //app获取所有表盘UID\r
-static void GetAllDialUidCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetAllDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[24];\r
     memset(value,0,24);\r
@@ -3393,7 +3400,7 @@ static void GetAllDialUidCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     }\r
 }\r
 //app获取目标步数设置\r
-static void GetTargetStepCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetTargetStepCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[25];\r
     memset(value,0,25);\r
@@ -3429,7 +3436,7 @@ static void GetTargetStepCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
 }\r
 \r
 //app其他目标设置\r
-static void GetTargetOtherCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetTargetOtherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[26];\r
     memset(value,0,26);\r
@@ -3478,7 +3485,7 @@ static void GetTargetOtherCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t
 }\r
 \r
 //app发送解除配对消息\r
-static void UnpairMessCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void UnpairMessCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -3492,7 +3499,7 @@ static void UnpairMessCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
     memcpy(value+7,&datalen,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         \r
         value[17] = 1;//\r
@@ -3506,7 +3513,7 @@ static void UnpairMessCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
     }\r
 }\r
 //app发送同步数据结束消息\r
-static void GetSynDataEndCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void GetSynDataEndCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -3520,7 +3527,7 @@ static void GetSynDataEndCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     memcpy(value+7,&datalen,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         value[17] = 1;//\r
         value[18] = Calculate_CRC(value,18);\r
@@ -3533,7 +3540,7 @@ static void GetSynDataEndCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *
     }\r
 }\r
 //同步历史步数\r
-static void stepDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void stepDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[58];\r
     memset(value,0,58);\r
@@ -3547,7 +3554,7 @@ static void stepDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *total
     memcpy(value+7,&tmpToall,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         uint8_t data_buf[40]; //\r
         uint8_t data_len = 0;\r
@@ -3581,7 +3588,7 @@ static void stepDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *total
     }\r
 }\r
 //同步卡路里历史数据\r
-static void kcalDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void kcalDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[58];\r
     memset(value,0,58);\r
@@ -3595,7 +3602,7 @@ static void kcalDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *total
     memcpy(value+7,&tmpToall,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         uint8_t data_buf[40]; //\r
         uint8_t data_len = 4;\r
@@ -3622,7 +3629,7 @@ static void kcalDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *total
     }\r
 }\r
 //同步距离历史数据\r
-static void disDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void disDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[58];\r
     memset(value,0,58);\r
@@ -3636,7 +3643,7 @@ static void disDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totald
     memcpy(value+7,&tmpToall,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         uint8_t data_buf[40]; //\r
         uint8_t data_len = 4;\r
@@ -3715,7 +3722,7 @@ static void Send_json_Data_Cmd(uint16_t pack_size,uint8_t id)
         // ym_free(json_format);\r
 }\r
 //同步睡眠数据\r
-static void sleepDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void sleepDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[18+1];\r
     memset(value,0,18+1);\r
@@ -3729,7 +3736,7 @@ static void sleepDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tota
     memcpy(value+7,&tmpToall,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         value[17] = 0;\r
         value[18] = 0xff;\r
@@ -3742,7 +3749,7 @@ static void sleepDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tota
     }\r
 }\r
 //同步数据结束完成\r
-static void synEndDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void synEndDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[18+1];\r
     memset(value,0,18+1);\r
@@ -3756,7 +3763,7 @@ static void synEndDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
     memcpy(value+7,&tmpToall,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         value[17] = 1;\r
         value[18] = Calculate_CRC(value,18);\r
@@ -3769,7 +3776,7 @@ static void synEndDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tot
     }\r
 }\r
 //同步站立历史数据\r
-static void standDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void standDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[58];\r
     memset(value,0,58);\r
@@ -3783,7 +3790,7 @@ static void standDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tota
     memcpy(value+7,&tmpToall,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         uint8_t data_buf[40]; //\r
         uint8_t data_len = 4;\r
@@ -3811,7 +3818,7 @@ static void standDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *tota
 }\r
 \r
 //同步燃脂时间数据\r
-static void burntimeDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void burntimeDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[48];\r
     memset(value,0,48);\r
@@ -3825,7 +3832,7 @@ static void burntimeDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *t
     memcpy(value+7,&tmpToall,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         uint8_t data_buf[30]; //\r
         uint32_t data_len = 0;\r
@@ -3861,7 +3868,7 @@ uint8 read_hart_jsondata(uint8 day)
 }\r
 \r
 //同步血氧历史数据\r
-static void spo2DataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+static void spo2DataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[43];\r
     memset(value,0,43);\r
@@ -3875,7 +3882,7 @@ static void spo2DataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *total
     memcpy(value+7,&tmpToall,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         uint32_t data_len = 0;\r
         for(uint16_t i = 0;i<5;i++)\r
@@ -4249,7 +4256,7 @@ void Read_file_buf_send_bin_Data(uint8_t num,uint16_t id,char *data_item)
 }\r
 \r
 //手机app下发读设备数据指令\r
-void readDevDataBle(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)\r
+void readDevDataBle(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)\r
 {\r
     uint8_t sendBuf[19];\r
     memset(sendBuf,0,19);\r
@@ -4267,10 +4274,10 @@ void readDevDataBle(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData
     memcpy(sendBuf+11,&pack_count,4);//分包索引号\r
     memcpy(sendBuf+15,&pack_datalen,2);//分包数据长度\r
 \r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         bleSendTypeID=cmd-((cmd/256)*256);\r
-        // printf("同步第%d天的数据\r\n",crcnum[0]);\r
+        // printf("同步第%d天的数据\r\n",data[0]);\r
         int num;\r
         switch (bleSendTypeID)\r
         {\r
@@ -4281,7 +4288,7 @@ void readDevDataBle(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData
                 {\r
                     num=96;\r
                 }\r
-                printf("同步心率数据,每包最多:%d 条数据 crcnum:%d\r\n",num,crcnum[0]);\r
+                printf("同步心率数据,每包最多:%d 条数据 data:%d\r\n",num,data[0]);\r
                 Read_file_buf_send_bin_Data(num,0x40,"heart_data_list");\r
                 break;\r
             case 0x41://同步血氧历史数据\r
@@ -4440,6 +4447,9 @@ void bleLongRecvData(uint8_t *data, uint16_t data_size,uint8_t *buf_cmd,uint8_t
         case 0x03://\r
             type2AE1Data(buf_cmd,data,data_size,totalData,crcvalue);\r
             break;\r
+        case 0x04:\r
+            type2AE0Data(buf_cmd,data,data_size,totalData,crcvalue);\r
+            break;\r
         default:\r
             break;\r
     }\r
@@ -4680,7 +4690,7 @@ uint8_t jscheck_ancs(uint8_t *data)
     }\r
     return 1;\r
 }\r
-void ancsDataShowCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
+void ancsDataShowCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -4693,11 +4703,11 @@ void ancsDataShowCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalDat
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp,2);\r
     \r
-    if(Check_CRC(crcnum,len,crcvalue))\r
+    if(Check_CRC(data,len,crcvalue))\r
     {\r
         //解析ancs数据并且显示出来\r
         uint8_t check_ok= 1;\r
-        check_ok = jscheck_ancs(crcnum);\r
+        check_ok = jscheck_ancs(data);\r
         value[17] = 1;\r
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
@@ -4718,6 +4728,103 @@ void type2AE1Data(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *total
             break;\r
     }\r
 }\r
+\r
+static ota_file_struct_t g_ota_file_stat={0};\r
+\r
+errcode_t ota_json_file_save(uint8_t *data,uint16_t datalen)\r
+{\r
+    printf("ota_json_file_save %s\n",data);\r
+\r
+    /**\r
+     *  * OTA文件信息格式\r
+     * {\r
+        "type":1, \r
+        //"name":"MT2523_FOTA.bin",\r
+        "size":3894464,\r
+        "major":0,\r
+        "mid":3,\r
+        "minor":2\r
+        "isForced":1\r
+        }\r
+\r
+        {"isForced":0,"size":254208,"minor":1,"type":1,"major":1,"mid":0}\r
+        */\r
+\r
+    cJSON* root = cJSON_Parse((const char *)data);\r
+    \r
+    if(root != NULL)\r
+    {         \r
+        cJSON* ota_type_json = cJSON_GetObjectItem(root, "type");\r
+        if(ota_type_json != NULL && cJSON_IsNumber(ota_type_json))\r
+        {\r
+            g_ota_file_stat.ota_type = ota_type_json->valueint;\r
+        }\r
+\r
+        cJSON* ota_name_json = cJSON_GetObjectItem(root, "name");\r
+        if ( ota_name_json != NULL && cJSON_IsString(ota_name_json)) {\r
+            g_ota_file_stat.ota_name = ota_name_json->valuestring;\r
+        }\r
+\r
+        cJSON* ota_size_json = cJSON_GetObjectItem(root, "size");\r
+        if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json))\r
+        {\r
+            g_ota_file_stat.ota_size = ota_size_json->valueint;\r
+        }\r
+        cJSON* ota_major_json = cJSON_GetObjectItem(root, "major");\r
+        if(ota_major_json != NULL && cJSON_IsNumber(ota_major_json))\r
+        {\r
+            g_ota_file_stat.ota_major = ota_major_json->valueint;\r
+        }\r
+        cJSON* ota_mid_json = cJSON_GetObjectItem(root, "mid");\r
+        if(ota_mid_json != NULL && cJSON_IsNumber(ota_mid_json))\r
+        {\r
+            g_ota_file_stat.ota_mid = ota_mid_json->valueint;\r
+        }\r
+        cJSON* ota_minor_json = cJSON_GetObjectItem(root, "minor");\r
+        if(ota_minor_json != NULL && cJSON_IsNumber(ota_minor_json))\r
+        {\r
+            g_ota_file_stat.ota_minor = ota_minor_json->valueint;\r
+        }\r
+        cJSON* ota_isforced_json = cJSON_GetObjectItem(root, "isForced");\r
+        if(ota_isforced_json != NULL && cJSON_IsNumber(ota_isforced_json))\r
+        {\r
+            g_ota_file_stat.ota_isforced = ota_isforced_json->valueint;\r
+        }\r
+        cJSON_Delete(root);\r
+\r
+        printf("  ota_type= %d, ota_name=%s, ota_size=%d, ota_major=%d, ota_mid=%d, ota_minor=%d, ota_isforced=%d \n",\r
+            g_ota_file_stat.ota_type,\r
+            g_ota_file_stat.ota_name,\r
+            g_ota_file_stat.ota_size,\r
+            g_ota_file_stat.ota_major,\r
+            g_ota_file_stat.ota_mid,\r
+            g_ota_file_stat.ota_minor,\r
+            g_ota_file_stat.ota_isforced\r
+        );\r
+\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+void type2AE0Data(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("type2AE0Data typeID:0x%x datalen %d\r\n",typeID,datalen);\r
+    bool checkcrc = Check_CRC(data,datalen,crcvalue);\r
+    if( checkcrc == true )\r
+    {\r
+        switch (typeID) //ID\r
+        {\r
+            case OTA_FILE_RECV_CMD://\r
+                ota_json_file_save( data, datalen);\r
+                break;\r
+        }\r
+        \r
+    }else{\r
+        printf("type2AE0Data CRC failed!\n");\r
+    }\r
+   \r
+}\r
 void bleRecvANCSData(uint8_t *data, uint16_t data_size,uint8_t *buf_cmd,uint8_t *totalData,uint8_t crcvalue)//buf_cmd 指令前17个字节数据\r
 {\r
     uint8_t type = buf_cmd[1];\r
@@ -4738,7 +4845,141 @@ uint8_t totalpack = 0;
 uint8_t cmd_data[17];\r
 uint8_t *recvData;\r
 #include "los_memory.h"\r
+\r
+\r
+#if USE_PROTOCOL_EN_DE_BY_SNICKER\r
+#define MAX_BLE_MSG_PACKAGE_LEN (1024*5)  //包缓存最大5k\r
+typedef struct \r
+{\r
+    uint8_t *data;\r
+    int handle;\r
+    int data_len ;\r
+    int totalDataLen;\r
+    msg_header_t cmd_header;\r
+    uint8_t crcvalue;\r
+} ble_read_data;\r
+\r
 #define MAX_HANDLE_NUM 10\r
+//LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus)\r
+//根据特征值分开组合读取的数据,并处理\r
+static ble_read_data handle_l[MAX_HANDLE_NUM]={0};\r
+\r
+void dumpHeader(msg_header_t *msgheader)\r
+{\r
+    printf("dumpHeader(%d) direction %02X, type %02X, id %02X, package_count %d, total_data_len %d,package_index %d , package_len %d\n",\r
+    sizeof(msg_header_t),\r
+    msgheader->direction,  \r
+    msgheader->cmdtype,  \r
+    msgheader->cmdid,  \r
+    msgheader->package_count,\r
+    msgheader->total_data_len,  \r
+    msgheader->package_index,  \r
+    msgheader->package_len  \r
+    );\r
+}\r
+\r
+\r
+/*****\r
+ * 组包函数\r
+ * 组包校验完成,在分发给对应的handler去解码协议。\r
+ * \r
+*/\r
+errcode_t combine_data_internal(ble_read_data *buffer_handle,uint8_t *totalData, uint16_t event_size)\r
+{\r
+\r
+    msg_header_t *header =  (msg_header_t*)totalData;\r
+    dumpHeader(header);\r
+    buffer_handle->cmd_header.direction = header->direction;\r
+    buffer_handle->cmd_header.cmdtype = header->cmdtype;\r
+    buffer_handle->cmd_header.cmdid = header->cmdid;\r
+    buffer_handle->cmd_header.package_count = header->package_count;\r
+    buffer_handle->cmd_header.total_data_len = header->total_data_len;\r
+    buffer_handle->cmd_header.package_len = header->package_len;\r
+    buffer_handle->cmd_header.package_index = header->package_index;\r
+\r
+    //第一帧\r
+    if (buffer_handle->cmd_header.package_index ==  1)\r
+    {\r
+        //如果有历史数据,没有被清空,可能是历史错误数据,则清空内存。\r
+        if (buffer_handle->data!=NULL && buffer_handle->data_len > 0)\r
+        {\r
+            free(buffer_handle->data);\r
+            buffer_handle->data = NULL;\r
+            buffer_handle->data_len = 0;\r
+        }\r
+        buffer_handle->totalDataLen =  buffer_handle->cmd_header.total_data_len;\r
+        if (buffer_handle->totalDataLen > MAX_BLE_MSG_PACKAGE_LEN || buffer_handle->totalDataLen <= 0 )\r
+        {\r
+            printf("package is too lardge (%d) than (%d) or too small !\n",buffer_handle->totalDataLen,MAX_BLE_MSG_PACKAGE_LEN);\r
+            return ERRCODE_FAIL;\r
+        }\r
+        buffer_handle->data = malloc(buffer_handle->totalDataLen);\r
+        if (buffer_handle->data== NULL) \r
+        {\r
+            return ERRCODE_MALLOC;\r
+        }\r
+    }\r
+    //经过第一包处理,仍然data==NULL证明第一帧就是错的,要退出解析。\r
+    if (buffer_handle->data== NULL) \r
+    {\r
+        return ERRCODE_MALLOC;\r
+    }\r
+    //创建缓存开始存储包数据\r
+    if(buffer_handle->cmd_header.package_len >0)\r
+    {\r
+\r
+\r
+    }\r
+    //如果包完整接收,进行crc校验\r
+    if(buffer_handle->data_len == buffer_handle->totalDataLen)\r
+    {\r
+\r
+\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)\r
+{\r
+\r
+    if (event_size < sizeof(msg_header_t))\r
+    {\r
+        printf("event size (%d) is less than msg_header_t (%d) ",event_size,sizeof(msg_header_t));\r
+        return ;\r
+    }\r
+    if(sendbigDataBufState == true)//正在发送大数据不接收任何app指令下发的数据\r
+    {\r
+        return;\r
+    }\r
+    printf("bleDataRecv handle:%d\r\n",handle); \r
+\r
+    for(int i = 0;i<MAX_HANDLE_NUM;i++)\r
+    {\r
+        if(handle_l[i].handle == 0)//第一次用 \r
+        {\r
+            handle_l[i].handle = handle;            \r
+        }\r
+        if(handle_l[i].handle == handle)\r
+        {\r
+            //找到当前handle的缓存数据 ,进行组包\r
+            combine_data_internal(&handle_l[i],totalData,event_size);\r
+        }\r
+    }\r
+}\r
+\r
+void free_ble_data(void)//以防断开蓝牙没有释放数据类型\r
+{\r
+    return;\r
+    totalpack = 0;\r
+    muiltFlag = 0; \r
+    packdataLen = 0;\r
+    totalDataLen = 0;\r
+    ANCSBigBufFlag = 0;\r
+    recvBigDataBufState = false;\r
+    sendbigDataBufState = false;\r
+    \r
+}\r
+#else \r
 typedef struct \r
 {\r
     uint8_t *data;\r
@@ -4748,11 +4989,20 @@ typedef struct
     uint8_t cmd_data[17];\r
     uint8_t crcvalue;\r
 } ble_read_data;\r
+\r
+#define MAX_HANDLE_NUM 10\r
 //LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus)\r
 //根据特征值分开组合读取的数据,并处理\r
 static ble_read_data handle_l[MAX_HANDLE_NUM]={0};\r
 void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)\r
 {\r
+\r
+    if(sendbigDataBufState == true)//正在发送大数据不接收任何app指令下发的数据\r
+    {\r
+        return;\r
+    }\r
+    printf("bleDataRecv handle:%d\r\n",handle); \r
+\r
     if(sendbigDataBufState == true)//正在发送大数据不接收任何app指令下发的数据\r
     {\r
         return;\r
@@ -4763,8 +5013,8 @@ void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)
     {\r
         if(handle_l[i].handle == 0)//第一次用 \r
         {\r
-            handle_l[i].handle = handle;\r
-            \r
+            handle_l[i].handle = handle;            \r
+\r
         }\r
         if(handle_l[i].handle == handle)//以前用过 2AE4 2AE5 2AE1 2AE3 2AE0 \r
         {\r
@@ -4858,7 +5108,7 @@ void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)
         {\r
             read_data_tmp->data[read_data_tmp->totalDataLen]=0;\r
         }\r
-        bleLongRecvData(read_data_tmp->data,read_data_tmp->totalDataLen,read_data_tmp->cmd_data,NULL,read_data_tmp->crcvalue);\r
+                bleLongRecvData(read_data_tmp->data,read_data_tmp->totalDataLen,read_data_tmp->cmd_data,NULL,read_data_tmp->crcvalue);\r
         if(read_data_tmp->data)//只有数据不为NULL的才释放\r
         {\r
             ym_free(read_data_tmp->data);\r
@@ -4871,7 +5121,7 @@ void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)
         memset(read_data_tmp->cmd_data,0,17);\r
         printf("pack data end!!!!!!\r\n");\r
     }\r
-    \r
+\r
 \r
 }\r
 void free_ble_data(void)//以防断开蓝牙没有释放数据类型\r
@@ -4886,10 +5136,13 @@ void free_ble_data(void)//以防断开蓝牙没有释放数据类型
     sendbigDataBufState = false;\r
     \r
 }\r
+\r
+#endif\r
+\r
 //接收app下发的原始数据 \r
 void revBleOldData(uint8_t *buf, uint16_t event_size,uint16_t handle)//每包的数据大小\r
 {\r
-    printf("handle :%d data2ae3Cmd:%d data2ae4Cmd:%d  event_size %d\r\n",handle,data2ae3Cmd,data2ae4Cmd,event_size);\r
+    printf("handle :%d %s event_size %d\r\n",handle,getHandlname(handle),event_size);\r
     bleDataRecv(buf,event_size,handle);\r
 }\r
 #endif\r
index 4613903..7321c58 100644 (file)
@@ -95,7 +95,44 @@ void cameram_send_data(void);
 #define FIND_PHONE_CMD 0x0501 //同步睡眠历史数据
 
 
+#define USE_PROTOCOL_EN_DE_BY_SNICKER 0
+
+#if USE_PROTOCOL_EN_DE_BY_SNICKER
+#define MSG_DIRECTION_RECV 0x73
+#define MSG_DIRECTION_SEND 0x71
+
 /*******************data structure*************************/
+
+#pragma pack(1)
+/***
+ *     uint8_t direction;//指令方向
+    uint8_t cmdtype;//指令 类型
+    uint8_t cmdid;//指令 ID 
+    uint32_t package_count;//总包数
+    uint32_t total_data_len;//数据总长度
+    uint32_t package_index;//分包索引
+    uint16_t package_len;//分包数据长度
+*/
+typedef struct
+{
+    uint8_t direction;//指令方向
+    uint8_t cmdtype;//指令 类型
+    uint8_t cmdid;//指令 ID 
+    uint32_t package_count;//总包数
+    uint32_t total_data_len;//数据总长度
+    uint32_t package_index;//分包索引
+    uint16_t package_len;//分包数据长度
+}msg_header_t;//获取其他目标设置
+#pragma pack()
+
+typedef struct 
+{
+    msg_header_t header;
+    uint8_t  *package_data;//0-482字节  数据包
+    uint8_t  crc; //校验位 数据包后最后一位
+}msg_data_t;
+
+#endif
 #pragma pack(1)
 typedef struct
 {
@@ -498,6 +535,9 @@ typedef struct
 #define ANDROID_ANCS_CMD 0x0301
 
 
+/****************OTA******************************************/
+#define OTA_FILE_RECV_CMD 0x0420
+
 /***********************长指令>20字节****************************************/
 /*******************TYPE+ID**********************/
 /*
@@ -605,11 +645,29 @@ typedef struct
 #pragma pack()
 
 
+typedef struct 
+{
+    uint8_t ota_type;
+    uint32_t ota_size;
+    uint8_t ota_major;
+    uint8_t ota_mid;
+    uint8_t ota_minor;
+    uint8_t ota_isforced;
+    char    *ota_name;
+}ota_file_struct_t;
+
+        
+
+
 
 void revBleOldData(uint8_t *buf, uint16_t event_size,uint16_t handle);//协议接收client下发的数据接口
 //02类型的指令数据
 void type2AE3Data(uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue);//对不同指令ID进行区分
 void type2AE1Data(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue);
+void type2AE0Data(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue);
+void type2AE4Data(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue);
+void type2AE5Data(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue);
+
 errcode_t sendBleData(uint8_t *buf,uint16_t len);
 void sendParieSuccess(uint8_t flag,bd_addr_t *addr);//发送配对成功指令to app mac手机端的地址
 void getPhoneInfo_test(void);
index f387ac7..fa92340 100644 (file)
@@ -803,25 +803,25 @@ static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t
     gatts_add_character_result_t *result, errcode_t status)\r
 {\r
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bt_gatts_characteristic_add_cb uuid:0x%02x%02x 0x%x %d %d\r\n",uuid->uuid[0],uuid->uuid[1],srv_handle,result->handle,result->value_handle);\r
-    bt_uuid_t chara_uuid_data4 = {0};\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_OTA_ID, &chara_uuid_data4);\r
-\r
-    bt_uuid_t chara_uuid_data5 = {0};\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_ANDRIOD_ID, &chara_uuid_data5);\r
-\r
-    bt_uuid_t chara_uuid_data1 = {0};\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_RECV_ID, &chara_uuid_data1);\r
-    bt_uuid_t chara_uuid_data2 = {0};\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_SHORT_ID, &chara_uuid_data2);\r
-    bt_uuid_t chara_uuid_data3 = {0};\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_LONG_ID, &chara_uuid_data3);\r
+    bt_uuid_t chara_uuid_data_2ae0 = {0};\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_OTA_ID, &chara_uuid_data_2ae0);\r
+\r
+    bt_uuid_t chara_uuid_data_2ae1 = {0};\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_ANDRIOD_ID, &chara_uuid_data_2ae1);\r
+\r
+    bt_uuid_t chara_uuid_data_2ae5 = {0};\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_RECV_ID, &chara_uuid_data_2ae5);\r
+    bt_uuid_t chara_uuid_data_2ae3  = {0};\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_SHORT_ID, &chara_uuid_data_2ae3);\r
+    bt_uuid_t chara_uuid_data_2ae4 = {0};\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_LONG_ID, &chara_uuid_data_2ae4);\r
     \r
     \r
-    bt_uuid_t chara_uuid_data6 = {0};\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_READ_BATTERY_ID, &chara_uuid_data6);\r
+    bt_uuid_t chara_uuid_data_2ae2 = {0};\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_READ_BATTERY_ID, &chara_uuid_data_2ae2);\r
 \r
-    bt_uuid_t hid_report_uuid = {0};\r
-    bts_data_to_uuid_len2(BLE_UUID_REPORT, &hid_report_uuid);\r
+    bt_uuid_t hid_report_uuid_2a4d = {0};\r
+    bts_data_to_uuid_len2(BLE_UUID_REPORT, &hid_report_uuid_2a4d);\r
 \r
     bt_uuid_t alipay_report_uuid = {0};\r
     bts_data_to_uuid_len2(ALIPAYY_CHARACTERISTIC_ID, &alipay_report_uuid);\r
@@ -832,7 +832,7 @@ static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t
         alipay_handle = result->value_handle;\r
     }\r
 \r
-    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data1))\r
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae5))\r
     {\r
         if(g_ble_server_handle == 0)\r
         {\r
@@ -845,7 +845,7 @@ static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " 2ae5 result->value_handle1  %d\r\n",result->value_handle);\r
     }\r
     \r
-    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data2))\r
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae3 ))\r
     {\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "2ae3 result->value_handle2  %d\r\n",result->value_handle);\r
         if(data2ae3Cmd == 0)\r
@@ -855,7 +855,7 @@ static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t
             \r
     }\r
     \r
-    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data4))\r
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae0))\r
     {\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "2ae0 result->value_handle4  %d\r\n",result->value_handle);\r
         if(data2ae0Cmd == 0)\r
@@ -863,7 +863,7 @@ static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t
             data2ae0Cmd = result->value_handle;\r
         }\r
     }\r
-    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data5))\r
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae1))\r
     {\r
         if(data2ae1Cmd == 0)\r
         {\r
@@ -873,12 +873,12 @@ static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "2ae1 result->value_handle5  %d\r\n",result->value_handle);\r
         // shortCmdChara = result->value_handle;\r
     }\r
-    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data6))\r
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae2))\r
     {\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "2ae2 result->value_handle6  %d\r\n",result->value_handle);\r
         // shortCmdChara = result->value_handle;\r
     }\r
-    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data3))\r
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae4))\r
     {\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "2ae4 result->value_handle3  %d\r\n",result->value_handle);\r
         if(data2ae4Cmd == 0)\r
@@ -887,8 +887,8 @@ static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t
         }\r
         //  = result->value_handle;\r
     }\r
-    if (ble_gatts_cmp_uuid(uuid, &hid_report_uuid) == true) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->hid_report_uuid  %d\r\n",result->value_handle);\r
+    if (ble_gatts_cmp_uuid(uuid, &hid_report_uuid_2a4d) == true) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->hid_report_uuid_2a4d  %d\r\n",result->value_handle);\r
         if(g_hid_server_handle == 0){\r
             g_hid_server_handle = result->value_handle;\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_hid_server_handle  %d\r\n",g_hid_server_handle);\r
index 5ffdb72..8ae66ec 100644 (file)
@@ -21,6 +21,7 @@ extern uint16_t data2ae3Cmd;//2ae3短指令特征值
 extern uint16_t data2ae4Cmd;
 extern uint16_t data2ae5Cmd;
 extern uint16_t data2ae1Cmd;//安卓消息来电
+extern uint16_t data2ae0Cmd;//OTA
 extern uint16_t ble_nus_max_data_len;
 extern uint16_t alipay_handle;
 extern uint16_t g_ble_conn_id;