增加GPS轨迹协议内容
authorCaisking <Casiking@zhihuishixun.com>
Thu, 11 Sep 2025 10:49:46 +0000 (18:49 +0800)
committerCaisking <Casiking@zhihuishixun.com>
Thu, 11 Sep 2025 10:49:46 +0000 (18:49 +0800)
code/sdk/application/wearable/fd230/nativeapp/nativeui/traing/src/TraingModel.cpp
code/sdk/zhihui/services/ble_service/blemoder/bleInstruct.cpp
code/sdk/zhihui/services/ble_service/blemoder/bleInstruct.h
code/sdk/zhihui/services/ble_service/blemoder/bleinstruct_sample.cpp
code/sdk/zhihui/services/ble_service/bleservice/bleEvent.c

index a04225d..b6d67d6 100644 (file)
@@ -3341,6 +3341,18 @@ bool get_training_heart_path_(char *path, uint32_t time, uint32_t max_len) {
   return true;
 }
 
+//获取gps轨迹路径
+bool get_training_gps_path_(char *path, uint32_t time, uint32_t max_len) {
+  std::string str = OHOS::TraingModel::GetInstance()->GetGPSDataPath(time);
+  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "get_training_gps:%s\r\n",
+                str.c_str());
+  if (str.length() <= 3) {
+    return false;
+  }
+  memcpy_s(path, max_len, str.c_str(), str.length());
+  return true;
+}
+
 char *struct_to_json_buf_malloc_(uint8_t day) {
   cJSON *dataJSON = cJSON_CreateObject();
   cJSON *data_arryJSON = cJSON_CreateArray();
@@ -3400,6 +3412,7 @@ extern bleInstruct_t_ bleInstruct_t;
 void ble_training_init(void) {
   bleInstruct_t.get_training_spead_path_cb = get_training_spead_path_;
   bleInstruct_t.get_training_heart_path_cb = get_training_heart_path_;
+  bleInstruct_t.get_training_gps_path_cb = get_training_gps_path_;
   bleInstruct_t.struct_to_json_buf_malloc = struct_to_json_buf_malloc_;
 }
 
index 5bf13bf..a59d657 100644 (file)
@@ -111,6 +111,11 @@ uint8_t get_dial_num()
     return SAFE_CALL_PTR_NO_ARGS(bleInstruct_t.get_dial_num_cb);
 }
 
+int  read_GPS_DATA(char *path ,uint8_t *out_buf)
+{
+    return SAFE_CALL_PTR(bleInstruct_t.read_GPS_DATA_cb, path, out_buf);
+}
+
 bool ble_is_Alipay_bind(void)
 {
     // return is_Alipay_bind();
@@ -132,6 +137,11 @@ bool get_training_spead_path(char *path ,uint32_t time,uint32_t max_len)
     return SAFE_CALL_BOOL(bleInstruct_t.get_training_spead_path_cb, path, time, max_len);
 }
 
+bool get_training_gps_path(char *path ,uint32_t time,uint32_t max_len)
+{
+    return SAFE_CALL_BOOL(bleInstruct_t.get_training_gps_path_cb, path, time, max_len);
+}
+
 
 bool get_training_heart_path(char *path ,uint32_t time,uint32_t max_len)
 {
index 4bf6d96..3372906 100644 (file)
@@ -383,7 +383,7 @@ void ble_sos_data_save(void);
 void ble_SOS_data_init(void);
 
 bool get_training_spead_path(char *path ,uint32_t time,uint32_t max_len);
-
+bool get_training_gps_path(char *path ,uint32_t time,uint32_t max_len);
 bool get_training_heart_path(char *path ,uint32_t time,uint32_t max_len);
 
 void set_goal_other_notification(uint8_t data);
@@ -408,14 +408,19 @@ errcode_t get_dial_file_path(char* input_dialname ,uint32_t input_size, char* ou
 
 uint16_t get_str_nodisplay_number(char *str, uint32_t max_len);
 
+int  read_GPS_DATA(char *path ,uint8_t *out_buf);
+
 bool ble_bin_install(const char * data);
 typedef struct bleInstruct
 {
     uint16_t (*get_str_nodisplay_number_cb)(char *str, uint32_t max_len);
+    int  (*read_GPS_DATA_cb)(char *path ,uint8_t *out_buf);
+    
     uint8_t (*get_dial_num_cb)(void);
     void (*set_ota_upgrade_cb)(void);
     bool (*get_training_spead_path_cb)(char *path ,uint32_t time,uint32_t max_len);
     bool (*get_training_heart_path_cb)(char *path ,uint32_t time,uint32_t max_len);
+    bool (*get_training_gps_path_cb)(char *path ,uint32_t time,uint32_t max_len);
 
     void (*ble_sos_data_save_cb)(void);
 
index 9915642..1c555a1 100644 (file)
@@ -30,7 +30,7 @@
 #include "../../../../../../zhihui/config/include/ConfigModelC.h"
 #include "../../../../../../zhihui/utils/custom_runtime.h"
 
-#ifdef FD230
+
 #include "uiservice/include/ui_service.h" 
 #include "TraingModel.h"
 #include "WeatherModel.h"
@@ -58,7 +58,6 @@
 #include "MusicPlayerModel.h"
 #include "UiConfig.h"
 
-#endif
 
 
 
@@ -112,7 +111,6 @@ extern "C" {
 #define DIAL_DATA_DIR APP_DOWNLOAD_DIAL_PATH
 
 // #define DIAL_DATA_DIR "/user/dial/offline_dial"
-#ifdef FD230
 
 uint16_t get_str_nodisplay_number(char *str, uint32_t max_len) {
 
@@ -147,6 +145,55 @@ uint16_t get_str_nodisplay_number(char *str, uint32_t max_len) {
   // printf("%s\r\n", str_);
 }
 
+int  read_GPS_DATA(char *path ,uint8_t *out_buf)
+{
+    FILE *fp= fopen(path,"rb+");
+    if(fp==NULL)
+    {
+        return 0;
+    }
+    uint32_t file_size=0;
+
+    int len=0;
+
+    OHOS::GPSData_t data={0};
+
+    while (1)
+    {
+        int read_size=fread(&data,1,sizeof(data),fp);
+        if(read_size==sizeof(data) )
+        {
+            
+
+            int temp_data=data.timestamp;
+            memcpy_s(out_buf+len,4,&temp_data,sizeof(data.timestamp));
+            printf("%d",temp_data);
+            len+=4;
+
+            int temp_latitude=(int)(data.latitude *10000000);
+            memcpy_s(out_buf+len,4,&temp_latitude,sizeof(temp_latitude));
+            // printf("temp_latitude :%d\r\n",temp_latitude);
+            len+=4;
+
+            int temp_longitude=(int)(data.longitude*10000000);
+            memcpy_s(out_buf+len,4,&temp_longitude,sizeof(temp_longitude));
+            // printf("temp_longitude :%d\r\n",temp_longitude);
+            len+=4;
+
+
+        }
+        else 
+        {
+            break;
+        }
+    }
+
+    fclose(fp);
+   
+
+   return len;
+}
+
 
 char * get_dial_path(void)
 {
@@ -3316,9 +3363,9 @@ void ble_set_sleep_remind(msg_get_sleep_param_info_t data)
         p_ConfigModel->set_condigData_Int(OHOS::ConfigModel::CONFIGMODEL_ITEM_SLEEP_REMIND,data.bedtime_alarm);
 
         //更新睡眠配置
-        #ifdef FD230
-            OHOS::SleepModel::GetInstance().set_sleep_goal();
-        #endif
+    
+        OHOS::SleepModel::GetInstance().set_sleep_goal();
+
 
     }  
     return;
@@ -3622,10 +3669,7 @@ void set_languaage(uint32_t id)
 
 char *addressbook(void)//获取通讯录保存文件地址路径
 {
-    #ifdef FD230
     return ADDRESS_BOOK_PATH;
-    #endif
-    return NULL;
 }
 
 void addressbookToRead(char *buf)//转化用于·c文件
@@ -4054,7 +4098,7 @@ bool IS_free_save_Mp3(uint32_t size)
     return true;
 }
 
-#endif
+
 #ifdef __cplusplus
 #if __cplusplus
 }
index 2e152e4..464508c 100644 (file)
-/**\r
- * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
- * Description: alipay bluetooth module.\r
- * Author:\r
- * Create:\r
- */\r
-\r
-\r
-#ifdef __cplusplus\r
-extern "C" {\r
-#endif\r
-#include "common_def.h"\r
-#include "bts_def.h"\r
-#include "bts_gatt_stru.h"\r
-#include "bts_a2dp_source.h"\r
-#include "bts_gatt_server.h"\r
-#include "bts_le_gap.h"\r
-#include "osal_task.h"\r
-#include "securec.h"\r
-#include "wearable_log.h"\r
-#include <stdint.h>\r
-#include <stdio.h>\r
-#include "stdbool.h"\r
-#include "bts_br_gap.h"\r
-\r
-#ifdef SUPPORT_BATTERY_SERVICE\r
-#include "battery_hal.h"\r
-#endif\r
-\r
-#include "bleService.h"\r
-#include "alipay_feature.h"\r
-\r
-// #include "alipay_bluetooth.h"\r
-\r
-#include "bts_a2dp_sink.h"\r
-#include "osal_timer.h"\r
-#include "bleEvent.h"\r
-#include "broadcast_feature.h"\r
-#include <sys/stat.h>\r
-#if 1//#ifdef //SUPPORT_BLE_SERVICE\r
-#include "app_common_api.h"\r
-// #include "hidService.h"\r
-#include "../../../../../open_source/openharmony/third_party/cJSON/cJSON.h"\r
-#include "errcode.h"\r
-#include "sys/statfs.h"\r
-\r
-#ifdef BLE_INSTRUCT\r
-#include "bleInstruct.h"\r
-#endif\r
-\r
-#include "custom_utils.h"\r
-#include "custom_runtime.h"\r
-#include "bleANCS.h"\r
-#ifdef FD230\r
-#include "Bluetooyhpabpserver.h"\r
-#endif\r
-#include "custom_save_runtime.h"\r
-\r
-#define DEBUG_TEST (0)\r
-#define CRC_CHECK_ERR 0 //crc校验失败\r
-#define JSON_CHECK_OK 1 //json解析成功\r
-#define JSON_CHECK_ERR 2 //json解析失败\r
-\r
-#define AI_TXT_BUF_MAX_LEN 1024*3 //json解析失败\r
-\r
-\r
-#define  MAX_BLE_EVENT_DIAL_NUM  (10) //表盘最大数量\r
-\r
-#include "upg_common_porting.h"\r
-\r
-\r
-uint32_t packdataLen = 0;\r
-uint32_t totalDataLen = 0;\r
-uint8_t totalpack = 0;\r
-uint8_t cmd_data[17];\r
-uint8_t *recvData;\r
-#include "los_memory.h"\r
-\r
-#define MAX_BLE_MSG_PACKAGE_LEN (1024*5)  //包缓存最大5k\r
-#define BLE_MSG_TMP_FILE_NAME "/user/userdata/ble_tmp_buf_%04X"\r
-typedef struct \r
-{\r
-    int handle;\r
-    int data_len ;\r
-    int totalDataLen;\r
-    int buffer_to_file; //1 buffer to file , 0 buffer to ram\r
-    int decode_type; //1 with header , 2 no header\r
-    FILE *tmpfilehandle;// 如果buffer to file , 则在此保存handle\r
-    msg_header_t cmd_header;\r
-    uint8_t *data;//if buffer_to_file is 1, than data is the filename , else  data is the ram buffer.\r
-    uint8_t crcvalue;\r
-    uint8_t lrcvalue; //计算crc用的临时变量\r
-    uint8_t lrcvalue2; //计算crc用的临时变量\r
-    uint32_t last_timestamp;// last package receive time\r
-    uint8_t receive_file_flag;//1 接收文件 0 不接收文件\r
-    file_recv_stat_t file_recv_stat;\r
-    uint8_t last_data_sample[5]; //专门给文件传输过程中重复包判定用。目前只是取前5个字节,实际应该再做优化算法。\r
-    uint16_t last_data_size;//专门给传输过程中重复包判定用,记录上一个包的长度,至少长度相同才有判断重复的必要。同时也可以作为少于5个字节的包的判定依据。\r
-} ble_read_data;\r
-\r
-#define MAX_HANDLE_NUM 10\r
-//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
-errcode_t cancel_recv_file(uint8_t flag);\r
-\r
-static char app_name[64]={0};\r
-\r
-uint8_t ble_dial_file_count=0;\r
-uint8_t ble_dial_file_index=0;\r
-uint8_t *bigDataBuf = NULL;//大数据buf\r
-uint8_t bigDataBufLen=0;\r
-bool sendbigDataBufState = false;//发送大数据表示不要被其他指令打断\r
-bool recvBigDataBufState = false;//接收大数据标志\r
-static bool muiltFlag = 0;//多包数据flag\r
-static bool ANCSBigBufFlag = 0;//ANCS多包数据flag\r
-// static uint16_t data_len = 0;\r
-ble_recv_data_info_t ble_recv_data;\r
-static uint8_t TRANSMIT_DATA;\r
-static osTimerId_t BR_TRANSFER_timer=NULL;\r
-static uint32_t timer_flie_flag=0;\r
-ble_read_data* ble_read_timer_p=NULL;\r
-\r
-#ifdef  SINGLE_USER_PARTITION\r
-#define UP_DATE_FWPKG_PATH    UPG_FILE_NAME  \r
-                    \r
-#else\r
-#define UP_DATE_FWPKG_PATH   UPG_FILE_NAME\r
-#endif\r
-\r
-\r
-//MP3文件重命名\r
-static errcode_t create_mp3_name(char* path,char*dir_path ,char* file_name)\r
-{\r
-\r
-    sprintf_s(path,256,"%s/",dir_path);\r
-    uint16_t path_len=strlen(path);\r
-\r
-\r
-    if(strstr(file_name,".mp3"))\r
-    {\r
-        //"光-陈粒.128.mp3"\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",file_name);\r
-        int len=strlen(file_name)-strlen(".mp3");\r
-        for(int i=0;i<len;i++)\r
-        {\r
-            uint8_t Uintdata=0;\r
-            char UintBUF[3]={0};\r
-            //sprintf(UintBUF,"%02X",file_name[i]);\r
-            memcpy_s((void*)&Uintdata,1,(void*)&file_name[i],1);\r
-            sprintf(UintBUF,"%02X",Uintdata);\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",UintBUF);\r
-            memcpy_s(path+path_len,2,UintBUF,2);\r
-            path_len+=2;\r
-        }\r
-        memcpy_s(path+path_len,strlen(".mp3"),".mp3",strlen(".mp3"));\r
-        return ERRCODE_SUCC;\r
-    }\r
-    else\r
-    {\r
-        sprintf_s(path,256,"%s/%s.mp3",dir_path,file_name);\r
-    }\r
-    return ERRCODE_FAIL;\r
-    \r
-}\r
-\r
-\r
-#if 1\r
-#include "app_msg_manager.h"\r
-#include "app_tx_process.h"\r
-static int ym_malloc_count = 0,ym_free_count = 0;\r
-static void *ym_malloc(unsigned int size)\r
-{\r
-    // app_pkg_msg_send(HEAPINFO, DIAG_CONTROL_FALSE, NULL, 0);\r
-\r
-    return malloc(size);\r
-}\r
-static void  ym_free(void * p)\r
-{\r
-    free(p);\r
-}\r
-void malloc_test(void)\r
-{\r
-    for(int i = 0;i<1000;i++)\r
-    {\r
-        char * temp = ym_malloc(i*10);\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"i:%d,addr:%x\r\n",i,temp);\r
-        \r
-    }\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
-    if (data2ae6Cmd == handle) return "data2ae6Cmd";\r
-    //if (data2ae2Cmd == handle) return "data2ae2Cmd";\r
-    \r
-    return "unknown handle";\r
-\r
-}\r
-static errcode_t get_file_recv_file_path(char* input_filename ,uint32_t input_size, char* output_file_path , uint32_t max_output_size)\r
-{\r
-    if(input_filename == NULL || output_file_path == NULL)\r
-    {\r
-        return ERRCODE_FAIL;\r
-    }\r
-\r
-    int ret = sprintf_s(output_file_path,max_output_size,"/user/userdata/%s",input_filename);\r
-    if (ret < 0)\r
-        return ERRCODE_FAIL;\r
-\r
-    return ERRCODE_SUCC;\r
-} \r
-static errcode_t get_app_file_path(char* input_filename ,uint32_t input_size, char* output_file_path , uint32_t max_output_size)\r
-{\r
-    if(input_filename == NULL || output_file_path == NULL)\r
-    {\r
-        return ERRCODE_FAIL;\r
-    }\r
-\r
-    uapi_create_dir("/user/app_store");\r
-\r
-    int ret = sprintf_s(output_file_path,max_output_size,"/user/app_store/%s",input_filename);\r
-    if (ret < 0)\r
-        return ERRCODE_FAIL;\r
-\r
-    return ERRCODE_SUCC;\r
-}\r
-static errcode_t get_custom_dial_file_path(uint16_t id,char *filename,uint32_t input_size, char* output_file_path , uint32_t max_output_size)\r
-{\r
-    if( id >=5  || output_file_path == NULL || filename == NULL)\r
-    {\r
-        return ERRCODE_FAIL;\r
-    }\r
-    char name[64]={0};\r
-    ble_get_dial_path(name,id);\r
-    int ret;\r
-   if(id == 1 && strcmp(filename, "main_bg") == 0) //自定义视频表盘Id 1 只有背景需要是mp4 main_bg\r
-    {\r
-        ret = sprintf_s(output_file_path,max_output_size,"%s/%s.mp4",name,filename);  \r
-    }\r
-    else\r
-    {\r
-        ret = sprintf_s(output_file_path,max_output_size,"%s/%s.bin",name,filename);\r
-    }\r
-    if (ret < 0)\r
-        return ERRCODE_FAIL;\r
-\r
-    return ERRCODE_SUCC;\r
-\r
-}\r
-\r
-\r
-\r
-\r
-int char_to_dec(char ch)\r
-{\r
-    int num = 0;\r
-    if(ch >= '0' && ch <= '9') {\r
-        num = num * 10 + (ch - '0');\r
-    }\r
-    return num;\r
-}\r
-void char_to_big(uint8_t *src_str,uint8_t *res_str,uint8_t len)\r
-{\r
-    for(uint8_t i = 0;i<len;i++)\r
-    {\r
-        if(src_str[i] >= 'a' && src_str[i] <= 'z') {\r
-            src_str[i] = src_str[i] - 32;\r
-        }\r
-    }\r
-    memcpy(res_str,src_str,len);\r
-}\r
-void cameram_data(void)//拍照发送数据 调用这个接口即可\r
-{\r
-    uint8_t data[2]={0x01,0x00};\r
-    errcode_t ret = ble_hid_server_send_input_report(&data,2);\r
-    osal_msleep(100); /* wait 100 ms */\r
-    memset(data,0,2);\r
-    (void)ble_hid_server_send_input_report(&data, 2); /* 上报按下按键 把停止发送指令也要发送 防止一直拍照*/\r
-}\r
-\r
-bool bigDataBufState=false;//大数据传输状态\r
-/**\r
- * 计算crc时的求和函数,可以递归,从而实现多段数据的组合计算\r
-*/\r
-// uint8_t calculate_lrc(uint8_t *data,uint16_t len,uint8_t _lrcValue)\r
-// {\r
-//     uint8_t lrcValue = _lrcValue;\r
-//     if(data == NULL)\r
-//     {\r
-//         return false;   \r
-//     }\r
-//     for(uint16_t i = 0; i < len; i++)\r
-//     {\r
-//             lrcValue =lrcValue+ data[i];\r
-//         //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%02x ",data[i]);\r
-//     }\r
-//     return lrcValue;\r
-// }\r
-\r
-\r
-/***\r
- * 根据求和后的数据计算crc 值 \r
-*/\r
-// uint8_t get_crc_from_lrc(uint8_t lrcValue)\r
-// {\r
-//     uint8_t crcbuf  = 0;\r
-//     crcbuf = lrcValue%256;\r
-//     crcbuf = 256-crcbuf;\r
-//     crcbuf = crcbuf%256;\r
-//     return crcbuf;\r
-// }\r
-\r
-uint8_t  calculate_lrc_file(char *file_path)\r
-{\r
-    uint8_t lrcValue =0;\r
-    FILE * fp = fopen(file_path,"rb+");\r
-\r
-    char data[1]={0};\r
-    \r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"calculate_lrc_file %s\r\n",file_path);\r
-    uint8_t  read_size=0;\r
-\r
-    if(fp==NULL)\r
-    {\r
-          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_path);\r
-          return 0;\r
-    }\r
-    do\r
-    {\r
-        memset_s(data,1,0,1);\r
-        read_size=fread(data,1,1,fp);\r
-        lrcValue+=data[0];\r
-\r
-    }while(read_size==1);\r
-\r
-    fclose(fp);\r
-    return lrcValue;\r
-}\r
-\r
-\r
-#define USE_DEMO\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(data == NULL)\r
-    {\r
-        return false;   \r
-    }\r
-       lrcValue = calculate_lrc(data,len,0x00);\r
-    \r
-    crcbuf = get_crc_from_lrc(lrcValue); \r
-\r
-    #ifdef BLE_LOG\r
-     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC lrc: 0x%x ,ret crc: 0x%x ,crcvalue 0x%x , len:%d\r\n",lrcValue,crcbuf,crcvalue,len);\r
-    #endif\r
-       if(crcbuf == crcvalue)\r
-    {\r
-        WEARABLE_LOGD(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
-        if(uapi_dev_runtime_get_android_connection_status()==1)\r
-                   return true;\r
-        else\r
-        #ifndef USE_DEMO\r
-            return false;\r
-        #else\r
-             return true;\r
-        #endif\r
-    }\r
-        \r
-}\r
-\r
-\r
-// uint8_t Calculate_CRC(uint8_t *data,uint16_t len)//计算20byte\r
-// {\r
-//     uint8_t crcbuf  = 0;\r
-//     uint8_t lrcValue = 0x00;\r
-//     lrcValue = calculate_lrc(data+17,len-17,0x00);\r
-//     crcbuf = get_crc_from_lrc(lrcValue);\r
-//     return crcbuf;\r
-// }\r
-\r
-uint8_t Calculate_CRC_AI(uint8_t *data,uint16_t len)\r
-{\r
-       return Calculate_CRC(data,len);\r
-}\r
-\r
-// uint8_t Calculate_CRC_Big(uint8_t *data,uint16_t len)//计算20byte\r
-// {\r
-//     uint8_t crcbuf  = 0;\r
-//     uint8_t lrcValue = 0x00;\r
-//     lrcValue = calculate_lrc(data,len,0x00);\r
-//     crcbuf = get_crc_from_lrc(lrcValue);\r
-//     return crcbuf;\r
-// }\r
-\r
-static cJSON *cjson_json_tmp = NULL;\r
-//发送ble数据\r
-errcode_t sendBleData(uint8_t *buf,uint16_t len)\r
-{\r
-    errcode_t ret = ERRCODE_FAIL;\r
-    #ifdef BLE_LOG\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bigDataBufState:%d and  sendbigDataBufState %d\r\n",bigDataBufState,sendbigDataBufState);\r
-    #endif\r
-    //if(Bleconnect == true )\r
-    {\r
-        ret = svr_ble_bt_gatts_noyify(buf,len);\r
-    }\r
-    return ret;\r
-    \r
-}\r
-\r
-\r
-errcode_t sendBleData_zhihui(uint8_t *buf,uint16_t len)\r
-{\r
-    errcode_t ret = ERRCODE_FAIL;\r
-    #ifdef BLE_LOG\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bigDataBufState:%d and  sendbigDataBufState %d\r\n",bigDataBufState,sendbigDataBufState);\r
-    #endif\r
-    //if(Bleconnect == true )\r
-    {\r
-        ret = svr_ble_bt_gatts_noyify_zhihui(buf,len);\r
-    }\r
-    return ret;\r
-    \r
-}\r
-\r
-\r
-void sendDataNow(uint8_t *buf,uint16_t len)\r
-{\r
-    //if(Bleconnect == true )\r
-    {\r
-        svr_ble_bt_gatts_noyify(buf,len);\r
-    }\r
-}\r
-\r
-void send_Data_Now_zh(uint8_t *buf,uint16_t len)\r
-{\r
-    {\r
-        svr_ble_bt_gatts_noyify_zhihui(buf,len);\r
-    }\r
-}\r
-\r
-\r
-\r
-void send_big_data(ble_data_type type,char *data, uint16 datalen)\r
-{\r
-    // 动态分配内存空间,防止堆栈溢出\r
-    uint8_t *buf =NULL;\r
-    buf = ym_malloc(17 + datalen + 1); \r
-    memset_s(buf,ble_nus_max_data_len,0,17 + datalen + 1);\r
-    if (buf == NULL && datalen!=0) {\r
-          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"内存分配失败\n");\r
-        return;\r
-    }\r
-    if(type.Packet_id>=2)\r
-    {\r
-        msleep(get_ble_interval()+5);//多包数据发送增加延迟\r
-    }\r
-    // 设置消息头部信息\r
-    buf[0] = 0x72; // 消息头\r
-    buf[1] = type.type; // 类型\r
-    buf[2] = type.type_id; // 类型ID\r
-    memcpy(buf + 3, &type.packet_total, 4); // 总包数\r
-    memcpy(buf + 7, &type.total, 4); // 总数据长度\r
-    memcpy(buf + 11, &type.Packet_id, 4); // 数据包ID\r
-    memcpy(buf + 15, &datalen, 2); // 包数据长度\r
-\r
-    // 处理数据和计算CRC\r
-    if (data == NULL) {\r
-        //数据为空 按照18个字节总长度发送给app\r
-        buf[17] = 0x00; // 直接写0x00的校验和\r
-    } else {\r
-        memcpy(buf + 17, data, datalen); // 复制数据到缓冲区\r
-        buf[17 + datalen] = Calculate_CRC_Big((uint8_t *)data, datalen); // 计算CRC\r
-    }\r
-\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data:\r\n");\r
-    \r
-    for(int i=0;i<17 + datalen + 1;i++)\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buf[i]);\r
-    }\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"end\r\n");\r
-\r
-    // 根据标志位选择发送数据的方式\r
-  if(type.type==6)\r
-    {\r
-        send_Data_Now_zh(buf, 17 + datalen + 1);\r
-    }\r
-    else\r
-    {\r
-        sendDataNow(buf, 17 + datalen + 1); // 判断是否在传输或接收多包数据\r
-    }\r
-   \r
-    \r
-\r
-    ym_free(buf); // 释放内存空间\r
-}\r
-\r
-void send_long_data(char *buf, uint32_t pack_size,uint8_t type,uint8_t id)\r
-{\r
-    uint32_t data_len = strlen(buf);\r
-    uint32_t surplus_len=data_len;\r
-    uint32_t pack;\r
-    if(data_len%pack_size==0)\r
-    {\r
-        pack=data_len/pack_size;\r
-    }\r
-    else\r
-    {   \r
-        pack=data_len/pack_size+1;\r
-    }\r
-    uint32_t pack_id=1;\r
-    uint32_t offset=0;\r
-    while (surplus_len!=0)\r
-    {\r
-        if(surplus_len>=pack_size)\r
-        {\r
-            surplus_len=surplus_len-pack_size;\r
-\r
-            ble_data_type type_={type,id,data_len,pack,pack_id};\r
-            send_big_data(type_,buf+offset,pack_size);\r
-\r
-            //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,id,1);\r
-            offset+=pack_size;\r
-        }\r
-        else\r
-        {\r
-            \r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
-            ble_data_type type_={type,id,data_len,pack,pack_id};\r
-            send_big_data(type_,buf+offset,surplus_len);\r
-            //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,id,1);\r
-            break;\r
-        }\r
-        pack_id++;\r
-    }\r
-}\r
-\r
- \r
-\r
-bool is_free_ota_update(uint32_t size)\r
-{\r
-    uint64_t free_size=0;\r
-    int i;\r
-    struct statfs file_buf = {0};\r
-    FILE *fp=NULL;\r
-    fp=fopen(UP_DATE_FWPKG_PATH,"rb+");\r
-    if(fp)\r
-    {\r
-        fclose(fp);\r
-        remove(UP_DATE_FWPKG_PATH);\r
-    }\r
-\r
-#ifdef SINGLE_USER_PARTITION\r
-    static const char * const g_volume_names[1] = { "/user/"};\r
-        for (i = 0; i < 1; i++) {\r
-#else\r
-    static const char * const g_volume_names[4] = {"/system/", "/update/", "/music/", "/user/"};\r
-        for (i = 0; i < 4; i++) {\r
-#endif\r
-          \r
-            /* 获取文件系统状态 */\r
-            if (statfs(g_volume_names[i], &file_buf) != 0) {\r
-                return false ;\r
-            }\r
-\r
-            #ifdef SINGLE_USER_PARTITION\r
-             if(strcmp("/user/",g_volume_names[i])==0)\r
-            {\r
-                free_size= ((uint64_t)(file_buf.f_bfree * file_buf.f_bsize));\r
-                //  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"free_size :%ld\r\n",free_size);\r
-                  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"free_size :%lu\r\n",free_size);\r
-            }\r
-            int need_size=size*1.5;\r
-            if(need_size>free_size)\r
-            {\r
-                return false;\r
-            }\r
-            else\r
-            {\r
-                  return true;\r
-            }\r
-            #else\r
-            //单分区不考虑是否足够空间\r
-                return true;\r
-            #endif\r
-#ifdef SINGLE_USER_PARTITION\r
-        }\r
-#else\r
-    }\r
-#endif\r
-    return false;\r
-}\r
-\r
-\r
-\r
-//发送训练状态[app发起的运动]\r
-void sendtraningstatedata(uint8_t state ,uint16_t time)\r
-{\r
-    char data[3]={0};\r
-    uint32_t data_len=3;\r
-    data[0]=state;\r
-    memcpy(&data[1],&time,2);\r
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time);\r
-    ble_data_type type={0x05,0x50,data_len,1,1};\r
-    send_big_data(type,data,data_len);\r
-    \r
-}\r
-\r
-//发送训练结束状态[手表发起]\r
-void sendtraningstateend(void)\r
-{\r
-    char data[1]={0};\r
-    uint32_t data_len=1;\r
-    data[0]=0;  //[0 结束]\r
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态结束%d\r\n",data[0]);\r
-    \r
-    ble_data_type type={0x05,0x51,data_len,1,1};\r
-    send_big_data(type,data,data_len);\r
-    //end_big_data(0,data,data_len,data_len,1,1,0x51,5);\r
-}\r
-\r
-void sendtraningdata(msg_get_train_data_info_t *data)\r
-{\r
-    cJSON* dataJSON = cJSON_CreateObject();\r
-    \r
-    if (dataJSON == NULL) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error creating JSON object\n");\r
-        return;\r
-    }\r
-    \r
-    cJSON_AddNumberToObject(dataJSON,"st",data->st);\r
-    cJSON_AddNumberToObject(dataJSON,"hr",data->hr);\r
-    cJSON_AddNumberToObject(dataJSON,"ca",data->ca);\r
-    cJSON_AddNumberToObject(dataJSON,"di",data->di);\r
-    cJSON_AddNumberToObject(dataJSON,"stp",data->stp);\r
-    cJSON_AddNumberToObject(dataJSON,"ti",data->ti);\r
-    cJSON_AddNumberToObject(dataJSON,"pc",data->pc);\r
-\r
-    char *jsonString = cJSON_PrintUnformatted(dataJSON);\r
-    \r
-    if (jsonString == NULL) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n");\r
-        cJSON_Delete(dataJSON);\r
-        return;\r
-    }\r
-    \r
-    uint32_t data_len = strlen(jsonString);\r
-    cJSON_Delete(dataJSON);\r
-    \r
-    if (data_len == 0) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n");\r
-        return;\r
-    }\r
-    \r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送训练实时数据 %d %s\n", data_len, jsonString);\r
-    ble_data_type type={0x01,0x0f,data_len,1,1};\r
-    send_big_data(type,jsonString,data_len);\r
- \r
-    cJSON_free(jsonString);\r
-}\r
-\r
-static uint8_t AI_is_end_state=0;\r
-\r
-//查询AI 模型是否可用,结果通过2AE4返回\r
-/*使用模型:\r
-0:文心一言\r
-1:ChatGPT\r
-2:KIMI\r
-3:豆包*/\r
-void inquire_AI_is_ready(uint8_t type)\r
-{\r
-  \r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"查询AI模型,是否准备就绪\r\n");\r
-    ble_data_type type_={0x05,0x06,1,1,1};\r
-    send_big_data(type_,(char *)&type,1);\r
-    //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x06, 5);\r
-}\r
-\r
-void watch_synchronization_time(void)\r
-{\r
-    ble_data_type type_={0x05,0x02,0,1,1};\r
-    send_big_data(type_,NULL,0);\r
-}\r
-\r
-\r
-\r
-//发送ble数据\r
-uint8_t phone_mac[6];//手机下发的mac地址 第一次连接为空 \r
-uint8_t parie_mac[6];//配对完成之后的的mac地址\r
-uint8_t phoneDataFlag = 0;\r
-//发送配对指令\r
-void sendConfirmParieSucess(void)\r
-{\r
-    uint8_t value[19];\r
-    memset(value,0,19);\r
-    value[0] = 0x72;\r
-    value[1] = 0x05;\r
-    value[2] = 0x11;\r
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    value[17] = 0x01;\r
-    value[18] = Calculate_CRC(value,1+18);\r
-    sendBleData(value,19);\r
-}\r
-\r
-uint8_t phoneType = 0;\r
-\r
-\r
-\r
-\r
-errcode_t UnbindSucessCmd(uint8_t flag)//发送解绑指令,解绑界面调用这个函数 如果点了✓调用这个函数 返回成功后延迟10s再重启设备  \r
-{\r
-    errcode_t sendok = ERRCODE_FAIL;\r
-    uint32_t tmp = 1;\r
-    uint8_t value[19];\r
-    uint8_t crcvalue = 0;\r
-    memset(value,0,19);\r
-    memset(value,0,19);\r
-    value[0] =0x72;\r
-    value[1] =0x05;\r
-    value[2] =0x12;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp,2);\r
-    value[17] = flag;\r
-    value[18] = Calculate_CRC(value,18);\r
-    sendok =  sendBleData(value,19);\r
-    msleep(3*get_ble_interval());//增加延时,确保可以成功发送解除绑定\r
-\r
-    bd_addr_t addr={0};\r
-    get_phone_addr(&addr,g_ble_conn_id);\r
-\r
-    bool ret = bt_is_acl_connected(&addr);\r
-    if(flag == 1)\r
-    {   \r
-        if(0!=remove(PHONE_WATCH_CONFIG_PATH))\r
-        {\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n");\r
-        }\r
-        gap_ble_remove_all_pairs(); \r
-        gap_remove_all_pairs();\r
-    }\r
-    \r
-\r
-\r
-    return sendok;\r
-}\r
-\r
-void watch_clean_pairs(void)\r
-{\r
-    if(0!=remove(PHONE_WATCH_CONFIG_PATH))\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n");\r
-    }\r
-    gap_ble_remove_all_pairs(); \r
-    gap_remove_all_pairs();\r
-}\r
- \r
-\r
-void getDeviceState(void)//获取设备状态\r
-{\r
-     bd_addr_t addr={0};\r
-    get_phone_addr(&addr,g_ble_conn_id);\r
-\r
-    bool ret = bt_is_acl_connected(&addr);\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getDeviceState ret:%d\r\n",ret);\r
-}\r
-\r
-void clearPaireFlag(uint8_t flag)\r
-{\r
-    uint8_t value[19];\r
-    uint8_t crcvalue = 0;\r
-    memset(value,0,19);\r
-    uint32_t tmp = 1;\r
-    value[0] =0x72;\r
-    value[1] =0x01;\r
-    value[2] =0x10;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp,2);\r
-    value[17] = flag;\r
-    value[18] = Calculate_CRC(value,18);\r
-    sendBleData(value,19);\r
-    \r
-    UnbindSucessCmd(1);//1确认解绑;\r
-    \r
-    // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);//恢复出厂\r
-    uint8_t shutdowflag = 2;//恢复出厂\r
-    CustomEventPublish(TOPIC_EVENT_SHUTDOWN_ANIMATIOR, &shutdowflag, sizeof(shutdowflag));\r
-    //uapi_reboot_device();\r
-}\r
-void clearPaireCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)//发送清除配对指令\r
-{\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        //弹出清除配对界面不弹出是则发送0x02操作失败 1操作成功 0校验失败\r
-        clearPaireFlag(1);\r
-    }\r
-    else\r
-    {\r
-        clearPaireFlag(0);\r
-    }\r
-}\r
-uint8_t *savephonename=NULL;\r
-//确认配对指令\r
-uint8_t first_bond = 0;//是否第一次绑定 第一次绑定保存配对mac地址\r
-void comfirmPaire(uint8_t flag)\r
-{\r
-    uint8_t value[19];\r
-    memset(value,0,19);\r
-    uint32_t tmp = 1;\r
-    value[0] =0x72;\r
-    value[1] =0x05;\r
-    value[2] =0x11;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp,2);\r
-    value[17] = flag;\r
-    value[18] = Calculate_CRC(value,1+17);\r
-    sendBleData(value,19);\r
-    if(flag == 1)\r
-    {\r
-        first_bond = 1;\r
-\r
-        if(get_ble_pair())\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," gap_ble_pair \r\n");\r
-\r
-            bd_addr_t addr={0};\r
-            get_phone_addr(&addr,g_ble_conn_id);\r
-\r
-            errcode_t code = gap_ble_pair_remote_device(&addr);\r
-            if(code!=ERRCODE_SUCC)\r
-            {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"gap_ble_pair_remote_device fail %X\r\n",code);\r
-            }\r
-        }\r
-\r
-        \r
-    }else{\r
-        first_bond = 0;\r
-        errcode_t ret = 0;\r
-         bd_addr_t addr={0};\r
-            get_phone_addr(&addr,g_ble_conn_id);\r
-\r
-        ret = gap_ble_disconnect_remote_device(&addr);//与固定的mac设置地址进行断开连接\r
-        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_ble_disconnect_remote_device %x\r\n",ret);\r
-        ret = gap_ble_remove_all_pairs(); \r
-        bool ret_ok = gap_remove_all_pairs();\r
-        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_remove_all_pairs  %x %x\r\n",ret,ret_ok);\r
-        if(savephonename != NULL)\r
-        {\r
-            ym_free(savephonename);\r
-            savephonename = NULL;\r
-        }\r
-    }\r
-}\r
-\r
-// l连接手表之后-app通过特征值2AE4读手表信息->手表会把相应的信息给app->app通过73 02 10下发手机信息给设备(第一次连接mac为空)->设备返回73 02 10状态1才能和手机app第一次连接->设备会回发配对指令72 05 11给app,同时设备会对手机发起配对->手机点了配对后,配对成功手表会发配对成功指令72 05 10,这条指令包含手机的mac地址也会传给app->app校验解析成功之后->app下发时间指令72 02 02给设备->设备回复解析成功->完成连接\r
-void alarmData(void)\r
-{\r
-\r
-}\r
-\r
-\r
-void getPhoneNameLen(uint8_t *data,uint8_t *datalen,uint8_t *type)//获取手机设备名称长度\r
-{\r
-    uint8_t len = 0;\r
-    uint8_t *json = data;\r
-    cJSON* root = cJSON_Parse((const char *)json);\r
-    \r
-    if(root != NULL)\r
-    {\r
-        cJSON* pn = cJSON_GetObjectItem(root, "pn");\r
-        if (pn && cJSON_IsString(pn)) {\r
-            len = strlen(pn->valuestring)+1;   \r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设备名称: %s len:%d\n", pn->valuestring,len);\r
-        }\r
-        cJSON* tp = cJSON_GetObjectItem(root, "tp");\r
-        if(tp && cJSON_IsNumber(tp))\r
-        {\r
-            *type=tp->valueint;\r
-        }\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d\r\n",type);\r
-       \r
-        cJSON* bond=cJSON_GetObjectItem(root, "bond");\r
-        if(bond)\r
-        {\r
-\r
-        }\r
-        *datalen = len;\r
-        cJSON_Delete(root);\r
-    } else{\r
-        len = 0;\r
-        *datalen = len;\r
-    }\r
-}\r
-#define PHONE_NAME_MAX_LEN 50\r
-static uint8_t *getPhoneName(uint8_t *data)//获取手机设备名称\r
-{\r
-    uint8_t *json = data;\r
-    uint8_t *str = NULL; \r
-    cJSON* root = cJSON_Parse((const char *)json);\r
-    if(root != NULL)\r
-    {\r
-        cJSON* pn = cJSON_GetObjectItem(root, "pn");\r
-        if (pn && cJSON_IsString(pn)) {\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]='\0';\r
-                str = ym_malloc(sizeof(char)*datalen);\r
-                if(str != NULL)\r
-                {\r
-                    memcpy(str,(uint8_t *)pn->valuestring,datalen+1);\r
-                }\r
-                if(savephonename)\r
-                {\r
-                    ym_free(savephonename);\r
-                    savephonename=NULL;\r
-                }\r
-                savephonename =  ym_malloc(sizeof(char)*datalen);\r
-                if(savephonename != NULL){\r
-                    memcpy(savephonename,(uint8_t *)pn->valuestring,datalen+1);\r
-                }\r
-            }\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设备名称: %s\n", pn->valuestring);\r
-        }\r
-        cJSON_Delete(root);\r
-    } \r
-    if (str == NULL){\r
-        return NULL;\r
-    } \r
-    else{\r
-        return str;\r
-    }\r
-    \r
-}\r
-void getPhoneMac(uint8_t *data,uint8_t *phoneMac)//获取手机设备mac这个是手表上传给手机的mac地址\r
-{\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
-    uint8_t datalen = 0;\r
-    uint8_t count = 5;\r
-    if(root != NULL)\r
-    {\r
-        cJSON* mac = cJSON_GetObjectItem(root, "mac");\r
-        if (mac && cJSON_IsArray(mac)) {\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"MAC地址: ");\r
-            cJSON* macElement = NULL;\r
-            cJSON_ArrayForEach(macElement, mac) {\r
-                if (cJSON_IsNumber(macElement)) {\r
-                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d", macElement->valueint);\r
-                    if (macElement->prev != NULL) {\r
-                        phone_tmp[count] = macElement->valueint;\r
-                        count--;\r
-                          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,", ");\r
-                    }\r
-                }\r
-            }\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n");\r
-        }\r
-\r
-        memcpy(phoneMac,phone_tmp,6);\r
-        cJSON_Delete(root);\r
-    } \r
-    else{\r
-        memset(phoneMac,0,6);\r
-    }\r
-}\r
-\r
-void GetwatchSaveMac(uint8_t *mac,uint8_t *mactype)//获取手表本地保存的mac地址和mac地址类型 分共有和私有的\r
-{\r
-    uint8_t mac_tmp[6];\r
-    memset(mac_tmp,0,6);\r
-    uint8_t count = 0;\r
-    uint8_t type= 0;\r
-    FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");\r
-    if (jsfile != NULL) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"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
-        // 解析JSON数据\r
-        cJSON *root = cJSON_Parse(jsonData);\r
-        // 释放资源\r
-        ym_free(jsonData);\r
-        if (root != NULL) {\r
-            cJSON *modifiedJson = cJSON_GetObjectItem(root,"mac");\r
-            if (cJSON_IsArray(modifiedJson)) {\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"watch MAC地址: ");\r
-                cJSON* macElement = NULL;\r
-                cJSON_ArrayForEach(macElement, modifiedJson) {\r
-                    if (cJSON_IsNumber(macElement)) {\r
-                          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d", macElement->valueint);\r
-                        if ((macElement->prev != NULL)) {\r
-                            mac_tmp[count] = macElement->valueint;\r
-                            count++;\r
-                              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,", ");\r
-                        }\r
-                    }\r
-                }\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n");\r
-            }\r
-            cJSON *mac_type = cJSON_GetObjectItem(root,"mac_type");\r
-            if(cJSON_IsNumber(mac_type))\r
-            {\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
-            memset(mac,0,6);\r
-        }else\r
-        {\r
-            memcpy(mac,mac_tmp,6);\r
-        }\r
-        cJSON_Delete(root);\r
-    }else\r
-    {\r
-        memset(mac_tmp,0,6);\r
-        memcpy(mac,mac_tmp,6);\r
-        *mactype = 0;\r
-    }\r
-}\r
-static void GetwatchSaveNameLen(uint8_t *datalen)//获取手表本地保存的手机设备名称长度\r
-{\r
-    uint8_t len = 0;\r
-    FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");\r
-    if (jsfile != NULL) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveNameLen 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
-        if (root != NULL) {\r
-            cJSON *pn = cJSON_GetObjectItem(root,"pn");\r
-            if(cJSON_IsString(pn))\r
-            {\r
-                len = strlen(pn->valuestring)+1;//多加一个加上字符串的结束符\0\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveNameLen;%d",len);\r
-            }\r
-        };\r
-        *datalen  = len;\r
-        // memcpy(datalen,&len,1);\r
-        // 释放资源\r
-        cJSON_Delete(root);\r
-    }else{\r
-        len = 0;\r
-        *datalen  = len;\r
-    }\r
-}\r
-static uint8_t *GetwatchSaveName(void)//获取手表本地保存的手机设备名称\r
-{\r
-    uint8_t count = 0;\r
-    uint8_t *str = NULL;\r
-    FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");\r
-    if (jsfile != NULL) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"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
-        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ym_free ym_malloc_count:%d ym_free_count:%d\r\n",ym_malloc_count,ym_free_count);\r
-        if (root != NULL) {\r
-            cJSON *pn = cJSON_GetObjectItem(root,"pn");\r
-            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
-                    if(str != NULL)\r
-                    {\r
-                        pn->valuestring[showname_len]='\0';\r
-                        memcpy(str,(uint8_t *)pn->valuestring,showname_len+1);\r
-                    }\r
-                    \r
-                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveName:%s",pn->valuestring);\r
-                }\r
-            }\r
-        }\r
-        // 释放资源\r
-        cJSON_Delete(root);\r
-    }\r
-    if (str == NULL)\r
-    {\r
-        return NULL;\r
-    }else{\r
-        return str;\r
-    }\r
-    \r
-}\r
-\r
-void cleanUnbindInfor(uint8_t flag)//和旧手机解绑清除配对信息\r
-{\r
-    uint8_t value[19];\r
-    memset(value,0,19);\r
-    uint32_t tmp = 1;\r
-    uint16_t tmp_fen= 1;\r
-    value[0] =0x72;\r
-    value[1] =0x05;\r
-    value[2] =0x11;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_fen,2);\r
-    value[17] = 0x03;//\r
-    value[18] = Calculate_CRC(value,18);\r
-    sendBleData(value,19);\r
-\r
-    uint8_t MacType = 0;\r
-    uint8_t mac_data[6];\r
-    memset(mac_data,0,6);\r
-    GetwatchSaveMac(&mac_data,&MacType);\r
-\r
-    bd_addr_t addr={0};\r
-    get_phone_addr(&addr,g_ble_conn_id);\r
-\r
-    errcode_t ret1 = gap_disconnect_remote_device(&addr);\r
-    gap_ble_disconnect_remote_device(&addr);//与固定的mac设置地址进行断开连接\r
-\r
-    if (flag == 1){\r
-        errcode_t ret= gap_ble_remove_pair(&addr);//清除配对信息\r
-        \r
-        gap_ble_remove_all_pairs(); \r
-        bool ret_flag = gap_remove_all_pairs();\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ret_flag:%d ret:%x\r\n",ret_flag,ret);\r
-        if(0!=remove(PHONE_WATCH_CONFIG_PATH))\r
-        {\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n");\r
-        }\r
-        set_ble_falg(0);\r
-        do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);//恢复出厂\r
-        //uapi_reboot_device();\r
-    }\r
-}\r
-static bool ctkd_flag_ble=false;\r
-\r
-void set_ctkd_flag(bool flag)\r
-{\r
-    ctkd_flag_ble=flag;\r
-}\r
-bool get_ctkd_flag(void)\r
-{\r
-    return true;//ctkd_flag_ble;\r
-}\r
-void sendBindInfor(uint8_t *data)\r
-{\r
-    uint8_t value[19];\r
-    memset(value,0,19);\r
-    uint32_t tmp = 1;\r
-    uint16_t tmp_fen= 1;\r
-    value[0] =0x72;\r
-    value[1] =0x02;\r
-    value[2] =0x10;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_fen,2);\r
-    \r
-    uint8_t copare_mac[6];\r
-    memset(copare_mac,0,6);\r
-    uint8_t datalen=0;\r
-    uint8_t *devname = NULL;\r
-    uint8_t devnamelen = 0;\r
-    uint8_t mac_tmp[6];\r
-    memset(mac_tmp,0,6);\r
-    uint8_t phone_type;\r
-    uint8_t bond = 1;//未与任何手机绑定过\r
-    errcode_t ret = 0;\r
-    first_bond = 0;\r
-    uint8_t save_mac[6];\r
-    memset(save_mac,0,6);\r
-    uint8_t MacType = 0;\r
-    \r
-    GetwatchSaveMac(&save_mac,&MacType);//获取手表设备本地保存的mac地址和mac地址类型 \r
-    getPhoneMac(data,&copare_mac);\r
-\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
-        //未配过使能一键双联\r
-\r
-        //清除一次配对\r
-        //if(get_ble_pair())\r
-       \r
-        //\r
-        value[17] = bond;//\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-\r
-        #ifdef SUPPORT_DEVICE_PAIRING_NOTIFICATION\r
-        #ifdef SUPPORT_A5133_SERVICE_BLE_PAIR\r
-        comfirmPaire(1);\r
-        #else\r
-        devnamelen = 0;\r
-        getPhoneNameLen(data,&devnamelen,&phone_type);//获取手机下发的手机设备名称长度\r
-\r
-        if(phone_type==0)\r
-        {\r
-            unsigned int paired_devices_num=0;\r
-            bool  gap_get_paired =gap_get_paired_devices_num(&paired_devices_num);\r
-            if(gap_get_paired!=true ||paired_devices_num!=0 )\r
-            {\r
-                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"sendBindInfor!!!!!!!!!:gap_remove_all_pairs \r\n");\r
-                gap_remove_all_pairs();\r
-            }\r
-        }\r
-       \r
-\r
-        if(devnamelen > 0 )\r
-        {\r
-        \r
-            devname = getPhoneName(data);\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname!!!!!!!!!:%s devnamelen:%d",devname,devnamelen);\r
-            if (devname != NULL){\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is name!!!!!!!!!\r\n");\r
-                uint8_t buf[devnamelen+2]; \r
-                memset(buf,0,devnamelen+2);\r
-                buf[0] = DEVICEBIND ;\r
-                buf[1] = devnamelen;//设备名称长度 0不显示\r
-                memcpy(buf+2,devname,devnamelen);\r
-\r
-                if(phone_type==1)\r
-                {\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"IOS\r\n");\r
-                    ble_set_pair(1);\r
-                    \r
-                    errcode_t ret = gap_ble_set_ctkd_enable(true);\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "iPhone gap_ble_set_ctkd_enable ret = %x", ret);\r
-                    set_ctkd_flag(true);\r
-                }\r
-                else\r
-                {\r
-                    ble_set_pair(0);\r
-               \r
-                    errcode_t ret = gap_ble_set_ctkd_enable(true);\r
-                    \r
-                }\r
-                \r
-                CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,(uint8_t *)buf,devnamelen+2);\r
-                //  comfirmPaire(1);\r
-                if(devname)\r
-                {   \r
-                    ym_free(devname);\r
-                    devname = NULL;\r
-                }\r
-            }else{\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is no name11111!!!!!!!!!:");\r
-                uint8_t buf[2]; \r
-                memset(buf,0,2);\r
-                buf[0] = DEVICEBIND;\r
-                buf[1] = 0;\r
-                CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);\r
-                //  comfirmPaire(1);\r
-                \r
-            }\r
-        }\r
-        else{\r
-            uint8_t buf[2]; \r
-            memset(buf,0,2);\r
-            buf[0] = DEVICEBIND;\r
-            buf[1] = 0 ;\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is no name!!!!!!!!!:");\r
-            CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);\r
-            //  comfirmPaire(1);\r
-        }\r
-         #endif\r
-        #endif\r
-\r
-        return;\r
-        \r
-    }else\r
-    {\r
-        if(copare_mac[0] == 0 && copare_mac[1] == 0 && copare_mac[2] == 0 && copare_mac[3] == 0 && copare_mac[4] == 0 && copare_mac[5] == 0) \r
-        {\r
-            bond = 0x03;//手表和其他手机绑定过\r
-           \r
-        }else{//如果手机有保存mac app下发是空就提示和其他手机绑定过界面不在发起配对\r
-            int result = memcmp(copare_mac,save_mac,6);\r
-            if(result == 0)\r
-            {\r
-               \r
-                if(get_ble_pair())\r
-                {\r
-                    set_ctkd_flag(true);\r
-                    errcode_t ret = gap_ble_set_ctkd_enable(true);\r
-\r
-                }\r
-                else\r
-                {\r
-                    errcode_t ret = gap_ble_set_ctkd_enable(true);\r
-                }\r
-\r
-    \r
-                if(get_ble_pair())\r
-                {\r
-                    bd_addr_t addr={0};\r
-                    get_phone_addr(&addr,g_ble_conn_id);\r
-\r
-                    errcode_t code = gap_ble_pair_remote_device(&addr);\r
-                    if(code!=ERRCODE_SUCC)\r
-                    {\r
-                          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_ble_pair_remote_device fail %X\r\n",code);\r
-                    }\r
-                }\r
-     \r
-                bond = 0x02;//手表与该手机绑定过\r
-                value[17] = bond;//\r
-                value[18] = Calculate_CRC(value,18);\r
-                sendBleData(value,19);\r
-                return;\r
-            }else{\r
-                bond = 0x03;//手表与其他手机绑定过\r
-            }\r
-        }\r
-    }\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bond flag:%d first_bond:%d\r\n",bond,first_bond);\r
-   \r
-    if(bond == 0x03)\r
-    {\r
-        devnamelen = 0;\r
-        GetwatchSaveNameLen(&devnamelen);//获取手表设备保存手机的设备名称长度\r
-        if(devnamelen > 0)\r
-        {   \r
-            devname = GetwatchSaveName();\r
-            if (devname != NULL){\r
-                uint8_t buf[devnamelen+2]; \r
-                memset(buf,0,devnamelen+2);\r
-                buf[0] = DEVICEUNBIND ;\r
-                buf[1] = devnamelen;\r
-                memcpy(buf+2,devname,devnamelen);\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname:is no null!!!!!%s\r\n",devname);\r
-                CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,(uint8_t *)buf,devnamelen+2);\r
-                if(devname)\r
-                {\r
-                    ym_free(devname);\r
-                    devname = NULL;\r
-                }\r
-            }else{\r
-                uint8_t buf[2]; \r
-                memset(buf,0,2);\r
-                buf[0] = DEVICEUNBIND;\r
-                buf[1] = 0;\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname:is  null!!!!!");\r
-                CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);\r
-            }\r
-        }else{\r
-            uint8_t buf[2]; \r
-            memset(buf,0,2);\r
-            buf[0] = DEVICEUNBIND;\r
-            buf[1] = 0;\r
-            CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);\r
-        }\r
-    }\r
-    value[17] = bond;//\r
-    value[18] = Calculate_CRC(value,18);\r
-    sendBleData(value,19);\r
-}\r
-void SetPhoneInfo(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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_fen= 1;\r
-    value[0] =0x72;\r
-    value[1] =0x02;\r
-    value[2] =0x10;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_fen,2);\r
-    phoneDataFlag = 1;\r
-    \r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        sendBindInfor(data);\r
-    }else{\r
-        value[17] = 0x00;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-\r
-void sendParieSuccess(uint8_t flag,bd_addr_t *addr)//发送配对成功指令to app\r
-{\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\r\n",addr->addr[0],addr->addr[1],addr->addr[2],addr->addr[3],addr->addr[4],addr->addr[5]);\r
-    if(g_ble_conn_id==0)\r
-    {\r
-        return;\r
-\r
-    }\r
-    if(first_bond == 1 && phoneDataFlag == 1)//第一次连接绑定\r
-    {\r
-        set_ble_falg(1);\r
-        uint8_t value[25];\r
-        uint8_t length = 0;\r
-        memset(value,0,25);\r
-        value[0] = 0x72;\r
-        value[1] = 0x05;\r
-        value[2] = 0x10;\r
-        uint32_t totalpack= 1;//总的包数\r
-        uint32_t data_len = 7;//数据长度\r
-        uint32_t pack_index= 1;//分包序号Index\r
-        uint16_t pack_dataLen = 7;\r
-        memcpy(value+3,&totalpack,4);\r
-        memcpy(value+7,&data_len,4);\r
-        memcpy(value+11,&pack_index,4);\r
-        memcpy(value+15,&pack_dataLen,2);\r
-        value[17] = flag;//1 配对成功 0 配对失败 \r
-        if(flag == 1)//配对成功\r
-        {\r
-            cJSON *dataJSON = cJSON_CreateObject();\r
-            if(dataJSON==NULL)\r
-            {\r
-                return;\r
-            }\r
-\r
-            cJSON* arrayJSON = cJSON_CreateArray();\r
-            if(arrayJSON==NULL)\r
-            {\r
-                return;\r
-            }\r
-            for(uint8_t id = 0;id<6;id++)\r
-            {\r
-                cJSON_AddNumberToObject(arrayJSON,"id",addr->addr[id]);\r
-            }\r
-            if(savephonename != NULL)\r
-            {\r
-                cJSON_AddStringToObject(dataJSON,"pn",(char *)savephonename);\r
-                ym_free(savephonename);\r
-                savephonename = NULL;\r
-            }\r
-            cJSON_AddNumberToObject(dataJSON,"phoneType",phoneType);\r
-            cJSON_AddNumberToObject(dataJSON,"mac_type",addr->type);\r
-            cJSON_AddItemToObject(dataJSON,"mac",arrayJSON);\r
-\r
-            char *jsonString = cJSON_PrintUnformatted(dataJSON);\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone %s",jsonString);\r
-            FILE *file = fopen(PHONE_WATCH_CONFIG_PATH, "wb");\r
-            if (file)\r
-            {\r
-                if (fputs(jsonString, file) != EOF) // 将 JSON 字符串写入文件\r
-                {\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WriteJsonData success\n");\r
-                }\r
-                fclose(file);\r
-            }\r
-            // ym_free(jsonString);\r
-            cJSON_free(jsonString);\r
-            cJSON_Delete(dataJSON);\r
-            // 读取JSON文件\r
-\r
-            //memcpy(value+18,addr->addr,6);\r
-            value[18]=addr->addr[5];\r
-            value[19]=addr->addr[4];\r
-            value[20]=addr->addr[3]; \r
-            value[21]=addr->addr[2];\r
-            value[22]=addr->addr[1];\r
-            value[23]=addr->addr[0];\r
-\r
-            memcpy(parie_mac,addr->addr,6);\r
-            length = 18+6;\r
-            uint8_t crcvalue = Calculate_CRC(value,length);\r
-            value[length] = crcvalue;\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:%d length:%d crcvalue:%d",sizeof(value),length,crcvalue );\r
-            sendBleData(value,length+1);\r
-        }else{\r
-            length = 18;\r
-            uint8_t crcvalue = Calculate_CRC(value,length);\r
-            value[length] = crcvalue;\r
-            length = length+1;\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:%d length:%d crcvalue:%d",sizeof(value),length,crcvalue );\r
-            sendBleData(value,length);\r
-        }\r
-        phoneDataFlag = 0;\r
-    }\r
-\r
-    \r
-}\r
-\r
-\r
-//02类型的指令数据\r
-\r
-void checkCrcSend(uint8_t type,uint8_t typeID,uint8_t crcflag)//获取时间\r
-{\r
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = type;\r
-    sendBuf[2] = typeID;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-    sendBuf[17] = crcflag;\r
-    sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-    sendBleData(sendBuf,19);\r
-\r
-}\r
-//发送查找手机\r
-void senfindphoneSend(uint8_t flag)\r
-{\r
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x05;\r
-    sendBuf[2] = 0x01; //3\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4); //15\r
-    memcpy(sendBuf+15,&tmp_data,2); //17\r
-    sendBuf[17] = flag;\r
-    sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-    sendBleData(sendBuf,19);\r
-}\r
-\r
-static uint8_t jsonCheck_time(uint8_t *buf)//json 格式解析\r
-{\r
-    // char time_data[24];\r
-    // memset(time_data,0,24);\r
-    \r
-    uint8_t *json;\r
-    json = buf;\r
-    cJSON* root = cJSON_Parse((const char *)json);\r
-    if (root == NULL) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"时间 JSON解析错误\n");\r
-        return 2;\r
-    }\r
-    char *locations;\r
-    int year = 1970;\r
-    uint8_t month = 1;\r
-    uint8_t day = 1;\r
-    uint8_t week = 4;\r
-    uint8_t hour = 0;\r
-    uint8_t minute = 0;\r
-    uint8_t second = 0;\r
-    uint32_t timestamp;\r
-    cJSON* time = cJSON_GetObjectItem(root, "time");\r
-    if (time && cJSON_IsNumber(time)) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %d\n", time->valueint);\r
-        timestamp = time->valueint;\r
-        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %d\n", time->valueint);\r
-    }\r
-    cJSON* jsweek = cJSON_GetObjectItem(root, "week");\r
-    if (jsweek && cJSON_IsNumber(jsweek)) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"week: %d\n", jsweek->valueint);\r
-        week = jsweek->valueint;\r
-    }\r
-    cJSON* jsyear = cJSON_GetObjectItem(root, "year");\r
-    if (jsyear && cJSON_IsNumber(jsyear)) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"year: %d\n", jsyear->valueint);\r
-        year = jsyear->valueint;\r
-    }\r
-    cJSON* jsmonth = cJSON_GetObjectItem(root, "month");\r
-    if (jsmonth && cJSON_IsNumber(jsmonth)) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"month: %d\n", jsmonth->valueint);\r
-        month = jsmonth->valueint;\r
-    }\r
-    cJSON* jsday = cJSON_GetObjectItem(root, "day");\r
-    if (jsday && cJSON_IsNumber(jsday)) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"day: %d\n", jsday->valueint);\r
-        day = jsday->valueint;\r
-    }\r
-    cJSON* jshour = cJSON_GetObjectItem(root, "hour");\r
-    if (jshour && cJSON_IsNumber(jshour)) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"hour: %d\n", jshour->valueint);\r
-        hour = jshour->valueint;\r
-    }\r
-    cJSON* jsminute = cJSON_GetObjectItem(root, "minute");\r
-    if (jsminute && cJSON_IsNumber(jsminute)) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"minute: %d\n", jsminute->valueint);\r
-        minute = jsminute->valueint;\r
-    }\r
-    cJSON* jssecond = cJSON_GetObjectItem(root, "second");\r
-    if (jssecond && cJSON_IsNumber(jssecond)) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"second: %d\n", jssecond->valueint);\r
-        second = jssecond->valueint;\r
-    }\r
-    cJSON* location = cJSON_GetObjectItem(root, "location");\r
-    if (location && cJSON_IsString(location)) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"location: %s\n", location->valuestring);\r
-        locations = location->valuestring;\r
-    }\r
-    // sprintf((char *)time_data,"%d-%d-%d %d:%d:%d",year+2000,month,day,hour,minute,second);\r
-    // set_system_time(time_data);\r
-    \r
-\r
-    /***计算timezone*/\r
-    struct tm tmp={0};\r
-    tmp.tm_year = year+2000 - 1900;\r
-    tmp.tm_mon = month -1;\r
-    tmp.tm_mday = day;\r
-    tmp.tm_hour = hour;\r
-    tmp.tm_min = minute;\r
-    tmp.tm_sec = second;\r
-    time_t timestamp2 = __tm_to_secs(&tmp);\r
-    int16_t timezone = (timestamp2-timestamp)/60/15;   \r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"timezone in quarters %d\n",timezone);\r
-    uapi_set_timezone(timezone); //要在uaip_sntp_set_time_utc 之前执行才有效\r
-    /********/\r
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"time: %d\n",timestamp );\r
-\r
-    uaip_sntp_set_time_utc(timestamp);\r
-\r
-    cJSON_Delete(root);\r
-    return 1;\r
-}\r
-\r
-\r
-\r
-\r
-void SetUTCtime(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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x02;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-    \r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-       \r
-        uint8_t set_ok = 1;\r
-        set_ok = jsonCheck_time(data);\r
-        sendBuf[17] = set_ok;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-       \r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-    \r
-}\r
-static training_ble training_ble_data;\r
-//设置训练目标\r
-static uint8_t jsonCheck_targetparam(uint8_t *buf)\r
-{\r
-    uint8_t *json;\r
-    json = buf;\r
-    cJSON* root = cJSON_Parse((const char *)json);\r
-    if (root == NULL) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"时间 JSON解析错误\n");\r
-        return 2;\r
-    }\r
-\r
-    memset(&training_ble_data, 0, sizeof(training_ble));\r
-\r
-    cJSON* ty = cJSON_GetObjectItem(root, "ty");//目标类型\r
-    if (cJSON_IsNumber(ty)) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ty: %d\n", ty->valueint);\r
-        training_ble_data.sportTagType = ty->valueint;\r
-        training_ble_data.controlmd = SETGOAL;\r
-\r
-        cJSON* targetItem = NULL;\r
-        switch (training_ble_data.sportTagType)\r
-        {\r
-            case 0: // 距离\r
-                targetItem = cJSON_GetObjectItem(root, "di");//目标距离\r
-                break;\r
-            case 1: // 卡路里\r
-                targetItem = cJSON_GetObjectItem(root, "ca");//目标卡路里\r
-                break;\r
-            case 2: // 时间\r
-                targetItem = cJSON_GetObjectItem(root, "tm");//目标时间\r
-                break;\r
-            case 3: // 步数\r
-                targetItem = cJSON_GetObjectItem(root, "st");//目标步数\r
-                break;\r
-            default:\r
-                break;\r
-        }\r
-\r
-        if (targetItem && cJSON_IsNumber(targetItem)) {\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s: %d\n", targetItem->string, targetItem->valueint);\r
-            training_ble_data.sportTag = targetItem->valueint;\r
-            cJSON_Delete(root);\r
-            CustomEventPublish(TOPIC_EVENT_BLE_TRAINING, (uint8_t*)&training_ble_data, sizeof(training_ble));\r
-            return JSON_CHECK_OK;\r
-        }\r
-    }\r
-\r
-    cJSON_Delete(root);\r
-    return JSON_CHECK_ERR;\r
-}\r
-\r
-\r
-void SetTarinTarget(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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x04;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-    \r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        uint8_t set_ok = 1;\r
-        set_ok = jsonCheck_targetparam(data);\r
-        sendBuf[17] = set_ok;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-    \r
-}\r
-\r
-static void SetOtherTarget(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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x17;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-    \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 = 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
-\r
-        uint8_t ring = data[5];//铃声\r
-        uint8_t vibratior = data[6];//振动\r
-        uint8_t notify = data[7];//通知\r
-        if(target_km)\r
-        set_goal_discount(target_km);\r
-        if(target_stand)\r
-        set_goal_standupcount(target_stand);\r
-        if(target_fattime)\r
-        set_goal_durationcount(target_fattime);\r
-        if(target_kcal)\r
-        set_goal_caloriescount(target_kcal);\r
-\r
-        // set_SilentMode(ring);\r
-        // set_vibrationremiander(vibratior);\r
-        // set_notify_switch(notify);\r
-        if(ring && vibratior && notify)\r
-        set_goal_other_notification(1);\r
-        else\r
-        set_goal_other_notification(0);\r
-\r
-\r
-        sendBuf[17] = 1;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-    \r
-}\r
-static void jsonCheck_alarm(uint8_t *buf)//json 解析闹钟数据\r
-{\r
-    uint8_t *json;\r
-    json = buf;\r
-    cJSON* root = cJSON_Parse((const char *)json);\r
-\r
-    if (root == NULL) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"闹钟 JSON解析错误\n");\r
-        return;\r
-    }\r
-    else\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"闹钟 %s\r\n",json);\r
-    }\r
-    ble_delet_all_AlarmInfo();\r
-\r
-    cJSON* alarms = cJSON_GetObjectItem(root, "alarms");\r
-    if(alarms==NULL)\r
-    {\r
-        return;\r
-    }\r
-    int alarmCount = cJSON_GetArraySize(alarms);\r
-   \r
-    for(int i=0;i<alarmCount;i++)\r
-    {\r
-         uint8_t week=0;\r
-        cJSON *data=cJSON_GetArrayItem(alarms,i);\r
-        if(data==NULL)\r
-        {\r
-            return;\r
-        }\r
-\r
-        cJSON *Id_data =cJSON_GetObjectItem(data,"id");\r
-        if(Id_data==NULL)\r
-        return;\r
-        int id=Id_data->valueint;\r
-\r
-        cJSON*  repeat=cJSON_GetObjectItem(data,"repeat");\r
-        if(repeat==NULL)\r
-        return;\r
-        \r
-        int array_size = cJSON_GetArraySize(repeat);\r
-        for(int j=0;j<array_size;j++)\r
-        {\r
-            int day = cJSON_GetArrayItem(repeat,j)->valueint;\r
-            if(day==7)\r
-            {\r
-                week|=0b00000001;\r
-            }\r
-            else if(day!=0)\r
-            {\r
-                week|=0b00000001<<(day);\r
-            }\r
-             \r
-        }\r
-     \r
-         cJSON*  hour_data=cJSON_GetObjectItem(data,"hour");\r
-         if(hour_data==NULL)\r
-         {\r
-            return;\r
-         }\r
-         int hour=hour_data->valueint;\r
-         cJSON*  minute_data=cJSON_GetObjectItem(data,"minute");\r
-        if(minute_data==NULL)\r
-         {\r
-            return;\r
-         }\r
-         int minute=minute_data ->valueint;\r
-         cJSON*  enable_data=cJSON_GetObjectItem(data,"enable");\r
-        if(enable_data==NULL)\r
-         {\r
-            return;\r
-         }\r
-        int enable=enable_data ->valueint;\r
-\r
-            ble_SetAlarmInfo(hour, minute,week,i,enable);\r
-\r
-    }\r
-    cJSON_Delete(root);\r
-    ble_AlarmClock_refresh();\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"alarmCount %d\n",alarmCount);\r
-    \r
-}\r
-\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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x21;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        jsonCheck_alarm(data);\r
-        \r
-        sendBuf[17] = 1;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }   \r
-}\r
-\r
-\r
-void SetpasswordCmd(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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x1c;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        char* buf[7]={0};\r
-        \r
-        sprintf_s(buf,7,"%d%d%d%d%d%d",data[1],data[2],data[3],data[4],data[5],data[6]);\r
-        ble_set_password(data[0],buf);\r
-\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",buf);\r
-        \r
-        sendBuf[17] = 1;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }   \r
-}\r
-\r
-\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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x0e;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        uint8_t type = data[0];\r
-        if(type == 0)//只设置屏幕亮度\r
-        {\r
-            uint8_t brightness = data[1];\r
-            set_brigthness(brightness);\r
-        }else if(type == 1)//设置亮屏时长 抬碗亮屏\r
-        {\r
-            uint8_t screen_type = data[1];//ms级别\r
-\r
-            int screen_time = 5*1000;\r
-            switch (screen_type)\r
-            {\r
-                case 0:\r
-                    screen_time = 5*1000;\r
-                    break;\r
-                case 1:\r
-                    screen_time = 10*1000;\r
-                    break;\r
-                case 2:\r
-                    screen_time = 15*1000;\r
-                    break;\r
-                case 3:\r
-                    screen_time = 30*1000;\r
-                    break;\r
-                case 4:\r
-                    screen_time = 60*1000;\r
-                    break;\r
-                case 5:\r
-                    screen_time = 60*5*1000;\r
-                    break;\r
-                default:\r
-                    break;\r
-            }\r
-            bool raise = data[2];\r
-\r
-            set_ScreenDuration(screen_time);\r
-            Set_RaiseToWake(raise);\r
-        }\r
-        sendBuf[17] = 1;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-    \r
-}\r
-\r
-\r
-\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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x0f;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-       \r
-        uint8_t type = data[0];\r
-        if(type == 0)//只改变系统音量参数 其他还是保持不变 按照原来的参数\r
-        {\r
-            int sys_volume = data[1];\r
-            Set_SystemVolume(sys_volume);\r
-\r
-        }else if(type == 1)//只改变铃声音量参数 其他还是保持不变 按照原来的参数\r
-        {\r
-            int ring_volume = 0;\r
-\r
-            ring_volume = data[1];\r
-\r
-            Set_CallVolume(ring_volume);\r
-\r
-        }else if(type == 2)//只改变媒体音量\r
-        {\r
-            int ring_volume = 0;\r
-            ring_volume = data[1];\r
-            Set_CallVolume(ring_volume);\r
-        }\r
-        else if(type == 3)//只改变铃声和振动开关\r
-        {\r
-            int bell_on = data[1];\r
-            int vibrate_on = data[2];\r
-            set_SilentMode(bell_on);\r
-            set_vibrationremiander(vibrate_on);\r
-        }\r
-\r
-        sendBuf[17] = 1;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-    \r
-}\r
-\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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x12;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        msg_get_heart_set_param_info_t set_data;\r
-\r
-        set_data.frequence = data[0];\r
-        set_data.remind_on=data[1];\r
-        set_data.max_min=data[2];\r
-        set_data.heart=data[3];\r
-\r
-        Set_heart_cmd(&set_data);\r
-        sendBuf[17] = 1;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-    \r
-}\r
-\r
-\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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x13;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        \r
-        msg_get_spo2_set_param_info_t set_data;\r
-        set_data.frequence = data[0];\r
-        set_data.remind_on=data[1];\r
-        set_data.spo2=data[2];\r
-\r
-        Set_oxygen_cmd(&set_data);\r
-\r
-        sendBuf[17] = 1;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-    \r
-}\r
-\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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x15;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        msg_get_sleep_param_info_t sleep_info;\r
-        sleep_info.schedule = data[0];\r
-        if(len>=6)\r
-        {\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
-        }\r
-      \r
-        ble_set_sleep_remind(sleep_info);\r
-\r
-        sendBuf[17] = 1;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-}\r
-\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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x14;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        msg_drink_info_t drink_info={0};\r
-        drink_info.drink_on = data[0];\r
-        if(data[1])\r
-        {\r
-            drink_info.drink_on=2;\r
-        }\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 = data[6]<<16|data[7];\r
-            drink_info.freq = data[8];\r
-           \r
-        }\r
-        ble_set_drink_remind(drink_info);\r
-        \r
-        sendBuf[17] = 1;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-    \r
-}\r
-\r
-void SetsedentarinessSetParamCmd(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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x1D;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        msg_sedent_set_param_info_t sedent_data={0};\r
-        sedent_data.sedent_on=data[0];\r
-\r
-        // uint32_t sedent_on_time=data[1];\r
-        // sedent_data.sedent_time |= sedent_on_time<<24;\r
-\r
-        // sedent_on_time=data[2];\r
-        // sedent_data.sedent_time |= sedent_on_time<<16;\r
-\r
-        // sedent_on_time=data[3];\r
-        // sedent_data.sedent_time |= sedent_on_time<<8;\r
-\r
-        // sedent_on_time=data[4];\r
-        // sedent_data.sedent_time |= sedent_on_time<<0;\r
-        memcpy_s( &sedent_data.sedent_time,4,&data[1],4);\r
-       \r
-\r
-        sedent_data.frequenc = data[5];\r
-\r
-        // set_sedent_param(&sedent_data);\r
-\r
-        sendBuf[17] = 1;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-}\r
-\r
-void SetmsgfiltrationCmd(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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x1E;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"总长%d\r\n",len);\r
-        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"数据%s\r\n",data);\r
-        uint32_t offset=0;\r
-        uint8_t count=0;\r
-        while (offset<len)\r
-        {\r
-            filtration_data data_t={0};\r
-            data_t.on=data[offset];\r
-            offset++;\r
-            data_t.len=data[offset];\r
-            offset++;\r
-            memcpy_s(data_t.name,filtration_data_max_len,&data[offset],data_t.len);\r
-            offset+=data_t.len;\r
-            // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"%s\r\n",data_t.name);\r
-            filtration_file_updata(&data_t,count);\r
-            count++;\r
-        } \r
-        filtration_file_save();\r
-        \r
-        sendBuf[17] = 1;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-}\r
-\r
-\r
-//通过时间戳来获取训练数据\r
-\r
-void SYN_train_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据\r
-{\r
-\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        if(len==4)\r
-        {\r
-            uint32_t timetamp=0;\r
-            memcpy_s((void*)&timetamp,4,data,4);\r
-            cJSON *json_data = ble_get_Trainingdata_by_timetamp(timetamp);\r
-            if(json_data==NULL)\r
-            {\r
-                ble_data_type type_={0x02,0x19,0,1,1};\r
-                send_big_data(type_,NULL,0);\r
-                return;\r
-            }\r
-            char *json_str=cJSON_PrintUnformatted(json_data);\r
-            uint32_t json_len= strlen(json_str);\r
-            cJSON_Delete(json_data);\r
-\r
-\r
-            uint32_t surplus_len=json_len;\r
-            uint32_t offset=0;\r
-\r
-            uint32_t pack;\r
-            uint16_t pack_size=(ble_nus_max_data_len-18);\r
-            if(pack_size>482)pack_size=482;\r
-\r
-            if(json_len%pack_size==0)\r
-            {\r
-                pack=json_len/pack_size;\r
-            }\r
-            else\r
-            {   \r
-                pack=json_len/pack_size+1;\r
-            }\r
-            uint32_t pack_id=1;\r
-            while (surplus_len!=0)\r
-            {\r
-                if(surplus_len>=pack_size)\r
-                {\r
-                    surplus_len=surplus_len-pack_size;\r
-\r
-                    ble_data_type type_={0x02,0x19,json_len,pack,pack_id};\r
-                    send_big_data(type_,(char *)json_str+offset,pack_size);\r
-                    offset+=pack_size;\r
-                }\r
-                else\r
-                {\r
-                    \r
-                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",json_len,surplus_len,pack_id,pack);\r
-                    ble_data_type type_={0x02,0x19,json_len,pack,pack_id};\r
-                    send_big_data(type_,(char *)json_str+offset,surplus_len);\r
-                    break;\r
-                }\r
-                pack_id++;\r
-            }\r
-\r
-            cJSON_free(json_str);\r
-\r
-        }\r
-        \r
-    }\r
-       else\r
-       {\r
-        ble_data_type type_={0x02,0x19,0,1,1};\r
-        send_big_data(type_,NULL,0);\r
-    }\r
-}\r
-\r
-\r
-void SYN_train_heart_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据\r
-{\r
-\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        if(len==4)\r
-        {\r
-            uint32_t timetamp=0;\r
-            memcpy_s((void*)&timetamp,4,data,4);\r
-            char path[128]={0};\r
-            if(get_training_heart_path(path,timetamp,128))\r
-            {\r
-                FILE *fp= fopen(path,"rb+");\r
-                uint32_t file_size=0;\r
-                if(fp==NULL)\r
-                {\r
-                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);\r
-\r
-                    ble_data_type type_={0x02,0x4b,0,1,1};\r
-                    send_big_data(type_,NULL,0);\r
-\r
-                    return ;\r
-                }\r
-                fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾\r
-                file_size = ftell(fp);       // 获取当前文件指针位置,即文件大小\r
-                fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头\r
-\r
-                int num=(ble_nus_max_data_len-18);\r
-                if(num>482)num=482;\r
-\r
-                int num_check=file_size%5;//心率数据 5个字节\r
-                if(num_check!=0)\r
-                {\r
-                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",cmd);\r
-\r
-                    ble_data_type type_={0x02,0x4b,0,1,1};\r
-                    send_big_data(type_,NULL,0);\r
-                    return ;\r
-                }\r
-            \r
-                char* buf = (char *)ym_malloc(sizeof(char)*num+1);\r
-                if(buf==NULL){fclose(fp); return ;}\r
-\r
-                uint32_t pack=1;\r
-\r
-                if(file_size%num==0)\r
-                pack=file_size/num;\r
-                else\r
-                pack=file_size/num+1;\r
-\r
-                uint32_t pack_id=1;\r
-                uint32_t read_size=0;\r
-                do\r
-                {\r
-                    memset_s(buf,num+1,0,num+1);\r
-                    read_size=fread(buf,1,num,fp);\r
-                    if(read_size!=0)\r
-                    {\r
-                        ble_data_type type_={0x02,0x4b,file_size,pack,pack_id};\r
-                        send_big_data(type_,buf,read_size);\r
-                    }\r
-                    pack_id++;\r
-                } while (read_size==num);\r
-                fclose(fp);\r
-                free(buf);\r
-\r
-            }\r
-        }\r
-        \r
-    }\r
-       else\r
-       {\r
-        ble_data_type type_={0x02,0x4B,0,1,1};\r
-        send_big_data(type_,NULL,0);\r
-    }\r
-}\r
-\r
-void SYN_train_speed_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据\r
-{\r
-\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        if(len==4)\r
-        {\r
-            uint32_t timetamp=0;\r
-            memcpy_s((void*)&timetamp,4,data,4);\r
-            char path[128]={0};\r
-            if(get_training_spead_path(path,timetamp,128))\r
-            {\r
-                FILE *fp= fopen(path,"rb+");\r
-                uint32_t file_size=0;\r
-                if(fp==NULL)\r
-                {\r
-                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);\r
-\r
-                    ble_data_type type_={0x02,0x18,0,1,1};\r
-                    send_big_data(type_,NULL,0);\r
-\r
-                    return ;\r
-                }\r
-                fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾\r
-                file_size = ftell(fp);       // 获取当前文件指针位置,即文件大小\r
-                fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头\r
-\r
-                int num=(ble_nus_max_data_len-18);\r
-                if(num>482)num=482;\r
-\r
-                int num_check=file_size%6;\r
-                if(num_check!=0)\r
-                {\r
-                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",cmd);\r
-\r
-                    ble_data_type type_={0x02,0x18,0,1,1};\r
-                    send_big_data(type_,NULL,0);\r
-                    return ;\r
-                }\r
-            \r
-                char* buf = (char *)ym_malloc(sizeof(char)*num+1);\r
-                if(buf==NULL){fclose(fp); return ;}\r
-\r
-                uint32_t pack=1;\r
-                if(file_size%num==0)\r
-                pack=file_size/num;\r
-                else\r
-                pack=file_size/num+1;\r
-                uint32_t pack_id=1;\r
-                uint32_t read_size=0;\r
-                do\r
-                {\r
-                    memset_s(buf,num+1,0,num+1);\r
-                    read_size=fread(buf,1,num,fp);\r
-                    if(read_size!=0)\r
-                    {\r
-                        ble_data_type type_={0x02,0x18,file_size,pack,pack_id};\r
-                        send_big_data(type_,buf,read_size);\r
-                    }\r
-                    \r
-\r
-                    //send_big_data(1,buf,read_size,file_size,pack_id,pack,id,1);\r
-                    pack_id++;\r
-                } while (read_size==num);\r
-\r
-                fclose(fp);\r
-                free(buf);\r
-\r
-            }\r
-        \r
-        }   \r
-    }\r
-       else\r
-       {\r
-        ble_data_type type_={0x02,0x18,0,1,1};\r
-        send_big_data(type_,NULL,0);\r
-    }\r
-}\r
-\r
-//APP设置步数目标\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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x16;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        \r
-        uint32_t targetStep;\r
-        memcpy(&targetStep,data,4);\r
-\r
-        uint8_t ringOn=data[4];\r
-        uint8_t vibration=data[5];\r
-        uint8_t notify=data[6];\r
-\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设置步数:%d %d %d %d \r\n",targetStep,ringOn,vibration,notify);\r
-\r
-        set_goal_stepcount(targetStep);\r
-        \r
-\r
-        if(ringOn &&vibration &&  notify)\r
-        set_goal_step_notification(1);\r
-        else\r
-        set_goal_step_notification(0);\r
-\r
-\r
-        sendBuf[17] = 1;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-    \r
-}\r
-\r
-uint8_t jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气数据\r
-{\r
-    uint8_t *json;\r
-    json = buf;\r
-    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));\r
-    FILE *fp=fopen("/user/userdata/weather.json","wb+");\r
-    if(fp != NULL)\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather len %d",strlen((char *)buf)+1);\r
-        //fwrite((void*)buf,1,strlen((char *)buf)+1,fp);\r
-        fputs((char *)buf,fp);\r
-        fclose(fp);\r
-    }\r
-    return parse_jsonCheck_weather(buf,check);\r
-}\r
-void parse_jsonCheck_weather_post(uint8_t *buf)//json 格式解析 天气数据\r
-{\r
-     uint8_t *json;\r
-    json = buf;\r
-    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));\r
-    cJSON* root = cJSON_Parse((const char *)json);\r
-    if (root == NULL) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");\r
-        return ;\r
-    }\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始解析天气 JSON\n");\r
-    cJSON *now_cjson = cJSON_GetObjectItem(root, "now");\r
-    if(now_cjson == NULL)\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");\r
-        return ;\r
-    }\r
-    int humidity=0;\r
-    char * windScale=NULL;\r
-    char *textNight=NULL;\r
-    int uvIndex=0;\r
-    int temp=0;\r
-    int iconNight=0;\r
-\r
-    cJSON *now_data_humidity= cJSON_GetObjectItem(now_cjson, "humidity");\r
-    if(now_data_humidity)\r
-    {\r
-        humidity=now_data_humidity->valueint;\r
-    }\r
-    cJSON *now_data_windScale=cJSON_GetObjectItem(now_cjson, "windScale");\r
-    if(now_data_windScale)\r
-    {\r
-        windScale=now_data_windScale->valuestring;\r
-    }\r
-    cJSON *now_data_textNight=cJSON_GetObjectItem(now_cjson, "textNight");\r
-    if(now_data_textNight)\r
-    {\r
-        textNight=now_data_textNight->valuestring;\r
-    }\r
-    cJSON *now_data_uvIndex= cJSON_GetObjectItem(now_cjson, "uvIndex");\r
-    if(now_data_uvIndex)\r
-    {\r
-        uvIndex=now_data_uvIndex->valueint;\r
-    }\r
-    cJSON *now_data_temp= cJSON_GetObjectItem(now_cjson, "temp");\r
-    if(now_data_temp)\r
-    {\r
-        temp=now_data_temp->valueint;\r
-    }\r
-    cJSON *now_data_iconNight= cJSON_GetObjectItem(now_cjson, "iconNight");\r
-    if(now_data_iconNight)\r
-    {\r
-        iconNight=now_data_iconNight->valueint;\r
-    }\r
-    set_weather_now_data(humidity,windScale,textNight,uvIndex,temp,iconNight);\r
-\r
-\r
-    cJSON *address_cjson = cJSON_GetObjectItem(root, "address");\r
-\r
-    char*city=NULL;\r
-    char*subLocality=NULL;\r
-    char*atm=NULL;\r
-     int lat=0;\r
-     int lon=0;\r
-\r
-    cJSON *address_cjson_ = cJSON_GetObjectItem(address_cjson, "city");\r
-    if(address_cjson_)\r
-    {\r
-        city=address_cjson_->valuestring;\r
-    }\r
-    \r
-    \r
-     address_cjson_= cJSON_GetObjectItem(address_cjson, "subLocality");\r
-    if(address_cjson_)\r
-    {\r
-        subLocality=address_cjson_->valuestring;\r
-    } \r
-\r
-    address_cjson_=cJSON_GetObjectItem(address_cjson, "atm");\r
-    if(address_cjson_)\r
-    {\r
-        atm=address_cjson_->valuestring;\r
-    } \r
-    address_cjson_ = cJSON_GetObjectItem(address_cjson, "lat");\r
-    if(address_cjson_)\r
-    {\r
-        lat=address_cjson_->valueint;\r
-    } \r
-\r
-    address_cjson_ = cJSON_GetObjectItem(address_cjson, "lon");\r
-    if(address_cjson_)\r
-    {\r
-        lon=address_cjson_->valueint;\r
-    } \r
-    set_weather_address_data(lat,atm,city,subLocality,lon);\r
-    cJSON *daily = cJSON_GetObjectItem(root, "daily");\r
-    if(daily==NULL)\r
-    {\r
-        return ;\r
-    }\r
-    int count= cJSON_GetArraySize(daily);\r
-    for(int i=0;i<count;i++)\r
-    {   \r
-        //{"tempMin":22,"iconDay":6,"fxDate":1712505600,"textDay":"阵雨","tempMax":29},\r
-        cJSON *data=cJSON_GetArrayItem(daily,i);\r
-\r
-        int  tempMin=0;\r
-        int  iconDay=0;\r
-        int  fxDate=0;\r
-        char *  textDay=NULL;\r
-        int  tempMax=0;\r
-\r
-\r
-        cJSON *data_=cJSON_GetObjectItem(data,"tempMin");\r
-        if(data_&& cJSON_IsNumber(data_) )\r
-        {\r
-           tempMin=data_->valueint;\r
-        }\r
-        \r
-        data_=cJSON_GetObjectItem(data,"iconDay");\r
-        if(data_&& cJSON_IsNumber(data_) )\r
-        {\r
-           iconDay=data_->valueint;\r
-        }\r
-        \r
-        data_=cJSON_GetObjectItem(data,"fxDate");\r
-        if(data_&& cJSON_IsNumber(data_) )\r
-        {\r
-           fxDate=data_->valueint;\r
-        }\r
-        \r
-        data_=cJSON_GetObjectItem(data,"textDay");\r
-        if(data_&& cJSON_IsString(data_) )\r
-        {\r
-           textDay=data_->valuestring;\r
-        }\r
-        data_=cJSON_GetObjectItem(data,"tempMax");\r
-        if(data_&& cJSON_IsNumber(data_) )\r
-        {\r
-           tempMax=data_->valueint;\r
-        }\r
-        set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i);\r
-\r
-    }\r
-     ble_UpdateMainWeatherData();\r
-    cJSON_Delete(root);\r
-    return ;\r
-}\r
-\r
-uint8_t parse_jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气数据\r
-{\r
-    uint8_t flag = 0;\r
-    // flag = 2;\r
-    // memcpy(check,&flag,1);\r
-    // return 0;\r
-    uint8_t *json;\r
-    json = buf;\r
-    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));\r
-    cJSON* root = cJSON_Parse((const char *)json);\r
-    if (root == NULL) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");\r
-        flag = 2;\r
-        memcpy(check,&flag,1);\r
-        return 0;\r
-    }\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始解析天气 JSON\n");\r
-    cJSON *now_cjson = cJSON_GetObjectItem(root, "now");\r
-    if(now_cjson == NULL)\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");\r
-        return 0;\r
-    }\r
-    int humidity=0;\r
-    char * windScale=NULL;\r
-    char *textNight=NULL;\r
-    int uvIndex=0;\r
-    int temp=0;\r
-    int iconNight=0;\r
-\r
-    cJSON *now_data_humidity= cJSON_GetObjectItem(now_cjson, "humidity");\r
-    if(now_data_humidity)\r
-    {\r
-        humidity=now_data_humidity->valueint;\r
-    }\r
-    cJSON *now_data_windScale=cJSON_GetObjectItem(now_cjson, "windScale");\r
-    if(now_data_windScale)\r
-    {\r
-        windScale=now_data_windScale->valuestring;\r
-    }\r
-    cJSON *now_data_textNight=cJSON_GetObjectItem(now_cjson, "textNight");\r
-    if(now_data_textNight)\r
-    {\r
-        textNight=now_data_textNight->valuestring;\r
-    }\r
-    cJSON *now_data_uvIndex= cJSON_GetObjectItem(now_cjson, "uvIndex");\r
-    if(now_data_uvIndex)\r
-    {\r
-        uvIndex=now_data_uvIndex->valueint;\r
-    }\r
-    cJSON *now_data_temp= cJSON_GetObjectItem(now_cjson, "temp");\r
-    if(now_data_temp)\r
-    {\r
-        temp=now_data_temp->valueint;\r
-    }\r
-    cJSON *now_data_iconNight= cJSON_GetObjectItem(now_cjson, "iconNight");\r
-    if(now_data_iconNight)\r
-    {\r
-        iconNight=now_data_iconNight->valueint;\r
-    }\r
-    set_weather_now_data(humidity,windScale,textNight,uvIndex,temp,iconNight);\r
-\r
-\r
-    cJSON *address_cjson = cJSON_GetObjectItem(root, "address");\r
-\r
-    char*city=NULL;\r
-    char*subLocality=NULL;\r
-    char*atm=NULL;\r
-     int lat=0;\r
-     int lon=0;\r
-\r
-    cJSON *address_cjson_ = cJSON_GetObjectItem(address_cjson, "city");\r
-    if(address_cjson_)\r
-    {\r
-        city=address_cjson_->valuestring;\r
-    }\r
-    \r
-    \r
-     address_cjson_= cJSON_GetObjectItem(address_cjson, "subLocality");\r
-    if(address_cjson_)\r
-    {\r
-        subLocality=address_cjson_->valuestring;\r
-    } \r
-\r
-    address_cjson_=cJSON_GetObjectItem(address_cjson, "atm");\r
-    if(address_cjson_)\r
-    {\r
-        atm=address_cjson_->valuestring;\r
-    } \r
-    address_cjson_ = cJSON_GetObjectItem(address_cjson, "lat");\r
-    if(address_cjson_)\r
-    {\r
-        lat=address_cjson_->valueint;\r
-    } \r
-\r
-    address_cjson_ = cJSON_GetObjectItem(address_cjson, "lon");\r
-    if(address_cjson_)\r
-    {\r
-        lon=address_cjson_->valueint;\r
-    } \r
-    set_weather_address_data(lat,atm,city,subLocality,lon);\r
-    cJSON *daily = cJSON_GetObjectItem(root, "daily");\r
-    if(daily==NULL)\r
-    {\r
-        return 0;\r
-    }\r
-    int count= cJSON_GetArraySize(daily);\r
-    for(int i=0;i<count;i++)\r
-    {   \r
-        //{"tempMin":22,"iconDay":6,"fxDate":1712505600,"textDay":"阵雨","tempMax":29},\r
-        cJSON *data=cJSON_GetArrayItem(daily,i);\r
-\r
-        int  tempMin=0;\r
-        int  iconDay=0;\r
-        int  fxDate=0;\r
-        char *  textDay=NULL;\r
-        int  tempMax=0;\r
-\r
-\r
-        cJSON *data_=cJSON_GetObjectItem(data,"tempMin");\r
-        if(data_&& cJSON_IsNumber(data_) )\r
-        {\r
-           tempMin=data_->valueint;\r
-        }\r
-        \r
-        data_=cJSON_GetObjectItem(data,"iconDay");\r
-        if(data_&& cJSON_IsNumber(data_) )\r
-        {\r
-           iconDay=data_->valueint;\r
-        }\r
-        \r
-        data_=cJSON_GetObjectItem(data,"fxDate");\r
-        if(data_&& cJSON_IsNumber(data_) )\r
-        {\r
-           fxDate=data_->valueint;\r
-        }\r
-        \r
-        data_=cJSON_GetObjectItem(data,"textDay");\r
-        if(data_&& cJSON_IsString(data_) )\r
-        {\r
-           textDay=data_->valuestring;\r
-        }\r
-        data_=cJSON_GetObjectItem(data,"tempMax");\r
-        if(data_&& cJSON_IsNumber(data_) )\r
-        {\r
-           tempMax=data_->valueint;\r
-        }\r
-        set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i);\r
-\r
-    }\r
-\r
-    if( uapi_dev_runtime_get_bt_powerstat() && cm_get_HFP_switch())\r
-    uapi_pbap_cmd_start_client();\r
-\r
-    bd_addr_t bdaddr={0};\r
-    #ifdef FD230\r
-    uapi_get_br_address(&bdaddr);\r
-    if( uapi_dev_runtime_get_bt_powerstat() && (cm_get_HFP_switch()||cm_get_A2DP_switch()))\r
-    {\r
-      \r
-        if(cm_get_A2DP_switch() && cm_get_A2DP_switch() && false==bt_is_acl_connected(&bdaddr) && !(bdaddr.addr[0]==0 && bdaddr.addr[1]==0 && bdaddr.addr[2]==0 && bdaddr.addr[3]==0 \r
-              && bdaddr.addr[4]==0 && bdaddr.addr[5]==0))\r
-        {\r
-            gap_reconnect_media_device(&bdaddr);\r
-        }\r
-        else if(cm_get_A2DP_switch())\r
-        {\r
-            uapi_a2dp_snk_connect();\r
-        }\r
-        else if(cm_get_HFP_switch())\r
-        {\r
-            uapi_hfp_connect();\r
-        }\r
-        \r
-    }\r
-   \r
-    #endif\r
-\r
-    ble_UpdateMainWeatherData();\r
-    cJSON_Delete(root);\r
-    *check = 1;\r
-    return 1;\r
-}\r
-/*读取天气历史数据*/\r
-uint8_t read_jsonHistory_weather(void)\r
-{\r
-    uint8_t *buf = NULL;\r
-    FILE *fp=fopen("/user/userdata/weather.json","rb");\r
-    if(fp == NULL)\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"read_jsonHistory_weather:fopen error\r\n");\r
-        return 0;\r
-    }\r
-    fseek(fp, 0, SEEK_END);\r
-    long size = ftell(fp);\r
-    fseek(fp, 0, SEEK_SET);\r
-    if (size == 0)\r
-    {\r
-        fclose(fp);\r
-        return 0;\r
-    }\r
-    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file size = %d\r\n",size);\r
-    buf = (uint8_t*)malloc(size + 1);\r
-    if(buf == NULL)\r
-    {\r
-        fclose(fp);\r
-        return 0;\r
-    }\r
-\r
-    char *str = fgets((char *)buf,size + 1,fp);\r
-    if(str!=NULL)\r
-    {\r
-        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file str = %s\r\n",str);\r
-    }\r
-\r
-    fclose(fp);\r
-\r
-    parse_jsonCheck_weather_post(buf);\r
-\r
-    free(buf);\r
-    \r
-    return 1;\r
-}\r
-\r
-uint8_t binCheck_AI(uint8_t *buf,uint8_t *check,uint16_t len)//json 格式解析 天气数据\r
-{\r
-    uint8_t flag = 0;\r
-    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));\r
-    #if 0\r
-        FILE *fp=fopen("user/AI.txt","wb+");\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI len %d\r\n",len);\r
-        fwrite((void*)buf,1,len,fp);\r
-        //fputs((char *)buf,fp);\r
-        fclose(fp);\r
-    #endif\r
-\r
-    uint16_t offset=0;\r
-\r
-    while (len>offset)\r
-    {\r
-       if(buf[offset]==1)\r
-       {\r
-            offset++;\r
-            if(offset>=len)break;\r
-            uint16_t txt_len;\r
-            memcpy_s(&txt_len,2,&buf[offset],2);\r
-\r
-            offset+=2;\r
-            if(offset>=len)break;\r
-\r
-            char txt_buf[256]={0};\r
-            memcpy_s(txt_buf,256,&buf[offset],txt_len);\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",txt_buf,txt_len);\r
-            ble_set_ai_Question_str(txt_buf);\r
-            offset+=txt_len;\r
-            //offset+=1;\r
-       }\r
-        if(offset>=len)break;\r
-       \r
-        if(buf[offset]==2)\r
-       {\r
-            offset++;\r
-            if(offset>=len)break;\r
-\r
-            uint16_t txt_len;\r
-            memcpy_s(&txt_len,2,&buf[offset],2);\r
-\r
-            offset+=2;\r
-            if(offset>=len)break;\r
-\r
-            if(txt_len>=AI_TXT_BUF_MAX_LEN)\r
-            txt_len=AI_TXT_BUF_MAX_LEN;\r
-\r
-            char *txt_buf=(char*)malloc(txt_len+1);\r
-            if(txt_buf==NULL)\r
-            {\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI txtbuf malloc fail\r\n");\r
-                ble_set_ai_Answer_str("手表缓存不足",0);\r
-                return 0;\r
-            }\r
-\r
-            txt_buf[txt_len]=0;\r
-            memcpy_s((char *)txt_buf,1024*3,&buf[offset],txt_len);\r
-\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI txtbuf Answer %s %d\r\n",txt_buf,txt_len);\r
-            ble_set_ai_Answer_str(txt_buf,2);\r
-            free(txt_buf);\r
-\r
-            offset+=txt_len;\r
-            //offset+=1;\r
-       }\r
-        if(offset>=len)break;\r
-\r
-        if(buf[offset]==0)\r
-       {\r
-            offset++;\r
-            if(offset>=len)break;\r
-\r
-            uint16_t txt_len;\r
-            memcpy_s(&txt_len,2,&buf[offset],2);\r
-\r
-            offset+=2;\r
-            if(offset>=len)break;\r
-\r
-            char error_buf[256]={0};\r
-            memcpy_s(error_buf,256,&buf[offset],txt_len);\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len);\r
-            ble_set_ai_Answer_str(error_buf,0);\r
-            offset+=txt_len;\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 解析失败\r\n");\r
-\r
-       }\r
-       if(offset>=len)break;\r
-\r
-       if(buf[offset]==3)\r
-       {\r
-            offset++;\r
-            if(offset>=len)break;\r
-\r
-            uint16_t txt_len;\r
-            memcpy_s(&txt_len,2,&buf[offset],2);\r
-\r
-            offset+=2;\r
-            if(offset>=len)break;\r
-\r
-            char error_buf[256]={0};\r
-            memcpy_s(error_buf,256,&buf[offset],txt_len);\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len);\r
-            ble_set_ai_Answer_str(error_buf,3);\r
-            offset+=txt_len;\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 回应错误\r\n");\r
-\r
-       }\r
-       if(offset>=len)break;\r
-\r
-        if(buf[offset]==4)\r
-       {\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 结束\r\n");\r
-            // if(AI_is_end_state)\r
-            // {\r
-            //     AI_is_end_state=0;\r
-            // }\r
-            offset++;\r
-            if(offset>=len)\r
-            {\r
-                ble_set_ai_Answer_str("",4);\r
-                break;\r
-            }\r
-\r
-            uint16_t txt_len;\r
-            memcpy_s(&txt_len,2,&buf[offset],2);\r
-\r
-            offset+=2;\r
-            if(offset>=len)break;\r
-\r
-            char error_buf[256]={0};\r
-            memcpy_s(error_buf,256,&buf[offset],txt_len);\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len);\r
-            ble_set_ai_Answer_str(error_buf,4);\r
-\r
-            offset+=txt_len;\r
-            //  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 解析失败\r\n");\r
-\r
-       }\r
-       if(offset>=len)break;\r
-        offset++;\r
-    }\r
-   \r
-    *check = 1;\r
-    return 1;\r
-}\r
-\r
-\r
-void SetWeatherCmd(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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x20;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data);\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        // uint32_t y=(0xff00);\r
-        // uint32_t x =(0xff00& 0Xff00)>>16;\r
-        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd %u\r\n",x);\r
-        uint8_t check = 1;\r
-        jsonCheck_weather(data,&check);\r
-        sendBuf[17] = check;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    } \r
-}\r
-\r
-\r
-void SetAiResultCmd(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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x1f;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data);\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        uint8_t check = 1;\r
-        binCheck_AI(data,&check,len);\r
-\r
-        sendBuf[17] = check;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    } \r
-}\r
-\r
-void APP_reply_AI_is_ready(uint8_t *data,uint16_t len)\r
-{\r
-    if(data[0])\r
-    {\r
-        if(len>1)\r
-        {\r
-            //更新chatgptKEY\r
-            FILE *fp= fopen("/user/userdata/chatGPTkey.bin","wb+");\r
-            if(fp)\r
-            {\r
-                fwrite(data+1,1,len-1,fp);\r
-                fclose(fp);\r
-            }\r
-        }\r
-    }\r
-    ble_app_reply(data[0]);\r
-}\r
-void SaveChatGPTCmd(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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x23;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data);\r
-    //"sk-proj-04ogvrZQqyaiv1OWw8OZT3BlbkFJG9Gyr8oFvRdmr3oXQNbX"\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        \r
-        FILE *fp= fopen("/user/userdata/chatGPTkey.bin","wb+");\r
-        if(fp)\r
-        {\r
-            fwrite(data,1,len,fp);\r
-            fclose(fp);\r
-            sendBuf[17] = 1;\r
-        }\r
-        else\r
-        {\r
-            sendBuf[17] = 2;\r
-        }\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    } \r
-}\r
-\r
-\r
-bool bin_Check_schedule(uint8_t *data,uint16_t len)\r
-{\r
-    uint16_t offset = 0;\r
-    uint16_t buf_len = 0;\r
-    uint16_t id_ = 1;\r
-    \r
-    // 打印函数开始及总长度信息\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bin_Check_schedule start, total len: %d", len);\r
-\r
-    while (offset < len)\r
-    {\r
-        uint16_t id;\r
-        // 解析ID\r
-        memcpy_s(&id, 2, &data[offset], 2);\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsing ID: 0x%04X at offset: %d", id, offset);\r
-        offset += 2;\r
-        if (offset >= len)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing ID, break");\r
-            break;\r
-        }\r
-\r
-        // 解析标题长度\r
-        memcpy_s(&buf_len, 2, &data[offset], 2);\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title length: %d at offset: %d", buf_len, offset);\r
-        offset += 2;\r
-        if (offset >= len)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing title length, break");\r
-            break;\r
-        }\r
-\r
-        // 解析标题内容\r
-        char *title = (char*)malloc(buf_len + 1);\r
-        if (!title)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to allocate memory for title");\r
-            break;\r
-        }\r
-        memset_s(title, buf_len + 1, 0, buf_len + 1);  // 修正为实际分配的大小\r
-        memcpy_s(title, buf_len + 1, &data[offset], buf_len);\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsed title: [%s] (length: %d) at offset: %d", title, buf_len, offset);\r
-\r
-        offset += buf_len;\r
-\r
-        if (offset >= len)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing title, free title and break");\r
-            free(title);\r
-            break;\r
-        }\r
-\r
-        // 解析开始时间\r
-        uint32_t timetemp_begin = 0;\r
-        memcpy_s(&timetemp_begin, 4, &data[offset], 4);\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Start time: %u at offset: %d", timetemp_begin, offset);\r
-        offset += 4;\r
-        if (offset >= len)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing start time, free title and break");\r
-            free(title);\r
-            break;\r
-        }\r
-\r
-        // 解析结束时间\r
-        uint32_t timetemp_end = 0;\r
-        memcpy_s(&timetemp_end, 4, &data[offset], 4);\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "End time: %u at offset: %d", timetemp_end, offset);\r
-        offset += 4;\r
-        if (offset >= len)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing end time, free title and break");\r
-            free(title);\r
-            break;\r
-        }\r
-\r
-        // 解析附加信息长度\r
-        memcpy_s(&buf_len, 2, &data[offset], 2);\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Additional info length: %d at offset: %d", buf_len, offset);\r
-        offset += 2;\r
-\r
-        if (buf_len == 0)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "No additional info, offset: %d, len: %d", offset, len);\r
-            // 调用设置函数\r
-            if (offset == len)\r
-            {\r
-                Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, "", true);\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info (complete), id_: %d", id_);\r
-            }\r
-            else\r
-            {\r
-                Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, "", false);\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info (incomplete), id_: %d", id_);\r
-            }\r
-            \r
-            id_++;\r
-            free(title);\r
-            continue;\r
-        }\r
-\r
-        if (offset >= len)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len before parsing additional info, free title and break");\r
-            free(title);\r
-            break;\r
-        }\r
-\r
-        // 解析附加信息\r
-        char *str_ = (char*)malloc(buf_len + 1);\r
-        if (!str_)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to allocate memory for additional info");\r
-            free(title);\r
-            break;\r
-        }\r
-        memset_s(str_, buf_len + 1, 0, buf_len + 1);  // 修正为实际分配的大小\r
-        memcpy_s(str_, buf_len + 1, &data[offset], buf_len);\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsed additional info: [%s] (length: %d) at offset: %d", str_, buf_len, offset);\r
-\r
-        offset += buf_len;\r
-        \r
-        // 调用设置函数\r
-        if (offset == len)\r
-        {\r
-            Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, str_, true);\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info with additional info (complete), id_: %d", id_);\r
-        }\r
-        else\r
-        {\r
-            Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, str_, false);\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info with additional info (incomplete), id_: %d", id_);\r
-        }\r
-\r
-        id_++;\r
-\r
-        // 释放内存\r
-        free(title);\r
-        free(str_);\r
-        \r
-        if (offset >= len)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "All data parsed, exit loop");\r
-            break;\r
-        }\r
-    }\r
-    \r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bin_Check_schedule end, total parsed id count: %d", id_ - 1);\r
-    return true;\r
-}\r
-void APP_send_schedule_Cmd(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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x24;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data);\r
-    //"sk-proj-04ogvrZQqyaiv1OWw8OZT3BlbkFJG9Gyr8oFvRdmr3oXQNbX"\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        \r
-        printf("11111111111111111\n");\r
-        bool val = bin_Check_schedule(data,len);\r
-        printf("222222222222222222222\n");\r
-        if(val)\r
-        {\r
-            sendBuf[17] = 1;\r
-        }\r
-        else\r
-        {\r
-            sendBuf[17] = 2;\r
-        }\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    } \r
-}\r
-\r
-bool bin_Check_sos(uint8_t *data,uint16_t len)\r
-{\r
-    uint8_t SOS_num=data[0];\r
-    uint32_t offset=1;\r
-    char *name=NULL;\r
-    char *number=NULL;\r
-    ble_sos_number_clean();\r
-\r
-    while (SOS_num)\r
-    {\r
-        SOS_num--;\r
-        uint8_t sex=data[offset];\r
-        offset++;\r
-        if(offset>=len)\r
-        break;\r
-        uint8_t name_len=data[offset];\r
-        offset++;\r
-        if(offset>=len)\r
-        break;\r
-        char *name=(char *)malloc(name_len+1);\r
-        if(name==NULL)\r
-        break;\r
-        memset_s(name,255,0,name_len+1);\r
-        memcpy_s(name,255,&data[offset],name_len);\r
-        offset+=name_len;\r
-        if(offset>=len)\r
-        break;\r
-        uint8_t number_len=data[offset];\r
-        offset++;\r
-        if(offset>=len)\r
-        break;\r
-        char *number=(char *)malloc(number_len);\r
-        if(number==NULL)\r
-        break;\r
-        memset_s(number,255,0,number_len+1);\r
-        memcpy_s(number,255,&data[offset],number_len);\r
-        offset+=number_len;\r
-        \r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"sex:%d,name:%s,number:%s;\r\n",sex,name,number);\r
-\r
-        ble_add_sos_number(sex,name,number);\r
-\r
-        free(number);\r
-        number==NULL;\r
-        free(name);\r
-        name==NULL;\r
-\r
-        if(offset>=len)\r
-        break;\r
-\r
-\r
-    }\r
-    if(number)\r
-    {\r
-        free(number);\r
-    }\r
-    if(name)\r
-    {\r
-        free(name);\r
-    }\r
-\r
-    ble_sos_data_save();\r
-\r
-    return true;\r
-}\r
-\r
-void APP_send_sos_Cmd(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
-    uint8_t sendBuf[19];\r
-    memset(sendBuf,0,19);\r
-    sendBuf[0] = 0x72;\r
-    sendBuf[1] = 0x02;\r
-    sendBuf[2] = 0x25;\r
-    memcpy(sendBuf+3,&tmp,4);\r
-    memcpy(sendBuf+7,&tmp,4);\r
-    memcpy(sendBuf+11,&tmp,4);\r
-    memcpy(sendBuf+15,&tmp_data,2);\r
-\r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        \r
-        if(bin_Check_sos(data,len))\r
-        {\r
-            sendBuf[17] = 1;\r
-        }\r
-        else\r
-        {\r
-            sendBuf[17] = 2;\r
-        }\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    }\r
-       else\r
-       {\r
-               sendBuf[17] = 0;\r
-        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
-        sendBleData(sendBuf,19);\r
-    } \r
-}\r
-\r
-\r
-void GetGPSCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)\r
-{\r
-    ble_data_type type_={0x02,0x4f,0,1,1};\r
-    send_big_data(type_,NULL,0);\r
-\r
-   //send_big_data(1,NULL,0,0,1,1,0x4f,2);\r
-}\r
-\r
-void App_delete_file(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
-{\r
-\r
-    uint8_t reply[2]={0};\r
-    if (len<=2)\r
-    {\r
-         ble_reply_cmdarr(cmd,reply,2);//crc error\r
-    }\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        uint8_t count=data[0];\r
-        uint8_t type=data[1];\r
-        if(type==2)\r
-        {\r
-            if(len-2!=count*2)\r
-            {\r
-                ble_reply_cmdarr(cmd,reply,1);//crc error\r
-            }\r
-            else\r
-            {\r
-                int offest=2;\r
-                for(int i=0;i<count;i++)\r
-                {\r
-                    uint16_t id=0;\r
-                    memcpy_s(&id,2,&data[offest],2);\r
-                    bool ret = delete_MP3_file_By_ID(id);\r
-                    if(ret==false)\r
-                    {\r
-                        reply[0]=2;\r
-                        ble_reply_cmdarr(cmd,reply,1);//crc error\r
-                        return;\r
-                    }\r
-                    else\r
-                    {\r
-                        offest+=2;\r
-                    }\r
-                }\r
-                reply[0]=1;\r
-                ble_mp3_list_update();\r
-                ble_reply_cmdarr(cmd,reply,1);\r
-            }\r
-\r
-        }\r
-        else\r
-        {\r
-            reply[0]=2;\r
-            ble_reply_cmdarr(cmd,reply,1);\r
-        }\r
-\r
-        \r
-        \r
-    }else{\r
-        ble_reply_cmdarr(cmd,reply,1);//crc error\r
-    }\r
-\r
-}\r
-\r
-void query_dial_installed(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
-{\r
-\r
-    uint8_t reply[2]={0};\r
-    if (len != 2)\r
-    {\r
-         ble_reply_cmdarr(cmd,reply,2);//crc error\r
-    }\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        uint16_t dial_uid  = *(uint16_t*)data;\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"query dial 0x%04X installed !!!!!!!!\r\n",dial_uid);\r
-\r
-        if(!ble_is_dial_install_by_id(dial_uid))\r
-        reply[0]=2; //该表盘是否已安装 0:指令校验失败 1:已安装 2:未安装\r
-        else\r
-        reply[0]=1; //该表盘是否已安装 0:指令校验失败 1:已安装 2:未安装\r
-        \r
-\r
-        reply[1]=0; //表盘列表是否已满 0:未满 1:已满\r
-        ble_reply_cmdarr(cmd,reply,2);\r
-        \r
-    }else{\r
-        ble_reply_cmdarr(cmd,reply,2);//crc error\r
-    }\r
-\r
-}\r
-\r
-void SetUserInfo(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\r
-{\r
-\r
-\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getUserInfo ");\r
-\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        ble_reply_cmd(USER_INFOR_CMD,1);\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getUserInfo:!!!!!!!!\r\n");\r
-        msg_user_info_t *p_userinfo = (msg_user_info_t*)data;\r
-\r
-        msg_user_info_t msg_userinfo = {0};\r
-        msg_userinfo.age = p_userinfo->age;\r
-       msg_userinfo.fat_time = p_userinfo->fat_time;\r
-        msg_userinfo.gender = p_userinfo->gender;\r
-        msg_userinfo.height = p_userinfo->height;\r
-                msg_userinfo.target_stand = p_userinfo->target_stand;\r
-        msg_userinfo.target_step = p_userinfo->target_step;\r
-        msg_userinfo.timeformat = p_userinfo->timeformat;\r
-        msg_userinfo.weight = p_userinfo->weight;\r
-        msg_userinfo.calorie=p_userinfo->calorie;\r
-        msg_userinfo.distance=p_userinfo->distance;\r
-\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getUserInfo:!!age %d, fat %d, sex %d, height %d, stand %d, step %d , timeformat %d , weight %d !!!!!!\r\n",\r
-        p_userinfo->age,\r
-        p_userinfo->fat_time,\r
-        p_userinfo->gender,\r
-        p_userinfo->height,\r
-        p_userinfo->target_stand,\r
-        p_userinfo->target_step,\r
-        p_userinfo->timeformat,\r
-        p_userinfo->weight\r
-        );\r
-        \r
-        set_user_data(&msg_userinfo);\r
-        \r
-    }else{\r
-        ble_reply_cmd(USER_INFOR_CMD,0);//crc error\r
-    }\r
-}\r
-\r
-//APP下发快捷辅助功能参数\r
-void Set_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
-    uint32_t tmp = 1;\r
-    uint16_t packtmp = 1;\r
-    value[0] =0x72;\r
-    value[1] =0x02;\r
-    value[2] =0x11;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&packtmp,2);\r
-    \r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        uint8_t paramCnt = data[0];//快捷辅助功能 按照协议文档要区分\r
-        set_quick_auxiliary_paramters(paramCnt);\r
-        value[17] = 1;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else{\r
-        value[17] = 0x00;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\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 *data,uint16_t len)\r
-{\r
-    int num=data[0];//人数\r
-    int offset=1;\r
-    while (num)\r
-    {\r
-        uint8 sex = data[offset];\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"性别: %d\r\n",sex);\r
-        offset=offset+1;\r
-        uint8 name_len=data[offset];\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"name_len %d\r\n",name_len);\r
-        char name[32]={0};\r
-        if(name_len==0)\r
-        {\r
-            name_len=strlen("未知");\r
-             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"未知\r\n");\r
-        }\r
-        else\r
-        {\r
-            memcpy(name,&data[offset+1],name_len);\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"姓名: %s\r\n",name);\r
-            // for(int i=0;i<name_len;i++)\r
-            // {\r
-            //       WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," %X ",name[i]);\r
-            // }\r
-            //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"r\n");\r
-        }\r
-        offset=offset+name_len+1;\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=data[offset];\r
-            char phonen_name[32]={0};\r
-            memcpy(phonen_name,&data[offset+1],phonen_len);\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"号码: %s\r\n",phonen_name);\r
-            //  for(int i=0;i<phonen_len;i++)\r
-            // {\r
-            //       WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," %X ",phonen_name[i]);\r
-            // }\r
-            //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"r\n");\r
-\r
-            offset=offset+phonen_len+1;\r
-        }\r
-        for(int i=0;i<phone_num;i++)\r
-        {\r
-            uint8 add = data[offset];\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"归属地长度: %d\r\n",add);\r
-            memcpy(name,&data[offset+1],add);\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"归属地: %s\r\n",name);\r
-            offset=offset+add+1;\r
-            uint8 yun = data[offset];\r
-            memcpy(name,&data[offset+1],yun);\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"运营商: %s\r\n",name);\r
-            offset=offset+yun+1;\r
-        }\r
-       \r
-        num--;\r
-    }\r
-     \r
-}\r
-void SetAPPaddressbook(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
-    uint32_t tmp = 1;\r
-    value[0] =0x72;\r
-    value[1] =0x02;\r
-    value[2] =0x0b;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp,2);\r
-    \r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        addressbookToRead((char*)data);\r
-        //同步完就写一次\r
-        addressbookTowrite();\r
-        value[17] = 0x01;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else{\r
-        value[17] = 0x00;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-\r
-}\r
-\r
-//02 类型\r
-void type2AE4Data(ble_read_data *buffer_handle,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
-\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE4Data typeID:0x%04X\r\n",typeID);\r
-    switch (typeID) //ID\r
-    {\r
-        case USER_INFOR_CMD://app下发的获取用户信息\r
-            SetUserInfo(buffer_handle,typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SET_PHONE_INFOR_CMD://app下发的下发的手机信息\r
-            SetPhoneInfo(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SET_WATCH_AUXIL_FUN_PARAM_CMD://app下发快捷辅助功能参数\r
-            Set_auxil_fun_parm(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case CURR_TIME_CMD:\r
-            SetUTCtime(typeID,data,datalen,totalData,crcvalue);//获取时间app下发的时间进行解析\r
-            break;\r
-        case SET_BLE_NAME_CMD:\r
-            getPhoneInfo_test();\r
-            break;\r
-        case SET_TRAIN_TARGET_CMD://训练目标\r
-            SetTarinTarget(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SET_address_book_CMD:\r
-            SetAPPaddressbook(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SET_ALARM_DATA_CMD:\r
-            SetAlarmDataCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SET_OTHER_TARGET_CMD:\r
-            SetOtherTarget(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SET_PASSWORD_CMD:\r
-            SetpasswordCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SET_SEDENTARINESS_PARAM_CMD:\r
-            SetsedentarinessSetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SET_ANCS_MSG_FILTRATION_CMD:\r
-             SetmsgfiltrationCmd(typeID,data,datalen,totalData,crcvalue);\r
-             break;\r
-        case QUERY_DIAL_INSTALLED_PARAM_CMD:\r
-            query_dial_installed(buffer_handle,typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case DELETE_FILE_CMD:\r
-            App_delete_file(buffer_handle,typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SYN_BASIC_REAL_HEATR_CMD:\r
-            SYN_train_heart_datatCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SYN_TRAIN_DATA_CMD:\r
-            SYN_train_datatCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SYN_TRAIN_SPEED_CMD:\r
-            SYN_train_speed_datatCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        \r
-        case SYN_TODAY_BASIC_TRAIN_TXT_CMD:\r
-            break;\r
-        case SYN_WATCH_LCD_PARAM_CMD://app下发的同步屏幕参数到手表\r
-            GetWatchLcdParamCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SYN_VOICE_VIBRATION_PARAM_CMD://app下发声音与振动参数\r
-            GetVoiceVibrateParamCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SET_WATCH_HR_SET_PARAM_CMD://app下发设置心率参数\r
-            GetHrSetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SET_WATCH_SPO2_SET_PARAM_CMD:\r
-            GetSpo2SetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SET_DRINK_PARAM_CMD://app下发的喝水提醒设置\r
-            SetDrinkSetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SET_SLEEP_PARAM_CMD://app下发的喝水提醒设置\r
-            SetsleepSetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case SET_STEP_TARGET_CMD://app下发的步数目标设置\r
-            SetsteptargetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-            \r
-        case SET_WEATHER_DATA_CMD://app下发的天气数据\r
-            SetWeatherCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-         case SET_APP_AI_TXT_CMD://app下发的AI数据\r
-            SetAiResultCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        \r
-         case SYN_APP_GET_GPS_DATA_CMD://app获取GPS数据\r
-            GetGPSCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case APP_SEND_CHATGPT_KEY_CMD:\r
-            SaveChatGPTCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        case APP_SEND_AI_KEY_IS_AVAILABLE_CMD:\r
-            APP_reply_AI_is_ready(data,datalen);\r
-            break;\r
-         case SYN_APP_SCHEDULE_DATA_CMD:\r
-            APP_send_schedule_Cmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-         case APP_SEND_SOS_DATA_CMD:\r
-            APP_send_sos_Cmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\r
-        \r
-\r
-        default:\r
-            break;\r
-    }\r
-}\r
-\r
-void reply_app_send_switchDialCmd(bool flag)\r
-{\r
-    uint8_t data;\r
-    if(flag)\r
-    {\r
-        data=1;\r
-        ble_reply_cmdarr(0x0102,&data,1);\r
-    }\r
-    else\r
-    {\r
-        data=3;\r
-        ble_reply_cmdarr(0x0102,&data,1);\r
-    }\r
-}\r
-\r
-//切换表盘\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
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x02;\r
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    \r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        uint16_t daila_type = 0;\r
-        memcpy(&daila_type,&data[0],2);\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"switchDialCmd %d !!!!!!!!!!\r\n",daila_type,data,len);\r
-\r
-        ble_set_dial_by_id(daila_type);\r
-\r
-        // if(ble_get_dial_id()==daila_type)\r
-        // {\r
-        //     value[17] = 1;//切换成功\r
-        // }\r
-        // else\r
-        // {\r
-        //     value[17] = 3;//切换失败\r
-        // }\r
-        \r
-        // value[18] = Calculate_CRC(value,18);\r
-        // sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;//校验失败\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-\r
-//关于本机内容\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
-    uapi_get_fw_version(&_major,&_mid,&_minor);\r
-    cJSON *dataJSON = cJSON_CreateObject();\r
-    cJSON_AddNumberToObject(dataJSON,"code",1);\r
-    cJSON_AddNumberToObject(dataJSON,"major",_major);\r
-    cJSON_AddNumberToObject(dataJSON,"mid",_mid);\r
-    cJSON_AddNumberToObject(dataJSON,"minor",_minor);\r
-    unsigned char addr[6];\r
-    bluetooth_get_local_addr(&addr[0],6);\r
-    char mac_data[24];\r
-    memset(mac_data,0,24);\r
-    sprintf(mac_data,"%02X:%02X:%02X:%02X:%02X:%02X",addr[5],addr[4],addr[3],addr[2],addr[1],addr[0]);\r
-    cJSON_AddStringToObject(dataJSON, "macAddress",mac_data);\r
-\r
-    char *json_format = cJSON_PrintUnformatted(dataJSON);\r
-    cJSON_Delete(dataJSON);\r
-    uint32_t data_len = strlen(json_format);\r
-    uint8_t value[data_len+19];\r
-    memset(value,0,data_len+19);\r
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = (uint16_t)data_len;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x03;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&data_len,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        memcpy(value+17,(uint8_t *)json_format,data_len);//17+69 = 86\r
-        \r
-        value[data_len+17] = Calculate_CRC(value,data_len+17);//\r
-        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data_len:%d %x %d!!!!!\r\n",data_len,value[data_len+17],data_len+17);\r
-        sendBleData(value,data_len+18);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        uint8_t lrc = Calculate_CRC(value,18);\r
-        value[18] = lrc;\r
-        sendBleData(value,19);\r
-    }\r
-    cJSON_free(json_format);\r
-}\r
-//查找手表 01 04\r
-//设置查找手表的状态,1 校验成 2手表已找到,停止查找手表\r
-void setFindWatchFlag(uint8_t flag)\r
-{\r
-    uint8_t value[19];\r
-    memset(value,0,19);\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x04;\r
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    value[17] = flag;//校验标志\r
-    value[18] = Calculate_CRC(value,18);\r
-    sendBleData(value,19);\r
-}\r
-static void findWatchCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        uint8_t findFlag = data[0];\r
-        CustomEventPublish(TOPIC_EVENT_FIND_WATCH,&findFlag,sizeof(findFlag));//查找手表\r
-        setFindWatchFlag(1);\r
-    }else\r
-    {\r
-        setFindWatchFlag(0);\r
-    } \r
-}\r
-//获取sd卡剩余空间\r
-static void GetSDSpaceCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
-    uint8_t value[28];\r
-    memset(value,0,28);\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x05;\r
-    \r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        uint32_t tmp_ = 1;\r
-        uint32_t tmp = 9;\r
-        uint16_t tmp_data = 9;\r
-        memcpy(value+3,&tmp_,4);\r
-        memcpy(value+7,&tmp,4);\r
-        memcpy(value+11,&tmp_,4);\r
-        memcpy(value+15,&tmp_data,2);\r
-\r
-        uint8_t sdFlag = 1;\r
-\r
-        uint64_t free_size=0;\r
-        int i;\r
-        struct statfs file_buf = {0};\r
-#ifdef SINGLE_USER_PARTITION\r
-        static const char * const g_volume_names[1] = { "/user/"};\r
-        for (i = 0; i < 1; i++) {\r
-#else\r
-        static const char * const g_volume_names[4] = {"/system/", "/update/", "/music/", "/user/"};\r
-        \r
-        for (i = 0; i < 4; i++) {\r
-#endif\r
-            /* 获取文件系统状态 */\r
-            if (statfs(g_volume_names[i], &file_buf) != 0) {\r
-                return ;\r
-            }\r
-            if(strcmp("/user/",g_volume_names[i])==0)\r
-            {\r
-                free_size= ((uint64_t)(file_buf.f_bfree * file_buf.f_bsize));\r
-                //  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"free_size :%ld\r\n",free_size);\r
-                  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"free_size :%lu\r\n",free_size);\r
-            }\r
-        }\r
-        if(sdFlag == 1)// 1获取失败 2 获取成功 \r
-        {\r
-            value[17] = 1;//校验标志\r
-            memcpy_s(value+18,8,&free_size,8);\r
-\r
-            value[26] = Calculate_CRC(value,26);\r
-            sendBleData(value,27);\r
-        }else{\r
-            \r
-            uint32_t tmp = 1;\r
-            uint16_t tmp_data = 1;\r
-            memcpy(value+3,&tmp,4);\r
-            memcpy(value+7,&tmp,4);\r
-            memcpy(value+11,&tmp,4);\r
-            memcpy(value+15,&tmp_data,2);\r
-            value[17] = 2;//校验标志\r
-            value[18] = Calculate_CRC(value,18); \r
-            sendBleData(value,19);\r
-        }\r
-    }else\r
-    {\r
-\r
-        uint32_t tmp = 1;\r
-        uint16_t tmp_data = 1;\r
-        memcpy(value+3,&tmp,4);\r
-        memcpy(value+7,&tmp,4);\r
-        memcpy(value+11,&tmp,4);\r
-        memcpy(value+15,&tmp_data,2);\r
-\r
-        value[17] = 0;//校验标志\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    } \r
-}\r
-//获取当前数据\r
-void GetCurDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
-    // if(!Check_CRC(data,len,crcvalue))\r
-    // {\r
-    //     int data_len=0;\r
-    //     ble_data_type type_={0x01,0x06,data_len,1,1};\r
-    //     send_big_data(type_,NULL,0);\r
-    //     return;\r
-    // }\r
-    // cJSON *dataJSON = cJSON_CreateObject();\r
-    // const char *string_value[7]={"hr","spo2","steps","duration","standup","calories","distance"};\r
-    // for(uint8_t i = 0;i<7;i++)\r
-    // {\r
-    //     cJSON* data_arryJSON = cJSON_CreateObject();\r
-    //     if(data_arryJSON==NULL)\r
-    //     {\r
-    //         return;\r
-    //     }\r
-    //     uint32_t value=0;\r
-    //     if(i==0)\r
-    //     {\r
-    //         // value=ble_get_heart_data();\r
-    //     }\r
-    //     else if(i==1)\r
-    //     {\r
-    //         value=ble_get_oxygen_data();\r
-    //     }\r
-    //     else if(i==2)\r
-    //     {\r
-    //         // value=cywee_get_step_data();\r
-    //     }\r
-    //     else if(i==3)\r
-    //     {\r
-    //         value=cywee_get_fat_time_data();\r
-    //     }\r
-    //     else if(i==4)\r
-    //     {\r
-    //         value=1;\r
-    //     }\r
-    //     else if(i==5)\r
-    //     {\r
-    //         value=cywee_get_calories_data();\r
-    //     }\r
-    //     else if(i==6)\r
-    //     {\r
-    //         value=cywee_get_distance_data();\r
-    //     }\r
-\r
-\r
-    //     cJSON_AddNumberToObject(data_arryJSON,"value",value);\r
-    //     uint32_t creationTime;\r
-    //     int ret =uapi_get_timestampe_ss(&creationTime);\r
-    //     cJSON_AddNumberToObject(data_arryJSON,"time",creationTime);\r
-\r
-    //     cJSON_AddItemToObject(dataJSON,string_value[i],data_arryJSON);\r
-    // }\r
-    // cJSON *recJSON= ble_get_recs_data();\r
-    // cJSON_AddItemToObject(dataJSON,"recs",recJSON);\r
-    // char *json_format = cJSON_PrintUnformatted(dataJSON);\r
-       //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetCurDataCmd %d %s\n",strlen(json_format),json_format);\r
-    // cJSON_Delete(dataJSON);\r
-\r
-    // uint32_t data_len = strlen(json_format);\r
-    // uint32_t surplus_len=data_len;\r
-    // uint32_t pack;\r
-    // uint16_t pack_size=(ble_nus_max_data_len-18);\r
-    // if(pack_size>482)pack_size=482;\r
-\r
-    // if(data_len%pack_size==0)\r
-    // {\r
-    //     pack=data_len/pack_size;\r
-    // }\r
-    // else\r
-    // {   \r
-    //     pack=data_len/pack_size+1;\r
-    // }\r
-    // uint32_t pack_id=1;\r
-    // uint32_t offset=0;\r
-    // while (surplus_len!=0)\r
-    // {\r
-    //     if(surplus_len>=pack_size)\r
-    //     {\r
-    //         surplus_len=surplus_len-pack_size;\r
-\r
-\r
-    //         ble_data_type type_={0x01,0x06,data_len,pack,pack_id};\r
-    //         send_big_data(type_,json_format+offset,pack_size);\r
-\r
-    //         //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,0x06,1);\r
-    //         offset+=pack_size;\r
-    //     }\r
-    //     else\r
-    //     {\r
-            \r
-    //           WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
-    //          ble_data_type type_={0x01,0x06,data_len,pack,pack_id};\r
-    //         send_big_data(type_,json_format+offset,surplus_len);\r
-    //         //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,0x06,1);\r
-    //         break;\r
-    //     }\r
-    //     pack_id++;\r
-    // }\r
-    // cJSON_free(json_format);\r
-    \r
-}\r
-//获取当手表电池电量\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x07;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        float voltage = 0.0F;\r
-        uint8_t power = 0;\r
-        power = battery_get_voltage(&voltage);\r
-        value[17] = power;\r
-        value[18] = Calculate_CRC(value,18);\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-//设置开关//(弃)\r
-static void SetSwitchMessCmd(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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x08;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        uint8_t switch_on = data[0];//0 关闭 1 开启\r
-        if(switch_on)\r
-        {\r
-            //ble_ancs_client_cmd_setup_and_subscribe(g_ble_conn_id);\r
-        }\r
-        else\r
-        {\r
-            //ble_ancs_client_subscribe_notify(g_ble_conn_id,0);\r
-        }\r
-\r
-        value[17] = 1;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-//撤销当前文件传输 1 OTA 2MP3 3表盘 3天气 5闹钟\r
-static void RemoveFileCmd(ble_read_data *buffer_handle,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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x20;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        uint8_t file_type= data[0];//1 ota 2 MP3\r
-\r
-        // TRANSMIT_DATA=TRANS_FREE;\r
-        // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
-        value[17] = 1; //\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-\r
-        cancel_recv_file(0);\r
-\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-//获取指定类型文件目录\r
-static void GetFileTypeCmd(uint8_t *data,uint16_t len)\r
-{\r
-    uint8_t value[19];\r
-    memset(value,0,19);\r
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x21;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,1))\r
-    {\r
-        uint8_t fileType = data[17];//2 mp3 3 表盘\r
-\r
-        value[17] = 1; //1 操作成功 2 操作失败\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-//删除指定类型所有的文件\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x22;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        value[17] = 1; //1 操作成功 2 操作失败\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-//开启指定运动模式\r
-void reply_APP_OpenSportModeCmd(bool falg)\r
-{\r
-\r
-    ble_data_type type_={0x01,0x0A,1,1,1};\r
-    char data[1]={0};\r
-    if(falg)\r
-    data[0]=1;\r
-    else\r
-    data[0]=2;\r
-    send_big_data(type_,data,1);\r
-\r
-}\r
-\r
-\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x0A;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        training_ble_data.sportType= data[0];//运动类型 0 健走 1跑步 2骑行 3\r
-        training_ble_data.controlmd= START;\r
-          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"开启指定运动%d\r\n",data[0]);\r
-        CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
-\r
-        // value[17] = 1; //1 操作成功 2 操作失败\r
-        // value[18] = Calculate_CRC(value,18);\r
-        // sendBleData(value,19);\r
-    }\r
-    else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-void reply_APP_SportStopModeCmd(uint16_t time)\r
-{\r
-    char data[3]={0};\r
-    uint32_t data_len=3;\r
-    data[0]=1;\r
-    memcpy(&data[1],&time,2);\r
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time);\r
-    ble_data_type type={0x01,0x0B,data_len,1,1};\r
-    send_big_data(type,data,data_len);\r
-}\r
-//结束运动模式\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x0B;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-       \r
-        training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3\r
-        training_ble_data.controlmd= END;\r
-          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"结束运动\r\n");\r
-\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
-        // sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-//设置语言\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x0E;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        uint8_t language = data[0];\r
-        set_languaage(language);\r
-        value[17] = 1; //1 操作成功 2 操作失败\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-//开启/关闭获取实时训练数据\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x11;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        uint8_t autoSportData = data[0];//开关 1开启 0关闭\r
-         /*进行开启关闭操作*/\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进行开启关闭操作 %d\r\n", autoSportData);\r
-        set_traning_updata_auto( autoSportData);\r
-\r
-        value[17] = 1; //1 操作成功 2 操作失败\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-//设置训练数据采集频率\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x14;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        uint8_t Frequence = data[0];//频率单位是s\r
-        /*设置获取频率*/\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设置获取频率 %d\r\n", Frequence);\r
-        set_traning_updata_freq(Frequence);\r
-\r
-        value[17] = 1; //1 操作成功 2 操作失败\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-//获取实时训练数据\r
-// void getSportData(char *buf)\r
-// {\r
-//     cJSON *dataJSON = cJSON_CreateObject();\r
-//     cJSON_AddNumberToObject(dataJSON,"st",1637825067);\r
-//     cJSON_AddNumberToObject(dataJSON,"hr",120);\r
-//     cJSON_AddNumberToObject(dataJSON,"ca",3657);\r
-//     cJSON_AddNumberToObject(dataJSON,"di",5274);\r
-//     cJSON_AddNumberToObject(dataJSON,"stp",1234);\r
-//     cJSON_AddNumberToObject(dataJSON,"ti",3);\r
-//     char *json_format = cJSON_PrintUnformatted(dataJSON);\r
-//       WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s",json_format);\r
-//     cJSON_Delete(dataJSON);\r
-//     int dataLen = strlen(json_format);\r
-//     memcpy(buf,json_format,dataLen);\r
-//     return;\r
-// }\r
-void sendRealTimeDataToAPP(uint8_t flag)\r
-{\r
-    if(flag == 0)//校验失败\r
-    {\r
-        ble_data_type type_={0x01,0x0f,0,1,1};\r
-        send_big_data(type_,NULL,0);\r
-\r
-        //send_big_data(0,NULL,0,0,1,1,0x0f,1);\r
-\r
-    }else \r
-    {\r
-        training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3\r
-        training_ble_data.controlmd= SENDDATA;\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送运动实时数据\r\n");\r
-\r
-        CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
-        \r
-    }\r
-    \r
-}\r
-//获取实时训练数据\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(data,len,crcvalue))\r
-    {\r
-        sendRealTimeDataToAPP(1);\r
-    }else\r
-    {\r
-        sendRealTimeDataToAPP(0);\r
-    }\r
-}\r
-//设置最高心率提醒\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x15;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))//\r
-    {\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
-        //设置255  表示心率提醒关闭\r
-          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"设置最高心率提醒 %d\r\n",maxHr);\r
-        value[17] = 1;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-    \r
-}\r
-\r
-void reply_APP_SportPasueResetCmd(uint16_t time)\r
-{\r
-    char data[3]={0};\r
-    uint32_t data_len=3;\r
-    data[0]=1;\r
-    memcpy(&data[1],&time,2);\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time);\r
-    ble_data_type type={0x01,0x16,data_len,1,1};\r
-    send_big_data(type,data,data_len);\r
-}\r
-\r
-\r
-//训练暂停/恢复\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x16;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))//\r
-    {\r
-        uint8_t PauseStop = data[0];//0 暂停 1恢复\r
-        if(PauseStop==0)\r
-        {\r
-            training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3\r
-            training_ble_data.controlmd= STOP;\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"运动暂停\r\n");\r
-\r
-            CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
-        }\r
-        else\r
-        {\r
-            training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3\r
-            training_ble_data.controlmd= RECOVER;\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"运动恢复\r\n");\r
-\r
-            CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));\r
-\r
-        }\r
-        // value[17] = 1;\r
-        // value[18] = Calculate_CRC(value,18);\r
-        // sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-    \r
-}\r
-//发送当前表盘到app\r
-\r
-void Watch_SendDial_ToAppCmd(void)\r
-{\r
-  \r
-    uint16_t dialNum =ble_get_dial_id();\r
-    ble_data_type type_={0x01,0x17,2,1,1};\r
-    send_big_data(type_,(char *)&dialNum,2);\r
-}\r
-\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
-    uint32_t tmp = 1;\r
-    uint32_t datalen = 2;\r
-    uint16_t tmp_data = 2;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x17;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&datalen,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))//\r
-    {\r
-        uint16_t dialNum =ble_get_dial_id();\r
-        memcpy(&value[17],&dialNum,2);\r
-        value[19] = Calculate_CRC(value,19);\r
-        sendBleData(value,20);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-    \r
-}\r
-//获取手表当前状态\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x19;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-\r
-    //0空闲状态 9 usb状态 10 运动训练状态\r
-     uint8_t watchStatus = 0;\r
-     \r
-    if(uapi_dev_runtime_get_train_status())\r
-    watchStatus=10;\r
-   \r
-    value[17] = watchStatus;\r
-    value[18] = Calculate_CRC(value,18);\r
-    sendBleData(value,19);\r
-}\r
-//获取手表屏幕参数\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
-    uint32_t tmp = 1;\r
-    uint32_t datalen = 3;\r
-    uint16_t tmp_data = 3;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x1a;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&datalen,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-\r
-    int brigntess = get_brigthness();\r
-    int screen_time =get_ScreenDuration();\r
-       WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetScreenParamCmd get_ScreenDuration %d \r\n", screen_time);\r
-    switch (get_ScreenDuration()/1000)\r
-    {\r
-        case 5:\r
-            screen_time = 0;\r
-            break;\r
-        case 10:\r
-            screen_time = 1;\r
-            break;\r
-        case 15:\r
-            screen_time = 2;\r
-            break;\r
-        case 30:\r
-            screen_time = 3;\r
-            break;\r
-        case 60:\r
-            screen_time = 4;\r
-            break;\r
-        case 60*5:\r
-            screen_time = 5;\r
-            break;\r
-        default:\r
-            screen_time = 0;\r
-            break;\r
-    }\r
-    bool wrist_on = Get_RaiseToWake();\r
-    value[17] = brigntess;\r
-    value[18] = screen_time;\r
-    value[19] = wrist_on;\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetScreenParamCmd %d %d %d  \r\n",brigntess,screen_time,wrist_on);\r
-    value[20] = Calculate_CRC(value,20);\r
-    sendBleData(value,21);\r
-}\r
-\r
-//App删除表盘 (仅W4手表)\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x1b;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        uint16_t deleteDial = 0;//删除的表盘UID \r
-        deleteDial=data[0]+data[1]*256;\r
-        \r
-        if(ble_delete_dial(deleteDial))\r
-        value[17] = 1;// 1删除成功 2 没有改资源 0指令校验失败\r
-        else\r
-        value[17] = 2;// 1删除成功 2 没有改资源 0指令校验失败\r
-\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-      \r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-    \r
-    \r
-}\r
-\r
-//获取手表声音与振动参数 Sound and Vibration\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
-    uint32_t tmp = 1;\r
-    uint32_t datalen = 5;\r
-    uint16_t tmp_data = 5;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x1c;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&datalen,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-       \r
-        int sys_volume = Get_SystemVolume();\r
-        int ring_volume = Get_CallVolume();\r
-        int media_volume = Get_CallVolume();\r
-        uint8_t vibrate_on = get_vibrationremiander();\r
-\r
-        bool bell_on = get_SilentMode();\r
-\r
-        value[17] = sys_volume;// \r
-        value[18] = ring_volume;// \r
-        value[19] = media_volume;// \r
-        value[20] = bell_on;//\r
-        value[21] = vibrate_on;// \r
-        value[22] = Calculate_CRC(value,22);\r
-        sendBleData(value,23);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-    \r
-    \r
-}\r
-\r
-//APP获取手表辅助功能参数Auxiliary functions\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x1d;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        uint8_t paramCmt = 0;//辅助功能 0\r
-        paramCmt = get_quick_auxiliary_paramters();\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"paramCmt:%d\r\n",paramCmt);\r
-        value[17] = paramCmt;// \r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-    \r
-    \r
-}\r
-//APP获取手表心率设置\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
-    uint32_t tmp = 1;\r
-    uint32_t datalen = 4;\r
-    uint16_t tmp_data = 4;\r
-\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x1e;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&datalen,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        \r
-        msg_get_heart_set_param_info_t heart_param;\r
-        Get_heart_cmd(&heart_param);\r
-\r
-        value[17] = heart_param.frequence;//\r
-        value[18] = heart_param.remind_on;//\r
-        value[19] = heart_param.max_min;//\r
-        value[20] = heart_param.heart;// \r
-\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d ",value[17],value[18],value[19],value[20]);\r
-\r
-        value[21] = Calculate_CRC(value,21);\r
-        sendBleData(value,22);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-    \r
-    \r
-}\r
-//APP获取手表血氧设置\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
-    uint32_t tmp = 1;\r
-    uint32_t datalen = 3;\r
-    uint16_t tmp_data = 3;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x1f;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&datalen,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        msg_get_spo2_set_param_info_t SO2_param;\r
-        Get_oxygen_cmd(&SO2_param);\r
-\r
-        uint8_t spo2freq = SO2_param.frequence;//监测频率\r
-        uint8_t spo2Switch = SO2_param.remind_on;//心率提醒开关\r
-        uint8_t spo2MaxMin = SO2_param.spo2;//高于或低于\r
-\r
-        value[17] = spo2freq;//\r
-        value[18] = spo2Switch;//\r
-        value[19] = spo2MaxMin;// \r
-\r
-        value[20] = Calculate_CRC(value,20);\r
-        sendBleData(value,21);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-    \r
-    \r
-}\r
-void cameraSend(uint8_t flag)//2进行手势拍照 3退出拍照界面\r
-{\r
-    uint8_t value[19];\r
-    memset(value,0,19);\r
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x23;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    value[17] = flag;// \r
-    value[18] = Calculate_CRC(value,18);\r
-    sendBleData(value,19);\r
-}\r
-//手势拍照协议\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x23;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        uint8_t carmera_on = data[0]; //0退出拍照界面 1进入拍照界面\r
-        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进入拍照\r\n");\r
-        //需要加界面弹窗提示\r
-        if(carmera_on == 1)//进入拍照界面\r
-        {\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进入拍照\r\n");\r
-            CustomEventPublish(TOPIC_EVENT_ENTER_CMAERA,NULL,0);\r
-        }else{//退出拍照弹窗界面\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"退出拍照\r\n");\r
-            CustomEventPublish(TOPIC_EVENT_CANCEL_CMAERA,NULL,0);\r
-        }\r
-        value[17] = 1;// \r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-//APP获取手表喝水提醒设置\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x24;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(1)\r
-    {\r
-        msg_drink_info_t drink_on_;\r
-        ble_get_drink_remind(&drink_on_);\r
-        value[17] = drink_on_.drink_on;// \r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-//APP发送恢复出厂设置\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x25;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        value[17] = 1;// \r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-    if( value[17])\r
-    {\r
-        do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);\r
-    }\r
-}\r
-//APP发送重新启动\r
-static uint8_t power_buf[2]={0};\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x26;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        \r
-        value[17] = 1;// \r
-        value[18] = Calculate_CRC(value,18);\r
-        power_buf[0]=REBOOT;\r
-        CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,power_buf,2);\r
-        sendBleData(value,19);\r
-\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-//APP发送关机\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x27;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        \r
-        value[17] = 1;// \r
-        value[18] = Calculate_CRC(value,18);\r
-        power_buf[0]=SHUTDOWN;\r
-        CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,power_buf,2);\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-\r
-//app发送公英制单位\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
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x28;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        uint8_t kmileter = data[0];//公英制单位 0 是公英制 1英制单位\r
-        value[17] = 1;// \r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-//app获取久坐设置\r
-static void GetSedentParamCmd(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
-    uint32_t tmp = 1;\r
-    uint32_t datalen = 6;\r
-    uint16_t tmp_data =6;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x31;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&datalen,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(1)\r
-    {\r
-        msg_sedent_set_param_info_t data;\r
-        get_sedent_param( &data);\r
-\r
-        uint8_t on = data.sedent_on;//作息时间设定 0关闭 1开启 1\r
-        uint32_t time = data.sedent_time;//时间 4\r
-        uint8_t frequenc = data.frequenc;//间隔 1\r
-       \r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%04X %d %d\r\n",time,frequenc,on);\r
-        value[17] = on;\r
-        memcpy_s(&value[18],4,&time,4);\r
-        \r
-        value[22] = frequenc;\r
-        value[23] = Calculate_CRC(value,23);\r
-        sendBleData(value,24);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-\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
-    uint32_t tmp = 1;\r
-    uint32_t datalen = 6;\r
-    uint16_t tmp_data =6;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x29;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&datalen,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(1)\r
-    {\r
-        msg_get_sleep_param_info_t data;\r
-\r
-        ble_get_sleep_remind(&data);\r
-        uint8_t sleepTime = data.schedule;//作息时间设定 0关闭 1开启\r
-        uint8_t bedTimeHour = data.bedtime_hour;//就寝时间\r
-        uint8_t bedTimeMin = data.bedtime_min;//就寝时间\r
-        uint8_t wakeTimeHour = data.waketime_hour;//起床时间\r
-        uint8_t wakeTimeMin = data.waketime_min;//起床时间\r
-        uint8_t bedTimeOn = data.bedtime_alarm;//就寝前20分钟提醒时间\r
-\r
-        value[17] = sleepTime;\r
-        value[18] = bedTimeHour;\r
-        value[19] = bedTimeMin;\r
-        value[20] = wakeTimeHour;\r
-        value[21] = wakeTimeMin;\r
-        value[22] = bedTimeOn;\r
-        value[23] = Calculate_CRC(value,23);\r
-        sendBleData(value,24);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-//app获取所有表盘UID\r
-static void GetAllDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
-   \r
-\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        int dial_num=ble_get_dial_num();\r
-       \r
-        uint16_t data_size=1+dial_num*2;\r
-        uint32_t temp_data_size=data_size;\r
-        char *dail_uid_buf=(char *)ym_malloc(data_size);\r
-        dail_uid_buf[0]=(uint8_t)dial_num;\r
-\r
-        if(dial_num *2 !=get_all_dial_id(dail_uid_buf+1,dial_num*2))\r
-        {\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd  dial_num %d err\r\n",dial_num);\r
-        }\r
-        else\r
-        {\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd yes\r\n");\r
-\r
-        }\r
-        ble_data_type type_={0x01,0x2a,temp_data_size,1,1};\r
-        send_big_data(type_,dail_uid_buf,data_size);\r
-        //send_big_data(0,dail_uid_buf,data_size,temp_data_size,1,1,0x2a,1);\r
-\r
-        free(dail_uid_buf);\r
-        \r
-    }else\r
-    {\r
-        ble_reply_cmd(cmd,0);\r
-    }\r
-}\r
-//app获取目标步数设置\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
-    uint32_t tmp = 1;\r
-    uint32_t datalen = 7;\r
-    uint16_t tmp_data = 7;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x2b;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&datalen,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(1)\r
-    {\r
-        uint32_t targetStep = get_goal_stepcount();//目标步数 4字节\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"目标步数:%d\r\n",targetStep);\r
-\r
-        uint8_t ringOn = get_step_goal_notify_switch();//铃声提醒\r
-        uint8_t vibration = get_step_goal_notify_switch();//振动提醒\r
-        uint8_t notify = get_step_goal_notify_switch();//通知提醒\r
-\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"提醒开关:%d %d %d \r\n",ringOn,vibration,notify);\r
-\r
-        memcpy(&value[17],&targetStep,4);//目标步数\r
-\r
-        value[21] = ringOn;//铃声提醒\r
-        value[22] = vibration;//振动提醒\r
-        value[23] = notify;//通知提醒\r
-\r
-        value[24] = Calculate_CRC(value,24);\r
-        sendBleData(value,25);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-//app其他目标设置\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
-    uint32_t tmp = 1;\r
-    uint32_t datalen = 8;\r
-    uint16_t tmp_data = 8;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x2c;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&datalen,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(1)\r
-    {\r
-        uint16_t targetKcal = 0;//目标卡路里\r
-        uint8_t targetKm = 0;//目标里程\r
-        uint8_t targetstand = 0;//目标站立\r
-        uint8_t targetfat = 0;//目标燃脂时间\r
-        uint8_t ringTime = 0;//铃声提醒\r
-        uint8_t vibration = 0;//振动提醒\r
-        uint8_t notify = 0;//通知提醒\r
-\r
-        targetKcal = get_goal_caloriescount();\r
-        targetKm = get_goal_discount();\r
-        targetstand =get_goal_standupcount();\r
-        targetfat = get_goal_durationcount();\r
-\r
-        ringTime = get_other_goal_notify_switch ();\r
-        vibration = get_other_goal_notify_switch();\r
-        notify = get_other_goal_notify_switch();\r
-        \r
-        memcpy(&value[17],&targetKcal,2);//目标卡路里\r
-        value[19] = targetKm;//\r
-        value[20] = targetstand;//\r
-        value[21] = targetfat;//\r
-\r
-        value[22] = ringTime;//\r
-        value[23] = vibration;//\r
-        value[24] = notify;//通知提醒\r
-        value[25] = Calculate_CRC(value,25);\r
-        sendBleData(value,26);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-} \r
-\r
-static void GetPasswordCmd(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
-    uint32_t tmp = 1;\r
-    uint32_t datalen = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x2f;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&datalen,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(1)\r
-    {\r
-        uint8_t data=ble_get_password();\r
-        memcpy(&value[17],&data,1);//\r
-     \r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-static void GetmsgconfigCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
-    uint8_t value[36];\r
-    memset(value,0,36);\r
-    uint32_t tmp = 1;\r
-    uint32_t datalen = 18;\r
-    uint16_t tmp_data = 18;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x33;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&datalen,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(1)\r
-    {\r
-        uint8_t data_buf[filtration_data_count];\r
-        uint8_t  data_buf_len=0;\r
-        // memset(data,1,18);\r
-        filtration_on_get((uint8_t*)data_buf,&data_buf_len);\r
-        // printf("data_buf_len %d\r\n",data_buf_len);\r
-        memcpy(&value[17],data_buf,data_buf_len);//\r
-        value[17+data_buf_len] = Calculate_CRC(value,17+data_buf_len);\r
-        sendBleData(value,18+data_buf_len);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-\r
-\r
-\r
-bool get_AI_PATH_and_size(char *path,uint32_t *size)\r
-{\r
-\r
-    memcpy((void*)path,ble_get_ai_audio_path_str(),strlen(ble_get_ai_audio_path_str()));\r
-\r
-    FILE *fp= fopen(path,"r+");\r
-    if(fp)\r
-    {\r
-        fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾\r
-        *size = ftell(fp);       // 获取当前文件指针位置,即文件大小\r
-        fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头\r
-        fclose(fp);\r
-\r
-        return true;\r
-    }\r
-    else\r
-    {\r
-        return false;\r
-    }\r
-}\r
-#define SEND_AIVOICE_PACKAGE_DELAY 15\r
-//APP获取录音文件,录音文件上传\r
-static void GetAiRecordCmd(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
-    uint32_t tmp = 1;\r
-    uint32_t datalen = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x2f;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&datalen,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    char file_name[64]={0};\r
-    uint32_t file_size=0;\r
-    if(get_AI_PATH_and_size(file_name,&file_size))\r
-    {\r
-        int num=(ble_nus_max_data_len-18); \r
-        if(num>482)num=482;\r
-\r
-        char *data= (char *)malloc(num+1);\r
-        \r
-        uint16_t read_size=0;\r
-        FILE *fp=fopen(file_name,"rb+");\r
-        \r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetAiRecordCmd size %d\r\n",file_size);\r
-        uint32_t pack=file_size/num+1;\r
-        uint32_t pack_id=1;\r
-        if(fp==NULL)\r
-        {\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_name);\r
-            goto GetAiRecordFail;\r
-        }\r
-        do\r
-        {\r
-            memset_s(data,num+1,0,num+1);\r
-            read_size=fread(data,1,num,fp);\r
-\r
-            if(read_size!=0)\r
-            {\r
-                ble_data_type type_={0x01,0x34,file_size,pack,pack_id};\r
-                send_big_data(type_,data,read_size);\r
-            }\r
-            pack_id++;\r
-         \r
-\r
-        } while (read_size==num);\r
-        free(data);\r
-        fclose(fp);\r
-    }else\r
-    {\r
-        GetAiRecordFail:\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-static void GetSOSDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
-    uint32_t data_len=0;\r
-    uint8_t *bin_data = ble_get_sos_all_data_malloc(&data_len);\r
-    if(bin_data==NULL)\r
-    {\r
-        ble_data_type type_={0x01,0x36,0,1,1};\r
-        send_big_data(type_,NULL,0);\r
-        return;\r
-    }\r
-    uint32_t surplus_len=data_len;\r
-    uint32_t offset=0;\r
-\r
-    uint32_t pack;\r
-    uint16_t pack_size=(ble_nus_max_data_len-18);\r
-    if(pack_size>482)pack_size=482;\r
-\r
-    if(data_len%pack_size==0)\r
-    {\r
-        pack=data_len/pack_size;\r
-    }\r
-    else\r
-    {   \r
-        pack=data_len/pack_size+1;\r
-    }\r
-    uint32_t pack_id=1;\r
-    while (surplus_len!=0)\r
-    {\r
-        if(surplus_len>=pack_size)\r
-        {\r
-            surplus_len=surplus_len-pack_size;\r
-\r
-            ble_data_type type_={0x01,0x36,data_len,pack,pack_id};\r
-            send_big_data(type_,(char *)bin_data+offset,pack_size);\r
-            offset+=pack_size;\r
-        }\r
-        else\r
-        {\r
-            \r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
-            ble_data_type type_={0x01,0x36,data_len,pack,pack_id};\r
-            send_big_data(type_,(char *)bin_data+offset,surplus_len);\r
-            break;\r
-        }\r
-        pack_id++;\r
-    }\r
-    free(bin_data);\r
-    \r
-  \r
-}\r
-//AI录音已经就绪\r
-static void AiIsReadyCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
-\r
-    if(data[0])\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AiIsReadyCmd succ\r\n");  \r
-    }else\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AiIsReadyCmd fail\r\n");  \r
-    }\r
-}\r
-//app发送解除配对消息\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
-    uint32_t tmp = 1;\r
-    uint32_t datalen = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x2d;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&datalen,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        \r
-        value[17] = 1;//\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-uint8_t is_connect_synchronization_time=0;\r
-\r
-//app发送同步数据结束消息\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
-    uint32_t tmp = 1;\r
-    uint32_t datalen = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x2e;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&datalen,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        value[17] = 1;//\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-        uapi_save_runtime_log(RUNTIME_LOG_BLE_APP_SYN_END);\r
-\r
-        if(is_connect_synchronization_time)\r
-        {\r
-            watch_synchronization_time();\r
-        }\r
-        else\r
-        {\r
-            if(g_ble_conn_id)\r
-            {\r
-                is_connect_synchronization_time=1;\r
-            }\r
-            \r
-        }\r
-        \r
-\r
-\r
-        uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);\r
-\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-//同步基础训练历史数据 training history data\r
-static void Send_json_Data_Cmd(uint8_t day,uint16_t pack_size,uint8_t id)\r
-{\r
-\r
-    \r
-        char *json_format = NULL;\r
-        switch (id)\r
-        {\r
-            case 0x49:\r
-                json_format=struct_to_json_buf_malloc_(day);\r
-                break;\r
-            case 0x01:\r
-                json_format=struct_to_json_buf_malloc_Alarm();\r
-                break;\r
-            case 0x21:\r
-                json_format=dir_to_json_buf_malloc(day);\r
-                break;\r
-\r
-            default:\r
-                break;\r
-        }\r
-       \r
-        if(json_format == NULL) return ;\r
-\r
-        uint32_t data_len = strlen(json_format);\r
-        uint32_t surplus_len=data_len;\r
-        uint32_t pack;\r
-        if(data_len%pack_size==0)\r
-        {\r
-            pack=data_len/pack_size;\r
-        }\r
-        else\r
-        {   \r
-            pack=data_len/pack_size+1;\r
-        }\r
-        uint32_t pack_id=1;\r
-        uint32_t offset=0;\r
-        while (surplus_len!=0)\r
-        {\r
-           if(surplus_len>=pack_size)\r
-           {\r
-                surplus_len=surplus_len-pack_size;\r
-\r
-                ble_data_type type_={0x01,id,data_len,pack,pack_id};\r
-                send_big_data(type_,json_format+offset,pack_size);\r
-\r
-                //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,id,1);\r
-                offset+=pack_size;\r
-           }\r
-           else\r
-           {\r
-                \r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
-                ble_data_type type_={0x01,id,data_len,pack,pack_id};\r
-                send_big_data(type_,json_format+offset,surplus_len);\r
-                //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,id,1);\r
-                break;\r
-           }\r
-           pack_id++;\r
-        }\r
-        cJSON_free(json_format);\r
-}\r
-\r
-//同步数据结束完成\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
-    uint32_t tmp = 1;\r
-    uint32_t tmpToall = 0;\r
-    uint16_t tmp_data = 0;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x2e;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmpToall,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        value[17] = 1;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-\r
-        uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);\r
-\r
-    }else\r
-    {\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-\r
-\r
-\r
-//01类型 \r
-/*\r
-cmd: 指令uint16_t 协议01 02 拼接成0x0102 去协议文档对应是切换表盘\r
-*data:数据,不包含前面17个字节的包头和最后一位的校验和\r
-len 就是data的长度\r
-*totaldata:总的数据内容 包含包头和校验预览做接口是用  如果要计算totaldata的长度直接是len+17+1 就是加上包头和校验和\r
-crcvalue;数据的校验和 不包含包头和校验和的计算结果\r
-*/\r
-// 73 01 31 01 00 00 00 01 00 00 00 01 00 00 00 00 00 2 FE\r
-void SetDMPModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置入库模式 0关闭 1电信 2-255移动\r
-{\r
-    uint8_t value[19];\r
-    memset(value,0,19);\r
-    uint32_t tmp = 1;\r
-    value[0] =0x72;\r
-    value[1] =0x01;\r
-    value[2] =0x31;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp,2);\r
-    \r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        \r
-        int state = 0;\r
-        state = data[0];\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data[0];%d state:%d\r\n",data[0],state);\r
-        Set_DmpChangeMode(state);\r
-        value[17] = 1;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else{\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-// 73 01 32 01 00 00 00 00 00 00 00 01 00 00 00 00 00 crc\r
-\r
-void GetDMPModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取入库模式 0关闭 1电信 2-255移动\r
-{\r
-    uint8_t value[19];\r
-    memset(value,0,19);\r
-    uint32_t tmp = 1;\r
-    value[0] =0x72;\r
-    value[1] =0x01;\r
-    value[2] =0x32;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp,2);\r
-    \r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        int state = Get_DmpChangeMode();\r
-        value[17] = state;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else{\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-void type2AE3Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
-    uint16_t cmd = cmd_buf[1]*256+cmd_buf[2];\r
-     #ifdef BLE_LOG\r
-    \r
-    #endif\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE3Data:0x%04X\r\n",cmd);\r
-    // uint8_t typeID = cmd_buf[2];\r
-    switch (cmd)\r
-    {\r
-        case SEND_UPPAIR_CMD://清除配对指令\r
-            clearPaireCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case SWITCH_DIAL_CMD://表盘切换\r
-            switchDialCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case ABOUT_DEV_CMD://关于本机内容\r
-            aboutDeviceCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case FIND_WATCH_CMD://查找手表\r
-            findWatchCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_SD_SPACE_CMD://获取sdk的剩余空间\r
-            GetSDSpaceCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_CURR_DATA_CMD://获取当前数据 卡路里 \r
-            GetCurDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_BATTERY_LEVEL_CMD://获取手表电池电量 \r
-            GetBatteryLevelCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case SWITCH_MESS_CMD://开关消息推送功能 \r
-            SetSwitchMessCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case REVOKE_CURR_FILE_TRANS_CMD://撤销文件传输\r
-            RemoveFileCmd(buffer_handle,cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case DELETE_SPECIF_TYPE_FILE_CMD://删除指定类型的所有文件\r
-            DeleteFileTypeCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case SWITCH_SPORT_MODE_CMD://开启指定运动模式\r
-            OpenSportModeCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case STOP_SPORT_MODE_CMD://结束运动模式\r
-            StopSportModeCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case SET_LANGUGAE_CMD://设置语言\r
-            SetLanguageCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_REAL_HEART_CMD://获取实时训练数据\r
-            GetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case SWITCH_GET_REAL_HEART_CMD://开启/关闭自动获取实时训练数据\r
-            SetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case SET_REAL_DATA_FREQ_CMD://设置训练实时数据采集频率\r
-            SetRTDataFreCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-\r
-        case SET_MAX_HR_REMID_CMD://设置最高心疼提醒 255关闭\r
-            SetMaxHrRemindCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case SPORT_PAUSE_RESET_CMD://训练暂停/恢复\r
-            GetSportPasueResetCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case SEND_CURR_DIAL_TOAPP_CMD://发送当前表盘\r
-            SendDialToAppCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case SEND_CURR_STATUS_CMD: //获取手表当前状态\r
-            GetWatchStatusCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_WATCH_LCD_PARAM_CMD: //获取手表屏幕参数\r
-            GetScreenParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case DELETE_DIAL_CMD://删除表盘UID\r
-            DeleteDialUidCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_WATCH_VOICE_VIBRATE_CMD://获取手表声音与振动参数\r
-            GetSoundVibrationCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_WATCH_AUXIL_FUN_PARAM_CMD://获取手表辅助功能参数                                                                                                     \r
-            GetWatchAuxFuncCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_WATCH_HR_SET_PARAM_CMD://获取手表心率设置\r
-            GetHrGetParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_WATCH_SPO2_SET_PARAM_CMD://获取手表血氧设置\r
-            GetSpo2GetParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_GESTURE_CARMERA_CMD://获取手势拍照\r
-            carmeraCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_DRINK_SWITCH_CMD://获取喝水提醒设置\r
-            GetDrinkParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case FACTORY_SET_CMD://app发送恢复出厂设置\r
-            GetFactoryCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case RESET_WATCH_CMD://app发送重启指令\r
-            GetResetCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case POWER_OFF_CMD://app发送关机\r
-            GetPowerOffCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case KM_MILE_CMD://app设置手表公英制单位\r
-            GetMetricCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case SLEEP_GET_CMD://app获取睡眠设置\r
-            GetSleepParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_SEDENT_CMD:\r
-            GetSedentParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case DELETE_ALL_DILA_CMD://app所有表盘UID\r
-            GetAllDialUidCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_TARGET_STEP_CMD://app获取目标步数设置\r
-            GetTargetStepCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_OTHER_TARGET_CMD://app获取其他目标\r
-            GetTargetOtherCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_UNPAIR_CMD://发送解除配对消息\r
-            UnpairMessCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case SYN_DATA_END_CMD: //app发送同步数据结束消息\r
-            GetSynDataEndCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_PASSWORD_CMD: //获取手表密码\r
-            GetPasswordCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case SYN_GET_MSG_CONFIG_CMD: //获取手表消息设置\r
-            GetmsgconfigCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-            \r
-        case APP_GET_AI_PCM_DATA_CMD:\r
-            GetAiRecordCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case APP_GET_SOS_DATA_CMD:\r
-            GetSOSDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        \r
-        case GET_SPECIF_TYPE_FILE_CMD://获取指定类型文件目录 \r
-        case AI_IS_READ_DATA_CMD:\r
-        case SYN_HEART_HISTORY_DATA_CMD://同步心率历史数据\r
-        case SYN_SPO2_HISTORY_DATA_CMD://同步血氧历史数据\r
-        case SYN_STEP_HISTORY_DATA_CMD: //同步步数历史数据\r
-        case SYN_FAT_BURN_HISTORY_DATA_CMD://同步燃脂时间数据\r
-        case SYN_STAND_HISTORY_DATA_CMD://同步站立历史数据\r
-        case SYN_KCAL_HISTORY_DATA_CMD://同步卡路里历史数据\r
-        case SYN_DIS_HISTORY_DATA_CMD://同步距离历史数据\r
-        case SYN_BASIC_TRANIN_HISTORY_DATA_CMD://同步基础训练历史数据\r
-        case SYN_SLEEP_HISTORY_DATA_CMD://睡眠历史数据\r
-        case ALARM_CMD://获取手表闹钟//同步闹钟\r
-\r
-            readDevDataBle(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case SET_DMP_MODE_CMD://0X0131\r
-            SetDMPModeCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        case GET_DMP_MODE_CMD://0X0132\r
-            GetDMPModeCmd(cmd,data,datalen,totaldata,crcvalue);\r
-            break;\r
-        default:\r
-            break;\r
-    }\r
-\r
-\r
-}\r
-\r
-\r
-//05 类型\r
-void typeHexFiveData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen)\r
-{\r
-    uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];\r
-    switch (typeID) //ID\r
-    {\r
-        case FIND_PHONE_CMD://查找手机\r
-            // (data,datalen);\r
-            break;\r
-        case GET_CURR_TIME_CMD://手表获取系统时间\r
-            // getPhoneInfo(data,datalen);\r
-            break;\r
-        case SEND_PARI_SUCESS_CMD:\r
-            // GetUTCtime(data,datalen);//获取时间app下发的时间进行解析\r
-            break;\r
-        case GET_TRANS_END_CMD:\r
-            // getPhoneInfo_test();\r
-            break;\r
-        case SEND_FACTORY_RECORD_CMD:\r
-            break;\r
-        case REQUEST_EPO_FILE_CMD:\r
-            break;\r
-        case SEND_TRAIN_STATUS_CMD:\r
-            break;\r
-        default:\r
-            break;\r
-    }\r
-}\r
-\r
-\r
-#define STEP_DATA_LEN 8\r
-#define KCAL_DATA_LEN 8\r
-#define DIS_DATA_LEN 8\r
-#define STAND_DATA_LEN 8\r
-#define FATTIME_DATA_LEN 6\r
-#define HEART_DATA_LEN 5\r
-#define SPO2_DATA_LEN 5\r
-uint8_t bleSendTypeID=0;      //发送的数据类型\r
-//发送读出来的设备数据to APP\r
-uint16_t max_mtu_szie_data_len = 200;\r
-uint32_t EACH_DATA_LEN=0;//每种数据类型的的长度\r
-\r
-\r
-void Send_Sleep_Bin_Data(uint8_t day, uint16_t num)\r
-{\r
-   \r
-    char *data=NULL;\r
-    uint32_t file_size=1;\r
-    uint8_t sleep_count = ble_get_sleep_data_dir(&file_size,day);\r
-\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Send_Sleep_Bin_Data file_size : %d \r\n",file_size);\r
-\r
-    data=(char *)malloc(file_size);\r
-\r
-    if(data==NULL)\r
-    {\r
-        return;\r
-    }\r
-\r
-    memset(data,0,file_size);\r
-\r
-    data[0]=sleep_count;\r
-\r
-    if(data==NULL)\r
-    {\r
-        #ifdef BLE_LOG\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"malloc\r\n");\r
-        #endif\r
-\r
-        return;\r
-    }\r
-    ble_get_sleep_data(file_size,day,(uint8_t*)data+1);\r
-\r
-\r
-    if(data==NULL || file_size==1)\r
-    {\r
-        ble_data_type type_={0x01,0x4b,0,1,1};\r
-        send_big_data(type_,NULL,0);\r
-        //send_big_data(1,NULL,0,0,1,1,0x4b,1);\r
-        return;\r
-    }\r
-    \r
-    uint32_t surplus_len=file_size;\r
-    uint32_t pack;\r
-    if(file_size%num==0)\r
-    {\r
-        pack=file_size/num;\r
-    }\r
-    else\r
-    {   \r
-        pack=file_size/num+1;\r
-    }\r
-        //  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
-    uint32_t pack_id=1;\r
-    uint32_t offset=0;\r
-    while (surplus_len!=0)\r
-    {\r
-        if(surplus_len>=num)\r
-        {\r
-            surplus_len=surplus_len-num;\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",num,file_size,pack_id,pack);\r
-\r
-            ble_data_type type_={0x01,0x4b,file_size,pack,pack_id};\r
-            send_big_data(type_,data+offset,num);\r
-            offset+=num;\r
-        }\r
-        else\r
-        {\r
-            //#ifdef BLE_LOG\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",surplus_len,file_size,pack_id,pack);\r
-            //#endif\r
-            ble_data_type type_={0x01,0x4b,file_size,pack,pack_id};\r
-            send_big_data(type_,data+offset,surplus_len);\r
-               WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始\r\n");\r
-            for(int i=0;i<surplus_len;i++)\r
-            {\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%02X ",(uint8_t)data[i]);\r
-            }\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"结束\r\n");\r
-            break;\r
-        }\r
-        pack_id++;\r
-    }\r
-    free(data);\r
-    \r
-}\r
-\r
-\r
-bool Read_Health_BIN_file_buf_send_bin_Data(uint8_t day, uint16_t num,uint16_t id)\r
-{\r
-   \r
-    // send_big_data(1,NULL,0,0,1,1,id,1);\r
-    // return;\r
-    char *buf=NULL;\r
-    char path[128]={0};\r
-    switch (id)\r
-    {\r
-        case 0x40://同步心率历史数据\r
-            get_health_HEART_data_path(path,day,128);\r
-            break;\r
-        case 0x41://同步血氧历史数据\r
-            get_health_OXYGEN_data_path(path,day,128);\r
-            break;\r
-    }\r
-    uint32_t file_size=0;\r
-    FILE *fp= fopen(path,"r+");\r
-    if(fp==NULL)\r
-    {\r
-          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);\r
-        return false;\r
-    }\r
-    fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾\r
-    file_size = ftell(fp);       // 获取当前文件指针位置,即文件大小\r
-    fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头\r
-\r
-    int num_check=file_size%5;\r
-    if(num_check!=0)\r
-    {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "数据有误 %d %d \r\n", file_size, num);\r
-        fclose(fp);\r
-        return false;\r
-    }\r
-    \r
-    buf = (char *)ym_malloc(sizeof(char)*num+1);\r
-    if(buf==NULL){fclose(fp); return false;}\r
-\r
-    uint32_t pack=1;\r
-    if(file_size%num==0)\r
-    pack=file_size/num;\r
-    else\r
-    pack=file_size/num+1;\r
-    uint32_t pack_id=1;\r
-    uint32_t read_size=0;\r
-    do\r
-    {\r
-        memset_s(buf,num+1,0,num+1);\r
-        read_size=fread(buf,1,num,fp);\r
-        if(read_size!=0)\r
-        {\r
-            ble_data_type type_={0x01,id,file_size,pack,pack_id};\r
-            send_big_data(type_, buf, read_size);\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"%d %d %d %d %d\r\n",read_size,file_size,pack_id,pack);\r
-        }\r
-        \r
-\r
-        //send_big_data(1,buf,read_size,file_size,pack_id,pack,id,1);\r
-        pack_id++;\r
-    } while (read_size==num);\r
-\r
-    fclose(fp);\r
-    free(buf);\r
-    return true;\r
-}\r
-\r
-void Read_BIN_file_buf_send_bin_Data(uint8_t day,uint32_t pack_size,uint16_t id)\r
-{\r
-\r
-    const char *data=NULL;\r
-    uint32_t data_len = 0;\r
-   \r
-    data=ble_sywee_history(day,&data_len,id);\r
-\r
-    if(data==NULL)\r
-    {\r
-        ble_data_type type_={0x01,id,0,1,1};\r
-        send_big_data(type_,NULL,0);\r
-\r
-        //send_big_data(1,NULL,0,0,1,1,id,1);\r
-        return;\r
-    }\r
-    uint8_t single_data=8;\r
-    if(id==0x44)\r
-    {\r
-        single_data=6;\r
-    }\r
-    else if (id==0x45)\r
-    {\r
-        single_data=4;\r
-    }\r
-    int check_num=data_len%single_data;\r
-    if(check_num!=0)\r
-    {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",id);\r
-        free(data);\r
-        ble_data_type type_={0x01,id,0,1,1};\r
-        send_big_data(type_,NULL,0);\r
-\r
-        return ;\r
-    }\r
-\r
-    uint32_t surplus_len=data_len;\r
-    uint32_t pack;\r
-    if(data_len%pack_size==0)\r
-    {\r
-        pack=data_len/pack_size;\r
-    }\r
-    else\r
-    {   \r
-        pack=data_len/pack_size+1;\r
-    }\r
-        //  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
-    uint32_t pack_id=1;\r
-    uint32_t offset=0;\r
-    while (surplus_len!=0)\r
-    {\r
-        if(surplus_len>=pack_size)\r
-        {\r
-            surplus_len=surplus_len-pack_size;\r
-            ble_data_type type_={0x01,id,data_len,pack,pack_id};\r
-            send_big_data(type_,data+offset,pack_size);\r
-            //send_big_data(1,data+offset,pack_size,data_len,pack_id,pack,id,1);\r
-            offset+=pack_size;\r
-        }\r
-        else\r
-        {\r
-            #ifdef BLE_LOG\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);\r
-            #endif\r
-\r
-            ble_data_type type_={0x01,id,data_len,pack,pack_id};\r
-            send_big_data(type_,data+offset,surplus_len);\r
-\r
-            //send_big_data(1,data+offset,surplus_len,data_len,pack_id,pack,id,1);\r
-            break;\r
-        }\r
-        pack_id++;\r
-    }\r
-    free(data);\r
-    \r
-}\r
-\r
-//手机app下发读设备数据指令\r
-void readDevDataBle(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)\r
-{\r
-   \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
-\r
-    memcpy(sendBuf+15,&pack_datalen,2);//分包数据长度\r
-\r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        bleSendTypeID=cmd-((cmd/256)*256);\r
-        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"同步第%d天的数据\r\n",data[0]);\r
-        int num;\r
-\r
-        switch (bleSendTypeID)\r
-        {\r
-            case 0x40://同步心率历史数据\r
-                if(uapi_dev_runtime_get_heartrate_storage_status())\r
-                {\r
-                    ble_reply_cmdarr(SYN_HEART_HISTORY_DATA_CMD,NULL,0);\r
-                    return;\r
-                }\r
-\r
-                num=(ble_nus_max_data_len-18);\r
-                if(num>482)num=482;\r
-                #ifdef BLE_LOG\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"同步心率数据,每包最多:%d 数据 data:%d %d\r\n",num,data[0],len);\r
-                #endif\r
-                uapi_dev_runtime_set_heartrate_storage_status(1);\r
-                if(!Read_Health_BIN_file_buf_send_bin_Data(data[0],num,0x40))\r
-                {\r
-                    ble_data_type type_={0x01,0x40,0,1,1};\r
-                    send_big_data(type_,NULL,0);\r
-                }\r
-                uapi_dev_runtime_set_heartrate_storage_status(0);\r
-                //send_big_data(1,NULL,0,0,1,1,0x40,1);\r
-\r
-                break;\r
-            case 0x41://同步血氧历史数据\r
-                if(uapi_dev_runtime_get_bloodoxygen_storage_status())\r
-                {\r
-                    ble_reply_cmdarr(SYN_SPO2_HISTORY_DATA_CMD,NULL,0);\r
-                    return;\r
-                }\r
-\r
-\r
-                num=(ble_nus_max_data_len-18);\r
-                if(num>482)num=482;\r
-                 uapi_dev_runtime_set_bloodoxygen_storage_status(1);\r
-                if(!Read_Health_BIN_file_buf_send_bin_Data(data[0],num,0x41))\r
-                {\r
-                    ble_data_type type_={0x01,0x41,0,1,1};\r
-                    send_big_data(type_,NULL,0);\r
-                }\r
-                 uapi_dev_runtime_set_bloodoxygen_storage_status(0);\r
-\r
-                break;\r
-            case 0x43: //同步步数历史数据\r
-\r
-                if(uapi_dev_runtime_get_goal_storage_status())\r
-                {\r
-                    ble_reply_cmdarr(SYN_STEP_HISTORY_DATA_CMD,NULL,0);\r
-                    return;\r
-                }\r
-            \r
-                num=(ble_nus_max_data_len-18);\r
-                if(num>482)num=482;\r
-                 uapi_dev_runtime_set_goal_storage_status(1);\r
-                 Read_BIN_file_buf_send_bin_Data(data[0],num,0x43);\r
-                  uapi_dev_runtime_set_goal_storage_status(0);\r
-\r
-                break;\r
-            case 0x44://同步燃脂时间数据\r
-\r
-                if(uapi_dev_runtime_get_goal_storage_status())\r
-                {\r
-                    ble_reply_cmdarr(SYN_FAT_BURN_HISTORY_DATA_CMD,NULL,0);\r
-                    return;\r
-                }\r
-\r
-                num=(ble_nus_max_data_len-18);\r
-                if(num>482)num=482;\r
-                 uapi_dev_runtime_set_goal_storage_status(1);\r
-                 Read_BIN_file_buf_send_bin_Data(data[0],num,0x44);\r
-                  uapi_dev_runtime_set_goal_storage_status(0);\r
-                break;\r
-            case 0x45://同步站立历史数据\r
-\r
-                if(uapi_dev_runtime_get_goal_storage_status())\r
-                {\r
-                    ble_reply_cmdarr(SYN_STAND_HISTORY_DATA_CMD,NULL,0);\r
-                    return;\r
-                }\r
-\r
-\r
-                num=(ble_nus_max_data_len-18);\r
-                if(num>482)\r
-                {\r
-                    num=482;\r
-                }\r
-                 uapi_dev_runtime_set_goal_storage_status(1);\r
-                 Read_BIN_file_buf_send_bin_Data(data[0],num,0x45);\r
-                  uapi_dev_runtime_set_goal_storage_status(0);\r
-\r
-                break;\r
-            case 0x46://同步卡路里历史数据\r
-                 if(uapi_dev_runtime_get_goal_storage_status())\r
-                {\r
-                    ble_reply_cmdarr(SYN_KCAL_HISTORY_DATA_CMD,NULL,0);\r
-                    return;\r
-                }\r
-\r
-                num=(ble_nus_max_data_len-18);\r
-                if(num>482)\r
-                {\r
-                    num=482;\r
-                }\r
-                 uapi_dev_runtime_set_goal_storage_status(1);\r
-                Read_BIN_file_buf_send_bin_Data(data[0],num,0x46);\r
-                 uapi_dev_runtime_set_goal_storage_status(0);\r
-                break;\r
-            case 0x47://同步距离历史数据\r
-\r
-                if(uapi_dev_runtime_get_goal_storage_status())\r
-                {\r
-                    ble_reply_cmdarr(SYN_DIS_HISTORY_DATA_CMD,NULL,0);\r
-                    return;\r
-                }\r
-\r
-                 num=(ble_nus_max_data_len-18);\r
-                if(num>482)\r
-                {\r
-                    num=482;\r
-                }\r
-                 uapi_dev_runtime_set_goal_storage_status(1);\r
-                Read_BIN_file_buf_send_bin_Data(data[0],num,0x47);\r
-                 uapi_dev_runtime_set_goal_storage_status(0);\r
-                break;\r
-            case 0x49://同步基础训练历史数据\r
-\r
-                if(uapi_dev_runtime_get_train_storage_status())\r
-                {\r
-                    ble_reply_cmdarr(SYN_BASIC_TRANIN_HISTORY_DATA_CMD,NULL,0);\r
-                    return;\r
-                }\r
-\r
-                EACH_DATA_LEN = DIS_DATA_LEN;\r
-                num=(ble_nus_max_data_len-18);\r
-                if(num>482)\r
-                {\r
-                    num=482;\r
-                }\r
-                 uapi_dev_runtime_set_train_storage_status(1);\r
-                Send_json_Data_Cmd(data[0],num,0x49);\r
-                 uapi_dev_runtime_set_train_storage_status(0);\r
-                break;\r
-            case 0x01://同步闹钟\r
-                EACH_DATA_LEN = DIS_DATA_LEN;\r
-                num=(ble_nus_max_data_len-18);\r
-                if(num>482)\r
-                {\r
-                    num=482;\r
-                }\r
-                Send_json_Data_Cmd(data[0],num,0x01);\r
-                break;\r
-            case 0x4b://睡眠历史数据\r
-\r
-                if(uapi_dev_runtime_get_sleep_storage_status())\r
-                {\r
-                    ble_reply_cmdarr(SYN_SLEEP_HISTORY_DATA_CMD,NULL,0);\r
-                    return;\r
-                }\r
-\r
-                EACH_DATA_LEN = DIS_DATA_LEN;\r
-                num=(ble_nus_max_data_len-18);\r
-                if(num>482)num=482;\r
-                 uapi_dev_runtime_set_sleep_storage_status(1);\r
-                Send_Sleep_Bin_Data(data[0],num);\r
-                 uapi_dev_runtime_set_sleep_storage_status(0);\r
-                break;\r
-            case 0x21://文件目录\r
-                EACH_DATA_LEN = DIS_DATA_LEN;\r
-                num=(ble_nus_max_data_len-18);\r
-                if(num>482)\r
-                {\r
-                    num=482;\r
-                }\r
-                Send_json_Data_Cmd(data[0],num,0x21);\r
-                break;\r
-\r
-            default:\r
-                break;\r
-        }\r
-        //sendReadData();\r
-    }else{\r
-        sendBuf[18] = 0;\r
-        sendBleData(sendBuf,19);\r
-    }\r
-}\r
-\r
-\r
-\r
-\r
-void getPhoneInfo_test(void)\r
-{\r
-    /*\r
-    cJSON *dataJSON = cJSON_CreateObject();\r
-    cJSON* data_arryJSON = cJSON_CreateArray();\r
-    cJSON_AddNumberToObject(dataJSON,"code",1);\r
-    \r
-    for(uint8_t i =0;i<3;i++)\r
-    {\r
-        cJSON* itemJSON = cJSON_CreateObject();\r
-        cJSON* arrayJSON = cJSON_CreateArray();\r
-        for(uint8_t id = 0;id<7;id++)\r
-        {\r
-            cJSON_AddNumberToObject(arrayJSON,"id",id);\r
-        }\r
-        \r
-        cJSON_AddNumberToObject(itemJSON,"id",i);\r
-        cJSON_AddItemToObject(itemJSON,"repeat",arrayJSON);\r
-        cJSON_AddNumberToObject(itemJSON,"hour",2+20*i);\r
-        cJSON_AddNumberToObject(itemJSON,"minute",30+i*0);\r
-        cJSON_AddNumberToObject(itemJSON,"enable",1);\r
-        cJSON_AddItemReferenceToArray(data_arryJSON,itemJSON);\r
-    }\r
-    cJSON_AddItemToObject(dataJSON,"alarm",data_arryJSON);\r
-\r
-    char *json_format = cJSON_PrintUnformatted(dataJSON);\r
-         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d\n",strlen(json_format));\r
-    cJSON_Delete(dataJSON);\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\n",json_format);\r
-    uint32_t data_len = strlen(json_format);\r
-    uint8_t value[data_len+18];\r
-    uint32_t tmp = 1;\r
-    uint16_t tmp_data = 1;\r
-    value[0] = 0x72;\r
-    value[1] = 0x01;\r
-    value[2] = 0x01;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp_data,2);\r
-    memcpy(value+17,(uint8_t *)json_format,data_len);\r
-    unsigned char  lrc = Calculate_CRC(value,data_len+17);\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"lrc:%d",lrc);\r
-    value[data_len+18] = lrc;\r
-    sendBleData(value,data_len+18);\r
-    */\r
-\r
-    // uint8_t value[128];\r
-    // memset(value,0,128);\r
-    \r
-    // value[0] = 0x72;\r
-    // value[1] = 0x01;\r
-    // value[2] = 0x0f;\r
-    // char buf[128];\r
-    // memset(buf,0,128);\r
-    // getSportData(&buf);\r
-    // uint32_t tmp = 1;\r
-    // uint32_t datalen = 1;\r
-    // uint16_t tmp_data = 1;\r
-    // datalen = strlen(buf);\r
-    // tmp_data = datalen;\r
-    // memcpy(value+3,&tmp,4);\r
-    // memcpy(value+7,&datalen,4);\r
-    // memcpy(value+11,&tmp,4);\r
-    // memcpy(value+15,&tmp_data,2);\r
-    // memcpy(&value[17],buf,strlen(buf));\r
-\r
-    // comfirmPaire(0);\r
-\r
-}\r
-\r
-bool creatMessageDir(void)//创建消息文件夹\r
-{\r
-    struct stat info;\r
-    if (stat(ANCS_DATA_CONFIG_DIR, &info) != 0)\r
-    {\r
-        if (mkdir(ANCS_DATA_CONFIG_DIR, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)\r
-        {\r
-            return false; // Failed to create folder\r
-        }\r
-    }\r
-    return true;\r
-}\r
-char *get_message_dir_path(void)//获取信息的文件夹路径\r
-{\r
-    return ANCS_DATA_CONFIG_DIR;\r
-}\r
-\r
-void message_data(int uid,int appid,char  *title,char  *msg,int hasCode)\r
-{\r
-\r
-    uint32_t timestampe = 0;\r
-    if (uapi_get_timestampe_ss(&timestampe) != ERRCODE_SUCC)\r
-    {\r
-        timestampe = 0;\r
-    }\r
-    ancs_data_info_t data;\r
-    data.title=malloc(strlen(title)+1);\r
-    data.msg = malloc(strlen(msg) + 1);\r
-    memset_s(data.title, TITLE_BUF_LEN, 0, strlen(title) + 1);\r
-    memset_s(data.msg, MSG_BUF_LEN, 0, strlen(msg) + 1);\r
-    memcpy_s(data.title, TITLE_BUF_LEN + 1, title, strlen(title));\r
-    memcpy_s(data.msg, MSG_BUF_LEN + 1, msg, strlen(msg));\r
-\r
-\r
-    data.appid = appid;\r
-    data.uid=uid;\r
-    data.time=timestampe;\r
-    data.read=0;\r
-    data.hasCode = hasCode;\r
-\r
-    data.msglen = strlen(msg);\r
-    data.titlelen = strlen(title);\r
-    \r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"message_data %p %p\r\n",  data.title,   data.msg);\r
-\r
-    CustomEventPublish_TOPIC_EVENT_MESSAGENOTE(&data);\r
-    return ;\r
-\r
-}\r
-int uft8_check(char *chinese_string,int length)\r
-{\r
-    int i = 0;\r
-     for (i = 0; i < length;) {\r
-        // 判断是否为ASCII字符\r
-        if ((unsigned char)chinese_string[i] < 0x80) {\r
-            //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ASCII character: %d\n", (int)(unsigned char)chinese_string[i]);\r
-            i++;\r
-        } else {\r
-            // 假设这里我们只处理3字节的UTF-8字符\r
-            // 实际上,中文字符通常是4字节\r
-            if ((unsigned char)chinese_string[i] >= 0xF0) {\r
-                // 这里应处理4字节UTF-8字符的逻辑\r
-                // 例如: return (chinese_string[i] << 24) | (chinese_string[i + 1] << 16) | (chinese_string[i + 2] << 8) | chinese_string[i + 3];\r
-                i += 4; // 跳过4个字节\r
-            } else if ((unsigned char)chinese_string[i] >= 0xE0) {\r
-                // 这里应处理3字节UTF-8字符的逻辑\r
-                // 例如: return (chinese_string[i] << 16) | (chinese_string[i + 1] << 8) | chinese_string[i + 2];\r
-                i += 3; // 跳过3个字节\r
-            } else {\r
-                // 这里应处理2字节UTF-8字符的逻辑\r
-                // 例如: return (chinese_string[i] << 8) | chinese_string[i + 1];\r
-                i += 2; // 跳过2个字节\r
-            }\r
-        }\r
-        if(i+4 > length)\r
-            break;\r
-    }\r
-    return i;\r
-}\r
-\r
-\r
-//安卓消息接收解析数据 //ANCS 2AE1\r
-uint8_t jscheck_ancs(uint8_t *data)\r
-{\r
-    uint8_t *json;\r
-    json = data;\r
-    cJSON* root = cJSON_Parse((const char *)json);\r
-    if (root == NULL) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"信息解析 JSON解析 失败\n");\r
-        return 2;\r
-    }\r
-\r
-    int uid_t = 0;\r
-    int appid_t = 0;\r
-    int hasCode_t = 0;\r
-    char *titleBuf;\r
-    char *msgBuf;\r
-    titleBuf = ym_malloc(TITLE_BUF_LEN+1);\r
-    msgBuf = ym_malloc(MSG_BUF_LEN+1);\r
-    if(titleBuf == NULL || msgBuf == NULL)//申请内存失败不在申请\r
-    {\r
-        return 2;\r
-    }\r
-    memset(titleBuf,0,TITLE_BUF_LEN+1);\r
-    memset(msgBuf,0,MSG_BUF_LEN+1);\r
-    cJSON* uid = cJSON_GetObjectItem(root, "uid");\r
-    if (uid && cJSON_IsNumber(uid)) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"uid_t: %d\n", uid->valueint);\r
-        uid_t = uid->valueint;\r
-    }\r
-    cJSON* appid = cJSON_GetObjectItem(root, "appid");\r
-    if (appid && cJSON_IsNumber(appid)) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"appid_t: %d\n", appid->valueint);\r
-        appid_t = appid->valueint;\r
-    }\r
-    cJSON* title_c = cJSON_GetObjectItem(root, "title");\r
-    if (title_c && cJSON_IsString(title_c)) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"titleBuf: %s\n", title_c->valuestring);\r
-        int len = strlen(title_c->valuestring);\r
-        if(len >= TITLE_BUF_LEN){\r
-            len = uft8_check(title_c->valuestring,TITLE_BUF_LEN-4);\r
-            title_c->valuestring[len++] ='.';\r
-            title_c->valuestring[len++] = '.';\r
-            title_c->valuestring[len++] = '.';\r
-            title_c->valuestring[len++] = 0;\r
-        }\r
-        memcpy_s(titleBuf,TITLE_BUF_LEN,(uint8_t *)title_c->valuestring,len);\r
-    }\r
-    cJSON* msg = cJSON_GetObjectItem(root, "msg");\r
-    if (msg && cJSON_IsString(msg)) {\r
-        int len = strlen(msg->valuestring);\r
-        if(len >= MSG_BUF_LEN-4){\r
-            len = uft8_check(msg->valuestring,MSG_BUF_LEN-4);\r
-            msg->valuestring[len++] ='.';\r
-            msg->valuestring[len++] = '.';\r
-            msg->valuestring[len++] = '.';\r
-            msg->valuestring[len++] = 0;\r
-        }\r
-        memcpy_s(msgBuf,MSG_BUF_LEN,(uint8_t *)msg->valuestring,len);\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"msgBuf: %s\n",msgBuf);\r
-    }\r
-    cJSON* time = cJSON_GetObjectItem(root, "time");\r
-    if (time && cJSON_IsString(time)) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %s\n", time->valuestring);\r
-        // timeBuf = time->valueint;\r
-    }\r
-    cJSON* hasCode = cJSON_GetObjectItem(root, "hasCode");\r
-    if (hasCode && cJSON_IsNumber(hasCode)) {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"hasCode_t: %d\n", hasCode->valueint);\r
-        hasCode_t = hasCode->valueint;\r
-    }\r
-    cJSON_Delete(root);\r
-\r
-    // if(ancs_msg_data!=NULL)\r
-    // {\r
-    //     free(ancs_msg_data);\r
-    //     ancs_msg_data=NULL;\r
-    // }\r
-\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"send message\r\n");\r
-    message_data(uid_t,appid_t,titleBuf,msgBuf,hasCode_t);\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"send message ok\r\n");\r
-\r
-    if(titleBuf != NULL){\r
-        ym_free(titleBuf);\r
-        titleBuf = NULL;\r
-    }\r
-    if(msgBuf != NULL){\r
-        ym_free(msgBuf);\r
-        msgBuf = NULL;\r
-    }\r
-    return 1;\r
-}\r
-\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
-    uint32_t tmp = 1;\r
-    value[0] =0x72;\r
-    value[1] =0x02;\r
-    value[2] =0x01;\r
-    memcpy(value+3,&tmp,4);\r
-    memcpy(value+7,&tmp,4);\r
-    memcpy(value+11,&tmp,4);\r
-    memcpy(value+15,&tmp,2);\r
-    \r
-    if(Check_CRC(data,len,crcvalue))\r
-    {\r
-        //解析ancs数据并且显示出来\r
-        uint8_t check_ok= 1;\r
-        check_ok = jscheck_ancs(data);\r
-        value[17] = 1;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }else{\r
-        value[17] = 0;\r
-        value[18] = Calculate_CRC(value,18);\r
-        sendBleData(value,19);\r
-    }\r
-}\r
-\r
-void CustomEventPublish_TOPIC_EVENT_MESSAGENOTE(void *data)\r
-{\r
-    CustomEventPublish(TOPIC_EVENT_MESSAGE_UPDATA,(uint8_t*)data,sizeof(ancs_data_info_t));\r
-}\r
-\r
-void type2AE1Data(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
-     #ifdef BLE_LOG\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE1Data typeID:0x%4X\r\n",typeID);\r
-    #endif\r
-    switch (typeID) //ID\r
-    {\r
-        case ANDROID_ANCS_CMD://\r
-            ancsDataShowCmd(typeID,data,datalen,totalData,crcvalue);\r
-            break;\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
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type:%d %d data_size:%d data:%d crcvalue:%x\r\n",buf_cmd[0],type,data_size,data[0],crcvalue);\r
-    switch (type)\r
-    {\r
-        case 0x03://\r
-            type2AE1Data(buf_cmd,data,data_size,totalData,crcvalue);\r
-            break;\r
-        default:\r
-            break;\r
-    }\r
-}\r
-\r
-/**\r
- * less than 20bytes msg reply\r
-*/\r
-errcode_t ble_reply_msgarr(uint8_t msg_cmdtype,uint8_t msg_cmdid,uint8_t *replydata,uint16_t replydata_len)\r
-{\r
-\r
-        //发送校验失败\r
-\r
-        if (replydata_len > 20)\r
-        {\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"datalen is larger than 20, please send with other api !\n");\r
-            return ERRCODE_FAIL;\r
-        }\r
-        uint16_t replybuflen=sizeof(msg_header_t)+replydata_len+1;\r
-        uint8_t *replybuf=malloc(replybuflen);\r
-        if(replybuf != NULL)\r
-        {\r
-            msg_header_t *reply_cmd_header=(msg_header_t*)replybuf;\r
-            reply_cmd_header->direction = MSG_DIRECTION_SEND;\r
-            reply_cmd_header->cmdtype   =msg_cmdtype;\r
-            reply_cmd_header->cmdid   = msg_cmdid;\r
-            reply_cmd_header->package_count = 1;\r
-            reply_cmd_header->package_index = 1;\r
-            reply_cmd_header->package_len = replydata_len;\r
-            reply_cmd_header->total_data_len = replydata_len;\r
-            memcpy_s(replybuf+sizeof(msg_header_t),replydata_len,replydata,replydata_len);            \r
-            uint8_t crc_value = Calculate_CRC( replybuf, replybuflen - 1);\r
-            replybuf[ replybuflen - 1 ] = crc_value ; //CRC\r
-            errcode_t ret=0;\r
-            if(msg_cmdtype==6)\r
-            {\r
-                ret=sendBleData_zhihui(replybuf,replybuflen);\r
-\r
-            }else\r
-            {\r
-                 ret= sendBleData(replybuf,replybuflen);\r
-            }\r
-           \r
-\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ble_reply_msgarr cmdtype %02X cmdid %02X package %d/%d , len %d,total len %d , data[0] %02X crc %02X\n",\r
-            reply_cmd_header->cmdtype,\r
-            reply_cmd_header->cmdid,\r
-            reply_cmd_header->package_index,\r
-            reply_cmd_header->package_count,\r
-            reply_cmd_header->package_len,\r
-            reply_cmd_header->total_data_len,\r
-            (replybuf+sizeof(msg_header_t))[0],\r
-            crc_value\r
-            );\r
-            free(replybuf);\r
-            return ret;\r
-        }else{\r
-            return ERRCODE_MALLOC;\r
-        }\r
-}\r
-\r
-errcode_t ble_reply_cmdarr(uint16_t msg_cmd,uint8_t *replydata,uint16_t replydata_len)\r
-{\r
-\r
-    uint8_t cmdtype = (uint8_t)((msg_cmd&0xFF00)>>8);\r
-    uint8_t cmdid = (uint8_t)(msg_cmd&0x00FF);\r
-    \r
-    return ble_reply_msgarr(cmdtype,cmdid,replydata,replydata_len);\r
-\r
-}\r
-errcode_t ble_reply_cmd(uint16_t msg_cmd,uint8_t replydata)\r
-{\r
-    uint8_t cmdtype = (uint8_t)((msg_cmd&0xFF00)>>8);\r
-    uint8_t cmdid = (uint8_t)(msg_cmd&0x00FF);\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"msg_cmd %04X cmdtype %02X cmdid %02X\n",msg_cmd,cmdtype,cmdid);\r
-    return ble_reply_msg(cmdtype,cmdid,replydata);\r
-}\r
-errcode_t ble_reply_msg(uint8_t msg_cmdtype,uint8_t msg_cmdid,uint8_t replydata)\r
-{\r
-    return ble_reply_msgarr(msg_cmdtype,msg_cmdid,&replydata,1);\r
-}\r
-\r
-static uint32_t last_package_id=0;\r
-static void  ble_transfer_Timer_CallBack(int data)\r
-{\r
-    timer_flie_flag--;\r
-\r
-    if(timer_flie_flag==0)\r
-    {\r
-        cancel_recv_file(1);\r
-    }\r
-}\r
-uint8_t OTA_FILE_value=0;\r
-\r
-errcode_t decode_ota_data(ble_read_data *buffer_handle,uint8_t *data,uint16_t datalen,uint8_t crcvalue)\r
-{\r
-    if(datalen<sizeof(msg_header_t))\r
-    {\r
-        return ERRCODE_FAIL;\r
-    }\r
-\r
-    msg_header_t *header =  (msg_header_t*)data; \r
-\r
-    if(header->cmdtype!=0x06)\r
-    {\r
-        return ERRCODE_FAIL;\r
-    }\r
-\r
-    uint8_t* data_=data+sizeof(msg_header_t);\r
-        //datalen-=18;\r
-    datalen=header->package_len;\r
-\r
-    if(header->cmdid==0x0B)\r
-    {   \r
-        //取消文件传输\r
-        if(Check_CRC(data_,datalen,crcvalue))\r
-        {\r
-            cancel_recv_file(0);\r
-            uint8_t replydata= 1;\r
-            ble_reply_msgarr(6,0x0B,&replydata,1);\r
-        }\r
-        else\r
-        {\r
-             cancel_recv_file(0);\r
-            uint8_t replydata= 0;\r
-            ble_reply_msgarr(6,0x0B,&replydata,1);\r
-        }\r
-\r
-    }\r
-    else if(header->cmdid==0x02)\r
-    {\r
-\r
-        uint32_t package_id=header->package_index;\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"package_id: %d \r\n",package_id);\r
-        if(Check_CRC(data_,datalen,crcvalue))\r
-        {\r
-        \r
-            if(package_id==0)\r
-            {\r
-            last_package_id=package_id;\r
-            if((buffer_handle->file_recv_stat.recv_file_stat <= 0) && buffer_handle->file_recv_stat.file == NULL )\r
-            {\r
-                buffer_handle->file_recv_stat.lrcvalue = 0;\r
-                if (buffer_handle->file_recv_stat.file_type == 1)\r
-                {\r
-\r
-                    buffer_handle->file_recv_stat.file = fopen(UP_DATE_FWPKG_PATH,"w+");\r
-                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",UP_DATE_FWPKG_PATH,buffer_handle->file_recv_stat.file);\r
-\r
-\r
-                }\r
-                else if (buffer_handle->file_recv_stat.file_type == 2)\r
-                {\r
-                    char musicpath[64]={0};\r
-                    get_music_path(musicpath,64);\r
-                    //"/user/userdata/music"\r
-                    char filepath[256]={0};\r
-                    create_mp3_name(filepath,musicpath,buffer_handle->file_recv_stat.file_name);\r
-\r
-                    buffer_handle->file_recv_stat.file = fopen(filepath,"w+");\r
-                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);\r
-                }\r
-                 else if (buffer_handle->file_recv_stat.file_type == 4)\r
-                {\r
-                   char filepath[128]={0};\r
-                    if (get_app_file_path(buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)\r
-                    {\r
-                        buffer_handle->file_recv_stat.file = fopen(filepath,"w+");//?\r
-                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);\r
-                    }else{\r
-                          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);\r
-                    }            \r
-                }\r
-                else\r
-                {\r
-                    char filepath[128]={0};\r
-                    if (get_file_recv_file_path(buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)\r
-                    {\r
-                        buffer_handle->file_recv_stat.file = fopen(filepath,"w+");\r
-                          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);\r
-                    }else{\r
-                          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);\r
-                    }            \r
-                }\r
-\r
-\r
-\r
-                if (buffer_handle->file_recv_stat.file == NULL)\r
-                {\r
-                      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"6185 buffer_handle->file_recv_stat.file  \n");\r
-                    return ERRCODE_FAIL;\r
-                }\r
-                size_t writtensize = fwrite(data_,1,datalen,buffer_handle->file_recv_stat.file);\r
-                if(writtensize == datalen)\r
-                {\r
-                    timer_flie_flag=10;\r
-\r
-                    buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_,datalen,buffer_handle->file_recv_stat.lrcvalue);\r
-                            buffer_handle->file_recv_stat.received_size += datalen;\r
-                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d\n",buffer_handle->file_recv_stat.received_size);\r
-                    OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;\r
-\r
-\r
-                }else{\r
-                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen);\r
-                    return ERRCODE_FAIL;\r
-                }\r
-\r
-\r
-                buffer_handle->file_recv_stat.recv_file_stat = 1;\r
-                ////////////////创建文件传输超时定时器//////////////////\r
-                uint32_t tick;\r
-                osStatus_t retTimer;\r
-                if(BR_TRANSFER_timer!=NULL)\r
-                {\r
-                    osTimerDelete(BR_TRANSFER_timer);\r
-                    BR_TRANSFER_timer = NULL;\r
-                }\r
-                ble_read_timer_p=buffer_handle;\r
-                timer_flie_flag=10;\r
-\r
-                BR_TRANSFER_timer = osTimerNew((osTimerFunc_t)ble_transfer_Timer_CallBack, osTimerPeriodic, NULL, NULL);\r
-                tick =1000;// osMs2Tick(1000);\r
-                retTimer = osTimerStart(BR_TRANSFER_timer, tick);\r
-                if (retTimer != osOK && BR_TRANSFER_timer != NULL) {\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);\r
-                    osTimerDelete(BR_TRANSFER_timer);\r
-                    BR_TRANSFER_timer = NULL;\r
-                    return ERRCODE_FAIL;\r
-                }\r
-\r
-                {\r
-                    if(buffer_handle->file_recv_stat.file_type==3)\r
-                    TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING;\r
-                    \r
-                    if(buffer_handle->file_recv_stat.file_type==1)\r
-                    TRANSMIT_DATA=TRANS_OTA_TRANSMITTING;\r
-                \r
-                    if(buffer_handle->file_recv_stat.file_type==2)\r
-                    TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;\r
-\r
-                     if(buffer_handle->file_recv_stat.file_type==4)\r
-                    TRANSMIT_DATA=TRANS_BIN_TRANSMITTING;\r
-                    \r
-                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                }\r
-            }\r
-            ///////////////////////////////////////////////////////////\r
-        }\r
-        else if ((last_package_id+1)==package_id)\r
-        {\r
-            last_package_id=package_id;\r
-            if (buffer_handle->file_recv_stat.file == NULL)\r
-            {\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6194 buffer_handle->file_recv_stat.file  \n");\r
-                return ERRCODE_FAIL;\r
-            }\r
-            //写入文件\r
-            size_t writtensize = fwrite(data_,1,datalen,buffer_handle->file_recv_stat.file);\r
-            if(writtensize == datalen)\r
-            {\r
-                timer_flie_flag=10;\r
-\r
-                buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_,datalen,buffer_handle->file_recv_stat.lrcvalue);\r
-                        buffer_handle->file_recv_stat.received_size += datalen;\r
-                OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;\r
-                  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d %0.3lf\n",buffer_handle->file_recv_stat.received_size\r
-                  ,(float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size);\r
-\r
-            }else{\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen);\r
-                return ERRCODE_FAIL;\r
-            }\r
-\r
-        //检查文件是否写完\r
-            if(buffer_handle->file_recv_stat.file_size == buffer_handle->file_recv_stat.received_size)\r
-            {\r
-                if (buffer_handle->file_recv_stat.file!=NULL)\r
-                {\r
-                    fclose(buffer_handle->file_recv_stat.file);\r
-                    buffer_handle->file_recv_stat.file = NULL;\r
-                }\r
-                if (buffer_handle->file_recv_stat.file_name != NULL)\r
-                {\r
-                    free(buffer_handle->file_recv_stat.file_name);\r
-                    buffer_handle->file_recv_stat.file_name=NULL;\r
-                }\r
-                buffer_handle->file_recv_stat.recv_file_stat = 2;\r
-                buffer_handle->receive_file_flag = 0;\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received success \n");\r
-\r
-                if(BR_TRANSFER_timer)\r
-                {\r
-                    osTimerStop(BR_TRANSFER_timer);\r
-                    osTimerDelete(BR_TRANSFER_timer);\r
-                    BR_TRANSFER_timer = NULL;\r
-                }\r
-                ble_read_timer_p=NULL;\r
-\r
-                TRANSMIT_DATA=FILE_IS_DONE;\r
-        \r
-                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
-\r
-                ble_reply_cmd(OTA_FILE_SUCC_CMD,1);//接收成功\r
-            }\r
-\r
-            }\r
-            else if (last_package_id==package_id)\r
-            {\r
-                uint32_t replydata=0xffffffff;\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"0xffffffff 包重复\r\n");\r
-                //ble_reply_msgarr(6,4,&replydata,4);\r
-            }\r
-            else if (last_package_id!=package_id)\r
-            {\r
-                uint32_t replydata= last_package_id+1;\r
-                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"包错漏\r\n");\r
-                \r
-\r
-                ble_reply_msgarr(0x06,0x04,&replydata,4);\r
-            }\r
-            return ERRCODE_SUCC;\r
-        }\r
-        else\r
-        {\r
-            return ERRCODE_FAIL;\r
-        }\r
-    }\r
-    return ERRCODE_FAIL;\r
-}\r
-\r
-\r
-\r
-\r
-errcode_t decode_ota_json(ble_read_data *buffer_handle) {\r
-\r
-    if (uapi_dev_runtime_get_train_status() == 1) {\r
-       return ERRCODE_FAIL;\r
-    }\r
-\r
-    uint8_t *data = buffer_handle->data+sizeof(msg_header_t);\r
-    uint16_t datalen = buffer_handle->totalDataLen;\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ota_json_file_save %s\n",data);\r
-\r
-    cJSON* root = cJSON_Parse((const char *)data);\r
-    if(root != NULL)\r
-    {    \r
-        cJSON* ota_size_json = cJSON_GetObjectItem(root, "size");\r
-        if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json))\r
-        {\r
-            buffer_handle->file_recv_stat.file_size = ota_size_json->valueint;\r
-            if(is_free_ota_update(ota_size_json->valueint)==false)\r
-            {\r
-                TRANSMIT_DATA=TRANS_OTA_FAIL;\r
-                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                cJSON_Delete(root);\r
-\r
-                return ERRCODE_FAIL;\r
-            }\r
-        }\r
-\r
-        cJSON* ota_type_json = cJSON_GetObjectItem(root, "type");\r
-        if(ota_type_json != NULL && cJSON_IsNumber(ota_type_json))\r
-        {\r
-            buffer_handle->file_recv_stat.file_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
-            uint32_t filenamelen=strlen(ota_name_json->valuestring)+1;\r
-            if (filenamelen > 0 && filenamelen < 255)\r
-            {\r
-                buffer_handle->file_recv_stat.file_name = malloc(filenamelen);\r
-                if (buffer_handle->file_recv_stat.file_name!=NULL)\r
-                    memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen);\r
-                //下载完成再在 cancel download 里 free filename\r
-            }else{\r
-                buffer_handle->file_recv_stat.file_name = NULL;\r
-            }\r
-        }else{\r
-            buffer_handle->file_recv_stat.file_name = NULL;\r
-        }\r
-        \r
-        cJSON* ota_major_json = cJSON_GetObjectItem(root, "major");\r
-        if(ota_major_json != NULL && cJSON_IsNumber(ota_major_json))\r
-        {\r
-            buffer_handle->file_recv_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
-            buffer_handle->file_recv_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
-            buffer_handle->file_recv_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
-            buffer_handle->file_recv_stat.ota_isforced = ota_isforced_json->valueint;\r
-        }\r
-        cJSON_Delete(root);\r
-\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"  ota_type= %d, ota_name=%s, ota_size=%d, ota_major=%d, ota_mid=%d, ota_minor=%d, ota_isforced=%d \n",\r
-            buffer_handle->file_recv_stat.file_type,\r
-            buffer_handle->file_recv_stat.file_name,\r
-            buffer_handle->file_recv_stat.file_size,\r
-            buffer_handle->file_recv_stat.ota_major,\r
-            buffer_handle->file_recv_stat.ota_mid,\r
-            buffer_handle->file_recv_stat.ota_minor,\r
-            buffer_handle->file_recv_stat.ota_isforced\r
-        );\r
-        buffer_handle->file_recv_stat.received_size = 0;\r
-        buffer_handle->file_recv_stat.lrcvalue = 0;\r
-        buffer_handle->receive_file_flag = 1;\r
-        uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);\r
-        //进入特殊UI\r
-        TRANSMIT_DATA=TRANS_OTA_TRANSMITTING;\r
-        CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
-        return ERRCODE_SUCC;\r
-    }else{\r
-        buffer_handle->receive_file_flag = 0;        \r
-        return ERRCODE_FAIL;\r
-    }\r
-}\r
-\r
-\r
-errcode_t decode_mp3_json(ble_read_data *buffer_handle)\r
-{\r
-    if (uapi_dev_runtime_get_train_status() == 1) {\r
-       return ERRCODE_FAIL;\r
-    }\r
-  \r
-    uint8_t *data = buffer_handle->data+sizeof(msg_header_t);\r
-    uint16_t datalen = buffer_handle->totalDataLen;\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"MP3_file_save %s\n",data);\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
-            buffer_handle->file_recv_stat.file_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
-            uint32_t filenamelen=strlen(ota_name_json->valuestring)+1;\r
-\r
-            if (filenamelen > 0 && filenamelen < 255)\r
-            {\r
-                if(buffer_handle->file_recv_stat.file_name)\r
-                {\r
-                    free(buffer_handle->file_recv_stat.file_name);\r
-                    buffer_handle->file_recv_stat.file_name=NULL;\r
-                }\r
-                buffer_handle->file_recv_stat.file_name = malloc(filenamelen);\r
-                if (buffer_handle->file_recv_stat.file_name!=NULL)\r
-                {\r
-                    memset_s(buffer_handle->file_recv_stat.file_name,filenamelen,0,filenamelen);\r
-                    memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen);\r
-                }\r
-                    \r
-                //下载完成再在 cancel download 里 free filename\r
-            }else{\r
-                buffer_handle->file_recv_stat.file_name = NULL;\r
-            }\r
-        }\r
-\r
-        cJSON* ota_size_json = cJSON_GetObjectItem(root, "size");\r
-        if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json))\r
-        {\r
-            buffer_handle->file_recv_stat.file_size = ota_size_json->valueint;\r
-        }\r
-            cJSON_Delete(root);\r
-\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"  MP3_type= %d, MP3_name=%s, MP3_size=%d \n",\r
-            buffer_handle->file_recv_stat.file_type,\r
-            buffer_handle->file_recv_stat.file_name,\r
-            buffer_handle->file_recv_stat.file_size\r
-        );\r
-        // buffer_handle->file_recv_stat.received_size = 0;\r
-        // buffer_handle->file_recv_stat.lrcvalue = 0;\r
-        // buffer_handle->receive_file_flag = 1;\r
-        // uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);\r
-        // TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;\r
-        // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-        if(IS_free_save_Mp3(ota_size_json->valueint)==false)\r
-        {\r
-            free(buffer_handle->file_recv_stat.file_name);\r
-            buffer_handle->file_recv_stat.file_name=NULL;\r
-\r
-            TRANSMIT_DATA=TRANS_MP3_MAX_FAIL;\r
-            CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
-            return  ERRCODE_FAIL;\r
-        }\r
-        else\r
-        {\r
-             buffer_handle->file_recv_stat.received_size = 0;\r
-            buffer_handle->file_recv_stat.lrcvalue = 0;\r
-            buffer_handle->receive_file_flag = 1;\r
-            uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);\r
-\r
-            return ERRCODE_SUCC;\r
-        }\r
-\r
-    }else{\r
-        buffer_handle->receive_file_flag = 0;        \r
-        return ERRCODE_FAIL;\r
-    }\r
-}\r
-\r
-\r
-errcode_t decode_bin_json(ble_read_data *buffer_handle)\r
-{\r
-    if (uapi_dev_runtime_get_train_status() == 1) {\r
-       return ERRCODE_FAIL;\r
-    }\r
-  \r
-    uint8_t *data = buffer_handle->data+sizeof(msg_header_t);\r
-    uint16_t datalen = buffer_handle->totalDataLen;\r
-    // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"decode_bin_json %s\n",data);\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
-            buffer_handle->file_recv_stat.file_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
-            uint32_t filenamelen=strlen(ota_name_json->valuestring)+1;\r
-\r
-            if (filenamelen > 0 && filenamelen < 255)\r
-            {\r
-                if(buffer_handle->file_recv_stat.file_name)\r
-                {\r
-                    free(buffer_handle->file_recv_stat.file_name);\r
-                    buffer_handle->file_recv_stat.file_name=NULL;\r
-                }\r
-                buffer_handle->file_recv_stat.file_name = malloc(filenamelen);\r
-                if (buffer_handle->file_recv_stat.file_name!=NULL)\r
-                {\r
-                    memset_s(buffer_handle->file_recv_stat.file_name,filenamelen,0,filenamelen);\r
-                    memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen);\r
-                }\r
-                    \r
-                //下载完成再在 cancel download 里 free filename\r
-            }else{\r
-                buffer_handle->file_recv_stat.file_name = NULL;\r
-            }\r
-        }\r
-\r
-        cJSON* ota_size_json = cJSON_GetObjectItem(root, "size");\r
-        if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json))\r
-        {\r
-            buffer_handle->file_recv_stat.file_size = ota_size_json->valueint;\r
-        }\r
-            cJSON_Delete(root);\r
-\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"  bin type = %d, bin name =%s, bin size =%d \n",\r
-            buffer_handle->file_recv_stat.file_type,\r
-            buffer_handle->file_recv_stat.file_name,\r
-            buffer_handle->file_recv_stat.file_size\r
-        );\r
-        // buffer_handle->file_recv_stat.received_size = 0;\r
-        // buffer_handle->file_recv_stat.lrcvalue = 0;\r
-        // buffer_handle->receive_file_flag = 1;\r
-        // uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);\r
-        // TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;\r
-        // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-        if(IS_free_save_Mp3(ota_size_json->valueint)==false)\r
-        {\r
-            free(buffer_handle->file_recv_stat.file_name);\r
-            buffer_handle->file_recv_stat.file_name=NULL;\r
-\r
-            TRANSMIT_DATA=TRANS_MP3_MAX_FAIL;\r
-            CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
-            return  ERRCODE_FAIL;\r
-        }\r
-        else\r
-        {\r
-             buffer_handle->file_recv_stat.received_size = 0;\r
-            buffer_handle->file_recv_stat.lrcvalue = 0;\r
-            buffer_handle->receive_file_flag = 1;\r
-            uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);\r
-\r
-            memset_s(app_name,64,0,64);\r
-            memcpy_s(app_name,64, buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name));\r
-            \r
-\r
-            return ERRCODE_SUCC;\r
-        }\r
-\r
-    }else{\r
-        buffer_handle->receive_file_flag = 0;        \r
-        return ERRCODE_FAIL;\r
-    }\r
-}\r
-static uint16_t  ble_dial_uid=0;\r
-\r
-errcode_t decode_dial_info(ble_read_data *buffer_handle)\r
-{\r
-\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"decode_dial_info \n");\r
-    for(uint8_t i = 0;i<buffer_handle->data_len;i++)\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buffer_handle->data[i]);\r
-    }\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n");\r
-    if (buffer_handle->data_len == 6)\r
-    {\r
-\r
-        return ERRCODE_SUCC;\r
-    }\r
-    uint8_t *data = buffer_handle->data+sizeof(msg_header_t);\r
-    uint16_t datalen = buffer_handle->totalDataLen;\r
-\r
-    msg_recv_dial_info_t dialinfo={0};\r
-    msg_recv_dial_info_t *pdialinfo=(msg_recv_dial_info_t*)data;\r
-\r
-    // dialinfo.dial_count = pdialinfo->dial_count;\r
-    dialinfo.dial_uid = pdialinfo->dial_uid;\r
-    if(dialinfo.dial_uid<=4)\r
-    {\r
-        \r
-        msg_recv_custom_dial_info_t *custom_dial_info=(msg_recv_custom_dial_info_t*)data;\r
-        custom_dial_info->dial_uid+=1;\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"custom_dial_info %d %d %d %d",\r
-        custom_dial_info->dial_uid,\r
-        custom_dial_info->battery,\r
-        custom_dial_info->time,\r
-        custom_dial_info->time_font);\r
-\r
-        ble_save_dial_custom(custom_dial_info);\r
-        ble_dial_file_count=*(data+sizeof(msg_recv_custom_dial_info_t));\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," custom_dial file_count %d\r\n",ble_dial_file_count);\r
-        \r
-    }\r
-    else\r
-    {\r
-        dialinfo.file_name_len = pdialinfo->file_name_len;\r
-        // dialinfo.file_type = pdialinfo->file_type;\r
-\r
-        if (dialinfo.file_name_len < 0 || dialinfo.file_name_len >255)\r
-        {\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name len should in [0,255] \n");\r
-            return ERRCODE_FAIL;\r
-        }\r
-\r
-        char * filename = malloc(dialinfo.file_name_len);\r
-\r
-        ble_dial_file_count= data[sizeof(msg_recv_dial_info_t)+dialinfo.file_name_len];\r
-        if (filename == NULL)\r
-        {\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name malloc failed  filename_len %d\n",dialinfo.file_name_len);\r
-            return ERRCODE_FAIL;\r
-        }\r
-        memcpy_s(filename,dialinfo.file_name_len,data+sizeof(msg_recv_dial_info_t),dialinfo.file_name_len);\r
-\r
-        buffer_handle->file_recv_stat.file_name = filename;\r
-        \r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," dial name = %s, dial file count = %d \n",\r
-            filename,ble_dial_file_count);\r
-\r
-        free(filename);\r
-        buffer_handle->file_recv_stat.file_name=NULL;\r
-    }\r
-\r
-    ble_dial_uid = dialinfo.dial_uid;\r
-   \r
-    buffer_handle->file_recv_stat.received_size = 0;\r
-    buffer_handle->file_recv_stat.lrcvalue = 0;\r
-    buffer_handle->receive_file_flag = 0;\r
-    \r
-    return ERRCODE_SUCC;\r
-\r
-}\r
-\r
-errcode_t decode_single_dial_info(ble_read_data *buffer_handle)\r
-{\r
-\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"decode_single_dial_info \n");\r
-    for(uint8_t i = 0;i<buffer_handle->data_len;i++)\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buffer_handle->data[i]);\r
-    }\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n");\r
-    if (buffer_handle->data_len == 6)\r
-    {\r
-        return ERRCODE_SUCC;\r
-    }\r
-    uint8_t *data = buffer_handle->data+sizeof(msg_header_t);\r
-    uint16_t datalen = buffer_handle->totalDataLen;\r
-\r
-    msg_recv_single_dial_info_t dialinfo={0};\r
-    msg_recv_single_dial_info_t *pdialinfo=(msg_recv_single_dial_info_t*)data;\r
-\r
-    dialinfo.dial_count = pdialinfo->dial_count;\r
-\r
-    ble_dial_file_index= dialinfo.dial_count;\r
-\r
-    dialinfo.dial_uid = pdialinfo->dial_uid;\r
-    dialinfo.file_name_len = pdialinfo->file_name_len;\r
-    dialinfo.file_type = pdialinfo->file_type;\r
-\r
-    if (dialinfo.file_name_len < 6 || dialinfo.file_name_len >255)\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name len should in [6,255] \n");\r
-        return ERRCODE_FAIL;\r
-    }\r
-\r
-    if (uapi_dev_runtime_get_train_status() == 1) {\r
-       return ERRCODE_FAIL;\r
-    }\r
-    \r
-\r
-    char * filename = malloc(dialinfo.file_name_len+1);\r
-    //下载完成再在 cancel download 里 free filename\r
-\r
-    uint32_t file_size = 0;\r
-    memcpy_s((void*)&file_size,sizeof(uint32_t),(void*)&data[sizeof(msg_recv_single_dial_info_t)+dialinfo.file_name_len],sizeof(uint32_t));\r
-    if (filename == NULL)\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name malloc failed  filename_len %d\n",dialinfo.file_name_len);\r
-        return ERRCODE_FAIL;\r
-    }\r
-    memcpy_s(filename,dialinfo.file_name_len,data+sizeof(msg_recv_single_dial_info_t),dialinfo.file_name_len);\r
-    filename[dialinfo.file_name_len] ='\0';\r
-    //在runtime中备份一个安装文件名。\r
-    uapi_dev_runtime_set_dialname(filename);\r
-    \r
-    if (check_dial_freespace(dialinfo.dial_uid, file_size) == false)\r
-    {\r
-        free(filename);\r
-        filename=NULL;\r
-\r
-        TRANSMIT_DATA=TRANS_DIAL_MAX_FAIL;\r
-        CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-        return ERRCODE_FAIL;\r
-    }\r
-\r
-    //存表盘id\r
-    ble_dial_uid = dialinfo.dial_uid;\r
-    // if(ble_dial_uid<=4)\r
-    // ble_dial_uid++;\r
-\r
-    if(buffer_handle->file_recv_stat.file_name)\r
-    {\r
-        free(buffer_handle->file_recv_stat.file_name);\r
-        buffer_handle->file_recv_stat.file_name=NULL;\r
-    }\r
-    \r
-    buffer_handle->file_recv_stat.file_name = filename;\r
-    buffer_handle->file_recv_stat.file_size = file_size;\r
-    buffer_handle->file_recv_stat.file_type = 3;//表盘\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"  filetype = %d, file_name=%s, file_size=%d , dial_uid %04X ,dial_count %d, dial_filetype %d\n",\r
-        buffer_handle->file_recv_stat.file_type,\r
-        buffer_handle->file_recv_stat.file_name,\r
-        buffer_handle->file_recv_stat.file_size,\r
-        dialinfo.dial_uid,\r
-        dialinfo.dial_count,\r
-        dialinfo.file_type\r
-\r
-    );\r
-    buffer_handle->file_recv_stat.received_size = 0;\r
-    buffer_handle->file_recv_stat.lrcvalue = 0;\r
-    buffer_handle->receive_file_flag = 1;\r
-    uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);\r
-\r
-    // TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING;\r
-    // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-    return ERRCODE_SUCC;\r
-    \r
-\r
-  \r
-\r
-   \r
-\r
-}\r
-static errcode_t install_dial(void)\r
-{\r
-    char *lzmapkgname = uapi_dev_runtime_get_dialname();\r
-    // 增加初始参数校验打印\r
-    if (lzmapkgname == NULL) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取到的表盘包名为空\n");\r
-        return ERRCODE_FAIL;\r
-    }\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 开始安装表盘,包名:%s\n", lzmapkgname);\r
-\r
-    // 检查是否为lzma格式包\r
-    char *lzmaindex = strstr(lzmapkgname, ".lzma");\r
-    if (lzmaindex == NULL) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:包名中未找到.lzma后缀,不是有效压缩包\n");\r
-        return ERRCODE_FAIL;\r
-    }\r
-\r
-    // 创建表盘目录(若不存在)\r
-    struct stat info;\r
-    if (stat(get_dial_path(), &info) != 0) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录不存在,尝试创建...\n");\r
-        if (mkdir(get_dial_path(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:创建表盘目录失败\n");\r
-            return ERRCODE_FAIL;\r
-        }\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录创建成功\n");\r
-    } else {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录已存在,无需创建\n");\r
-    }\r
-\r
-    // 解析表盘基础名称(去除.lzma后缀)\r
-    char dial_basename[64] = {0};\r
-    int dial_basenamelen = lzmaindex - lzmapkgname;\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析基础名称长度:%d\n", dial_basenamelen);\r
-    if (dial_basenamelen <= 0 || dial_basenamelen >= sizeof(dial_basename)) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:基础名称长度无效(%d),超出缓冲区大小\n", dial_basenamelen);\r
-        return ERRCODE_FAIL;\r
-    }\r
-    memcpy_s(dial_basename, sizeof(dial_basename), lzmapkgname, dial_basenamelen);\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析到表盘基础名称:%s\n", dial_basename);\r
-\r
-    // 确定解压后bin文件路径\r
-    char dialbin_filepath[128] = {0};\r
-    if (ble_dial_uid > 5) {\r
-        if (get_dial_file_path(dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取常规表盘文件路径失败\n");\r
-            return ERRCODE_FAIL;\r
-        }\r
-    } else {\r
-        if (get_custom_dial_file_path(ble_dial_uid, dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取自定义表盘文件路径失败\n");\r
-            return ERRCODE_FAIL;\r
-        }\r
-    }\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压目标bin文件路径:%s\n", dialbin_filepath);\r
-\r
-    // 确定源lzma文件路径\r
-    char lzma_filepath[128] = {0};\r
-    if (get_file_recv_file_path(lzmapkgname, strlen(lzmapkgname), lzma_filepath, sizeof(lzma_filepath)) != ERRCODE_SUCC) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取源lzma文件路径失败\n");\r
-        return ERRCODE_FAIL;\r
-    }\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件路径:%s\n", lzma_filepath);\r
-\r
-    // 执行解压操作\r
-    errcode_t ret = uapi_dial_pkg_decompress(lzma_filepath, dialbin_filepath);\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压操作完成,返回码:0x%X(%s)\n", ret, \r
-                 (ret == ERRCODE_SUCC) ? "成功" : "失败");\r
-\r
-    // 关键:检查解压后bin文件是否存在及大小\r
-    struct stat bin_info;\r
-    if (stat(dialbin_filepath, &bin_info) != 0) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件不存在或无法访问(路径:%s)\n", dialbin_filepath);\r
-        ret = ERRCODE_FAIL; // 即使解压返回成功,文件不存在也视为失败\r
-    } else {\r
-        if (bin_info.st_size <= 0) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件大小为空(%ld字节),无效文件\n", bin_info.st_size);\r
-            ret = ERRCODE_FAIL; // 大小为空视为失败\r
-        } else {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压后bin文件大小正常:%ld字节\n", bin_info.st_size);\r
-        }\r
-    }\r
-\r
-    // 若解压失败,直接返回\r
-    if (ret != ERRCODE_SUCC) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压失败,终止安装流程\n");\r
-        return ret;\r
-    }\r
-\r
-    // 注册并设置表盘\r
-    char *namebuf = strtok(lzmapkgname, ".");\r
-    if (ble_dial_uid > 5) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 注册常规表盘:%s(ID:%d)\n", namebuf, ble_dial_uid);\r
-        install_Register_dial(namebuf, ble_dial_uid);\r
-        ble_set_dial_by_id(ble_dial_uid);\r
-    } else {\r
-        if (ble_dial_file_index == ble_dial_file_count) {\r
-            char name_str[32] = {0};\r
-            ble_get_custom_dial(ble_dial_uid, name_str);\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘安装完毕,注册:%s(ID:%d)\n", name_str, ble_dial_uid);\r
-            install_Register_dial(name_str, ble_dial_uid);\r
-            ble_set_dial_by_id(ble_dial_uid);\r
-        } else {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘未达安装条件(当前索引:%d,总数:%d)\n", \r
-                         ble_dial_file_index, ble_dial_file_count);\r
-        }\r
-    }\r
-\r
-    // 删除源lzma文件\r
-    #if 1\r
-    if (remove(lzma_filepath) != 0) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 警告:删除源lzma文件失败(路径:%s),可能残留冗余文件\n", lzma_filepath);\r
-        // 此处不返回失败,仅警告,因为核心安装已完成\r
-    } else {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件已成功删除\n");\r
-    }\r
-    #endif\r
-\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘安装流程全部完成,返回成功\n");\r
-    return ERRCODE_SUCC;\r
-}\r
-static char file_name[128]={0};\r
-static uint32_t file_size=0;\r
-\r
-bool Read_tar_file_buf_send_Data(uint16_t pack_size,uint8_t id)\r
-{\r
-\r
-    char *data= (char *)malloc(pack_size+1);\r
-    uint16_t read_size=0;\r
-    FILE *fp=fopen(file_name,"rb+");\r
-    \r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",file_size);\r
-\r
-    uint32_t pack=file_size/pack_size+1;\r
-    uint32_t pack_id=1;\r
-    if(fp==NULL)\r
-    {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_name);\r
-        free(data);\r
-        return false;\r
-    }\r
-\r
-    do\r
-    {\r
-        memset_s(data,pack_size+1,0,pack_size+1);\r
-        read_size=fread(data,1,pack_size,fp);\r
-        if(read_size!=0)\r
-        {\r
-            ble_data_type type_={0x05,id,file_size,pack,pack_id};\r
-            send_big_data(type_,(char *)data,read_size);\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",read_size);\r
-        }\r
-        \r
-\r
-        //send_big_data(1,data,read_size,file_size,pack_id,pack,id,5);\r
-        pack_id++;\r
-       \r
-    } while (read_size==pack_size);\r
-    free(data);\r
-    fclose(fp);\r
-    sendbigDataBufState = false;\r
-    return true;\r
-}\r
-\r
-\r
-void delete_app(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue)\r
-{\r
-    \r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        if(ble_app_delete(data))\r
-        {\r
-            ble_reply_cmd(cmd,1);\r
-        }\r
-        else\r
-        {\r
-            ble_reply_cmd(cmd,2);\r
-        }\r
-\r
-    }\r
-       else\r
-       {\r
-               ble_reply_cmd(cmd,0);\r
-    }\r
-    \r
-}\r
-\r
-void get_app_list(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue)\r
-{\r
-    \r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        cJSON *jdata=ble_app_list();\r
-\r
-        if(jdata)\r
-        {\r
-            \r
-            char *jsonString = cJSON_PrintUnformatted(jdata);\r
-            \r
-            if (jsonString == NULL) {\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n");\r
-                cJSON_Delete(jdata);\r
-                return;\r
-            }\r
-            \r
-            uint32_t data_len = strlen(jsonString);\r
-            cJSON_Delete(jdata);\r
-            \r
-            if (data_len == 0) {\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n");\r
-                return;\r
-            }\r
-            int num=(ble_nus_max_data_len-18); \r
-            if(num>482)num=482;\r
-\r
-            send_long_data(jsonString,num,0x06,0x0E);\r
-\r
-            cJSON_free(jsonString);\r
-        }\r
-\r
-\r
-    }\r
-       else\r
-       {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"CRC ERROR!");\r
-               ble_reply_cmd(cmd,0);\r
-    }\r
-    \r
-}\r
-\r
-void get_watch_msg(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue)\r
-{\r
-    \r
-       if(Check_CRC(data,len,crcvalue))\r
-       {\r
-        cJSON *jdata=ble_get_watch_msg();\r
-\r
-        if(jdata)\r
-        {\r
-            \r
-            char *jsonString = cJSON_PrintUnformatted(jdata);\r
-            \r
-            if (jsonString == NULL) {\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n");\r
-                cJSON_Delete(jdata);\r
-                return;\r
-            }\r
-            \r
-            uint32_t data_len = strlen(jsonString);\r
-            cJSON_Delete(jdata);\r
-            \r
-            if (data_len == 0) {\r
-                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n");\r
-                return;\r
-            }\r
-            int num=(ble_nus_max_data_len-18); \r
-            if(num>482)num=482;\r
-\r
-            send_long_data(jsonString,num,0x06,0x0F);\r
-\r
-            cJSON_free(jsonString);\r
-        }\r
-\r
-\r
-    }\r
-       else\r
-       {\r
-               ble_reply_cmd(cmd,0);\r
-    }\r
-    \r
-}\r
-\r
-\r
-bool read_dir_send_json()\r
-{\r
-   \r
-    char *send_buf=NULL;\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"read_dir_send_json xxxxxxxx\r\n");\r
-    memset_s(file_name,128,0,128);\r
-    send_buf=tar_dir_to_json_buf_malloc_(file_name,&file_size);\r
-     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"read_dir_send_json end\r\n");\r
-    if( send_buf!=NULL)\r
-    {\r
-        //send_big_data(1,send_buf,strlen(send_buf),strlen(send_buf),1,1,0x26,0x04);\r
-\r
-        ble_data_type type_={0x04,0x26,strlen(send_buf),1,1};\r
-        \r
-        send_big_data(type_,(char *)send_buf,strlen(send_buf));\r
-\r
-        free(send_buf);\r
-        return true;\r
-    }\r
-    else\r
-    {\r
-         return false;\r
-    }\r
-}\r
-\r
-void decode_file_checksum_2AE6(ble_read_data *buffer_handle)\r
-{\r
-    uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);\r
-\r
-    uint8_t msg_crc = get_crc_from_lrc(buffer_handle->lrcvalue);\r
-    if ((msg_crc == buffer_handle->crcvalue) \r
-    || (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID ))\r
-    {\r
-        uint8_t file_crc = get_crc_from_lrc(buffer_handle->file_recv_stat.lrcvalue);\r
-        uint8_t crc_recv = buffer_handle->data[sizeof(msg_header_t)];\r
-#if 1\r
-        if ((file_crc == crc_recv) ||\r
-            (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID))\r
-#else\r
-        if (file_crc == crc_recv) \r
-#endif\r
-        {\r
-            ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,1);\r
-            switch(buffer_handle->file_recv_stat.file_type)\r
-            {\r
-                case 1: //ota\r
-                    ble_reply_cmd(FILE_SUCC_TRANSFER,1);\r
-                    do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_STARTOTA,NULL,0);\r
-                    TRANSMIT_DATA=TRANS_OTA_SUCC;\r
-                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-        \r
-                    break;\r
-                case 2://mp3\r
-                    TRANSMIT_DATA=TRANS_MP3_SUCC;\r
-                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                    \r
-                    ble_reply_cmd(FILE_SUCC_TRANSFER,1);\r
-                    ble_mp3_list_update();\r
-\r
-                    break;\r
-                case 3://dial\r
-                    //TODO: 设置成当前下载的表盘\r
-                    if (install_dial() == ERRCODE_SUCC)\r
-                    {\r
-                        //ble_set_dial_by_id(ble_dial_uid);\r
-\r
-                        if(ble_dial_uid>5 ||  ble_dial_file_index==ble_dial_file_count)\r
-                        {\r
-                            TRANSMIT_DATA= TRANS_DIAL_SUCC;\r
-                            CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                        //0504\r
-                            ble_reply_cmd(DIAL_SUCC_INSTALL,1);\r
-                        }\r
-                        \r
-\r
-\r
-                      //  ble_reply_cmd(GET_TRANS_END_CMD,1);\r
-                        \r
-                    }\r
-                    else\r
-                    {\r
-                        TRANSMIT_DATA= TRANS_DIAL_FAIL;\r
-                        CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
-                        ble_reply_cmd(DIAL_SUCC_INSTALL,0);\r
-\r
-                    }\r
-                    break;\r
-                case 4://dial\r
-                     TRANSMIT_DATA=TRANS_BIN_SUCC;\r
-                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                    if( ble_bin_install(app_name))\r
-                    ble_reply_cmd(FILE_SUCC_TRANSFER,1);\r
-                    else\r
-                    ble_reply_cmd(FILE_SUCC_TRANSFER,0);\r
-\r
-                    // ble_mp3_list_update();\r
-\r
-                    break;\r
-                default:\r
-                    break;\r
-            }\r
-        }else{\r
-            ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,2);\r
-            switch (buffer_handle->file_recv_stat.file_type)\r
-            {\r
-             case 1: //ota\r
-                    TRANSMIT_DATA=TRANS_OTA_FAIL;\r
-                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                    break;\r
-            case 2://mp3\r
-                    TRANSMIT_DATA=TRANS_MP3_FAIL;\r
-                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
-                    break;\r
-            case 3://dial\r
-                    TRANSMIT_DATA= TRANS_DIAL_FAIL;\r
-                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                    break;\r
-\r
-            case 4://dial\r
-                    TRANSMIT_DATA= TRANS_BIN_FAIL;\r
-                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-        \r
-                    break;\r
-                default:\r
-                    break;\r
-            }\r
-\r
-        }\r
-    }else{\r
-        ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,0);\r
-        switch (buffer_handle->file_recv_stat.file_type)\r
-        {\r
-            case 1: //ota\r
-                TRANSMIT_DATA=TRANS_OTA_FAIL;\r
-                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                break;\r
-        case 2://mp3\r
-                TRANSMIT_DATA=TRANS_MP3_FAIL;\r
-                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
-                break;\r
-        case 3://dial\r
-                TRANSMIT_DATA= TRANS_DIAL_FAIL;\r
-                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                break;\r
-        case 4://dial\r
-                TRANSMIT_DATA= TRANS_BIN_FAIL;\r
-                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                break;\r
-            default:\r
-                break;\r
-        }\r
-    }\r
-    buffer_handle->file_recv_stat.recv_file_stat=0; \r
-}\r
-\r
-void decode_file_checksum(ble_read_data *buffer_handle)\r
-{\r
-    uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);\r
-\r
-    uint8_t msg_crc = get_crc_from_lrc(buffer_handle->lrcvalue);\r
-    if ((msg_crc == buffer_handle->crcvalue) \r
-    || (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID ))\r
-    {\r
-        uint8_t file_crc = get_crc_from_lrc(buffer_handle->file_recv_stat.lrcvalue);\r
-        uint8_t crc_recv = buffer_handle->data[sizeof(msg_header_t)];\r
-#if 1\r
-        if ((file_crc == crc_recv) ||\r
-            (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID))\r
-#else\r
-        if (file_crc == crc_recv) \r
-#endif\r
-        {\r
-            ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,1);\r
-            switch(buffer_handle->file_recv_stat.file_type)\r
-            {\r
-                case 1: //ota\r
-                    do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_STARTOTA,NULL,0);\r
-                   \r
-                    TRANSMIT_DATA=TRANS_OTA_SUCC;\r
-                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                    \r
-\r
-                    break;\r
-                case 2://mp3\r
-                    TRANSMIT_DATA=TRANS_MP3_SUCC;\r
-                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                    \r
-                    ble_reply_cmd(DIAL_INSTALL_REPY_CMD,1);\r
-                    ble_mp3_list_update();\r
-\r
-                    break;\r
-                case 3://dial\r
-                    //TODO: 设置成当前下载的表盘\r
-                    if (install_dial() == ERRCODE_SUCC)\r
-                    {\r
-                        //ble_set_dial_by_id(ble_dial_uid);\r
-\r
-                        if(ble_dial_uid>5 ||  ble_dial_file_index==ble_dial_file_count)\r
-                        {\r
-                            TRANSMIT_DATA= TRANS_DIAL_SUCC;\r
-                            CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                        //0504\r
-                            ble_reply_cmd(DIAL_INSTALL_REPY_CMD,1);\r
-                        }\r
-                        \r
-\r
-\r
-                      //  ble_reply_cmd(GET_TRANS_END_CMD,1);\r
-                        \r
-                    }\r
-                    else\r
-                    {\r
-                        TRANSMIT_DATA= TRANS_DIAL_FAIL;\r
-                        CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
-                        ble_reply_cmd(DIAL_INSTALL_REPY_CMD,0);\r
-\r
-                    }\r
-                    break;\r
-                default:\r
-                    break;\r
-            }\r
-        }else{\r
-            ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,2);\r
-            switch (buffer_handle->file_recv_stat.file_type)\r
-            {\r
-             case 1: //ota\r
-                    TRANSMIT_DATA=TRANS_OTA_FAIL;\r
-                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                    break;\r
-            case 2://mp3\r
-                    TRANSMIT_DATA=TRANS_MP3_FAIL;\r
-                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
-                    break;\r
-            case 3://dial\r
-                    TRANSMIT_DATA= TRANS_DIAL_FAIL;\r
-                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-        \r
-                    break;\r
-                default:\r
-                    break;\r
-            }\r
-\r
-        }\r
-    }else{\r
-        ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,0);\r
-        switch (buffer_handle->file_recv_stat.file_type)\r
-        {\r
-            case 1: //ota\r
-                TRANSMIT_DATA=TRANS_OTA_FAIL;\r
-                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                break;\r
-        case 2://mp3\r
-                TRANSMIT_DATA=TRANS_MP3_FAIL;\r
-                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-\r
-                break;\r
-        case 3://dial\r
-                TRANSMIT_DATA= TRANS_DIAL_FAIL;\r
-                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-                break;\r
-            default:\r
-                break;\r
-        }\r
-    }\r
-    buffer_handle->file_recv_stat.recv_file_stat=0; \r
-   \r
-}\r
-\r
-void type2AE0Data(ble_read_data *buffer_handle)\r
-{\r
-    uint16_t typeID = buffer_handle->cmd_header.cmdtype*256 + buffer_handle->cmd_header.cmdid;\r
-   \r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE0Data typeID:0x%04X datalen %d\r\n",typeID,buffer_handle->totalDataLen);\r
-    \r
-    bool checkcrc = (get_crc_from_lrc(buffer_handle->lrcvalue) == buffer_handle->crcvalue);\r
-\r
-    uint32_t num;\r
-    if ( (checkcrc == true ) || \r
-    (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID))\r
-    {\r
-        switch (typeID) //ID\r
-        {\r
-            case OTA_FILE_RECV_CMD://\r
-                {\r
-                    if (decode_ota_json( buffer_handle) == ERRCODE_SUCC)\r
-                    {\r
-                        ble_reply_cmd(OTA_FILE_RECV_CMD,1);\r
-                    }else{\r
-                        ble_reply_cmd(OTA_FILE_RECV_CMD,2);\r
-                    }               \r
-                }\r
-                break;\r
-            case MP3_FILE_RECV_CMD:\r
-                {\r
-                    if (decode_mp3_json( buffer_handle) == ERRCODE_SUCC)\r
-                    {\r
-                        ble_reply_cmd(MP3_FILE_RECV_CMD,1);\r
-                    }else{\r
-                        ble_reply_cmd(MP3_FILE_RECV_CMD,2);\r
-                    }               \r
-                }\r
-                break;\r
-            case DIAL_FILE_RECV_CMD:\r
-                {\r
-                    if (decode_dial_info( buffer_handle) == ERRCODE_SUCC)\r
-                    {\r
-                    \r
-                        //if(ble_dial_uid >=5 && \r
-                        // if(get_dial_num()>=MAX_BLE_EVENT_DIAL_NUM)\r
-                        // {\r
-                        //     ble_reply_cmd(DIAL_FILE_RECV_CMD,3);\r
-\r
-                        // }\r
-                        //else\r
-                        {\r
-                           \r
-                            ble_reply_cmd(DIAL_FILE_RECV_CMD,1);\r
-                        }\r
-                        \r
-                    }else{\r
-                        ble_reply_cmd(DIAL_FILE_RECV_CMD,2);\r
-                    }               \r
-                }\r
-                break;\r
-            case FILE_CHECKSUM_RECV_CMD:\r
-                decode_file_checksum(buffer_handle);\r
-                break;\r
-            case SINGLE_DIAL_FILE_RECV_CMD:\r
-                if (decode_single_dial_info(buffer_handle) == ERRCODE_SUCC)\r
-                {\r
-                    ble_reply_cmd(SINGLE_DIAL_FILE_RECV_CMD,1);\r
-                } else {\r
-                    ble_reply_cmd(SINGLE_DIAL_FILE_RECV_CMD,2);\r
-                }         \r
-                break;\r
-            case EPO_DATA_RECV_CMD:\r
-                break;\r
-            case APP_INAUIRE_EXC_FILE_CMD:\r
-                get_tar_dir_file_count();\r
-\r
-                if(!read_dir_send_json())\r
-                {\r
-                    ble_reply_cmd(APP_INAUIRE_EXC_FILE_CMD,2);\r
-                }\r
-                break;\r
-                \r
-           case APP_START_SEND_EXC_FILE_CMD:\r
-                num=(ble_nus_max_data_len-18); \r
-                if(num>482)num=482;\r
-                if(!Read_tar_file_buf_send_Data(num,0x63))\r
-                {\r
-                    ble_reply_cmd(APP_START_SEND_EXC_FILE_CMD,2);\r
-                }\r
-                break;\r
-            case APP_SEND_EXC_FILE_END_CMD:\r
-                if(!tar_rmove(file_name))\r
-                {\r
-                    ble_reply_cmd(APP_SEND_EXC_FILE_END_CMD,2);\r
-                }\r
-                if(!read_dir_send_json())\r
-                {\r
-                    ble_reply_cmd(APP_SEND_EXC_FILE_END_CMD,2);\r
-                }\r
-                break;\r
-                \r
-\r
-            default:\r
-                break;            \r
-        }\r
-        \r
-    }else{\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE0Data CRC failed!\n");\r
-    }\r
-   \r
-}\r
-//\r
-void type2AE6Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue)\r
-{\r
-    uint16_t cmd = cmd_buf[1]*256+cmd_buf[2];\r
-     #ifdef BLE_LOG\r
-    \r
-    #endif\r
-      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE6Data:0x%04X\r\n",cmd);\r
-    // uint8_t typeID = cmd_buf[2];\r
-    switch (cmd)\r
-    {\r
-        case OTA_FILE_MSG_CMD  :\r
-        {\r
-            if (decode_ota_json( buffer_handle) == ERRCODE_SUCC)\r
-            {\r
-                ble_reply_cmd(OTA_FILE_MSG_CMD,1);\r
-            }else{\r
-                ble_reply_cmd(OTA_FILE_MSG_CMD,2);\r
-            }               \r
-        }\r
-        break;\r
-\r
-        case OTA_FILE_RECV_CMD://\r
-        {\r
-            if (decode_ota_json( buffer_handle) == ERRCODE_SUCC)\r
-            {\r
-                ble_reply_cmd(OTA_FILE_RECV_CMD,1);\r
-            }else{\r
-                ble_reply_cmd(OTA_FILE_RECV_CMD,2);\r
-            }               \r
-        }\r
-        break;\r
-\r
-\r
-        case DIAL_COLLECT_FILE_CMD  :\r
-        {\r
-            if (decode_dial_info( buffer_handle) == ERRCODE_SUCC)\r
-            {\r
-                ble_reply_cmd(DIAL_COLLECT_FILE_CMD,1);\r
-            }else{\r
-                ble_reply_cmd(DIAL_COLLECT_FILE_CMD,2);\r
-            }\r
-            break;             \r
-        }\r
-\r
-        case DIAL_SINGEL_FILE_CMD  :\r
-        {\r
-           if (decode_single_dial_info(buffer_handle) == ERRCODE_SUCC)\r
-            {\r
-                ble_reply_cmd(DIAL_SINGEL_FILE_CMD,1);\r
-\r
-           } else {\r
-\r
-                ble_reply_cmd(DIAL_SINGEL_FILE_CMD,2);\r
-\r
-            }         \r
-            break;      \r
-        }\r
-        case MP3_FILE_CMD  :\r
-        {\r
-            if (decode_mp3_json( buffer_handle) == ERRCODE_SUCC)\r
-            {\r
-                ble_reply_cmd(MP3_FILE_CMD,1);\r
-            }else{\r
-                ble_reply_cmd(MP3_FILE_CMD,2);\r
-            }              \r
-        }\r
-        break;\r
-        case BIN_FILE_CMD  :\r
-        {\r
-            if (decode_bin_json( buffer_handle) == ERRCODE_SUCC)\r
-            {\r
-                ble_reply_cmd(BIN_FILE_CMD,1);\r
-            }else{\r
-                ble_reply_cmd(BIN_FILE_CMD,2);\r
-            }              \r
-        }\r
-        break;\r
-\r
-  \r
-        case FILE_CHECKSUM_RECV_CMD:\r
-            decode_file_checksum(buffer_handle);\r
-            break;\r
-        // case OTA_FILE_DATA_CMD :\r
-        // {\r
-        //     if (decode_ota_data( buffer_handle,data,datalen, crcvalue) == ERRCODE_SUCC)\r
-        //     {\r
-\r
-        //     }else{\r
-        //         ble_reply_cmd(OTA_FILE_DATA_CMD,0);\r
-        //     }               \r
-        // }\r
-\r
-        case FILE_CHECKSUM_RECV_CMD_ZHIHUI :\r
-            decode_file_checksum_2AE6(buffer_handle);\r
-            break;\r
-            \r
-        case OTA_FILE_FAIL_CMD :\r
-\r
-            break;\r
-\r
-       case APP_DELETE_CMD  :\r
-            delete_app( cmd, data,datalen,crcvalue);\r
-            break;          \r
-        case GET_LIST_CMD :\r
-\r
-            get_app_list( cmd, data,datalen,crcvalue);\r
-\r
-            break;          \r
-        case GET_APP_MSG_CMD:\r
-            get_watch_msg( cmd, data,datalen,crcvalue);\r
-\r
-            break;         \r
-        default:\r
-            break;\r
-    }\r
-}\r
-   \r
-\r
-\r
-\r
-void dumpHeader(msg_header_t *msgheader)\r
-{\r
-    #ifdef BLE_LOG\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"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
-    #endif\r
-}\r
-\r
-errcode_t check_header(msg_header_t *header )\r
-{\r
-    if( (header->direction == MSG_DIRECTION_RECV || header->direction == MSG_DIRECTION_RECV_ANDROID) \r
-    && (header->cmdtype > 0 && header->cmdtype <= 6 )\r
-    && (header->cmdid > 0 && header->cmdid <= 0x50 )\r
-    )\r
-    {\r
-        // 这个是合理的值,可以当做header来处理\r
-        dumpHeader(header);\r
-        return ERRCODE_SUCC;\r
-    }else{\r
-        //非header\r
-        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"not first package , no header!\n");\r
-        return ERRCODE_FAIL;\r
-    }\r
-}\r
-\r
-\r
-errcode_t cancel_recv_file(uint8_t flag)\r
-{\r
-    if(BR_TRANSFER_timer)\r
-    {\r
-        timer_flie_flag=0;\r
-        osTimerStop(BR_TRANSFER_timer);\r
-        osTimerDelete(BR_TRANSFER_timer);\r
-        BR_TRANSFER_timer = NULL;\r
-    }\r
-\r
-    if(ble_read_timer_p)\r
-    {\r
-        if(flag)\r
-        {\r
-            if(ble_read_timer_p->file_recv_stat.file_type==1)\r
-            {\r
-                TRANSMIT_DATA=TRANS_OTA_FAIL;\r
-            }\r
-            else if (ble_read_timer_p->file_recv_stat.file_type==3)\r
-            {\r
-                TRANSMIT_DATA=TRANS_DIAL_FAIL;\r
-            }\r
-            else if(ble_read_timer_p->file_recv_stat.file_type==2)\r
-            {\r
-                TRANSMIT_DATA=TRANS_MP3_FAIL;\r
-            }\r
-             else if(ble_read_timer_p->file_recv_stat.file_type==4)\r
-            {\r
-                TRANSMIT_DATA=TRANS_BIN_FAIL;\r
-            }\r
-\r
-            else\r
-            {\r
-                TRANSMIT_DATA=TRANS_FREE;\r
-            }\r
-            ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,0);//接收失败\r
-        }\r
-        else\r
-        {\r
-            TRANSMIT_DATA=TRANS_FREE;\r
-        }\r
-\r
-        ble_read_timer_p->receive_file_flag = 0;\r
-\r
-        if (ble_read_timer_p->file_recv_stat.recv_file_stat != 2) //已经下载完毕的文件,没有必要cancel了。\r
-        {\r
-            if (ble_read_timer_p->file_recv_stat.file!=NULL)\r
-            {\r
-                fclose(ble_read_timer_p->file_recv_stat.file);\r
-                ble_read_timer_p->file_recv_stat.file = NULL;\r
-            }\r
-\r
-            if (ble_read_timer_p->file_recv_stat.file_type == 2)\r
-            {\r
-                char musicpath[64]={0};\r
-                get_music_path(musicpath,64);\r
-                //"/user/userdata/music"\r
-                char filepath[256]={0};\r
-                create_mp3_name(filepath,musicpath,ble_read_timer_p->file_recv_stat.file_name);\r
-                remove(filepath);\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);\r
-            }\r
-            else if (ble_read_timer_p->file_recv_stat.file_type == 3)\r
-            {\r
-                char filepath[128]={0};\r
-                if (get_file_recv_file_path(ble_read_timer_p->file_recv_stat.file_name,strlen(ble_read_timer_p->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)\r
-                {\r
-                    remove(filepath);\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);\r
-                }\r
-            }\r
-\r
-            if (ble_read_timer_p->file_recv_stat.file_name != NULL)\r
-            {\r
-                free(ble_read_timer_p->file_recv_stat.file_name);\r
-                ble_read_timer_p->file_recv_stat.file_name=NULL;\r
-            }\r
-            ble_read_timer_p->file_recv_stat.recv_file_stat = -1;\r
-            //ble_read_timer_p=NULL;\r
-            CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-        }\r
-        // else\r
-        // {\r
-        //     CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-        // }\r
-        ble_read_timer_p=NULL;\r
-       \r
-    }\r
-    \r
-   \r
-\r
-    return ERRCODE_SUCC;\r
-}\r
-\r
-uint8_t get_OTA_recv_value()\r
-{\r
-    return OTA_FILE_value;\r
-}\r
-\r
-void Set_OTA_recv_value()\r
-{\r
-    OTA_FILE_value=0;\r
-    return;\r
-}\r
-\r
-static errcode_t save_package_sample(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size)\r
-{\r
-\r
-    //保存前 4 bytes + 最后 1 byte\r
-    int save_len = 4;\r
-    uint8_t last_byte = calculate_lrc(data,event_size,0x00);\r
-    if (event_size < 4)\r
-    {\r
-        save_len = event_size;\r
-    }\r
-    memset(buffer_handle->last_data_sample,0,sizeof(buffer_handle->last_data_sample));\r
-    buffer_handle->last_data_size = event_size;\r
-    memcpy_s(buffer_handle->last_data_sample,sizeof(buffer_handle->last_data_sample),data,save_len);\r
-    buffer_handle->last_data_sample[4]=last_byte;\r
-\r
-    return ERRCODE_SUCC;\r
-}\r
-static errcode_t check_package_same(uint8_t* lastdata,uint8_t *newdata , uint16_t cmp_size)\r
-{\r
-\r
-\r
-    //对比前 4 bytes + 最后 1 byte    \r
-    int save_len = 4;\r
-    uint8_t current_sample_data[5];\r
-    uint8_t last_byte = calculate_lrc(newdata,cmp_size,0x00);\r
-    if (cmp_size < 4)\r
-    {\r
-        save_len = cmp_size;\r
-    }\r
-    memset(current_sample_data,0,sizeof(current_sample_data));    \r
-    memcpy_s(current_sample_data,sizeof(current_sample_data),newdata,save_len);\r
-    current_sample_data[4]=last_byte;\r
-    \r
-    if (memcmp(lastdata,newdata,5)==0)\r
-    {\r
-        return ERRCODE_SUCC;\r
-    }else{\r
-        return ERRCODE_FAIL;\r
-    }\r
-}\r
-\r
-errcode_t handle_recv_file(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size)\r
-{\r
-\r
-    if( event_size == 0 || data == NULL ) return ERRCODE_FAIL;\r
-    \r
-    if (buffer_handle->last_data_size == event_size)\r
-    {\r
-        if (check_package_same(buffer_handle->last_data_sample,data,event_size) == ERRCODE_SUCC)\r
-        {\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error handle_recv_file recve same package header 0x%02X%02X%02X%02X end 0x%02X skip \n"\r
-            ,buffer_handle->last_data_sample[0]\r
-            ,buffer_handle->last_data_sample[1]\r
-            ,buffer_handle->last_data_sample[2]\r
-            ,buffer_handle->last_data_sample[3]\r
-            ,buffer_handle->last_data_sample[4]);\r
-            // return ERRCODE_FAIL;\r
-        }\r
-    }\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file %d\n",event_size);\r
-    save_package_sample(buffer_handle,data,event_size);\r
-\r
-\r
-    //第一帧要创建文件\r
-    if((buffer_handle->file_recv_stat.recv_file_stat <= 0) && buffer_handle->file_recv_stat.file == NULL )\r
-    {\r
-        buffer_handle->file_recv_stat.lrcvalue = 0;\r
-        if (buffer_handle->file_recv_stat.file_type == 1)\r
-        {\r
-\r
-            buffer_handle->file_recv_stat.file = fopen(UP_DATE_FWPKG_PATH,"w+");\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",UP_DATE_FWPKG_PATH,buffer_handle->file_recv_stat.file);\r
-\r
-        }\r
-        else if (buffer_handle->file_recv_stat.file_type == 2)\r
-        {\r
-            char musicpath[64]={0};\r
-            get_music_path(musicpath,64);\r
-            //"/user/userdata/music"\r
-            char filepath[256]={0};\r
-            create_mp3_name(filepath,musicpath,buffer_handle->file_recv_stat.file_name);\r
-\r
-            buffer_handle->file_recv_stat.file = fopen(filepath,"w+");\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);\r
-        }\r
-        else\r
-        {\r
-            char filepath[128]={0};\r
-            if (get_file_recv_file_path(buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)\r
-            {\r
-                buffer_handle->file_recv_stat.file = fopen(filepath,"w+");\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);\r
-            }else{\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);\r
-            }            \r
-        }\r
-        if (buffer_handle->file_recv_stat.file == NULL)\r
-        {\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6185 buffer_handle->file_recv_stat.file  NULL\n");\r
-            return ERRCODE_FAIL;\r
-        }\r
-        buffer_handle->file_recv_stat.recv_file_stat = 1;\r
-        OTA_FILE_value=0;\r
-        ////////////////创建文件传输超时定时器//////////////////\r
-        uint32_t tick;\r
-        osStatus_t retTimer;\r
-        if(BR_TRANSFER_timer!=NULL)\r
-        {\r
-            osTimerDelete(BR_TRANSFER_timer);\r
-            BR_TRANSFER_timer = NULL;\r
-        }\r
-        ble_read_timer_p=buffer_handle;\r
-        timer_flie_flag=10;\r
-\r
-        BR_TRANSFER_timer = osTimerNew((osTimerFunc_t)ble_transfer_Timer_CallBack, osTimerPeriodic, NULL, NULL);\r
-        tick =1000;// osMs2Tick(1000);\r
-        retTimer = osTimerStart(BR_TRANSFER_timer, tick);\r
-        if (retTimer != osOK && BR_TRANSFER_timer != NULL) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);\r
-            osTimerDelete(BR_TRANSFER_timer);\r
-            BR_TRANSFER_timer = NULL;\r
-            return ERRCODE_FAIL;\r
-        }\r
-        //  if(buffer_handle->file_recv_stat.received_size==0)\r
-    {\r
-        if(buffer_handle->file_recv_stat.file_type==3)\r
-        TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING;\r
-        \r
-        if(buffer_handle->file_recv_stat.file_type==1)\r
-        TRANSMIT_DATA=TRANS_OTA_TRANSMITTING;\r
-    \r
-        if(buffer_handle->file_recv_stat.file_type==2)\r
-        TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;\r
-\r
-        CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-    }\r
-    \r
-        ///////////////////////////////////////////////////////////\r
-    }\r
-    if (buffer_handle->file_recv_stat.file == NULL)\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6194 buffer_handle->file_recv_stat.file  \n");\r
-        return ERRCODE_FAIL;\r
-    }\r
-    //写入文件\r
-    size_t writtensize = fwrite(data,1,event_size,buffer_handle->file_recv_stat.file);\r
-    if(writtensize == event_size)\r
-    {\r
-        timer_flie_flag=10;\r
-\r
-        buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data,event_size,buffer_handle->file_recv_stat.lrcvalue);\r
-                buffer_handle->file_recv_stat.received_size += event_size;\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d\n",buffer_handle->file_recv_stat.received_size);\r
-        OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;\r
-\r
-\r
-    }else{\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,event_size);\r
-        return ERRCODE_FAIL;\r
-    }\r
-\r
-    //检查文件是否写完\r
-    if(buffer_handle->file_recv_stat.file_size == buffer_handle->file_recv_stat.received_size)\r
-    {\r
-        if (buffer_handle->file_recv_stat.file!=NULL)\r
-        {\r
-            fclose(buffer_handle->file_recv_stat.file);\r
-            buffer_handle->file_recv_stat.file = NULL;\r
-        }\r
-        if (buffer_handle->file_recv_stat.file_name != NULL)\r
-        {\r
-            free(buffer_handle->file_recv_stat.file_name);\r
-            buffer_handle->file_recv_stat.file_name=NULL;\r
-        }\r
-        buffer_handle->file_recv_stat.recv_file_stat = 2;\r
-        buffer_handle->receive_file_flag = 0;\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received success \n");\r
-\r
-        if(BR_TRANSFER_timer)\r
-        {\r
-            osTimerStop(BR_TRANSFER_timer);\r
-            osTimerDelete(BR_TRANSFER_timer);\r
-            BR_TRANSFER_timer = NULL;\r
-        }\r
-        ble_read_timer_p=NULL;\r
-        TRANSMIT_DATA=FILE_IS_DONE;\r
-\r
-        CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);\r
-       \r
-        ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,1);//接收成功\r
-    }\r
-\r
-    return ERRCODE_SUCC;\r
-}\r
-\r
-//长数据解析\r
-void bleLongRecvData(ble_read_data *buffer_handle,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
-    #ifdef BLE_LOG\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type:%d %d data_size:%d data:%x crcvalue:%x\r\n",\r
-    buffer_handle->cmd_header.cmdtype,\r
-    buffer_handle->cmd_header.cmdid,\r
-    data_size,\r
-    data,\r
-    crcvalue);\r
-    #endif\r
-\r
-    if(buffer_handle->handle==data2ae4Cmd)\r
-    {\r
-        type2AE4Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue);\r
-    }\r
-    else if (buffer_handle->handle==data2ae3Cmd)\r
-    {\r
-        type2AE3Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue);\r
-    }\r
-    else if (buffer_handle->handle==data2ae1Cmd)\r
-    {\r
-        type2AE1Data(buf_cmd,data,data_size,totalData,crcvalue);\r
-    }\r
-    else if (buffer_handle->handle==data2ae0Cmd)\r
-    {\r
-        type2AE0Data(buffer_handle);\r
-    }\r
-    else if (buffer_handle->handle==data2ae6Cmd)\r
-    {\r
-        type2AE6Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue);\r
-    }\r
-}\r
-\r
-\r
-/// @brief 解码收到的msg\r
-/// @param buffer_handle \r
-/// @return \r
-static errcode_t handle_ble_msg(ble_read_data *buffer_handle)\r
-{\r
-\r
-    if(buffer_handle->buffer_to_file == 0)\r
-    {\r
-        bleLongRecvData(buffer_handle,buffer_handle->data+sizeof(msg_header_t),buffer_handle->totalDataLen,(uint8_t*)(&buffer_handle->cmd_header),buffer_handle->data,buffer_handle->crcvalue);\r
-\r
-    }else{\r
-        //处理缓存成文件的 \r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle ble msg file buffer! not implement\n");\r
-    }\r
-    return ERRCODE_SUCC;\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
-\r
-    if(buffer_handle->receive_file_flag == 1 )\r
-    {\r
-        //接收文件\r
-        if(buffer_handle->handle==data2ae6Cmd)\r
-        return decode_ota_data( buffer_handle,totalData,event_size,totalData[event_size-1]);\r
-        else\r
-        return handle_recv_file(buffer_handle,totalData,event_size);\r
-    }\r
-\r
-    msg_header_t *header =  (msg_header_t*)totalData;        \r
-    //第一帧\r
-    if (event_size > sizeof(msg_header_t) && check_header(header) == ERRCODE_SUCC  )\r
-    {\r
-\r
-        if (header->direction == MSG_DIRECTION_RECV_ANDROID)\r
-        {\r
-            //uapi_dev_runtime_set_android_connection_status(1);\r
-        }else{\r
-           // uapi_dev_runtime_set_android_connection_status(0);\r
-        }\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
-        if (buffer_handle->data!=NULL && buffer_handle->data_len > 0)\r
-        {\r
-            free(buffer_handle->data);\r
-            buffer_handle->data = NULL;\r
-        }\r
-        if (buffer_handle->tmpfilehandle!=NULL && buffer_handle->data_len>0)\r
-        {\r
-            fclose(buffer_handle->tmpfilehandle);\r
-            buffer_handle->tmpfilehandle = NULL;\r
-        }\r
-        buffer_handle->data_len = 0;\r
-        buffer_handle->crcvalue = 0;\r
-        buffer_handle->lrcvalue = 0;\r
-        buffer_handle->buffer_to_file = 0;\r
-        buffer_handle->decode_type = 0;\r
-        buffer_handle->tmpfilehandle = NULL;\r
-        uint32_t timestamp_ble=0;\r
-        uapi_get_timestampe_ss(&timestamp_ble);\r
-        buffer_handle->last_timestamp = timestamp_ble;\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
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"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
-        if(buffer_handle->totalDataLen+sizeof(msg_header_t)+1 > MAX_BLE_MSG_PACKAGE_LEN)\r
-        {\r
-            //如果总长度超过限定大小,则写入文件做缓存。\r
-            buffer_handle->buffer_to_file = 1;\r
-            int filelen = strlen(BLE_MSG_TMP_FILE_NAME);\r
-            buffer_handle->data = malloc(filelen);\r
-            if (buffer_handle->data== NULL) \r
-            {\r
-                return ERRCODE_MALLOC;\r
-            }\r
-            //生成临时文件名\r
-            sprintf_s((char*)buffer_handle->data,filelen,BLE_MSG_TMP_FILE_NAME,buffer_handle->handle);\r
-            buffer_handle->tmpfilehandle = fopen((const char*)buffer_handle->data,"w+");\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create ble protocol tmpfile %s handle %X\n",buffer_handle->data,buffer_handle->tmpfilehandle);\r
-            if (buffer_handle->tmpfilehandle != NULL)\r
-            {\r
-                //写buffer到文件\r
-                size_t ret =fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle);\r
-                buffer_handle->lrcvalue = calculate_lrc(totalData+sizeof(msg_header_t),header->package_len,0x00);\r
-                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"write %d to buffer file!\n",ret);\r
-            }\r
-            buffer_handle->data_len += event_size;\r
-           \r
-        }else{\r
-            //如果长度在限定大小之内。则写入内存中缓存。\r
-            buffer_handle->buffer_to_file = 0;\r
-            buffer_handle->data = malloc(buffer_handle->totalDataLen+sizeof(msg_header_t)+1);\r
-            if (buffer_handle->data== NULL) \r
-            {\r
-                return ERRCODE_MALLOC;\r
-            }\r
-            //创建缓存开始存储包数据\r
-            if(buffer_handle->cmd_header.package_len >=0)\r
-            {\r
-                memcpy_s(buffer_handle->data,buffer_handle->totalDataLen+sizeof(msg_header_t)+1,totalData,event_size);\r
-                buffer_handle->lrcvalue = calculate_lrc(totalData+sizeof(msg_header_t),header->package_len,0x00);\r
-                buffer_handle->data_len += event_size;\r
-            }\r
-\r
-            //单一包\r
-            if(event_size == sizeof(msg_header_t)+buffer_handle->totalDataLen+1)\r
-            {\r
-                buffer_handle->crcvalue = totalData[event_size-1];\r
-            }\r
-        }  \r
-        \r
-    }else{\r
-        //处理第二包以后的数据\r
-\r
-        //经过第一包处理,仍然data==NULL证明第一帧就是错的,要退出解析。\r
-        if (buffer_handle->data== NULL) \r
-        {\r
-            return ERRCODE_MALLOC;\r
-        }\r
-        //此处是最后一帧 event_size = (buffer_handle->totalDataLen-buffer_handle->data_len) + 1\r
-        if (event_size == (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 -buffer_handle->data_len ))\r
-        {\r
-            if(buffer_handle->buffer_to_file == 1)\r
-            {\r
-                fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle);\r
-            \r
-            }else{\r
-                memcpy_s(buffer_handle->data+buffer_handle->data_len,buffer_handle->totalDataLen,totalData,event_size);\r
-                    \r
-            }\r
-            buffer_handle->lrcvalue = calculate_lrc(totalData,event_size,buffer_handle->lrcvalue);\r
-            buffer_handle->data_len += event_size;                \r
-        }else if (event_size < (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 - buffer_handle->data_len))  //中间帧\r
-        {\r
-            if(buffer_handle->buffer_to_file == 1)\r
-            {\r
-                fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle);\r
-            \r
-            }else{\r
-                memcpy_s(buffer_handle->data+buffer_handle->data_len,(buffer_handle->totalDataLen  + sizeof(msg_header_t) + 1 - buffer_handle->data_len),totalData,event_size);\r
-                    \r
-            }\r
-            buffer_handle->lrcvalue = calculate_lrc(totalData,event_size,buffer_handle->lrcvalue);\r
-            buffer_handle->data_len += event_size;                            \r
-        }else{ //异常帧\r
-              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"error event_size %d , should <= %d\n",event_size, (buffer_handle->totalDataLen  + sizeof(msg_header_t) + 1 - buffer_handle->data_len) );\r
-            \r
-        }\r
-        \r
-    }\r
-    //如果包完整接收,进行crc校验\r
-    if( (buffer_handle->totalDataLen  + sizeof(msg_header_t) + 1 ) == buffer_handle->data_len )\r
-    {\r
-        //我们认为最后一个包,应该不包含其他包,因此其最后一位,应当就是crc值,因此可直接获取crc值\r
-        buffer_handle->crcvalue = buffer_handle->data[buffer_handle->data_len - 1];//获取crc\r
-        //最后一位校验位清0,方便字符串处理\r
-        buffer_handle->data[buffer_handle->data_len - 1] = 0;\r
-\r
-        //缓存到文件的,处理方法会不同因此单独解决\r
-        if(buffer_handle->buffer_to_file == 1)\r
-        {\r
-            //先关闭临时文件,然后把文件名给协议解析函数即可。\r
-            if (buffer_handle->tmpfilehandle != NULL)\r
-            {\r
-                fclose(buffer_handle->tmpfilehandle);\r
-                buffer_handle->tmpfilehandle=NULL;\r
-            }\r
-        }\r
-        // #define COMMON_CRC_MSG \r
-        //通用回复crc校验结果,不是所有指令都一致,暂时取消,在每个指令内部进行回复\r
-        #ifdef COMMON_CRC_MSG \r
-        if (get_crc_from_lrc(buffer_handle->lrcvalue) != buffer_handle->crcvalue)\r
-        {\r
-            //发送校验失败\r
-            ble_reply_msg(buffer_handle->cmd_header.cmdtype,buffer_handle->cmd_header.cmdid,0);\r
-\r
-        }else        \r
-        #endif \r
-        {\r
-            //协议解析指令\r
-            handle_ble_msg(buffer_handle);\r
-        }\r
-        //所有操作都完成,要释放 data \r
-        if(buffer_handle->data != NULL)\r
-        {\r
-            free(buffer_handle->data);\r
-            buffer_handle->data=NULL;\r
-        }\r
-        \r
-    }\r
-    return ERRCODE_SUCC;\r
-}\r
-\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
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"event size (%d) is less than msg_header_t (%d) ",event_size,sizeof(msg_header_t));\r
-       // return ;\r
-    }\r
-    #ifdef BLE_LOG\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bleDataRecv handle:%d\r\n",handle); \r
-    #endif\r
-    int last_unused_handle_index = -1;\r
-    int handle_index_found = -1;\r
-    for(int i = 0;i<MAX_HANDLE_NUM;i++)\r
-    {   \r
-        if(handle_l[i].handle == 0 && last_unused_handle_index == -1)\r
-        {\r
-            last_unused_handle_index = i;            \r
-        }\r
-        if(handle_l[i].handle == handle)\r
-        {\r
-            //找到当前handle的缓存数据 ,进行组包\r
-            handle_index_found = i;\r
-            break;\r
-        }\r
-    }\r
-    //如果没找到已经用到的handle_l,就用第一个空的handle_l\r
-    if(last_unused_handle_index >=0 && handle_index_found == -1)\r
-    {\r
-        handle_index_found = last_unused_handle_index;            \r
-    }\r
-\r
-    if(handle_index_found>=0)\r
-    {\r
-       //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_index_found:index %d addr %X\r\n",handle_index_found,&handle_l[handle_index_found]); \r
-        handle_l[handle_index_found].handle = handle;\r
-        combine_data_internal(&handle_l[handle_index_found],totalData,event_size);\r
-    }\r
-    else\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"no empty handle_l found! skip this msg!\n");\r
-\r
-    \r
-}\r
-\r
-void free_ble_data(void)//以防断开蓝牙没有释放数据类型\r
-{\r
-    blesrv_service_recv_msg_handler(0xff,(uint8_t*)"clean",6);\r
-    return;\r
-    \r
-}\r
-\r
-\r
-void cancel_AI_cur_chat(void)\r
-{\r
-    blesrv_service_recv_msg_handler(0xff,(uint8_t*)"AI_cancel_AI",13);\r
-    return;\r
-    //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5);\r
-}\r
-\r
-void free_ble_data_Event(void)//以防断开蓝牙没有释放数据类型\r
-{\r
-   \r
-    totalpack = 0;\r
-    muiltFlag = 0; \r
-    packdataLen = 0;\r
-    totalDataLen = 0;\r
-    ANCSBigBufFlag = 0;\r
-\r
-    recvBigDataBufState = false;\r
-    sendbigDataBufState = false;\r
-\r
-    is_connect_synchronization_time=0;\r
-\r
-\r
-    cancel_recv_file(1);\r
-\r
-    for (int i = 0 ; i < MAX_HANDLE_NUM ; i++)\r
-    {\r
-        if (handle_l[i].data != NULL)\r
-        {\r
-            free(handle_l[i].data);\r
-            handle_l[i].data=NULL;\r
-        }\r
-        memset((void*)&handle_l[i],0,sizeof(ble_read_data));\r
-    }\r
-    return;\r
-    \r
-}\r
-\r
-//发送AI录音准备就绪国内/\r
-/*使用模型:\r
-0:文心一言\r
-1:ChatGPT\r
-2:KIMI\r
-3:豆包*/\r
-bool send_AI_is_ready_(uint8_t type)\r
-{\r
-    \r
-    if(AI_is_end_state==0)\r
-    {  \r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪\r\n");\r
-        ble_data_type type_={0x05,0x05,1,1,1};\r
-        send_big_data(type_,(char *)&type,1);\r
-        AI_is_end_state=1;\r
-        return true;\r
-    }\r
-    else\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪失败,没有正确回复结束\r\n");\r
-        return false;\r
-    }\r
-    //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x05, 5);\r
-}\r
-\r
-static uint8_t AI_is_ready_type=0;\r
-\r
-bool send_AI_is_ready(uint8_t type)\r
-{\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪\r\n");\r
-    AI_is_ready_type=type;\r
-    blesrv_service_recv_msg_handler(0xff,(uint8_t*)"AI_is_ready",12);\r
-    return true;\r
-}\r
-\r
-void cancel_AI_cur_chat_(void)\r
-{\r
-    //if(AI_is_end_state)\r
-    {\r
-          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"取消当前AI对话\r\n");\r
-        uint8_t data=1;\r
-        ble_data_type type_={0x05,0x07,1,1,1};\r
-        send_big_data(type_,(char *)&data,1);\r
-        AI_is_end_state=0;\r
-        \r
-    }\r
-    //else\r
-    // {\r
-    //       WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"已经取消当前AI对话无需再次取消\r\n");\r
-    // }\r
-    \r
-\r
-    //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5);\r
-}\r
-\r
-//接收app下发的原始数据 \r
-void revBleOldData(uint8_t *buf, uint16_t event_size,uint16_t handle)//每包的数据大小\r
-{\r
-      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle :%d %s event_size %d\r\n",handle,getHandlname(handle),event_size);\r
-    if(handle==0xff)\r
-    {\r
-        if(strcmp("AI_cancel_AI",(char *)buf)==0)\r
-        {\r
-            cancel_AI_cur_chat_();\r
-        }\r
-        else if(strcmp("AI_is_ready",(char *)buf)==0)\r
-        {\r
-           send_AI_is_ready_(AI_is_ready_type);\r
-        }\r
-        else\r
-        {\r
-            free_ble_data_Event();\r
-        }\r
-       \r
-        return;\r
-    }\r
-\r
-    bleDataRecv(buf,event_size,handle);\r
-}\r
-#endif\r
-#endif\r
-#ifdef __cplusplus\r
-}\r
+/**
+ * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.
+ * Description: alipay bluetooth module.
+ * Author:
+ * Create:
+ */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include "common_def.h"
+#include "bts_def.h"
+#include "bts_gatt_stru.h"
+#include "bts_a2dp_source.h"
+#include "bts_gatt_server.h"
+#include "bts_le_gap.h"
+#include "osal_task.h"
+#include "securec.h"
+#include "wearable_log.h"
+#include <stdint.h>
+#include <stdio.h>
+#include "stdbool.h"
+#include "bts_br_gap.h"
+
+#ifdef SUPPORT_BATTERY_SERVICE
+#include "battery_hal.h"
+#endif
+
+#include "bleService.h"
+#include "alipay_feature.h"
+
+// #include "alipay_bluetooth.h"
+
+#include "bts_a2dp_sink.h"
+#include "osal_timer.h"
+#include "bleEvent.h"
+#include "broadcast_feature.h"
+#include <sys/stat.h>
+#if 1//#ifdef //SUPPORT_BLE_SERVICE
+#include "app_common_api.h"
+// #include "hidService.h"
+#include "../../../../../open_source/openharmony/third_party/cJSON/cJSON.h"
+#include "errcode.h"
+#include "sys/statfs.h"
+
+#ifdef BLE_INSTRUCT
+#include "bleInstruct.h"
+#endif
+
+#include "custom_utils.h"
+#include "custom_runtime.h"
+#include "bleANCS.h"
+#ifdef FD230
+#include "Bluetooyhpabpserver.h"
+#endif
+#include "custom_save_runtime.h"
+
+#define DEBUG_TEST (0)
+#define CRC_CHECK_ERR 0 //crc校验失败
+#define JSON_CHECK_OK 1 //json解析成功
+#define JSON_CHECK_ERR 2 //json解析失败
+
+#define AI_TXT_BUF_MAX_LEN 1024*3 //json解析失败
+
+
+#define  MAX_BLE_EVENT_DIAL_NUM  (10) //表盘最大数量
+
+#include "upg_common_porting.h"
+
+
+uint32_t packdataLen = 0;
+uint32_t totalDataLen = 0;
+uint8_t totalpack = 0;
+uint8_t cmd_data[17];
+uint8_t *recvData;
+#include "los_memory.h"
+
+#define MAX_BLE_MSG_PACKAGE_LEN (1024*5)  //包缓存最大5k
+#define BLE_MSG_TMP_FILE_NAME "/user/userdata/ble_tmp_buf_%04X"
+typedef struct 
+{
+    int handle;
+    int data_len ;
+    int totalDataLen;
+    int buffer_to_file; //1 buffer to file , 0 buffer to ram
+    int decode_type; //1 with header , 2 no header
+    FILE *tmpfilehandle;// 如果buffer to file , 则在此保存handle
+    msg_header_t cmd_header;
+    uint8_t *data;//if buffer_to_file is 1, than data is the filename , else  data is the ram buffer.
+    uint8_t crcvalue;
+    uint8_t lrcvalue; //计算crc用的临时变量
+    uint8_t lrcvalue2; //计算crc用的临时变量
+    uint32_t last_timestamp;// last package receive time
+    uint8_t receive_file_flag;//1 接收文件 0 不接收文件
+    file_recv_stat_t file_recv_stat;
+    uint8_t last_data_sample[5]; //专门给文件传输过程中重复包判定用。目前只是取前5个字节,实际应该再做优化算法。
+    uint16_t last_data_size;//专门给传输过程中重复包判定用,记录上一个包的长度,至少长度相同才有判断重复的必要。同时也可以作为少于5个字节的包的判定依据。
+} ble_read_data;
+
+#define MAX_HANDLE_NUM 10
+//LITE_OS_SEC_TEXT_MINOR UINT32 LOS_MemInfoGet(VOID *pool, LOS_MEM_POOL_STATUS *poolStatus)
+//根据特征值分开组合读取的数据,并处理
+static ble_read_data handle_l[MAX_HANDLE_NUM]={0};
+errcode_t cancel_recv_file(uint8_t flag);
+
+static char app_name[64]={0};
+
+uint8_t ble_dial_file_count=0;
+uint8_t ble_dial_file_index=0;
+uint8_t *bigDataBuf = NULL;//大数据buf
+uint8_t bigDataBufLen=0;
+bool sendbigDataBufState = false;//发送大数据表示不要被其他指令打断
+bool recvBigDataBufState = false;//接收大数据标志
+static bool muiltFlag = 0;//多包数据flag
+static bool ANCSBigBufFlag = 0;//ANCS多包数据flag
+// static uint16_t data_len = 0;
+ble_recv_data_info_t ble_recv_data;
+static uint8_t TRANSMIT_DATA;
+static osTimerId_t BR_TRANSFER_timer=NULL;
+static uint32_t timer_flie_flag=0;
+ble_read_data* ble_read_timer_p=NULL;
+
+#ifdef  SINGLE_USER_PARTITION
+#define UP_DATE_FWPKG_PATH    UPG_FILE_NAME  
+                    
+#else
+#define UP_DATE_FWPKG_PATH   UPG_FILE_NAME
+#endif
+
+
+//MP3文件重命名
+static errcode_t create_mp3_name(char* path,char*dir_path ,char* file_name)
+{
+
+    sprintf_s(path,256,"%s/",dir_path);
+    uint16_t path_len=strlen(path);
+
+
+    if(strstr(file_name,".mp3"))
+    {
+        //"光-陈粒.128.mp3"
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",file_name);
+        int len=strlen(file_name)-strlen(".mp3");
+        for(int i=0;i<len;i++)
+        {
+            uint8_t Uintdata=0;
+            char UintBUF[3]={0};
+            //sprintf(UintBUF,"%02X",file_name[i]);
+            memcpy_s((void*)&Uintdata,1,(void*)&file_name[i],1);
+            sprintf(UintBUF,"%02X",Uintdata);
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",UintBUF);
+            memcpy_s(path+path_len,2,UintBUF,2);
+            path_len+=2;
+        }
+        memcpy_s(path+path_len,strlen(".mp3"),".mp3",strlen(".mp3"));
+        return ERRCODE_SUCC;
+    }
+    else
+    {
+        sprintf_s(path,256,"%s/%s.mp3",dir_path,file_name);
+    }
+    return ERRCODE_FAIL;
+    
+}
+
+
+#if 1
+#include "app_msg_manager.h"
+#include "app_tx_process.h"
+static int ym_malloc_count = 0,ym_free_count = 0;
+static void *ym_malloc(unsigned int size)
+{
+    // app_pkg_msg_send(HEAPINFO, DIAG_CONTROL_FALSE, NULL, 0);
+
+    return malloc(size);
+}
+static void  ym_free(void * p)
+{
+    free(p);
+}
+void malloc_test(void)
+{
+    for(int i = 0;i<1000;i++)
+    {
+        char * temp = ym_malloc(i*10);
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"i:%d,addr:%x\r\n",i,temp);
+        
+    }
+    app_pkg_msg_send(HEAPINFO, DIAG_CONTROL_FALSE, NULL, 0);
+}
+#include "bleService.h"
+
+static const char* getHandlname(uint16_t handle)
+{
+
+    if (data2ae0Cmd == handle) return "data2ae0Cmd";
+    if (data2ae1Cmd == handle) return "data2ae1Cmd";
+    if (data2ae3Cmd == handle) return "data2ae3Cmd";
+    if (data2ae4Cmd == handle) return "data2ae4Cmd";
+    if (data2ae5Cmd == handle) return "data2ae5Cmd";
+    if (data2ae6Cmd == handle) return "data2ae6Cmd";
+    //if (data2ae2Cmd == handle) return "data2ae2Cmd";
+    
+    return "unknown handle";
+
+}
+static errcode_t get_file_recv_file_path(char* input_filename ,uint32_t input_size, char* output_file_path , uint32_t max_output_size)
+{
+    if(input_filename == NULL || output_file_path == NULL)
+    {
+        return ERRCODE_FAIL;
+    }
+
+    int ret = sprintf_s(output_file_path,max_output_size,"/user/userdata/%s",input_filename);
+    if (ret < 0)
+        return ERRCODE_FAIL;
+
+    return ERRCODE_SUCC;
+} 
+static errcode_t get_app_file_path(char* input_filename ,uint32_t input_size, char* output_file_path , uint32_t max_output_size)
+{
+    if(input_filename == NULL || output_file_path == NULL)
+    {
+        return ERRCODE_FAIL;
+    }
+
+    uapi_create_dir("/user/app_store");
+
+    int ret = sprintf_s(output_file_path,max_output_size,"/user/app_store/%s",input_filename);
+    if (ret < 0)
+        return ERRCODE_FAIL;
+
+    return ERRCODE_SUCC;
+}
+static errcode_t get_custom_dial_file_path(uint16_t id,char *filename,uint32_t input_size, char* output_file_path , uint32_t max_output_size)
+{
+    if( id >=5  || output_file_path == NULL || filename == NULL)
+    {
+        return ERRCODE_FAIL;
+    }
+    char name[64]={0};
+    ble_get_dial_path(name,id);
+    int ret;
+   if(id == 1 && strcmp(filename, "main_bg") == 0) //自定义视频表盘Id 1 只有背景需要是mp4 main_bg
+    {
+        ret = sprintf_s(output_file_path,max_output_size,"%s/%s.mp4",name,filename);  
+    }
+    else
+    {
+        ret = sprintf_s(output_file_path,max_output_size,"%s/%s.bin",name,filename);
+    }
+    if (ret < 0)
+        return ERRCODE_FAIL;
+
+    return ERRCODE_SUCC;
+
+}
+
+
+
+
+int char_to_dec(char ch)
+{
+    int num = 0;
+    if(ch >= '0' && ch <= '9') {
+        num = num * 10 + (ch - '0');
+    }
+    return num;
+}
+void char_to_big(uint8_t *src_str,uint8_t *res_str,uint8_t len)
+{
+    for(uint8_t i = 0;i<len;i++)
+    {
+        if(src_str[i] >= 'a' && src_str[i] <= 'z') {
+            src_str[i] = src_str[i] - 32;
+        }
+    }
+    memcpy(res_str,src_str,len);
+}
+void cameram_data(void)//拍照发送数据 调用这个接口即可
+{
+    uint8_t data[2]={0x01,0x00};
+    errcode_t ret = ble_hid_server_send_input_report(&data,2);
+    osal_msleep(100); /* wait 100 ms */
+    memset(data,0,2);
+    (void)ble_hid_server_send_input_report(&data, 2); /* 上报按下按键 把停止发送指令也要发送 防止一直拍照*/
+}
+
+bool bigDataBufState=false;//大数据传输状态
+/**
+ * 计算crc时的求和函数,可以递归,从而实现多段数据的组合计算
+*/
+// uint8_t calculate_lrc(uint8_t *data,uint16_t len,uint8_t _lrcValue)
+// {
+//     uint8_t lrcValue = _lrcValue;
+//     if(data == NULL)
+//     {
+//         return false;   
+//     }
+//     for(uint16_t i = 0; i < len; i++)
+//     {
+//             lrcValue =lrcValue+ data[i];
+//         //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%02x ",data[i]);
+//     }
+//     return lrcValue;
+// }
+
+
+/***
+ * 根据求和后的数据计算crc 值 
+*/
+// uint8_t get_crc_from_lrc(uint8_t lrcValue)
+// {
+//     uint8_t crcbuf  = 0;
+//     crcbuf = lrcValue%256;
+//     crcbuf = 256-crcbuf;
+//     crcbuf = crcbuf%256;
+//     return crcbuf;
+// }
+
+uint8_t  calculate_lrc_file(char *file_path)
+{
+    uint8_t lrcValue =0;
+    FILE * fp = fopen(file_path,"rb+");
+
+    char data[1]={0};
+    
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"calculate_lrc_file %s\r\n",file_path);
+    uint8_t  read_size=0;
+
+    if(fp==NULL)
+    {
+          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_path);
+          return 0;
+    }
+    do
+    {
+        memset_s(data,1,0,1);
+        read_size=fread(data,1,1,fp);
+        lrcValue+=data[0];
+
+    }while(read_size==1);
+
+    fclose(fp);
+    return lrcValue;
+}
+
+
+#define USE_DEMO
+static bool Check_CRC(uint8_t *data,uint16_t len,uint8_t crcvalue)//计算20byte的的校验位
+{
+       uint8_t crcbuf  = 0;
+    uint8_t lrcValue = 0x00;
+    if(data == NULL)
+    {
+        return false;   
+    }
+       lrcValue = calculate_lrc(data,len,0x00);
+    
+    crcbuf = get_crc_from_lrc(lrcValue); 
+
+    #ifdef BLE_LOG
+     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC lrc: 0x%x ,ret crc: 0x%x ,crcvalue 0x%x , len:%d\r\n",lrcValue,crcbuf,crcvalue,len);
+    #endif
+       if(crcbuf == crcvalue)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Check_CRC true:\r\n");
+           return true;
+    }
+       else{
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Check_CRC false:\r\n");
+        if(uapi_dev_runtime_get_android_connection_status()==1)
+                   return true;
+        else
+        #ifndef USE_DEMO
+            return false;
+        #else
+             return true;
+        #endif
+    }
+        
+}
+
+
+// uint8_t Calculate_CRC(uint8_t *data,uint16_t len)//计算20byte
+// {
+//     uint8_t crcbuf  = 0;
+//     uint8_t lrcValue = 0x00;
+//     lrcValue = calculate_lrc(data+17,len-17,0x00);
+//     crcbuf = get_crc_from_lrc(lrcValue);
+//     return crcbuf;
+// }
+
+uint8_t Calculate_CRC_AI(uint8_t *data,uint16_t len)
+{
+       return Calculate_CRC(data,len);
+}
+
+// uint8_t Calculate_CRC_Big(uint8_t *data,uint16_t len)//计算20byte
+// {
+//     uint8_t crcbuf  = 0;
+//     uint8_t lrcValue = 0x00;
+//     lrcValue = calculate_lrc(data,len,0x00);
+//     crcbuf = get_crc_from_lrc(lrcValue);
+//     return crcbuf;
+// }
+
+static cJSON *cjson_json_tmp = NULL;
+//发送ble数据
+errcode_t sendBleData(uint8_t *buf,uint16_t len)
+{
+    errcode_t ret = ERRCODE_FAIL;
+    #ifdef BLE_LOG
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bigDataBufState:%d and  sendbigDataBufState %d\r\n",bigDataBufState,sendbigDataBufState);
+    #endif
+    //if(Bleconnect == true )
+    {
+        ret = svr_ble_bt_gatts_noyify(buf,len);
+    }
+    return ret;
+    
+}
+
+
+errcode_t sendBleData_zhihui(uint8_t *buf,uint16_t len)
+{
+    errcode_t ret = ERRCODE_FAIL;
+    #ifdef BLE_LOG
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bigDataBufState:%d and  sendbigDataBufState %d\r\n",bigDataBufState,sendbigDataBufState);
+    #endif
+    //if(Bleconnect == true )
+    {
+        ret = svr_ble_bt_gatts_noyify_zhihui(buf,len);
+    }
+    return ret;
+    
+}
+
+
+void sendDataNow(uint8_t *buf,uint16_t len)
+{
+    //if(Bleconnect == true )
+    {
+        svr_ble_bt_gatts_noyify(buf,len);
+    }
+}
+
+void send_Data_Now_zh(uint8_t *buf,uint16_t len)
+{
+    {
+        svr_ble_bt_gatts_noyify_zhihui(buf,len);
+    }
+}
+
+
+
+void send_big_data(ble_data_type type,char *data, uint16 datalen)
+{
+    // 动态分配内存空间,防止堆栈溢出
+    uint8_t *buf =NULL;
+    buf = ym_malloc(17 + datalen + 1); 
+    memset_s(buf,ble_nus_max_data_len,0,17 + datalen + 1);
+    if (buf == NULL && datalen!=0) {
+          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"内存分配失败\n");
+        return;
+    }
+    if(type.Packet_id>=2)
+    {
+        msleep(get_ble_interval()+5);//多包数据发送增加延迟
+    }
+    // 设置消息头部信息
+    buf[0] = 0x72; // 消息头
+    buf[1] = type.type; // 类型
+    buf[2] = type.type_id; // 类型ID
+    memcpy(buf + 3, &type.packet_total, 4); // 总包数
+    memcpy(buf + 7, &type.total, 4); // 总数据长度
+    memcpy(buf + 11, &type.Packet_id, 4); // 数据包ID
+    memcpy(buf + 15, &datalen, 2); // 包数据长度
+
+    // 处理数据和计算CRC
+    if (data == NULL) {
+        //数据为空 按照18个字节总长度发送给app
+        buf[17] = 0x00; // 直接写0x00的校验和
+    } else {
+        memcpy(buf + 17, data, datalen); // 复制数据到缓冲区
+        buf[17 + datalen] = Calculate_CRC_Big((uint8_t *)data, datalen); // 计算CRC
+    }
+
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data:\r\n");
+    
+    for(int i=0;i<17 + datalen + 1;i++)
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buf[i]);
+    }
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"end\r\n");
+
+    // 根据标志位选择发送数据的方式
+  if(type.type==6)
+    {
+        send_Data_Now_zh(buf, 17 + datalen + 1);
+    }
+    else
+    {
+        sendDataNow(buf, 17 + datalen + 1); // 判断是否在传输或接收多包数据
+    }
+   
+    
+
+    ym_free(buf); // 释放内存空间
+}
+
+void send_long_data(char *buf, uint32_t pack_size,uint8_t type,uint8_t id)
+{
+    uint32_t data_len = strlen(buf);
+    uint32_t surplus_len=data_len;
+    uint32_t pack;
+    if(data_len%pack_size==0)
+    {
+        pack=data_len/pack_size;
+    }
+    else
+    {   
+        pack=data_len/pack_size+1;
+    }
+    uint32_t pack_id=1;
+    uint32_t offset=0;
+    while (surplus_len!=0)
+    {
+        if(surplus_len>=pack_size)
+        {
+            surplus_len=surplus_len-pack_size;
+
+            ble_data_type type_={type,id,data_len,pack,pack_id};
+            send_big_data(type_,buf+offset,pack_size);
+
+            //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,id,1);
+            offset+=pack_size;
+        }
+        else
+        {
+            
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);
+            ble_data_type type_={type,id,data_len,pack,pack_id};
+            send_big_data(type_,buf+offset,surplus_len);
+            //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,id,1);
+            break;
+        }
+        pack_id++;
+    }
+}
+
+ 
+
+bool is_free_ota_update(uint32_t size)
+{
+    uint64_t free_size=0;
+    int i;
+    struct statfs file_buf = {0};
+    FILE *fp=NULL;
+    fp=fopen(UP_DATE_FWPKG_PATH,"rb+");
+    if(fp)
+    {
+        fclose(fp);
+        remove(UP_DATE_FWPKG_PATH);
+    }
+
+#ifdef SINGLE_USER_PARTITION
+    static const char * const g_volume_names[1] = { "/user/"};
+        for (i = 0; i < 1; i++) {
+#else
+    static const char * const g_volume_names[4] = {"/system/", "/update/", "/music/", "/user/"};
+        for (i = 0; i < 4; i++) {
+#endif
+          
+            /* 获取文件系统状态 */
+            if (statfs(g_volume_names[i], &file_buf) != 0) {
+                return false ;
+            }
+
+            #ifdef SINGLE_USER_PARTITION
+             if(strcmp("/user/",g_volume_names[i])==0)
+            {
+                free_size= ((uint64_t)(file_buf.f_bfree * file_buf.f_bsize));
+                //  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"free_size :%ld\r\n",free_size);
+                  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"free_size :%lu\r\n",free_size);
+            }
+            int need_size=size*1.5;
+            if(need_size>free_size)
+            {
+                return false;
+            }
+            else
+            {
+                  return true;
+            }
+            #else
+            //单分区不考虑是否足够空间
+                return true;
+            #endif
+#ifdef SINGLE_USER_PARTITION
+        }
+#else
+    }
+#endif
+    return false;
+}
+
+
+
+//发送训练状态[app发起的运动]
+void sendtraningstatedata(uint8_t state ,uint16_t time)
+{
+    char data[3]={0};
+    uint32_t data_len=3;
+    data[0]=state;
+    memcpy(&data[1],&time,2);
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time);
+    ble_data_type type={0x05,0x50,data_len,1,1};
+    send_big_data(type,data,data_len);
+    
+}
+
+//发送训练结束状态[手表发起]
+void sendtraningstateend(void)
+{
+    char data[1]={0};
+    uint32_t data_len=1;
+    data[0]=0;  //[0 结束]
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态结束%d\r\n",data[0]);
+    
+    ble_data_type type={0x05,0x51,data_len,1,1};
+    send_big_data(type,data,data_len);
+    //end_big_data(0,data,data_len,data_len,1,1,0x51,5);
+}
+
+void sendtraningdata(msg_get_train_data_info_t *data)
+{
+    cJSON* dataJSON = cJSON_CreateObject();
+    
+    if (dataJSON == NULL) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error creating JSON object\n");
+        return;
+    }
+    
+    cJSON_AddNumberToObject(dataJSON,"st",data->st);
+    cJSON_AddNumberToObject(dataJSON,"hr",data->hr);
+    cJSON_AddNumberToObject(dataJSON,"ca",data->ca);
+    cJSON_AddNumberToObject(dataJSON,"di",data->di);
+    cJSON_AddNumberToObject(dataJSON,"stp",data->stp);
+    cJSON_AddNumberToObject(dataJSON,"ti",data->ti);
+    cJSON_AddNumberToObject(dataJSON,"pc",data->pc);
+
+    char *jsonString = cJSON_PrintUnformatted(dataJSON);
+    
+    if (jsonString == NULL) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n");
+        cJSON_Delete(dataJSON);
+        return;
+    }
+    
+    uint32_t data_len = strlen(jsonString);
+    cJSON_Delete(dataJSON);
+    
+    if (data_len == 0) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n");
+        return;
+    }
+    
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送训练实时数据 %d %s\n", data_len, jsonString);
+    ble_data_type type={0x01,0x0f,data_len,1,1};
+    send_big_data(type,jsonString,data_len);
+ 
+    cJSON_free(jsonString);
+}
+
+static uint8_t AI_is_end_state=0;
+
+//查询AI 模型是否可用,结果通过2AE4返回
+/*使用模型:
+0:文心一言
+1:ChatGPT
+2:KIMI
+3:豆包*/
+void inquire_AI_is_ready(uint8_t type)
+{
+  
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"查询AI模型,是否准备就绪\r\n");
+    ble_data_type type_={0x05,0x06,1,1,1};
+    send_big_data(type_,(char *)&type,1);
+    //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x06, 5);
+}
+
+void watch_synchronization_time(void)
+{
+    ble_data_type type_={0x05,0x02,0,1,1};
+    send_big_data(type_,NULL,0);
+}
+
+
+
+//发送ble数据
+uint8_t phone_mac[6];//手机下发的mac地址 第一次连接为空 
+uint8_t parie_mac[6];//配对完成之后的的mac地址
+uint8_t phoneDataFlag = 0;
+//发送配对指令
+void sendConfirmParieSucess(void)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    value[0] = 0x72;
+    value[1] = 0x05;
+    value[2] = 0x11;
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    value[17] = 0x01;
+    value[18] = Calculate_CRC(value,1+18);
+    sendBleData(value,19);
+}
+
+uint8_t phoneType = 0;
+
+
+
+
+errcode_t UnbindSucessCmd(uint8_t flag)//发送解绑指令,解绑界面调用这个函数 如果点了✓调用这个函数 返回成功后延迟10s再重启设备  
+{
+    errcode_t sendok = ERRCODE_FAIL;
+    uint32_t tmp = 1;
+    uint8_t value[19];
+    uint8_t crcvalue = 0;
+    memset(value,0,19);
+    memset(value,0,19);
+    value[0] =0x72;
+    value[1] =0x05;
+    value[2] =0x12;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp,2);
+    value[17] = flag;
+    value[18] = Calculate_CRC(value,18);
+    sendok =  sendBleData(value,19);
+    msleep(3*get_ble_interval());//增加延时,确保可以成功发送解除绑定
+
+    bd_addr_t addr={0};
+    get_phone_addr(&addr,g_ble_conn_id);
+
+    bool ret = bt_is_acl_connected(&addr);
+    if(flag == 1)
+    {   
+        if(0!=remove(PHONE_WATCH_CONFIG_PATH))
+        {
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n");
+        }
+        gap_ble_remove_all_pairs(); 
+        gap_remove_all_pairs();
+    }
+    
+
+
+    return sendok;
+}
+
+void watch_clean_pairs(void)
+{
+    if(0!=remove(PHONE_WATCH_CONFIG_PATH))
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n");
+    }
+    gap_ble_remove_all_pairs(); 
+    gap_remove_all_pairs();
+}
+ 
+
+void getDeviceState(void)//获取设备状态
+{
+     bd_addr_t addr={0};
+    get_phone_addr(&addr,g_ble_conn_id);
+
+    bool ret = bt_is_acl_connected(&addr);
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getDeviceState ret:%d\r\n",ret);
+}
+
+void clearPaireFlag(uint8_t flag)
+{
+    uint8_t value[19];
+    uint8_t crcvalue = 0;
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    value[0] =0x72;
+    value[1] =0x01;
+    value[2] =0x10;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp,2);
+    value[17] = flag;
+    value[18] = Calculate_CRC(value,18);
+    sendBleData(value,19);
+    
+    UnbindSucessCmd(1);//1确认解绑;
+    
+    // do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);//恢复出厂
+    uint8_t shutdowflag = 2;//恢复出厂
+    CustomEventPublish(TOPIC_EVENT_SHUTDOWN_ANIMATIOR, &shutdowflag, sizeof(shutdowflag));
+    //uapi_reboot_device();
+}
+void clearPaireCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)//发送清除配对指令
+{
+    if(Check_CRC(data,len,crcvalue))
+    {
+        //弹出清除配对界面不弹出是则发送0x02操作失败 1操作成功 0校验失败
+        clearPaireFlag(1);
+    }
+    else
+    {
+        clearPaireFlag(0);
+    }
+}
+uint8_t *savephonename=NULL;
+//确认配对指令
+uint8_t first_bond = 0;//是否第一次绑定 第一次绑定保存配对mac地址
+void comfirmPaire(uint8_t flag)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    value[0] =0x72;
+    value[1] =0x05;
+    value[2] =0x11;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp,2);
+    value[17] = flag;
+    value[18] = Calculate_CRC(value,1+17);
+    sendBleData(value,19);
+    if(flag == 1)
+    {
+        first_bond = 1;
+
+        if(get_ble_pair())
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," gap_ble_pair \r\n");
+
+            bd_addr_t addr={0};
+            get_phone_addr(&addr,g_ble_conn_id);
+
+            errcode_t code = gap_ble_pair_remote_device(&addr);
+            if(code!=ERRCODE_SUCC)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"gap_ble_pair_remote_device fail %X\r\n",code);
+            }
+        }
+
+        
+    }else{
+        first_bond = 0;
+        errcode_t ret = 0;
+         bd_addr_t addr={0};
+            get_phone_addr(&addr,g_ble_conn_id);
+
+        ret = gap_ble_disconnect_remote_device(&addr);//与固定的mac设置地址进行断开连接
+        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_ble_disconnect_remote_device %x\r\n",ret);
+        ret = gap_ble_remove_all_pairs(); 
+        bool ret_ok = gap_remove_all_pairs();
+        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_remove_all_pairs  %x %x\r\n",ret,ret_ok);
+        if(savephonename != NULL)
+        {
+            ym_free(savephonename);
+            savephonename = NULL;
+        }
+    }
+}
+
+// l连接手表之后-app通过特征值2AE4读手表信息->手表会把相应的信息给app->app通过73 02 10下发手机信息给设备(第一次连接mac为空)->设备返回73 02 10状态1才能和手机app第一次连接->设备会回发配对指令72 05 11给app,同时设备会对手机发起配对->手机点了配对后,配对成功手表会发配对成功指令72 05 10,这条指令包含手机的mac地址也会传给app->app校验解析成功之后->app下发时间指令72 02 02给设备->设备回复解析成功->完成连接
+void alarmData(void)
+{
+
+}
+
+
+void getPhoneNameLen(uint8_t *data,uint8_t *datalen,uint8_t *type)//获取手机设备名称长度
+{
+    uint8_t len = 0;
+    uint8_t *json = data;
+    cJSON* root = cJSON_Parse((const char *)json);
+    
+    if(root != NULL)
+    {
+        cJSON* pn = cJSON_GetObjectItem(root, "pn");
+        if (pn && cJSON_IsString(pn)) {
+            len = strlen(pn->valuestring)+1;   
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设备名称: %s len:%d\n", pn->valuestring,len);
+        }
+        cJSON* tp = cJSON_GetObjectItem(root, "tp");
+        if(tp && cJSON_IsNumber(tp))
+        {
+            *type=tp->valueint;
+        }
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d\r\n",type);
+       
+        cJSON* bond=cJSON_GetObjectItem(root, "bond");
+        if(bond)
+        {
+
+        }
+        *datalen = len;
+        cJSON_Delete(root);
+    } else{
+        len = 0;
+        *datalen = len;
+    }
+}
+#define PHONE_NAME_MAX_LEN 50
+static uint8_t *getPhoneName(uint8_t *data)//获取手机设备名称
+{
+    uint8_t *json = data;
+    uint8_t *str = NULL; 
+    cJSON* root = cJSON_Parse((const char *)json);
+    if(root != NULL)
+    {
+        cJSON* pn = cJSON_GetObjectItem(root, "pn");
+        if (pn && cJSON_IsString(pn)) {
+            uint8_t datalen = strlen(pn->valuestring)+1;  
+            if(datalen > PHONE_NAME_MAX_LEN) //
+            {
+                datalen = PHONE_NAME_MAX_LEN;
+            }
+            if(datalen - 1 > 0){
+                pn->valuestring[datalen]='\0';
+                str = ym_malloc(sizeof(char)*datalen);
+                if(str != NULL)
+                {
+                    memcpy(str,(uint8_t *)pn->valuestring,datalen+1);
+                }
+                if(savephonename)
+                {
+                    ym_free(savephonename);
+                    savephonename=NULL;
+                }
+                savephonename =  ym_malloc(sizeof(char)*datalen);
+                if(savephonename != NULL){
+                    memcpy(savephonename,(uint8_t *)pn->valuestring,datalen+1);
+                }
+            }
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设备名称: %s\n", pn->valuestring);
+        }
+        cJSON_Delete(root);
+    } 
+    if (str == NULL){
+        return NULL;
+    } 
+    else{
+        return str;
+    }
+    
+}
+void getPhoneMac(uint8_t *data,uint8_t *phoneMac)//获取手机设备mac这个是手表上传给手机的mac地址
+{
+    uint8_t *json = data;
+    uint8_t phone_tmp[6];
+    memset(phone_tmp,0,6);
+    cJSON* root = cJSON_Parse((const char *)json);
+    uint8_t datalen = 0;
+    uint8_t count = 5;
+    if(root != NULL)
+    {
+        cJSON* mac = cJSON_GetObjectItem(root, "mac");
+        if (mac && cJSON_IsArray(mac)) {
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"MAC地址: ");
+            cJSON* macElement = NULL;
+            cJSON_ArrayForEach(macElement, mac) {
+                if (cJSON_IsNumber(macElement)) {
+                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d", macElement->valueint);
+                    if (macElement->prev != NULL) {
+                        phone_tmp[count] = macElement->valueint;
+                        count--;
+                          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,", ");
+                    }
+                }
+            }
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n");
+        }
+
+        memcpy(phoneMac,phone_tmp,6);
+        cJSON_Delete(root);
+    } 
+    else{
+        memset(phoneMac,0,6);
+    }
+}
+
+void GetwatchSaveMac(uint8_t *mac,uint8_t *mactype)//获取手表本地保存的mac地址和mac地址类型 分共有和私有的
+{
+    uint8_t mac_tmp[6];
+    memset(mac_tmp,0,6);
+    uint8_t count = 0;
+    uint8_t type= 0;
+    FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");
+    if (jsfile != NULL) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"succes opening file\n");
+        fseek(jsfile, 0, SEEK_END);
+        long fileSize = ftell(jsfile);
+        fseek(jsfile, 0, SEEK_SET);
+
+        char *jsonData = (char *)ym_malloc(fileSize + 1);
+        fread(jsonData, 1, fileSize, jsfile);
+        jsonData[fileSize] = '\0';
+        fclose(jsfile);
+        // 解析JSON数据
+        cJSON *root = cJSON_Parse(jsonData);
+        // 释放资源
+        ym_free(jsonData);
+        if (root != NULL) {
+            cJSON *modifiedJson = cJSON_GetObjectItem(root,"mac");
+            if (cJSON_IsArray(modifiedJson)) {
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"watch MAC地址: ");
+                cJSON* macElement = NULL;
+                cJSON_ArrayForEach(macElement, modifiedJson) {
+                    if (cJSON_IsNumber(macElement)) {
+                          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d", macElement->valueint);
+                        if ((macElement->prev != NULL)) {
+                            mac_tmp[count] = macElement->valueint;
+                            count++;
+                              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,", ");
+                        }
+                    }
+                }
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n");
+            }
+            cJSON *mac_type = cJSON_GetObjectItem(root,"mac_type");
+            if(cJSON_IsNumber(mac_type))
+            {
+                *mactype = mac_type->valueint;
+            }
+        }
+        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){
+            memset(mac,0,6);
+        }else
+        {
+            memcpy(mac,mac_tmp,6);
+        }
+        cJSON_Delete(root);
+    }else
+    {
+        memset(mac_tmp,0,6);
+        memcpy(mac,mac_tmp,6);
+        *mactype = 0;
+    }
+}
+static void GetwatchSaveNameLen(uint8_t *datalen)//获取手表本地保存的手机设备名称长度
+{
+    uint8_t len = 0;
+    FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");
+    if (jsfile != NULL) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveNameLen opening file\n");
+        fseek(jsfile, 0, SEEK_END);
+        long fileSize = ftell(jsfile);
+        fseek(jsfile, 0, SEEK_SET);
+
+        char *jsonData = (char *)ym_malloc(fileSize + 1);
+        fread(jsonData, 1, fileSize, jsfile);
+        jsonData[fileSize] = '\0';
+        fclose(jsfile);
+
+        // 解析JSON数据
+        cJSON *root = cJSON_Parse(jsonData);
+        ym_free(jsonData);
+        if (root != NULL) {
+            cJSON *pn = cJSON_GetObjectItem(root,"pn");
+            if(cJSON_IsString(pn))
+            {
+                len = strlen(pn->valuestring)+1;//多加一个加上字符串的结束符\0
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveNameLen;%d",len);
+            }
+        };
+        *datalen  = len;
+        // memcpy(datalen,&len,1);
+        // 释放资源
+        cJSON_Delete(root);
+    }else{
+        len = 0;
+        *datalen  = len;
+    }
+}
+static uint8_t *GetwatchSaveName(void)//获取手表本地保存的手机设备名称
+{
+    uint8_t count = 0;
+    uint8_t *str = NULL;
+    FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");
+    if (jsfile != NULL) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"succes opening file\n");
+        fseek(jsfile, 0, SEEK_END);
+        long fileSize = ftell(jsfile);
+        fseek(jsfile, 0, SEEK_SET);
+
+        char *jsonData = (char *)ym_malloc(fileSize + 1);
+        fread(jsonData, 1, fileSize, jsfile);
+        jsonData[fileSize] = '\0';
+        fclose(jsfile);
+
+        // 解析JSON数据
+        cJSON *root = cJSON_Parse(jsonData);
+        ym_free(jsonData);
+        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ym_free ym_malloc_count:%d ym_free_count:%d\r\n",ym_malloc_count,ym_free_count);
+        if (root != NULL) {
+            cJSON *pn = cJSON_GetObjectItem(root,"pn");
+            if(cJSON_IsString(pn))
+            {
+                uint8_t showname_len = strlen(pn->valuestring)+1;
+                if(showname_len > 50)
+                {
+                    showname_len = PHONE_NAME_MAX_LEN;
+                }
+                if(showname_len-1 > 0){
+                    str = ym_malloc(sizeof(char)*showname_len);
+                    if(str != NULL)
+                    {
+                        pn->valuestring[showname_len]='\0';
+                        memcpy(str,(uint8_t *)pn->valuestring,showname_len+1);
+                    }
+                    
+                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetwatchSaveName:%s",pn->valuestring);
+                }
+            }
+        }
+        // 释放资源
+        cJSON_Delete(root);
+    }
+    if (str == NULL)
+    {
+        return NULL;
+    }else{
+        return str;
+    }
+    
+}
+
+void cleanUnbindInfor(uint8_t flag)//和旧手机解绑清除配对信息
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_fen= 1;
+    value[0] =0x72;
+    value[1] =0x05;
+    value[2] =0x11;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_fen,2);
+    value[17] = 0x03;//
+    value[18] = Calculate_CRC(value,18);
+    sendBleData(value,19);
+
+    uint8_t MacType = 0;
+    uint8_t mac_data[6];
+    memset(mac_data,0,6);
+    GetwatchSaveMac(&mac_data,&MacType);
+
+    bd_addr_t addr={0};
+    get_phone_addr(&addr,g_ble_conn_id);
+
+    errcode_t ret1 = gap_disconnect_remote_device(&addr);
+    gap_ble_disconnect_remote_device(&addr);//与固定的mac设置地址进行断开连接
+
+    if (flag == 1){
+        errcode_t ret= gap_ble_remove_pair(&addr);//清除配对信息
+        
+        gap_ble_remove_all_pairs(); 
+        bool ret_flag = gap_remove_all_pairs();
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ret_flag:%d ret:%x\r\n",ret_flag,ret);
+        if(0!=remove(PHONE_WATCH_CONFIG_PATH))
+        {
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"json remove fail\r\n");
+        }
+        set_ble_falg(0);
+        do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);//恢复出厂
+        //uapi_reboot_device();
+    }
+}
+static bool ctkd_flag_ble=false;
+
+void set_ctkd_flag(bool flag)
+{
+    ctkd_flag_ble=flag;
+}
+bool get_ctkd_flag(void)
+{
+    return true;//ctkd_flag_ble;
+}
+void sendBindInfor(uint8_t *data)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_fen= 1;
+    value[0] =0x72;
+    value[1] =0x02;
+    value[2] =0x10;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_fen,2);
+    
+    uint8_t copare_mac[6];
+    memset(copare_mac,0,6);
+    uint8_t datalen=0;
+    uint8_t *devname = NULL;
+    uint8_t devnamelen = 0;
+    uint8_t mac_tmp[6];
+    memset(mac_tmp,0,6);
+    uint8_t phone_type;
+    uint8_t bond = 1;//未与任何手机绑定过
+    errcode_t ret = 0;
+    first_bond = 0;
+    uint8_t save_mac[6];
+    memset(save_mac,0,6);
+    uint8_t MacType = 0;
+    
+    GetwatchSaveMac(&save_mac,&MacType);//获取手表设备本地保存的mac地址和mac地址类型 
+    getPhoneMac(data,&copare_mac);
+
+    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地址就走连接流程重新绑定
+    {
+        bond = 0x01;//手表未和任何手机绑定过
+        //未配过使能一键双联
+
+        //清除一次配对
+        //if(get_ble_pair())
+       
+        //
+        value[17] = bond;//
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+
+        #ifdef SUPPORT_DEVICE_PAIRING_NOTIFICATION
+        #ifdef SUPPORT_A5133_SERVICE_BLE_PAIR
+        comfirmPaire(1);
+        #else
+        devnamelen = 0;
+        getPhoneNameLen(data,&devnamelen,&phone_type);//获取手机下发的手机设备名称长度
+
+        if(phone_type==0)
+        {
+            unsigned int paired_devices_num=0;
+            bool  gap_get_paired =gap_get_paired_devices_num(&paired_devices_num);
+            if(gap_get_paired!=true ||paired_devices_num!=0 )
+            {
+                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"sendBindInfor!!!!!!!!!:gap_remove_all_pairs \r\n");
+                gap_remove_all_pairs();
+            }
+        }
+       
+
+        if(devnamelen > 0 )
+        {
+        
+            devname = getPhoneName(data);
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname!!!!!!!!!:%s devnamelen:%d",devname,devnamelen);
+            if (devname != NULL){
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is name!!!!!!!!!\r\n");
+                uint8_t buf[devnamelen+2]; 
+                memset(buf,0,devnamelen+2);
+                buf[0] = DEVICEBIND ;
+                buf[1] = devnamelen;//设备名称长度 0不显示
+                memcpy(buf+2,devname,devnamelen);
+
+                if(phone_type==1)
+                {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"IOS\r\n");
+                    ble_set_pair(1);
+                    
+                    errcode_t ret = gap_ble_set_ctkd_enable(true);
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "iPhone gap_ble_set_ctkd_enable ret = %x", ret);
+                    set_ctkd_flag(true);
+                }
+                else
+                {
+                    ble_set_pair(0);
+               
+                    errcode_t ret = gap_ble_set_ctkd_enable(true);
+                    
+                }
+                
+                CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,(uint8_t *)buf,devnamelen+2);
+                //  comfirmPaire(1);
+                if(devname)
+                {   
+                    ym_free(devname);
+                    devname = NULL;
+                }
+            }else{
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is no name11111!!!!!!!!!:");
+                uint8_t buf[2]; 
+                memset(buf,0,2);
+                buf[0] = DEVICEBIND;
+                buf[1] = 0;
+                CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);
+                //  comfirmPaire(1);
+                
+            }
+        }
+        else{
+            uint8_t buf[2]; 
+            memset(buf,0,2);
+            buf[0] = DEVICEBIND;
+            buf[1] = 0 ;
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone devname is no name!!!!!!!!!:");
+            CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);
+            //  comfirmPaire(1);
+        }
+         #endif
+        #endif
+
+        return;
+        
+    }else
+    {
+        if(copare_mac[0] == 0 && copare_mac[1] == 0 && copare_mac[2] == 0 && copare_mac[3] == 0 && copare_mac[4] == 0 && copare_mac[5] == 0) 
+        {
+            bond = 0x03;//手表和其他手机绑定过
+           
+        }else{//如果手机有保存mac app下发是空就提示和其他手机绑定过界面不在发起配对
+            int result = memcmp(copare_mac,save_mac,6);
+            if(result == 0)
+            {
+               
+                if(get_ble_pair())
+                {
+                    set_ctkd_flag(true);
+                    errcode_t ret = gap_ble_set_ctkd_enable(true);
+
+                }
+                else
+                {
+                    errcode_t ret = gap_ble_set_ctkd_enable(true);
+                }
+
+    
+                if(get_ble_pair())
+                {
+                    bd_addr_t addr={0};
+                    get_phone_addr(&addr,g_ble_conn_id);
+
+                    errcode_t code = gap_ble_pair_remote_device(&addr);
+                    if(code!=ERRCODE_SUCC)
+                    {
+                          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"gap_ble_pair_remote_device fail %X\r\n",code);
+                    }
+                }
+     
+                bond = 0x02;//手表与该手机绑定过
+                value[17] = bond;//
+                value[18] = Calculate_CRC(value,18);
+                sendBleData(value,19);
+                return;
+            }else{
+                bond = 0x03;//手表与其他手机绑定过
+            }
+        }
+    }
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bond flag:%d first_bond:%d\r\n",bond,first_bond);
+   
+    if(bond == 0x03)
+    {
+        devnamelen = 0;
+        GetwatchSaveNameLen(&devnamelen);//获取手表设备保存手机的设备名称长度
+        if(devnamelen > 0)
+        {   
+            devname = GetwatchSaveName();
+            if (devname != NULL){
+                uint8_t buf[devnamelen+2]; 
+                memset(buf,0,devnamelen+2);
+                buf[0] = DEVICEUNBIND ;
+                buf[1] = devnamelen;
+                memcpy(buf+2,devname,devnamelen);
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname:is no null!!!!!%s\r\n",devname);
+                CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,(uint8_t *)buf,devnamelen+2);
+                if(devname)
+                {
+                    ym_free(devname);
+                    devname = NULL;
+                }
+            }else{
+                uint8_t buf[2]; 
+                memset(buf,0,2);
+                buf[0] = DEVICEUNBIND;
+                buf[1] = 0;
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"devname:is  null!!!!!");
+                CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);
+            }
+        }else{
+            uint8_t buf[2]; 
+            memset(buf,0,2);
+            buf[0] = DEVICEUNBIND;
+            buf[1] = 0;
+            CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,buf,2);
+        }
+    }
+    value[17] = bond;//
+    value[18] = Calculate_CRC(value,18);
+    sendBleData(value,19);
+}
+void SetPhoneInfo(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取手机信息
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_fen= 1;
+    value[0] =0x72;
+    value[1] =0x02;
+    value[2] =0x10;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_fen,2);
+    phoneDataFlag = 1;
+    
+    if(Check_CRC(data,len,crcvalue))
+    {
+        sendBindInfor(data);
+    }else{
+        value[17] = 0x00;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+
+void sendParieSuccess(uint8_t flag,bd_addr_t *addr)//发送配对成功指令to app
+{
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\r\n",addr->addr[0],addr->addr[1],addr->addr[2],addr->addr[3],addr->addr[4],addr->addr[5]);
+    if(g_ble_conn_id==0)
+    {
+        return;
+
+    }
+    if(first_bond == 1 && phoneDataFlag == 1)//第一次连接绑定
+    {
+        set_ble_falg(1);
+        uint8_t value[25];
+        uint8_t length = 0;
+        memset(value,0,25);
+        value[0] = 0x72;
+        value[1] = 0x05;
+        value[2] = 0x10;
+        uint32_t totalpack= 1;//总的包数
+        uint32_t data_len = 7;//数据长度
+        uint32_t pack_index= 1;//分包序号Index
+        uint16_t pack_dataLen = 7;
+        memcpy(value+3,&totalpack,4);
+        memcpy(value+7,&data_len,4);
+        memcpy(value+11,&pack_index,4);
+        memcpy(value+15,&pack_dataLen,2);
+        value[17] = flag;//1 配对成功 0 配对失败 
+        if(flag == 1)//配对成功
+        {
+            cJSON *dataJSON = cJSON_CreateObject();
+            if(dataJSON==NULL)
+            {
+                return;
+            }
+
+            cJSON* arrayJSON = cJSON_CreateArray();
+            if(arrayJSON==NULL)
+            {
+                return;
+            }
+            for(uint8_t id = 0;id<6;id++)
+            {
+                cJSON_AddNumberToObject(arrayJSON,"id",addr->addr[id]);
+            }
+            if(savephonename != NULL)
+            {
+                cJSON_AddStringToObject(dataJSON,"pn",(char *)savephonename);
+                ym_free(savephonename);
+                savephonename = NULL;
+            }
+            cJSON_AddNumberToObject(dataJSON,"phoneType",phoneType);
+            cJSON_AddNumberToObject(dataJSON,"mac_type",addr->type);
+            cJSON_AddItemToObject(dataJSON,"mac",arrayJSON);
+
+            char *jsonString = cJSON_PrintUnformatted(dataJSON);
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"phone %s",jsonString);
+            FILE *file = fopen(PHONE_WATCH_CONFIG_PATH, "wb");
+            if (file)
+            {
+                if (fputs(jsonString, file) != EOF) // 将 JSON 字符串写入文件
+                {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WriteJsonData success\n");
+                }
+                fclose(file);
+            }
+            // ym_free(jsonString);
+            cJSON_free(jsonString);
+            cJSON_Delete(dataJSON);
+            // 读取JSON文件
+
+            //memcpy(value+18,addr->addr,6);
+            value[18]=addr->addr[5];
+            value[19]=addr->addr[4];
+            value[20]=addr->addr[3]; 
+            value[21]=addr->addr[2];
+            value[22]=addr->addr[1];
+            value[23]=addr->addr[0];
+
+            memcpy(parie_mac,addr->addr,6);
+            length = 18+6;
+            uint8_t crcvalue = Calculate_CRC(value,length);
+            value[length] = crcvalue;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:%d length:%d crcvalue:%d",sizeof(value),length,crcvalue );
+            sendBleData(value,length+1);
+        }else{
+            length = 18;
+            uint8_t crcvalue = Calculate_CRC(value,length);
+            value[length] = crcvalue;
+            length = length+1;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:%d length:%d crcvalue:%d",sizeof(value),length,crcvalue );
+            sendBleData(value,length);
+        }
+        phoneDataFlag = 0;
+    }
+
+    
+}
+
+
+//02类型的指令数据
+
+void checkCrcSend(uint8_t type,uint8_t typeID,uint8_t crcflag)//获取时间
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = type;
+    sendBuf[2] = typeID;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+    sendBuf[17] = crcflag;
+    sendBuf[18] = Calculate_CRC(sendBuf,18);
+    sendBleData(sendBuf,19);
+
+}
+//发送查找手机
+void senfindphoneSend(uint8_t flag)
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x05;
+    sendBuf[2] = 0x01; //3
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4); //15
+    memcpy(sendBuf+15,&tmp_data,2); //17
+    sendBuf[17] = flag;
+    sendBuf[18] = Calculate_CRC(sendBuf,18);
+    sendBleData(sendBuf,19);
+}
+
+static uint8_t jsonCheck_time(uint8_t *buf)//json 格式解析
+{
+    // char time_data[24];
+    // memset(time_data,0,24);
+    
+    uint8_t *json;
+    json = buf;
+    cJSON* root = cJSON_Parse((const char *)json);
+    if (root == NULL) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"时间 JSON解析错误\n");
+        return 2;
+    }
+    char *locations;
+    int year = 1970;
+    uint8_t month = 1;
+    uint8_t day = 1;
+    uint8_t week = 4;
+    uint8_t hour = 0;
+    uint8_t minute = 0;
+    uint8_t second = 0;
+    uint32_t timestamp;
+    cJSON* time = cJSON_GetObjectItem(root, "time");
+    if (time && cJSON_IsNumber(time)) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %d\n", time->valueint);
+        timestamp = time->valueint;
+        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %d\n", time->valueint);
+    }
+    cJSON* jsweek = cJSON_GetObjectItem(root, "week");
+    if (jsweek && cJSON_IsNumber(jsweek)) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"week: %d\n", jsweek->valueint);
+        week = jsweek->valueint;
+    }
+    cJSON* jsyear = cJSON_GetObjectItem(root, "year");
+    if (jsyear && cJSON_IsNumber(jsyear)) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"year: %d\n", jsyear->valueint);
+        year = jsyear->valueint;
+    }
+    cJSON* jsmonth = cJSON_GetObjectItem(root, "month");
+    if (jsmonth && cJSON_IsNumber(jsmonth)) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"month: %d\n", jsmonth->valueint);
+        month = jsmonth->valueint;
+    }
+    cJSON* jsday = cJSON_GetObjectItem(root, "day");
+    if (jsday && cJSON_IsNumber(jsday)) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"day: %d\n", jsday->valueint);
+        day = jsday->valueint;
+    }
+    cJSON* jshour = cJSON_GetObjectItem(root, "hour");
+    if (jshour && cJSON_IsNumber(jshour)) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"hour: %d\n", jshour->valueint);
+        hour = jshour->valueint;
+    }
+    cJSON* jsminute = cJSON_GetObjectItem(root, "minute");
+    if (jsminute && cJSON_IsNumber(jsminute)) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"minute: %d\n", jsminute->valueint);
+        minute = jsminute->valueint;
+    }
+    cJSON* jssecond = cJSON_GetObjectItem(root, "second");
+    if (jssecond && cJSON_IsNumber(jssecond)) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"second: %d\n", jssecond->valueint);
+        second = jssecond->valueint;
+    }
+    cJSON* location = cJSON_GetObjectItem(root, "location");
+    if (location && cJSON_IsString(location)) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"location: %s\n", location->valuestring);
+        locations = location->valuestring;
+    }
+    // sprintf((char *)time_data,"%d-%d-%d %d:%d:%d",year+2000,month,day,hour,minute,second);
+    // set_system_time(time_data);
+    
+
+    /***计算timezone*/
+    struct tm tmp={0};
+    tmp.tm_year = year+2000 - 1900;
+    tmp.tm_mon = month -1;
+    tmp.tm_mday = day;
+    tmp.tm_hour = hour;
+    tmp.tm_min = minute;
+    tmp.tm_sec = second;
+    time_t timestamp2 = __tm_to_secs(&tmp);
+    int16_t timezone = (timestamp2-timestamp)/60/15;   
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"timezone in quarters %d\n",timezone);
+    uapi_set_timezone(timezone); //要在uaip_sntp_set_time_utc 之前执行才有效
+    /********/
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"time: %d\n",timestamp );
+
+    uaip_sntp_set_time_utc(timestamp);
+
+    cJSON_Delete(root);
+    return 1;
+}
+
+
+
+
+void SetUTCtime(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取时间
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x02;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+    
+       if(Check_CRC(data,len,crcvalue))
+       {
+       
+        uint8_t set_ok = 1;
+        set_ok = jsonCheck_time(data);
+        sendBuf[17] = set_ok;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+       
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+    
+}
+static training_ble training_ble_data;
+//设置训练目标
+static uint8_t jsonCheck_targetparam(uint8_t *buf)
+{
+    uint8_t *json;
+    json = buf;
+    cJSON* root = cJSON_Parse((const char *)json);
+    if (root == NULL) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"时间 JSON解析错误\n");
+        return 2;
+    }
+
+    memset(&training_ble_data, 0, sizeof(training_ble));
+
+    cJSON* ty = cJSON_GetObjectItem(root, "ty");//目标类型
+    if (cJSON_IsNumber(ty)) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ty: %d\n", ty->valueint);
+        training_ble_data.sportTagType = ty->valueint;
+        training_ble_data.controlmd = SETGOAL;
+
+        cJSON* targetItem = NULL;
+        switch (training_ble_data.sportTagType)
+        {
+            case 0: // 距离
+                targetItem = cJSON_GetObjectItem(root, "di");//目标距离
+                break;
+            case 1: // 卡路里
+                targetItem = cJSON_GetObjectItem(root, "ca");//目标卡路里
+                break;
+            case 2: // 时间
+                targetItem = cJSON_GetObjectItem(root, "tm");//目标时间
+                break;
+            case 3: // 步数
+                targetItem = cJSON_GetObjectItem(root, "st");//目标步数
+                break;
+            default:
+                break;
+        }
+
+        if (targetItem && cJSON_IsNumber(targetItem)) {
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s: %d\n", targetItem->string, targetItem->valueint);
+            training_ble_data.sportTag = targetItem->valueint;
+            cJSON_Delete(root);
+            CustomEventPublish(TOPIC_EVENT_BLE_TRAINING, (uint8_t*)&training_ble_data, sizeof(training_ble));
+            return JSON_CHECK_OK;
+        }
+    }
+
+    cJSON_Delete(root);
+    return JSON_CHECK_ERR;
+}
+
+
+void SetTarinTarget(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置训练目标
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x04;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+    
+       if(Check_CRC(data,len,crcvalue))
+       {
+        uint8_t set_ok = 1;
+        set_ok = jsonCheck_targetparam(data);
+        sendBuf[17] = set_ok;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+    
+}
+
+static void SetOtherTarget(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取其他目标
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x17;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+    
+       if(Check_CRC(data,len,crcvalue))
+       {
+        // 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
+
+        uint16_t target_kcal = data[0]+data[1]*256;//目标卡路里
+        uint8_t target_km = data[2];//目标里程
+        uint8_t target_stand = data[3];//目标站立
+        uint8_t target_fattime = data[4];//目标燃脂
+
+        uint8_t ring = data[5];//铃声
+        uint8_t vibratior = data[6];//振动
+        uint8_t notify = data[7];//通知
+        if(target_km)
+        set_goal_discount(target_km);
+        if(target_stand)
+        set_goal_standupcount(target_stand);
+        if(target_fattime)
+        set_goal_durationcount(target_fattime);
+        if(target_kcal)
+        set_goal_caloriescount(target_kcal);
+
+        // set_SilentMode(ring);
+        // set_vibrationremiander(vibratior);
+        // set_notify_switch(notify);
+        if(ring && vibratior && notify)
+        set_goal_other_notification(1);
+        else
+        set_goal_other_notification(0);
+
+
+        sendBuf[17] = 1;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+    
+}
+static void jsonCheck_alarm(uint8_t *buf)//json 解析闹钟数据
+{
+    uint8_t *json;
+    json = buf;
+    cJSON* root = cJSON_Parse((const char *)json);
+
+    if (root == NULL) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"闹钟 JSON解析错误\n");
+        return;
+    }
+    else
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"闹钟 %s\r\n",json);
+    }
+    ble_delet_all_AlarmInfo();
+
+    cJSON* alarms = cJSON_GetObjectItem(root, "alarms");
+    if(alarms==NULL)
+    {
+        return;
+    }
+    int alarmCount = cJSON_GetArraySize(alarms);
+   
+    for(int i=0;i<alarmCount;i++)
+    {
+         uint8_t week=0;
+        cJSON *data=cJSON_GetArrayItem(alarms,i);
+        if(data==NULL)
+        {
+            return;
+        }
+
+        cJSON *Id_data =cJSON_GetObjectItem(data,"id");
+        if(Id_data==NULL)
+        return;
+        int id=Id_data->valueint;
+
+        cJSON*  repeat=cJSON_GetObjectItem(data,"repeat");
+        if(repeat==NULL)
+        return;
+        
+        int array_size = cJSON_GetArraySize(repeat);
+        for(int j=0;j<array_size;j++)
+        {
+            int day = cJSON_GetArrayItem(repeat,j)->valueint;
+            if(day==7)
+            {
+                week|=0b00000001;
+            }
+            else if(day!=0)
+            {
+                week|=0b00000001<<(day);
+            }
+             
+        }
+     
+         cJSON*  hour_data=cJSON_GetObjectItem(data,"hour");
+         if(hour_data==NULL)
+         {
+            return;
+         }
+         int hour=hour_data->valueint;
+         cJSON*  minute_data=cJSON_GetObjectItem(data,"minute");
+        if(minute_data==NULL)
+         {
+            return;
+         }
+         int minute=minute_data ->valueint;
+         cJSON*  enable_data=cJSON_GetObjectItem(data,"enable");
+        if(enable_data==NULL)
+         {
+            return;
+         }
+        int enable=enable_data ->valueint;
+
+            ble_SetAlarmInfo(hour, minute,week,i,enable);
+
+    }
+    cJSON_Delete(root);
+    ble_AlarmClock_refresh();
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"alarmCount %d\n",alarmCount);
+    
+}
+
+void SetAlarmDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x21;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+
+       if(Check_CRC(data,len,crcvalue))
+       {
+        jsonCheck_alarm(data);
+        
+        sendBuf[17] = 1;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }   
+}
+
+
+void SetpasswordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x1c;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+
+       if(Check_CRC(data,len,crcvalue))
+       {
+        char* buf[7]={0};
+        
+        sprintf_s(buf,7,"%d%d%d%d%d%d",data[1],data[2],data[3],data[4],data[5],data[6]);
+        ble_set_password(data[0],buf);
+
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\r\n",buf);
+        
+        sendBuf[17] = 1;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }   
+}
+
+
+void GetWatchLcdParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x0e;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+
+       if(Check_CRC(data,len,crcvalue))
+       {
+        uint8_t type = data[0];
+        if(type == 0)//只设置屏幕亮度
+        {
+            uint8_t brightness = data[1];
+            set_brigthness(brightness);
+        }else if(type == 1)//设置亮屏时长 抬碗亮屏
+        {
+            uint8_t screen_type = data[1];//ms级别
+
+            int screen_time = 5*1000;
+            switch (screen_type)
+            {
+                case 0:
+                    screen_time = 5*1000;
+                    break;
+                case 1:
+                    screen_time = 10*1000;
+                    break;
+                case 2:
+                    screen_time = 15*1000;
+                    break;
+                case 3:
+                    screen_time = 30*1000;
+                    break;
+                case 4:
+                    screen_time = 60*1000;
+                    break;
+                case 5:
+                    screen_time = 60*5*1000;
+                    break;
+                default:
+                    break;
+            }
+            bool raise = data[2];
+
+            set_ScreenDuration(screen_time);
+            Set_RaiseToWake(raise);
+        }
+        sendBuf[17] = 1;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+    
+}
+
+
+
+void GetVoiceVibrateParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x0f;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+
+       if(Check_CRC(data,len,crcvalue))
+       {
+       
+        uint8_t type = data[0];
+        if(type == 0)//只改变系统音量参数 其他还是保持不变 按照原来的参数
+        {
+            int sys_volume = data[1];
+            Set_SystemVolume(sys_volume);
+
+        }else if(type == 1)//只改变铃声音量参数 其他还是保持不变 按照原来的参数
+        {
+            int ring_volume = 0;
+
+            ring_volume = data[1];
+
+            Set_CallVolume(ring_volume);
+
+        }else if(type == 2)//只改变媒体音量
+        {
+            int ring_volume = 0;
+            ring_volume = data[1];
+            Set_CallVolume(ring_volume);
+        }
+        else if(type == 3)//只改变铃声和振动开关
+        {
+            int bell_on = data[1];
+            int vibrate_on = data[2];
+            set_SilentMode(bell_on);
+            set_vibrationremiander(vibrate_on);
+        }
+
+        sendBuf[17] = 1;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+    
+}
+
+void GetHrSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//app设置心率参数
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x12;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+
+       if(Check_CRC(data,len,crcvalue))
+       {
+        msg_get_heart_set_param_info_t set_data;
+
+        set_data.frequence = data[0];
+        set_data.remind_on=data[1];
+        set_data.max_min=data[2];
+        set_data.heart=data[3];
+
+        Set_heart_cmd(&set_data);
+        sendBuf[17] = 1;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+    
+}
+
+
+void GetSpo2SetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x13;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+
+       if(Check_CRC(data,len,crcvalue))
+       {
+        
+        msg_get_spo2_set_param_info_t set_data;
+        set_data.frequence = data[0];
+        set_data.remind_on=data[1];
+        set_data.spo2=data[2];
+
+        Set_oxygen_cmd(&set_data);
+
+        sendBuf[17] = 1;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+    
+}
+
+void SetsleepSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置睡眠
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x15;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+
+       if(Check_CRC(data,len,crcvalue))
+       {
+        msg_get_sleep_param_info_t sleep_info;
+        sleep_info.schedule = data[0];
+        if(len>=6)
+        {
+            sleep_info.bedtime_hour= data[1];
+            sleep_info.bedtime_min= data[2];
+            sleep_info.waketime_hour= data[3];
+            sleep_info.waketime_min= data[4];
+            sleep_info.bedtime_alarm= data[5];
+        }
+      
+        ble_set_sleep_remind(sleep_info);
+
+        sendBuf[17] = 1;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+}
+
+void SetDrinkSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置喝水提醒s设置
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x14;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+
+       if(Check_CRC(data,len,crcvalue))
+       {
+        msg_drink_info_t drink_info={0};
+        drink_info.drink_on = data[0];
+        if(data[1])
+        {
+            drink_info.drink_on=2;
+        }
+        // drink_info.drink_on = data[1];
+         drink_info.goal = data[2]+data[3]*256;
+         drink_info.time_start = data[4]<<16|data[5];
+        if(data[1])
+        {
+            drink_info.time_end = data[6]<<16|data[7];
+            drink_info.freq = data[8];
+           
+        }
+        ble_set_drink_remind(drink_info);
+        
+        sendBuf[17] = 1;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+    
+}
+
+void SetsedentarinessSetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置久坐设置
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x1D;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+
+       if(Check_CRC(data,len,crcvalue))
+       {
+        msg_sedent_set_param_info_t sedent_data={0};
+        sedent_data.sedent_on=data[0];
+
+        // uint32_t sedent_on_time=data[1];
+        // sedent_data.sedent_time |= sedent_on_time<<24;
+
+        // sedent_on_time=data[2];
+        // sedent_data.sedent_time |= sedent_on_time<<16;
+
+        // sedent_on_time=data[3];
+        // sedent_data.sedent_time |= sedent_on_time<<8;
+
+        // sedent_on_time=data[4];
+        // sedent_data.sedent_time |= sedent_on_time<<0;
+        memcpy_s( &sedent_data.sedent_time,4,&data[1],4);
+       
+
+        sedent_data.frequenc = data[5];
+
+        // set_sedent_param(&sedent_data);
+
+        sendBuf[17] = 1;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+}
+
+void SetmsgfiltrationCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置久坐设置
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x1E;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+
+       if(Check_CRC(data,len,crcvalue))
+       {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"总长%d\r\n",len);
+        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"数据%s\r\n",data);
+        uint32_t offset=0;
+        uint8_t count=0;
+        while (offset<len)
+        {
+            filtration_data data_t={0};
+            data_t.on=data[offset];
+            offset++;
+            data_t.len=data[offset];
+            offset++;
+            memcpy_s(data_t.name,filtration_data_max_len,&data[offset],data_t.len);
+            offset+=data_t.len;
+            // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"%s\r\n",data_t.name);
+            filtration_file_updata(&data_t,count);
+            count++;
+        } 
+        filtration_file_save();
+        
+        sendBuf[17] = 1;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+}
+
+
+//通过时间戳来获取训练数据
+
+void SYN_train_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据
+{
+
+       if(Check_CRC(data,len,crcvalue))
+       {
+        if(len==4)
+        {
+            uint32_t timetamp=0;
+            memcpy_s((void*)&timetamp,4,data,4);
+            cJSON *json_data = ble_get_Trainingdata_by_timetamp(timetamp);
+            if(json_data==NULL)
+            {
+                ble_data_type type_={0x02,0x19,0,1,1};
+                send_big_data(type_,NULL,0);
+                return;
+            }
+            char *json_str=cJSON_PrintUnformatted(json_data);
+            uint32_t json_len= strlen(json_str);
+            cJSON_Delete(json_data);
+
+
+            uint32_t surplus_len=json_len;
+            uint32_t offset=0;
+
+            uint32_t pack;
+            uint16_t pack_size=(ble_nus_max_data_len-18);
+            if(pack_size>482)pack_size=482;
+
+            if(json_len%pack_size==0)
+            {
+                pack=json_len/pack_size;
+            }
+            else
+            {   
+                pack=json_len/pack_size+1;
+            }
+            uint32_t pack_id=1;
+            while (surplus_len!=0)
+            {
+                if(surplus_len>=pack_size)
+                {
+                    surplus_len=surplus_len-pack_size;
+
+                    ble_data_type type_={0x02,0x19,json_len,pack,pack_id};
+                    send_big_data(type_,(char *)json_str+offset,pack_size);
+                    offset+=pack_size;
+                }
+                else
+                {
+                    
+                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",json_len,surplus_len,pack_id,pack);
+                    ble_data_type type_={0x02,0x19,json_len,pack,pack_id};
+                    send_big_data(type_,(char *)json_str+offset,surplus_len);
+                    break;
+                }
+                pack_id++;
+            }
+
+            cJSON_free(json_str);
+
+        }
+        
+    }
+       else
+       {
+        ble_data_type type_={0x02,0x19,0,1,1};
+        send_big_data(type_,NULL,0);
+    }
+}
+
+
+void SYN_train_heart_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据
+{
+
+       if(Check_CRC(data,len,crcvalue))
+       {
+        if(len==4)
+        {
+            uint32_t timetamp=0;
+            memcpy_s((void*)&timetamp,4,data,4);
+            char path[128]={0};
+            if(get_training_heart_path(path,timetamp,128))
+            {
+                FILE *fp= fopen(path,"rb+");
+                uint32_t file_size=0;
+                if(fp==NULL)
+                {
+                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);
+
+                    ble_data_type type_={0x02,0x4b,0,1,1};
+                    send_big_data(type_,NULL,0);
+
+                    return ;
+                }
+                fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
+                file_size = ftell(fp);       // 获取当前文件指针位置,即文件大小
+                fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头
+
+                int num=(ble_nus_max_data_len-18);
+                if(num>482)num=482;
+
+                int num_check=file_size%5;//心率数据 5个字节
+                if(num_check!=0)
+                {
+                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",cmd);
+
+                    ble_data_type type_={0x02,0x4b,0,1,1};
+                    send_big_data(type_,NULL,0);
+                    return ;
+                }
+            
+                char* buf = (char *)ym_malloc(sizeof(char)*num+1);
+                if(buf==NULL){fclose(fp); return ;}
+
+                uint32_t pack=1;
+
+                if(file_size%num==0)
+                pack=file_size/num;
+                else
+                pack=file_size/num+1;
+
+                uint32_t pack_id=1;
+                uint32_t read_size=0;
+                do
+                {
+                    memset_s(buf,num+1,0,num+1);
+                    read_size=fread(buf,1,num,fp);
+                    if(read_size!=0)
+                    {
+                        ble_data_type type_={0x02,0x4b,file_size,pack,pack_id};
+                        send_big_data(type_,buf,read_size);
+                    }
+                    pack_id++;
+                } while (read_size==num);
+                fclose(fp);
+                free(buf);
+
+            }
+        }
+        
+    }
+       else
+       {
+        ble_data_type type_={0x02,0x4B,0,1,1};
+        send_big_data(type_,NULL,0);
+    }
+}
+
+void SYN_train_speed_datatCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//同步训练数据
+{
+
+       if(Check_CRC(data,len,crcvalue))
+       {
+        if(len==4)
+        {
+            uint32_t timetamp=0;
+            memcpy_s((void*)&timetamp,4,data,4);
+            char path[128]={0};
+            if(get_training_spead_path(path,timetamp,128))
+            {
+                FILE *fp= fopen(path,"rb+");
+                uint32_t file_size=0;
+                if(fp==NULL)
+                {
+                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);
+
+                    ble_data_type type_={0x02,0x18,0,1,1};
+                    send_big_data(type_,NULL,0);
+
+                    return ;
+                }
+                fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
+                file_size = ftell(fp);       // 获取当前文件指针位置,即文件大小
+                fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头
+
+                int num=(ble_nus_max_data_len-18);
+                if(num>482)num=482;
+
+                int num_check=file_size%6;
+                if(num_check!=0)
+                {
+                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",cmd);
+
+                    ble_data_type type_={0x02,0x18,0,1,1};
+                    send_big_data(type_,NULL,0);
+                    return ;
+                }
+            
+                char* buf = (char *)ym_malloc(sizeof(char)*num+1);
+                if(buf==NULL){fclose(fp); return ;}
+
+                uint32_t pack=1;
+                if(file_size%num==0)
+                pack=file_size/num;
+                else
+                pack=file_size/num+1;
+                uint32_t pack_id=1;
+                uint32_t read_size=0;
+                do
+                {
+                    memset_s(buf,num+1,0,num+1);
+                    read_size=fread(buf,1,num,fp);
+                    if(read_size!=0)
+                    {
+                        ble_data_type type_={0x02,0x18,file_size,pack,pack_id};
+                        send_big_data(type_,buf,read_size);
+                    }
+                    
+
+                    //send_big_data(1,buf,read_size,file_size,pack_id,pack,id,1);
+                    pack_id++;
+                } while (read_size==num);
+
+                fclose(fp);
+                free(buf);
+
+            }
+        
+        }   
+    }
+       else
+       {
+        ble_data_type type_={0x02,0x18,0,1,1};
+        send_big_data(type_,NULL,0);
+    }
+}
+
+//APP设置步数目标
+void SetsteptargetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x16;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+
+       if(Check_CRC(data,len,crcvalue))
+       {
+        
+        uint32_t targetStep;
+        memcpy(&targetStep,data,4);
+
+        uint8_t ringOn=data[4];
+        uint8_t vibration=data[5];
+        uint8_t notify=data[6];
+
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设置步数:%d %d %d %d \r\n",targetStep,ringOn,vibration,notify);
+
+        set_goal_stepcount(targetStep);
+        
+
+        if(ringOn &&vibration &&  notify)
+        set_goal_step_notification(1);
+        else
+        set_goal_step_notification(0);
+
+
+        sendBuf[17] = 1;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+    
+}
+
+uint8_t jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气数据
+{
+    uint8_t *json;
+    json = buf;
+    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));
+    FILE *fp=fopen("/user/userdata/weather.json","wb+");
+    if(fp != NULL)
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather len %d",strlen((char *)buf)+1);
+        //fwrite((void*)buf,1,strlen((char *)buf)+1,fp);
+        fputs((char *)buf,fp);
+        fclose(fp);
+    }
+    return parse_jsonCheck_weather(buf,check);
+}
+void parse_jsonCheck_weather_post(uint8_t *buf)//json 格式解析 天气数据
+{
+     uint8_t *json;
+    json = buf;
+    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));
+    cJSON* root = cJSON_Parse((const char *)json);
+    if (root == NULL) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");
+        return ;
+    }
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始解析天气 JSON\n");
+    cJSON *now_cjson = cJSON_GetObjectItem(root, "now");
+    if(now_cjson == NULL)
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");
+        return ;
+    }
+    int humidity=0;
+    char * windScale=NULL;
+    char *textNight=NULL;
+    int uvIndex=0;
+    int temp=0;
+    int iconNight=0;
+
+    cJSON *now_data_humidity= cJSON_GetObjectItem(now_cjson, "humidity");
+    if(now_data_humidity)
+    {
+        humidity=now_data_humidity->valueint;
+    }
+    cJSON *now_data_windScale=cJSON_GetObjectItem(now_cjson, "windScale");
+    if(now_data_windScale)
+    {
+        windScale=now_data_windScale->valuestring;
+    }
+    cJSON *now_data_textNight=cJSON_GetObjectItem(now_cjson, "textNight");
+    if(now_data_textNight)
+    {
+        textNight=now_data_textNight->valuestring;
+    }
+    cJSON *now_data_uvIndex= cJSON_GetObjectItem(now_cjson, "uvIndex");
+    if(now_data_uvIndex)
+    {
+        uvIndex=now_data_uvIndex->valueint;
+    }
+    cJSON *now_data_temp= cJSON_GetObjectItem(now_cjson, "temp");
+    if(now_data_temp)
+    {
+        temp=now_data_temp->valueint;
+    }
+    cJSON *now_data_iconNight= cJSON_GetObjectItem(now_cjson, "iconNight");
+    if(now_data_iconNight)
+    {
+        iconNight=now_data_iconNight->valueint;
+    }
+    set_weather_now_data(humidity,windScale,textNight,uvIndex,temp,iconNight);
+
+
+    cJSON *address_cjson = cJSON_GetObjectItem(root, "address");
+
+    char*city=NULL;
+    char*subLocality=NULL;
+    char*atm=NULL;
+     int lat=0;
+     int lon=0;
+
+    cJSON *address_cjson_ = cJSON_GetObjectItem(address_cjson, "city");
+    if(address_cjson_)
+    {
+        city=address_cjson_->valuestring;
+    }
+    
+    
+     address_cjson_= cJSON_GetObjectItem(address_cjson, "subLocality");
+    if(address_cjson_)
+    {
+        subLocality=address_cjson_->valuestring;
+    } 
+
+    address_cjson_=cJSON_GetObjectItem(address_cjson, "atm");
+    if(address_cjson_)
+    {
+        atm=address_cjson_->valuestring;
+    } 
+    address_cjson_ = cJSON_GetObjectItem(address_cjson, "lat");
+    if(address_cjson_)
+    {
+        lat=address_cjson_->valueint;
+    } 
+
+    address_cjson_ = cJSON_GetObjectItem(address_cjson, "lon");
+    if(address_cjson_)
+    {
+        lon=address_cjson_->valueint;
+    } 
+    set_weather_address_data(lat,atm,city,subLocality,lon);
+    cJSON *daily = cJSON_GetObjectItem(root, "daily");
+    if(daily==NULL)
+    {
+        return ;
+    }
+    int count= cJSON_GetArraySize(daily);
+    for(int i=0;i<count;i++)
+    {   
+        //{"tempMin":22,"iconDay":6,"fxDate":1712505600,"textDay":"阵雨","tempMax":29},
+        cJSON *data=cJSON_GetArrayItem(daily,i);
+
+        int  tempMin=0;
+        int  iconDay=0;
+        int  fxDate=0;
+        char *  textDay=NULL;
+        int  tempMax=0;
+
+
+        cJSON *data_=cJSON_GetObjectItem(data,"tempMin");
+        if(data_&& cJSON_IsNumber(data_) )
+        {
+           tempMin=data_->valueint;
+        }
+        
+        data_=cJSON_GetObjectItem(data,"iconDay");
+        if(data_&& cJSON_IsNumber(data_) )
+        {
+           iconDay=data_->valueint;
+        }
+        
+        data_=cJSON_GetObjectItem(data,"fxDate");
+        if(data_&& cJSON_IsNumber(data_) )
+        {
+           fxDate=data_->valueint;
+        }
+        
+        data_=cJSON_GetObjectItem(data,"textDay");
+        if(data_&& cJSON_IsString(data_) )
+        {
+           textDay=data_->valuestring;
+        }
+        data_=cJSON_GetObjectItem(data,"tempMax");
+        if(data_&& cJSON_IsNumber(data_) )
+        {
+           tempMax=data_->valueint;
+        }
+        set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i);
+
+    }
+     ble_UpdateMainWeatherData();
+    cJSON_Delete(root);
+    return ;
+}
+
+uint8_t parse_jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析 天气数据
+{
+    uint8_t flag = 0;
+    // flag = 2;
+    // memcpy(check,&flag,1);
+    // return 0;
+    uint8_t *json;
+    json = buf;
+    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));
+    cJSON* root = cJSON_Parse((const char *)json);
+    if (root == NULL) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");
+        flag = 2;
+        memcpy(check,&flag,1);
+        return 0;
+    }
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始解析天气 JSON\n");
+    cJSON *now_cjson = cJSON_GetObjectItem(root, "now");
+    if(now_cjson == NULL)
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"天气 JSON解析错误\n");
+        return 0;
+    }
+    int humidity=0;
+    char * windScale=NULL;
+    char *textNight=NULL;
+    int uvIndex=0;
+    int temp=0;
+    int iconNight=0;
+
+    cJSON *now_data_humidity= cJSON_GetObjectItem(now_cjson, "humidity");
+    if(now_data_humidity)
+    {
+        humidity=now_data_humidity->valueint;
+    }
+    cJSON *now_data_windScale=cJSON_GetObjectItem(now_cjson, "windScale");
+    if(now_data_windScale)
+    {
+        windScale=now_data_windScale->valuestring;
+    }
+    cJSON *now_data_textNight=cJSON_GetObjectItem(now_cjson, "textNight");
+    if(now_data_textNight)
+    {
+        textNight=now_data_textNight->valuestring;
+    }
+    cJSON *now_data_uvIndex= cJSON_GetObjectItem(now_cjson, "uvIndex");
+    if(now_data_uvIndex)
+    {
+        uvIndex=now_data_uvIndex->valueint;
+    }
+    cJSON *now_data_temp= cJSON_GetObjectItem(now_cjson, "temp");
+    if(now_data_temp)
+    {
+        temp=now_data_temp->valueint;
+    }
+    cJSON *now_data_iconNight= cJSON_GetObjectItem(now_cjson, "iconNight");
+    if(now_data_iconNight)
+    {
+        iconNight=now_data_iconNight->valueint;
+    }
+    set_weather_now_data(humidity,windScale,textNight,uvIndex,temp,iconNight);
+
+
+    cJSON *address_cjson = cJSON_GetObjectItem(root, "address");
+
+    char*city=NULL;
+    char*subLocality=NULL;
+    char*atm=NULL;
+     int lat=0;
+     int lon=0;
+
+    cJSON *address_cjson_ = cJSON_GetObjectItem(address_cjson, "city");
+    if(address_cjson_)
+    {
+        city=address_cjson_->valuestring;
+    }
+    
+    
+     address_cjson_= cJSON_GetObjectItem(address_cjson, "subLocality");
+    if(address_cjson_)
+    {
+        subLocality=address_cjson_->valuestring;
+    } 
+
+    address_cjson_=cJSON_GetObjectItem(address_cjson, "atm");
+    if(address_cjson_)
+    {
+        atm=address_cjson_->valuestring;
+    } 
+    address_cjson_ = cJSON_GetObjectItem(address_cjson, "lat");
+    if(address_cjson_)
+    {
+        lat=address_cjson_->valueint;
+    } 
+
+    address_cjson_ = cJSON_GetObjectItem(address_cjson, "lon");
+    if(address_cjson_)
+    {
+        lon=address_cjson_->valueint;
+    } 
+    set_weather_address_data(lat,atm,city,subLocality,lon);
+    cJSON *daily = cJSON_GetObjectItem(root, "daily");
+    if(daily==NULL)
+    {
+        return 0;
+    }
+    int count= cJSON_GetArraySize(daily);
+    for(int i=0;i<count;i++)
+    {   
+        //{"tempMin":22,"iconDay":6,"fxDate":1712505600,"textDay":"阵雨","tempMax":29},
+        cJSON *data=cJSON_GetArrayItem(daily,i);
+
+        int  tempMin=0;
+        int  iconDay=0;
+        int  fxDate=0;
+        char *  textDay=NULL;
+        int  tempMax=0;
+
+
+        cJSON *data_=cJSON_GetObjectItem(data,"tempMin");
+        if(data_&& cJSON_IsNumber(data_) )
+        {
+           tempMin=data_->valueint;
+        }
+        
+        data_=cJSON_GetObjectItem(data,"iconDay");
+        if(data_&& cJSON_IsNumber(data_) )
+        {
+           iconDay=data_->valueint;
+        }
+        
+        data_=cJSON_GetObjectItem(data,"fxDate");
+        if(data_&& cJSON_IsNumber(data_) )
+        {
+           fxDate=data_->valueint;
+        }
+        
+        data_=cJSON_GetObjectItem(data,"textDay");
+        if(data_&& cJSON_IsString(data_) )
+        {
+           textDay=data_->valuestring;
+        }
+        data_=cJSON_GetObjectItem(data,"tempMax");
+        if(data_&& cJSON_IsNumber(data_) )
+        {
+           tempMax=data_->valueint;
+        }
+        set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i);
+
+    }
+
+    if( uapi_dev_runtime_get_bt_powerstat() && cm_get_HFP_switch())
+    uapi_pbap_cmd_start_client();
+
+    bd_addr_t bdaddr={0};
+    #ifdef FD230
+    uapi_get_br_address(&bdaddr);
+    if( uapi_dev_runtime_get_bt_powerstat() && (cm_get_HFP_switch()||cm_get_A2DP_switch()))
+    {
+      
+        if(cm_get_A2DP_switch() && cm_get_A2DP_switch() && false==bt_is_acl_connected(&bdaddr) && !(bdaddr.addr[0]==0 && bdaddr.addr[1]==0 && bdaddr.addr[2]==0 && bdaddr.addr[3]==0 
+              && bdaddr.addr[4]==0 && bdaddr.addr[5]==0))
+        {
+            gap_reconnect_media_device(&bdaddr);
+        }
+        else if(cm_get_A2DP_switch())
+        {
+            uapi_a2dp_snk_connect();
+        }
+        else if(cm_get_HFP_switch())
+        {
+            uapi_hfp_connect();
+        }
+        
+    }
+   
+    #endif
+
+    ble_UpdateMainWeatherData();
+    cJSON_Delete(root);
+    *check = 1;
+    return 1;
+}
+/*读取天气历史数据*/
+uint8_t read_jsonHistory_weather(void)
+{
+    uint8_t *buf = NULL;
+    FILE *fp=fopen("/user/userdata/weather.json","rb");
+    if(fp == NULL)
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"read_jsonHistory_weather:fopen error\r\n");
+        return 0;
+    }
+    fseek(fp, 0, SEEK_END);
+    long size = ftell(fp);
+    fseek(fp, 0, SEEK_SET);
+    if (size == 0)
+    {
+        fclose(fp);
+        return 0;
+    }
+    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file size = %d\r\n",size);
+    buf = (uint8_t*)malloc(size + 1);
+    if(buf == NULL)
+    {
+        fclose(fp);
+        return 0;
+    }
+
+    char *str = fgets((char *)buf,size + 1,fp);
+    if(str!=NULL)
+    {
+        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file str = %s\r\n",str);
+    }
+
+    fclose(fp);
+
+    parse_jsonCheck_weather_post(buf);
+
+    free(buf);
+    
+    return 1;
+}
+
+uint8_t binCheck_AI(uint8_t *buf,uint8_t *check,uint16_t len)//json 格式解析 天气数据
+{
+    uint8_t flag = 0;
+    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"jsonCheck_weather:len: json:%f jsonlen:%d\r\n",0.011,strlen((char *)json));
+    #if 0
+        FILE *fp=fopen("user/AI.txt","wb+");
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI len %d\r\n",len);
+        fwrite((void*)buf,1,len,fp);
+        //fputs((char *)buf,fp);
+        fclose(fp);
+    #endif
+
+    uint16_t offset=0;
+
+    while (len>offset)
+    {
+       if(buf[offset]==1)
+       {
+            offset++;
+            if(offset>=len)break;
+            uint16_t txt_len;
+            memcpy_s(&txt_len,2,&buf[offset],2);
+
+            offset+=2;
+            if(offset>=len)break;
+
+            char txt_buf[256]={0};
+            memcpy_s(txt_buf,256,&buf[offset],txt_len);
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",txt_buf,txt_len);
+            ble_set_ai_Question_str(txt_buf);
+            offset+=txt_len;
+            //offset+=1;
+       }
+        if(offset>=len)break;
+       
+        if(buf[offset]==2)
+       {
+            offset++;
+            if(offset>=len)break;
+
+            uint16_t txt_len;
+            memcpy_s(&txt_len,2,&buf[offset],2);
+
+            offset+=2;
+            if(offset>=len)break;
+
+            if(txt_len>=AI_TXT_BUF_MAX_LEN)
+            txt_len=AI_TXT_BUF_MAX_LEN;
+
+            char *txt_buf=(char*)malloc(txt_len+1);
+            if(txt_buf==NULL)
+            {
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI txtbuf malloc fail\r\n");
+                ble_set_ai_Answer_str("手表缓存不足",0);
+                return 0;
+            }
+
+            txt_buf[txt_len]=0;
+            memcpy_s((char *)txt_buf,1024*3,&buf[offset],txt_len);
+
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI txtbuf Answer %s %d\r\n",txt_buf,txt_len);
+            ble_set_ai_Answer_str(txt_buf,2);
+            free(txt_buf);
+
+            offset+=txt_len;
+            //offset+=1;
+       }
+        if(offset>=len)break;
+
+        if(buf[offset]==0)
+       {
+            offset++;
+            if(offset>=len)break;
+
+            uint16_t txt_len;
+            memcpy_s(&txt_len,2,&buf[offset],2);
+
+            offset+=2;
+            if(offset>=len)break;
+
+            char error_buf[256]={0};
+            memcpy_s(error_buf,256,&buf[offset],txt_len);
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len);
+            ble_set_ai_Answer_str(error_buf,0);
+            offset+=txt_len;
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 解析失败\r\n");
+
+       }
+       if(offset>=len)break;
+
+       if(buf[offset]==3)
+       {
+            offset++;
+            if(offset>=len)break;
+
+            uint16_t txt_len;
+            memcpy_s(&txt_len,2,&buf[offset],2);
+
+            offset+=2;
+            if(offset>=len)break;
+
+            char error_buf[256]={0};
+            memcpy_s(error_buf,256,&buf[offset],txt_len);
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len);
+            ble_set_ai_Answer_str(error_buf,3);
+            offset+=txt_len;
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 回应错误\r\n");
+
+       }
+       if(offset>=len)break;
+
+        if(buf[offset]==4)
+       {
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 结束\r\n");
+            // if(AI_is_end_state)
+            // {
+            //     AI_is_end_state=0;
+            // }
+            offset++;
+            if(offset>=len)
+            {
+                ble_set_ai_Answer_str("",4);
+                break;
+            }
+
+            uint16_t txt_len;
+            memcpy_s(&txt_len,2,&buf[offset],2);
+
+            offset+=2;
+            if(offset>=len)break;
+
+            char error_buf[256]={0};
+            memcpy_s(error_buf,256,&buf[offset],txt_len);
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len);
+            ble_set_ai_Answer_str(error_buf,4);
+
+            offset+=txt_len;
+            //  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AI 解析失败\r\n");
+
+       }
+       if(offset>=len)break;
+        offset++;
+    }
+   
+    *check = 1;
+    return 1;
+}
+
+
+void SetWeatherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取天气数据
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x20;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data);
+       if(Check_CRC(data,len,crcvalue))
+       {
+        // uint32_t y=(0xff00);
+        // uint32_t x =(0xff00& 0Xff00)>>16;
+        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd %u\r\n",x);
+        uint8_t check = 1;
+        jsonCheck_weather(data,&check);
+        sendBuf[17] = check;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    } 
+}
+
+
+void SetAiResultCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x1f;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data);
+       if(Check_CRC(data,len,crcvalue))
+       {
+        uint8_t check = 1;
+        binCheck_AI(data,&check,len);
+
+        sendBuf[17] = check;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    } 
+}
+
+void APP_reply_AI_is_ready(uint8_t *data,uint16_t len)
+{
+    if(data[0])
+    {
+        if(len>1)
+        {
+            //更新chatgptKEY
+            FILE *fp= fopen("/user/userdata/chatGPTkey.bin","wb+");
+            if(fp)
+            {
+                fwrite(data+1,1,len-1,fp);
+                fclose(fp);
+            }
+        }
+    }
+    ble_app_reply(data[0]);
+}
+void SaveChatGPTCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x23;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data);
+    //"sk-proj-04ogvrZQqyaiv1OWw8OZT3BlbkFJG9Gyr8oFvRdmr3oXQNbX"
+       if(Check_CRC(data,len,crcvalue))
+       {
+        
+        FILE *fp= fopen("/user/userdata/chatGPTkey.bin","wb+");
+        if(fp)
+        {
+            fwrite(data,1,len,fp);
+            fclose(fp);
+            sendBuf[17] = 1;
+        }
+        else
+        {
+            sendBuf[17] = 2;
+        }
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    } 
+}
+
+
+bool bin_Check_schedule(uint8_t *data,uint16_t len)
+{
+    uint16_t offset = 0;
+    uint16_t buf_len = 0;
+    uint16_t id_ = 1;
+    
+    // 打印函数开始及总长度信息
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bin_Check_schedule start, total len: %d", len);
+
+    while (offset < len)
+    {
+        uint16_t id;
+        // 解析ID
+        memcpy_s(&id, 2, &data[offset], 2);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsing ID: 0x%04X at offset: %d", id, offset);
+        offset += 2;
+        if (offset >= len)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing ID, break");
+            break;
+        }
+
+        // 解析标题长度
+        memcpy_s(&buf_len, 2, &data[offset], 2);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Title length: %d at offset: %d", buf_len, offset);
+        offset += 2;
+        if (offset >= len)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing title length, break");
+            break;
+        }
+
+        // 解析标题内容
+        char *title = (char*)malloc(buf_len + 1);
+        if (!title)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to allocate memory for title");
+            break;
+        }
+        memset_s(title, buf_len + 1, 0, buf_len + 1);  // 修正为实际分配的大小
+        memcpy_s(title, buf_len + 1, &data[offset], buf_len);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsed title: [%s] (length: %d) at offset: %d", title, buf_len, offset);
+
+        offset += buf_len;
+
+        if (offset >= len)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing title, free title and break");
+            free(title);
+            break;
+        }
+
+        // 解析开始时间
+        uint32_t timetemp_begin = 0;
+        memcpy_s(&timetemp_begin, 4, &data[offset], 4);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Start time: %u at offset: %d", timetemp_begin, offset);
+        offset += 4;
+        if (offset >= len)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing start time, free title and break");
+            free(title);
+            break;
+        }
+
+        // 解析结束时间
+        uint32_t timetemp_end = 0;
+        memcpy_s(&timetemp_end, 4, &data[offset], 4);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "End time: %u at offset: %d", timetemp_end, offset);
+        offset += 4;
+        if (offset >= len)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len after parsing end time, free title and break");
+            free(title);
+            break;
+        }
+
+        // 解析附加信息长度
+        memcpy_s(&buf_len, 2, &data[offset], 2);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Additional info length: %d at offset: %d", buf_len, offset);
+        offset += 2;
+
+        if (buf_len == 0)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "No additional info, offset: %d, len: %d", offset, len);
+            // 调用设置函数
+            if (offset == len)
+            {
+                Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, "", true);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info (complete), id_: %d", id_);
+            }
+            else
+            {
+                Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, "", false);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info (incomplete), id_: %d", id_);
+            }
+            
+            id_++;
+            free(title);
+            continue;
+        }
+
+        if (offset >= len)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Offset exceed len before parsing additional info, free title and break");
+            free(title);
+            break;
+        }
+
+        // 解析附加信息
+        char *str_ = (char*)malloc(buf_len + 1);
+        if (!str_)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Failed to allocate memory for additional info");
+            free(title);
+            break;
+        }
+        memset_s(str_, buf_len + 1, 0, buf_len + 1);  // 修正为实际分配的大小
+        memcpy_s(str_, buf_len + 1, &data[offset], buf_len);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Parsed additional info: [%s] (length: %d) at offset: %d", str_, buf_len, offset);
+
+        offset += buf_len;
+        
+        // 调用设置函数
+        if (offset == len)
+        {
+            Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, str_, true);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info with additional info (complete), id_: %d", id_);
+        }
+        else
+        {
+            Ble_Set_ScheduleInfo(id_, timetemp_begin, timetemp_end, title, str_, false);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Set schedule info with additional info (incomplete), id_: %d", id_);
+        }
+
+        id_++;
+
+        // 释放内存
+        free(title);
+        free(str_);
+        
+        if (offset >= len)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "All data parsed, exit loop");
+            break;
+        }
+    }
+    
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bin_Check_schedule end, total parsed id count: %d", id_ - 1);
+    return true;
+}
+void APP_send_schedule_Cmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x24;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+    //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetWeatherCmd:len:%d data:%s\r\n",len,data);
+    //"sk-proj-04ogvrZQqyaiv1OWw8OZT3BlbkFJG9Gyr8oFvRdmr3oXQNbX"
+       if(Check_CRC(data,len,crcvalue))
+       {
+        
+        printf("11111111111111111\n");
+        bool val = bin_Check_schedule(data,len);
+        printf("222222222222222222222\n");
+        if(val)
+        {
+            sendBuf[17] = 1;
+        }
+        else
+        {
+            sendBuf[17] = 2;
+        }
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    } 
+}
+
+bool bin_Check_sos(uint8_t *data,uint16_t len)
+{
+    uint8_t SOS_num=data[0];
+    uint32_t offset=1;
+    char *name=NULL;
+    char *number=NULL;
+    ble_sos_number_clean();
+
+    while (SOS_num)
+    {
+        SOS_num--;
+        uint8_t sex=data[offset];
+        offset++;
+        if(offset>=len)
+        break;
+        uint8_t name_len=data[offset];
+        offset++;
+        if(offset>=len)
+        break;
+        char *name=(char *)malloc(name_len+1);
+        if(name==NULL)
+        break;
+        memset_s(name,255,0,name_len+1);
+        memcpy_s(name,255,&data[offset],name_len);
+        offset+=name_len;
+        if(offset>=len)
+        break;
+        uint8_t number_len=data[offset];
+        offset++;
+        if(offset>=len)
+        break;
+        char *number=(char *)malloc(number_len);
+        if(number==NULL)
+        break;
+        memset_s(number,255,0,number_len+1);
+        memcpy_s(number,255,&data[offset],number_len);
+        offset+=number_len;
+        
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"sex:%d,name:%s,number:%s;\r\n",sex,name,number);
+
+        ble_add_sos_number(sex,name,number);
+
+        free(number);
+        number==NULL;
+        free(name);
+        name==NULL;
+
+        if(offset>=len)
+        break;
+
+
+    }
+    if(number)
+    {
+        free(number);
+    }
+    if(name)
+    {
+        free(name);
+    }
+
+    ble_sos_data_save();
+
+    return true;
+}
+
+void APP_send_sos_Cmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    sendBuf[0] = 0x72;
+    sendBuf[1] = 0x02;
+    sendBuf[2] = 0x25;
+    memcpy(sendBuf+3,&tmp,4);
+    memcpy(sendBuf+7,&tmp,4);
+    memcpy(sendBuf+11,&tmp,4);
+    memcpy(sendBuf+15,&tmp_data,2);
+
+       if(Check_CRC(data,len,crcvalue))
+       {
+        
+        if(bin_Check_sos(data,len))
+        {
+            sendBuf[17] = 1;
+        }
+        else
+        {
+            sendBuf[17] = 2;
+        }
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    }
+       else
+       {
+               sendBuf[17] = 0;
+        sendBuf[18] = Calculate_CRC(sendBuf,18);
+        sendBleData(sendBuf,19);
+    } 
+}
+
+void GetGPSCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+     {
+    if(Check_CRC(data,len,crcvalue))
+       {
+        if(len==4)
+        {
+            uint32_t timetamp=0;
+            memcpy_s((void*)&timetamp,4,data,4);
+            char path[128]={0};
+            if(get_training_gps_path(path,timetamp,128))
+            {
+                FILE *fp= fopen(path,"rb+");
+                uint32_t file_size=0;
+                if(fp==NULL)
+                {
+                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);
+                    ble_data_type type_={0x02,0x4f,0,1,1};
+                    send_big_data(type_,NULL,0);
+                    return ;
+                }
+                fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
+                file_size = ftell(fp);       // 获取当前文件指针位置,即文件大小
+                fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头
+                fclose(fp);
+
+                int num=(ble_nus_max_data_len-18);
+                if(num>482)num=482;
+
+                char* buf = (char *)ym_malloc( file_size );
+                if(buf==NULL){fclose(fp); return ;}
+
+                int data_size= read_GPS_DATA(path,buf);
+            
+                uint32_t surplus_len=data_size;
+                uint32_t offset=0;
+
+                uint32_t pack;
+                uint16_t pack_size=(ble_nus_max_data_len-18);
+                if(pack_size>482)pack_size=482;
+
+                if(data_size%pack_size==0)
+                {
+                    pack=data_size/pack_size;
+                }
+                else
+                {   
+                    pack=data_size/pack_size+1;
+                }
+                uint32_t pack_id=1;
+                while (surplus_len!=0)
+                {
+                    if(surplus_len>=pack_size)
+                    {
+                        surplus_len=surplus_len-pack_size;
+
+                        ble_data_type type_={0x02,0x4f,data_size,pack,pack_id};
+                        send_big_data(type_,(char *)buf+offset,pack_size);
+                        offset+=pack_size;
+                    }
+                    else
+                    {
+                    
+                        ble_data_type type_={0x02,0x4f,data_size,pack,pack_id};
+                        send_big_data(type_,(char *)buf+offset,surplus_len);
+                        break;
+                    }
+                    pack_id++;
+                }
+
+               
+                free(buf);
+
+            }
+            else
+            {
+                ble_data_type type_={0x02,0x4f,0,1,1};
+                send_big_data(type_,NULL,0);
+            }
+        
+        }
+        else
+        {
+            ble_data_type type_={0x02,0x4f,0,1,1};
+            send_big_data(type_,NULL,0);
+        }  
+    }
+       else
+       {
+        ble_data_type type_={0x02,0x4f,0,1,1};
+        send_big_data(type_,NULL,0);
+    }
+
+   //send_big_data(1,NULL,0,0,1,1,,2);
+}
+   //send_big_data(1,NULL,0,0,1,1,0x4f,2);
+}
+void App_delete_file(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//
+{
+
+    uint8_t reply[2]={0};
+    if (len<=2)
+    {
+         ble_reply_cmdarr(cmd,reply,2);//crc error
+    }
+    if(Check_CRC(data,len,crcvalue))
+    {
+        uint8_t count=data[0];
+        uint8_t type=data[1];
+        if(type==2)
+        {
+            if(len-2!=count*2)
+            {
+                ble_reply_cmdarr(cmd,reply,1);//crc error
+            }
+            else
+            {
+                int offest=2;
+                for(int i=0;i<count;i++)
+                {
+                    uint16_t id=0;
+                    memcpy_s(&id,2,&data[offest],2);
+                    bool ret = delete_MP3_file_By_ID(id);
+                    if(ret==false)
+                    {
+                        reply[0]=2;
+                        ble_reply_cmdarr(cmd,reply,1);//crc error
+                        return;
+                    }
+                    else
+                    {
+                        offest+=2;
+                    }
+                }
+                reply[0]=1;
+                ble_mp3_list_update();
+                ble_reply_cmdarr(cmd,reply,1);
+            }
+
+        }
+        else
+        {
+            reply[0]=2;
+            ble_reply_cmdarr(cmd,reply,1);
+        }
+
+        
+        
+    }else{
+        ble_reply_cmdarr(cmd,reply,1);//crc error
+    }
+
+}
+
+void query_dial_installed(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//
+{
+
+    uint8_t reply[2]={0};
+    if (len != 2)
+    {
+         ble_reply_cmdarr(cmd,reply,2);//crc error
+    }
+    if(Check_CRC(data,len,crcvalue))
+    {
+        uint16_t dial_uid  = *(uint16_t*)data;
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"query dial 0x%04X installed !!!!!!!!\r\n",dial_uid);
+
+        if(!ble_is_dial_install_by_id(dial_uid))
+        reply[0]=2; //该表盘是否已安装 0:指令校验失败 1:已安装 2:未安装
+        else
+        reply[0]=1; //该表盘是否已安装 0:指令校验失败 1:已安装 2:未安装
+        
+
+        reply[1]=0; //表盘列表是否已满 0:未满 1:已满
+        ble_reply_cmdarr(cmd,reply,2);
+        
+    }else{
+        ble_reply_cmdarr(cmd,reply,2);//crc error
+    }
+
+}
+
+void SetUserInfo(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//
+{
+
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getUserInfo ");
+
+    if(Check_CRC(data,len,crcvalue))
+    {
+        ble_reply_cmd(USER_INFOR_CMD,1);
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getUserInfo:!!!!!!!!\r\n");
+        msg_user_info_t *p_userinfo = (msg_user_info_t*)data;
+
+        msg_user_info_t msg_userinfo = {0};
+        msg_userinfo.age = p_userinfo->age;
+       msg_userinfo.fat_time = p_userinfo->fat_time;
+        msg_userinfo.gender = p_userinfo->gender;
+        msg_userinfo.height = p_userinfo->height;
+                msg_userinfo.target_stand = p_userinfo->target_stand;
+        msg_userinfo.target_step = p_userinfo->target_step;
+        msg_userinfo.timeformat = p_userinfo->timeformat;
+        msg_userinfo.weight = p_userinfo->weight;
+        msg_userinfo.calorie=p_userinfo->calorie;
+        msg_userinfo.distance=p_userinfo->distance;
+
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"getUserInfo:!!age %d, fat %d, sex %d, height %d, stand %d, step %d , timeformat %d , weight %d !!!!!!\r\n",
+        p_userinfo->age,
+        p_userinfo->fat_time,
+        p_userinfo->gender,
+        p_userinfo->height,
+        p_userinfo->target_stand,
+        p_userinfo->target_step,
+        p_userinfo->timeformat,
+        p_userinfo->weight
+        );
+        
+        set_user_data(&msg_userinfo);
+        
+    }else{
+        ble_reply_cmd(USER_INFOR_CMD,0);//crc error
+    }
+}
+
+//APP下发快捷辅助功能参数
+void Set_auxil_fun_parm(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t packtmp = 1;
+    value[0] =0x72;
+    value[1] =0x02;
+    value[2] =0x11;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&packtmp,2);
+    
+    if(Check_CRC(data,len,crcvalue))
+    {
+        uint8_t paramCnt = data[0];//快捷辅助功能 按照协议文档要区分
+        set_quick_auxiliary_paramters(paramCnt);
+        value[17] = 1;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else{
+        value[17] = 0x00;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+void getTRAIN_TARGETInfo(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//
+{
+
+}
+// #include "phoneaddressmodel.h"
+//电话薄解析函数
+void  Parse_addressbook_bin(uint8_t *data,uint16_t len)
+{
+    int num=data[0];//人数
+    int offset=1;
+    while (num)
+    {
+        uint8 sex = data[offset];
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"性别: %d\r\n",sex);
+        offset=offset+1;
+        uint8 name_len=data[offset];
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"name_len %d\r\n",name_len);
+        char name[32]={0};
+        if(name_len==0)
+        {
+            name_len=strlen("未知");
+             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"未知\r\n");
+        }
+        else
+        {
+            memcpy(name,&data[offset+1],name_len);
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"姓名: %s\r\n",name);
+            // for(int i=0;i<name_len;i++)
+            // {
+            //       WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," %X ",name[i]);
+            // }
+            //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"r\n");
+        }
+        offset=offset+name_len+1;
+        uint8 phone_num=data[offset]; 
+        offset=offset+1;
+        for(int i=0;i<phone_num;i++)
+        { 
+
+            uint8 phonen_len=data[offset];
+            char phonen_name[32]={0};
+            memcpy(phonen_name,&data[offset+1],phonen_len);
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"号码: %s\r\n",phonen_name);
+            //  for(int i=0;i<phonen_len;i++)
+            // {
+            //       WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," %X ",phonen_name[i]);
+            // }
+            //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"r\n");
+
+            offset=offset+phonen_len+1;
+        }
+        for(int i=0;i<phone_num;i++)
+        {
+            uint8 add = data[offset];
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"归属地长度: %d\r\n",add);
+            memcpy(name,&data[offset+1],add);
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"归属地: %s\r\n",name);
+            offset=offset+add+1;
+            uint8 yun = data[offset];
+            memcpy(name,&data[offset+1],yun);
+              WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"运营商: %s\r\n",name);
+            offset=offset+yun+1;
+        }
+       
+        num--;
+    }
+     
+}
+void SetAPPaddressbook(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    value[0] =0x72;
+    value[1] =0x02;
+    value[2] =0x0b;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp,2);
+    
+    if(Check_CRC(data,len,crcvalue))
+    {
+        addressbookToRead((char*)data);
+        //同步完就写一次
+        addressbookTowrite();
+        value[17] = 0x01;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else{
+        value[17] = 0x00;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+
+}
+
+//02 类型
+void type2AE4Data(ble_read_data *buffer_handle,uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue)
+{
+    uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE4Data typeID:0x%04X\r\n",typeID);
+    switch (typeID) //ID
+    {
+        case USER_INFOR_CMD://app下发的获取用户信息
+            SetUserInfo(buffer_handle,typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SET_PHONE_INFOR_CMD://app下发的下发的手机信息
+            SetPhoneInfo(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SET_WATCH_AUXIL_FUN_PARAM_CMD://app下发快捷辅助功能参数
+            Set_auxil_fun_parm(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case CURR_TIME_CMD:
+            SetUTCtime(typeID,data,datalen,totalData,crcvalue);//获取时间app下发的时间进行解析
+            break;
+        case SET_BLE_NAME_CMD:
+            getPhoneInfo_test();
+            break;
+        case SET_TRAIN_TARGET_CMD://训练目标
+            SetTarinTarget(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SET_address_book_CMD:
+            SetAPPaddressbook(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SET_ALARM_DATA_CMD:
+            SetAlarmDataCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SET_OTHER_TARGET_CMD:
+            SetOtherTarget(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SET_PASSWORD_CMD:
+            SetpasswordCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SET_SEDENTARINESS_PARAM_CMD:
+            SetsedentarinessSetParamCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SET_ANCS_MSG_FILTRATION_CMD:
+             SetmsgfiltrationCmd(typeID,data,datalen,totalData,crcvalue);
+             break;
+        case QUERY_DIAL_INSTALLED_PARAM_CMD:
+            query_dial_installed(buffer_handle,typeID,data,datalen,totalData,crcvalue);
+            break;
+        case DELETE_FILE_CMD:
+            App_delete_file(buffer_handle,typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SYN_BASIC_REAL_HEATR_CMD:
+            SYN_train_heart_datatCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SYN_TRAIN_DATA_CMD:
+            SYN_train_datatCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SYN_TRAIN_SPEED_CMD:
+            SYN_train_speed_datatCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        
+        case SYN_TODAY_BASIC_TRAIN_TXT_CMD:
+            break;
+        case SYN_WATCH_LCD_PARAM_CMD://app下发的同步屏幕参数到手表
+            GetWatchLcdParamCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SYN_VOICE_VIBRATION_PARAM_CMD://app下发声音与振动参数
+            GetVoiceVibrateParamCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SET_WATCH_HR_SET_PARAM_CMD://app下发设置心率参数
+            GetHrSetParamCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SET_WATCH_SPO2_SET_PARAM_CMD:
+            GetSpo2SetParamCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SET_DRINK_PARAM_CMD://app下发的喝水提醒设置
+            SetDrinkSetParamCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SET_SLEEP_PARAM_CMD://app下发的喝水提醒设置
+            SetsleepSetParamCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case SET_STEP_TARGET_CMD://app下发的步数目标设置
+            SetsteptargetParamCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+            
+        case SET_WEATHER_DATA_CMD://app下发的天气数据
+            SetWeatherCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+         case SET_APP_AI_TXT_CMD://app下发的AI数据
+            SetAiResultCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        
+         case SYN_APP_GET_GPS_DATA_CMD://app获取GPS数据
+            GetGPSCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case APP_SEND_CHATGPT_KEY_CMD:
+            SaveChatGPTCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        case APP_SEND_AI_KEY_IS_AVAILABLE_CMD:
+            APP_reply_AI_is_ready(data,datalen);
+            break;
+         case SYN_APP_SCHEDULE_DATA_CMD:
+            APP_send_schedule_Cmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+         case APP_SEND_SOS_DATA_CMD:
+            APP_send_sos_Cmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+        
+
+        default:
+            break;
+    }
+}
+
+void reply_app_send_switchDialCmd(bool flag)
+{
+    uint8_t data;
+    if(flag)
+    {
+        data=1;
+        ble_reply_cmdarr(0x0102,&data,1);
+    }
+    else
+    {
+        data=3;
+        ble_reply_cmdarr(0x0102,&data,1);
+    }
+}
+
+//切换表盘
+static void switchDialCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x02;
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    
+    if(Check_CRC(data,len,crcvalue))
+    {
+        uint16_t daila_type = 0;
+        memcpy(&daila_type,&data[0],2);
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"switchDialCmd %d !!!!!!!!!!\r\n",daila_type,data,len);
+
+        ble_set_dial_by_id(daila_type);
+
+        // if(ble_get_dial_id()==daila_type)
+        // {
+        //     value[17] = 1;//切换成功
+        // }
+        // else
+        // {
+        //     value[17] = 3;//切换失败
+        // }
+        
+        // value[18] = Calculate_CRC(value,18);
+        // sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;//校验失败
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+
+//关于本机内容
+static void aboutDeviceCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+
+    uint8_t _major,_mid,_minor;
+    uapi_get_fw_version(&_major,&_mid,&_minor);
+    cJSON *dataJSON = cJSON_CreateObject();
+    cJSON_AddNumberToObject(dataJSON,"code",1);
+    cJSON_AddNumberToObject(dataJSON,"major",_major);
+    cJSON_AddNumberToObject(dataJSON,"mid",_mid);
+    cJSON_AddNumberToObject(dataJSON,"minor",_minor);
+    unsigned char addr[6];
+    bluetooth_get_local_addr(&addr[0],6);
+    char mac_data[24];
+    memset(mac_data,0,24);
+    sprintf(mac_data,"%02X:%02X:%02X:%02X:%02X:%02X",addr[5],addr[4],addr[3],addr[2],addr[1],addr[0]);
+    cJSON_AddStringToObject(dataJSON, "macAddress",mac_data);
+
+    char *json_format = cJSON_PrintUnformatted(dataJSON);
+    cJSON_Delete(dataJSON);
+    uint32_t data_len = strlen(json_format);
+    uint8_t value[data_len+19];
+    memset(value,0,data_len+19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = (uint16_t)data_len;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x03;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&data_len,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        memcpy(value+17,(uint8_t *)json_format,data_len);//17+69 = 86
+        
+        value[data_len+17] = Calculate_CRC(value,data_len+17);//
+        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data_len:%d %x %d!!!!!\r\n",data_len,value[data_len+17],data_len+17);
+        sendBleData(value,data_len+18);
+    }else
+    {
+        value[17] = 0;
+        uint8_t lrc = Calculate_CRC(value,18);
+        value[18] = lrc;
+        sendBleData(value,19);
+    }
+    cJSON_free(json_format);
+}
+//查找手表 01 04
+//设置查找手表的状态,1 校验成 2手表已找到,停止查找手表
+void setFindWatchFlag(uint8_t flag)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x04;
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    value[17] = flag;//校验标志
+    value[18] = Calculate_CRC(value,18);
+    sendBleData(value,19);
+}
+static void findWatchCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    if(Check_CRC(data,len,crcvalue))
+    {
+        uint8_t findFlag = data[0];
+        CustomEventPublish(TOPIC_EVENT_FIND_WATCH,&findFlag,sizeof(findFlag));//查找手表
+        setFindWatchFlag(1);
+    }else
+    {
+        setFindWatchFlag(0);
+    } 
+}
+//获取sd卡剩余空间
+static void GetSDSpaceCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[28];
+    memset(value,0,28);
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x05;
+    
+    if(Check_CRC(data,len,crcvalue))
+    {
+        uint32_t tmp_ = 1;
+        uint32_t tmp = 9;
+        uint16_t tmp_data = 9;
+        memcpy(value+3,&tmp_,4);
+        memcpy(value+7,&tmp,4);
+        memcpy(value+11,&tmp_,4);
+        memcpy(value+15,&tmp_data,2);
+
+        uint8_t sdFlag = 1;
+
+        uint64_t free_size=0;
+        int i;
+        struct statfs file_buf = {0};
+#ifdef SINGLE_USER_PARTITION
+        static const char * const g_volume_names[1] = { "/user/"};
+        for (i = 0; i < 1; i++) {
+#else
+        static const char * const g_volume_names[4] = {"/system/", "/update/", "/music/", "/user/"};
+        
+        for (i = 0; i < 4; i++) {
+#endif
+            /* 获取文件系统状态 */
+            if (statfs(g_volume_names[i], &file_buf) != 0) {
+                return ;
+            }
+            if(strcmp("/user/",g_volume_names[i])==0)
+            {
+                free_size= ((uint64_t)(file_buf.f_bfree * file_buf.f_bsize));
+                //  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"free_size :%ld\r\n",free_size);
+                  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"free_size :%lu\r\n",free_size);
+            }
+        }
+        if(sdFlag == 1)// 1获取失败 2 获取成功 
+        {
+            value[17] = 1;//校验标志
+            memcpy_s(value+18,8,&free_size,8);
+
+            value[26] = Calculate_CRC(value,26);
+            sendBleData(value,27);
+        }else{
+            
+            uint32_t tmp = 1;
+            uint16_t tmp_data = 1;
+            memcpy(value+3,&tmp,4);
+            memcpy(value+7,&tmp,4);
+            memcpy(value+11,&tmp,4);
+            memcpy(value+15,&tmp_data,2);
+            value[17] = 2;//校验标志
+            value[18] = Calculate_CRC(value,18); 
+            sendBleData(value,19);
+        }
+    }else
+    {
+
+        uint32_t tmp = 1;
+        uint16_t tmp_data = 1;
+        memcpy(value+3,&tmp,4);
+        memcpy(value+7,&tmp,4);
+        memcpy(value+11,&tmp,4);
+        memcpy(value+15,&tmp_data,2);
+
+        value[17] = 0;//校验标志
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    } 
+}
+//获取当前数据
+void GetCurDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    // if(!Check_CRC(data,len,crcvalue))
+    // {
+    //     int data_len=0;
+    //     ble_data_type type_={0x01,0x06,data_len,1,1};
+    //     send_big_data(type_,NULL,0);
+    //     return;
+    // }
+    // cJSON *dataJSON = cJSON_CreateObject();
+    // const char *string_value[7]={"hr","spo2","steps","duration","standup","calories","distance"};
+    // for(uint8_t i = 0;i<7;i++)
+    // {
+    //     cJSON* data_arryJSON = cJSON_CreateObject();
+    //     if(data_arryJSON==NULL)
+    //     {
+    //         return;
+    //     }
+    //     uint32_t value=0;
+    //     if(i==0)
+    //     {
+    //         // value=ble_get_heart_data();
+    //     }
+    //     else if(i==1)
+    //     {
+    //         value=ble_get_oxygen_data();
+    //     }
+    //     else if(i==2)
+    //     {
+    //         // value=cywee_get_step_data();
+    //     }
+    //     else if(i==3)
+    //     {
+    //         value=cywee_get_fat_time_data();
+    //     }
+    //     else if(i==4)
+    //     {
+    //         value=1;
+    //     }
+    //     else if(i==5)
+    //     {
+    //         value=cywee_get_calories_data();
+    //     }
+    //     else if(i==6)
+    //     {
+    //         value=cywee_get_distance_data();
+    //     }
+
+
+    //     cJSON_AddNumberToObject(data_arryJSON,"value",value);
+    //     uint32_t creationTime;
+    //     int ret =uapi_get_timestampe_ss(&creationTime);
+    //     cJSON_AddNumberToObject(data_arryJSON,"time",creationTime);
+
+    //     cJSON_AddItemToObject(dataJSON,string_value[i],data_arryJSON);
+    // }
+    // cJSON *recJSON= ble_get_recs_data();
+    // cJSON_AddItemToObject(dataJSON,"recs",recJSON);
+    // char *json_format = cJSON_PrintUnformatted(dataJSON);
+       //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetCurDataCmd %d %s\n",strlen(json_format),json_format);
+    // cJSON_Delete(dataJSON);
+
+    // uint32_t data_len = strlen(json_format);
+    // uint32_t surplus_len=data_len;
+    // uint32_t pack;
+    // uint16_t pack_size=(ble_nus_max_data_len-18);
+    // if(pack_size>482)pack_size=482;
+
+    // if(data_len%pack_size==0)
+    // {
+    //     pack=data_len/pack_size;
+    // }
+    // else
+    // {   
+    //     pack=data_len/pack_size+1;
+    // }
+    // uint32_t pack_id=1;
+    // uint32_t offset=0;
+    // while (surplus_len!=0)
+    // {
+    //     if(surplus_len>=pack_size)
+    //     {
+    //         surplus_len=surplus_len-pack_size;
+
+
+    //         ble_data_type type_={0x01,0x06,data_len,pack,pack_id};
+    //         send_big_data(type_,json_format+offset,pack_size);
+
+    //         //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,0x06,1);
+    //         offset+=pack_size;
+    //     }
+    //     else
+    //     {
+            
+    //           WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);
+    //          ble_data_type type_={0x01,0x06,data_len,pack,pack_id};
+    //         send_big_data(type_,json_format+offset,surplus_len);
+    //         //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,0x06,1);
+    //         break;
+    //     }
+    //     pack_id++;
+    // }
+    // cJSON_free(json_format);
+    
+}
+//获取当手表电池电量
+static void GetBatteryLevelCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x07;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        float voltage = 0.0F;
+        uint8_t power = 0;
+        power = battery_get_voltage(&voltage);
+        value[17] = power;
+        value[18] = Calculate_CRC(value,18);
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n");
+        sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+//设置开关//(弃)
+static void SetSwitchMessCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x08;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        uint8_t switch_on = data[0];//0 关闭 1 开启
+        if(switch_on)
+        {
+            //ble_ancs_client_cmd_setup_and_subscribe(g_ble_conn_id);
+        }
+        else
+        {
+            //ble_ancs_client_subscribe_notify(g_ble_conn_id,0);
+        }
+
+        value[17] = 1;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+//撤销当前文件传输 1 OTA 2MP3 3表盘 3天气 5闹钟
+static void RemoveFileCmd(ble_read_data *buffer_handle,uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x20;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        uint8_t file_type= data[0];//1 ota 2 MP3
+
+        // TRANSMIT_DATA=TRANS_FREE;
+        // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+        value[17] = 1; //
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+
+        cancel_recv_file(0);
+
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+//获取指定类型文件目录
+static void GetFileTypeCmd(uint8_t *data,uint16_t len)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x21;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,1))
+    {
+        uint8_t fileType = data[17];//2 mp3 3 表盘
+
+        value[17] = 1; //1 操作成功 2 操作失败
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+//删除指定类型所有的文件
+static void DeleteFileTypeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x22;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        value[17] = 1; //1 操作成功 2 操作失败
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+//开启指定运动模式
+void reply_APP_OpenSportModeCmd(bool falg)
+{
+
+    ble_data_type type_={0x01,0x0A,1,1,1};
+    char data[1]={0};
+    if(falg)
+    data[0]=1;
+    else
+    data[0]=2;
+    send_big_data(type_,data,1);
+
+}
+
+
+static void OpenSportModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x0A;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        training_ble_data.sportType= data[0];//运动类型 0 健走 1跑步 2骑行 3
+        training_ble_data.controlmd= START;
+          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"开启指定运动%d\r\n",data[0]);
+        CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));
+
+        // value[17] = 1; //1 操作成功 2 操作失败
+        // value[18] = Calculate_CRC(value,18);
+        // sendBleData(value,19);
+    }
+    else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+void reply_APP_SportStopModeCmd(uint16_t time)
+{
+    char data[3]={0};
+    uint32_t data_len=3;
+    data[0]=1;
+    memcpy(&data[1],&time,2);
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time);
+    ble_data_type type={0x01,0x0B,data_len,1,1};
+    send_big_data(type,data,data_len);
+}
+//结束运动模式
+static void StopSportModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x0B;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+       
+        training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3
+        training_ble_data.controlmd= END;
+          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"结束运动\r\n");
+
+        CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));
+        // value[17] = 1; //1 操作成功 2 操作失败
+        // value[18] = Calculate_CRC(value,18);
+        // sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+//设置语言
+static void SetLanguageCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x0E;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        uint8_t language = data[0];
+        set_languaage(language);
+        value[17] = 1; //1 操作成功 2 操作失败
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+//开启/关闭获取实时训练数据
+static void SetRealTimeDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x11;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        uint8_t autoSportData = data[0];//开关 1开启 0关闭
+         /*进行开启关闭操作*/
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进行开启关闭操作 %d\r\n", autoSportData);
+        set_traning_updata_auto( autoSportData);
+
+        value[17] = 1; //1 操作成功 2 操作失败
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+//设置训练数据采集频率
+static void SetRTDataFreCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x14;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        uint8_t Frequence = data[0];//频率单位是s
+        /*设置获取频率*/
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"设置获取频率 %d\r\n", Frequence);
+        set_traning_updata_freq(Frequence);
+
+        value[17] = 1; //1 操作成功 2 操作失败
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+//获取实时训练数据
+// void getSportData(char *buf)
+// {
+//     cJSON *dataJSON = cJSON_CreateObject();
+//     cJSON_AddNumberToObject(dataJSON,"st",1637825067);
+//     cJSON_AddNumberToObject(dataJSON,"hr",120);
+//     cJSON_AddNumberToObject(dataJSON,"ca",3657);
+//     cJSON_AddNumberToObject(dataJSON,"di",5274);
+//     cJSON_AddNumberToObject(dataJSON,"stp",1234);
+//     cJSON_AddNumberToObject(dataJSON,"ti",3);
+//     char *json_format = cJSON_PrintUnformatted(dataJSON);
+//       WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s",json_format);
+//     cJSON_Delete(dataJSON);
+//     int dataLen = strlen(json_format);
+//     memcpy(buf,json_format,dataLen);
+//     return;
+// }
+void sendRealTimeDataToAPP(uint8_t flag)
+{
+    if(flag == 0)//校验失败
+    {
+        ble_data_type type_={0x01,0x0f,0,1,1};
+        send_big_data(type_,NULL,0);
+
+        //send_big_data(0,NULL,0,0,1,1,0x0f,1);
+
+    }else 
+    {
+        training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3
+        training_ble_data.controlmd= SENDDATA;
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送运动实时数据\r\n");
+
+        CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));
+        
+    }
+    
+}
+//获取实时训练数据
+static void GetRealTimeDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    
+    if(Check_CRC(data,len,crcvalue))
+    {
+        sendRealTimeDataToAPP(1);
+    }else
+    {
+        sendRealTimeDataToAPP(0);
+    }
+}
+//设置最高心率提醒
+static void SetMaxHrRemindCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x15;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))//
+    {
+        uint8_t maxHr = data[0];
+        if(maxHr > 250)maxHr = 250;//最高心率是250
+        else if(maxHr <= 0) maxHr = 0;
+        set_traning_heart_max(maxHr);
+        //设置255  表示心率提醒关闭
+          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"设置最高心率提醒 %d\r\n",maxHr);
+        value[17] = 1;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+    
+}
+
+void reply_APP_SportPasueResetCmd(uint16_t time)
+{
+    char data[3]={0};
+    uint32_t data_len=3;
+    data[0]=1;
+    memcpy(&data[1],&time,2);
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送训练状态数据%d %d\r\n",data[0],time);
+    ble_data_type type={0x01,0x16,data_len,1,1};
+    send_big_data(type,data,data_len);
+}
+
+
+//训练暂停/恢复
+static void GetSportPasueResetCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x16;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))//
+    {
+        uint8_t PauseStop = data[0];//0 暂停 1恢复
+        if(PauseStop==0)
+        {
+            training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3
+            training_ble_data.controlmd= STOP;
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"运动暂停\r\n");
+
+            CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));
+        }
+        else
+        {
+            training_ble_data.sportType= 4;//运动类型 0 健走 1跑步 2骑行 3
+            training_ble_data.controlmd= RECOVER;
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"运动恢复\r\n");
+
+            CustomEventPublish(TOPIC_EVENT_BLE_TRAINING,(uint8_t*)&training_ble_data,sizeof(training_ble));
+
+        }
+        // value[17] = 1;
+        // value[18] = Calculate_CRC(value,18);
+        // sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+    
+}
+//发送当前表盘到app
+
+void Watch_SendDial_ToAppCmd(void)
+{
+  
+    uint16_t dialNum =ble_get_dial_id();
+    ble_data_type type_={0x01,0x17,2,1,1};
+    send_big_data(type_,(char *)&dialNum,2);
+}
+
+static void SendDialToAppCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[20];
+    memset(value,0,20);
+    uint32_t tmp = 1;
+    uint32_t datalen = 2;
+    uint16_t tmp_data = 2;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x17;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&datalen,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))//
+    {
+        uint16_t dialNum =ble_get_dial_id();
+        memcpy(&value[17],&dialNum,2);
+        value[19] = Calculate_CRC(value,19);
+        sendBleData(value,20);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+    
+}
+//获取手表当前状态
+static void GetWatchStatusCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[20];
+    memset(value,0,20);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x19;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+
+    //0空闲状态 9 usb状态 10 运动训练状态
+     uint8_t watchStatus = 0;
+     
+    if(uapi_dev_runtime_get_train_status())
+    watchStatus=10;
+   
+    value[17] = watchStatus;
+    value[18] = Calculate_CRC(value,18);
+    sendBleData(value,19);
+}
+//获取手表屏幕参数
+static void GetScreenParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[21];
+    memset(value,0,21);
+    uint32_t tmp = 1;
+    uint32_t datalen = 3;
+    uint16_t tmp_data = 3;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x1a;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&datalen,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+
+    int brigntess = get_brigthness();
+    int screen_time =get_ScreenDuration();
+       WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetScreenParamCmd get_ScreenDuration %d \r\n", screen_time);
+    switch (get_ScreenDuration()/1000)
+    {
+        case 5:
+            screen_time = 0;
+            break;
+        case 10:
+            screen_time = 1;
+            break;
+        case 15:
+            screen_time = 2;
+            break;
+        case 30:
+            screen_time = 3;
+            break;
+        case 60:
+            screen_time = 4;
+            break;
+        case 60*5:
+            screen_time = 5;
+            break;
+        default:
+            screen_time = 0;
+            break;
+    }
+    bool wrist_on = Get_RaiseToWake();
+    value[17] = brigntess;
+    value[18] = screen_time;
+    value[19] = wrist_on;
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetScreenParamCmd %d %d %d  \r\n",brigntess,screen_time,wrist_on);
+    value[20] = Calculate_CRC(value,20);
+    sendBleData(value,21);
+}
+
+//App删除表盘 (仅W4手表)
+static void DeleteDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[20];
+    memset(value,0,20);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x1b;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        uint16_t deleteDial = 0;//删除的表盘UID 
+        deleteDial=data[0]+data[1]*256;
+        
+        if(ble_delete_dial(deleteDial))
+        value[17] = 1;// 1删除成功 2 没有改资源 0指令校验失败
+        else
+        value[17] = 2;// 1删除成功 2 没有改资源 0指令校验失败
+
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else
+    {
+      
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+    
+    
+}
+
+//获取手表声音与振动参数 Sound and Vibration
+static void GetSoundVibrationCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[23];
+    memset(value,0,23);
+    uint32_t tmp = 1;
+    uint32_t datalen = 5;
+    uint16_t tmp_data = 5;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x1c;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&datalen,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+       
+        int sys_volume = Get_SystemVolume();
+        int ring_volume = Get_CallVolume();
+        int media_volume = Get_CallVolume();
+        uint8_t vibrate_on = get_vibrationremiander();
+
+        bool bell_on = get_SilentMode();
+
+        value[17] = sys_volume;// 
+        value[18] = ring_volume;// 
+        value[19] = media_volume;// 
+        value[20] = bell_on;//
+        value[21] = vibrate_on;// 
+        value[22] = Calculate_CRC(value,22);
+        sendBleData(value,23);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+    
+    
+}
+
+//APP获取手表辅助功能参数Auxiliary functions
+static void GetWatchAuxFuncCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[23];
+    memset(value,0,23);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x1d;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        uint8_t paramCmt = 0;//辅助功能 0
+        paramCmt = get_quick_auxiliary_paramters();
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"paramCmt:%d\r\n",paramCmt);
+        value[17] = paramCmt;// 
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+    
+    
+}
+//APP获取手表心率设置
+static void GetHrGetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[22];
+    memset(value,0,22);
+    uint32_t tmp = 1;
+    uint32_t datalen = 4;
+    uint16_t tmp_data = 4;
+
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x1e;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&datalen,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        
+        msg_get_heart_set_param_info_t heart_param;
+        Get_heart_cmd(&heart_param);
+
+        value[17] = heart_param.frequence;//
+        value[18] = heart_param.remind_on;//
+        value[19] = heart_param.max_min;//
+        value[20] = heart_param.heart;// 
+
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d ",value[17],value[18],value[19],value[20]);
+
+        value[21] = Calculate_CRC(value,21);
+        sendBleData(value,22);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+    
+    
+}
+//APP获取手表血氧设置
+static void GetSpo2GetParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[21];
+    memset(value,0,21);
+    uint32_t tmp = 1;
+    uint32_t datalen = 3;
+    uint16_t tmp_data = 3;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x1f;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&datalen,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        msg_get_spo2_set_param_info_t SO2_param;
+        Get_oxygen_cmd(&SO2_param);
+
+        uint8_t spo2freq = SO2_param.frequence;//监测频率
+        uint8_t spo2Switch = SO2_param.remind_on;//心率提醒开关
+        uint8_t spo2MaxMin = SO2_param.spo2;//高于或低于
+
+        value[17] = spo2freq;//
+        value[18] = spo2Switch;//
+        value[19] = spo2MaxMin;// 
+
+        value[20] = Calculate_CRC(value,20);
+        sendBleData(value,21);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+    
+    
+}
+void cameraSend(uint8_t flag)//2进行手势拍照 3退出拍照界面
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x23;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    value[17] = flag;// 
+    value[18] = Calculate_CRC(value,18);
+    sendBleData(value,19);
+}
+//手势拍照协议
+static void carmeraCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x23;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        uint8_t carmera_on = data[0]; //0退出拍照界面 1进入拍照界面
+        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进入拍照\r\n");
+        //需要加界面弹窗提示
+        if(carmera_on == 1)//进入拍照界面
+        {
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"进入拍照\r\n");
+            CustomEventPublish(TOPIC_EVENT_ENTER_CMAERA,NULL,0);
+        }else{//退出拍照弹窗界面
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"退出拍照\r\n");
+            CustomEventPublish(TOPIC_EVENT_CANCEL_CMAERA,NULL,0);
+        }
+        value[17] = 1;// 
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+//APP获取手表喝水提醒设置
+static void GetDrinkParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x24;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(1)
+    {
+        msg_drink_info_t drink_on_;
+        ble_get_drink_remind(&drink_on_);
+        value[17] = drink_on_.drink_on;// 
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+//APP发送恢复出厂设置
+static void GetFactoryCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x25;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        value[17] = 1;// 
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+    if( value[17])
+    {
+        do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_RESTORE_FACTORY_SETTING, NULL, 0);
+    }
+}
+//APP发送重新启动
+static uint8_t power_buf[2]={0};
+static void GetResetCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x26;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        
+        value[17] = 1;// 
+        value[18] = Calculate_CRC(value,18);
+        power_buf[0]=REBOOT;
+        CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,power_buf,2);
+        sendBleData(value,19);
+
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+//APP发送关机
+static void GetPowerOffCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x27;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        
+        value[17] = 1;// 
+        value[18] = Calculate_CRC(value,18);
+        power_buf[0]=SHUTDOWN;
+        CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,power_buf,2);
+        sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+
+//app发送公英制单位
+static void GetMetricCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x28;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        uint8_t kmileter = data[0];//公英制单位 0 是公英制 1英制单位
+        value[17] = 1;// 
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+//app获取久坐设置
+static void GetSedentParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[24];
+    memset(value,0,24);
+    uint32_t tmp = 1;
+    uint32_t datalen = 6;
+    uint16_t tmp_data =6;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x31;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&datalen,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(1)
+    {
+        msg_sedent_set_param_info_t data;
+        get_sedent_param( &data);
+
+        uint8_t on = data.sedent_on;//作息时间设定 0关闭 1开启 1
+        uint32_t time = data.sedent_time;//时间 4
+        uint8_t frequenc = data.frequenc;//间隔 1
+       
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%04X %d %d\r\n",time,frequenc,on);
+        value[17] = on;
+        memcpy_s(&value[18],4,&time,4);
+        
+        value[22] = frequenc;
+        value[23] = Calculate_CRC(value,23);
+        sendBleData(value,24);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+
+static void GetSleepParamCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[24];
+    memset(value,0,24);
+    uint32_t tmp = 1;
+    uint32_t datalen = 6;
+    uint16_t tmp_data =6;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x29;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&datalen,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(1)
+    {
+        msg_get_sleep_param_info_t data;
+
+        ble_get_sleep_remind(&data);
+        uint8_t sleepTime = data.schedule;//作息时间设定 0关闭 1开启
+        uint8_t bedTimeHour = data.bedtime_hour;//就寝时间
+        uint8_t bedTimeMin = data.bedtime_min;//就寝时间
+        uint8_t wakeTimeHour = data.waketime_hour;//起床时间
+        uint8_t wakeTimeMin = data.waketime_min;//起床时间
+        uint8_t bedTimeOn = data.bedtime_alarm;//就寝前20分钟提醒时间
+
+        value[17] = sleepTime;
+        value[18] = bedTimeHour;
+        value[19] = bedTimeMin;
+        value[20] = wakeTimeHour;
+        value[21] = wakeTimeMin;
+        value[22] = bedTimeOn;
+        value[23] = Calculate_CRC(value,23);
+        sendBleData(value,24);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+//app获取所有表盘UID
+static void GetAllDialUidCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+   
+
+    if(Check_CRC(data,len,crcvalue))
+    {
+        int dial_num=ble_get_dial_num();
+       
+        uint16_t data_size=1+dial_num*2;
+        uint32_t temp_data_size=data_size;
+        char *dail_uid_buf=(char *)ym_malloc(data_size);
+        dail_uid_buf[0]=(uint8_t)dial_num;
+
+        if(dial_num *2 !=get_all_dial_id(dail_uid_buf+1,dial_num*2))
+        {
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd  dial_num %d err\r\n",dial_num);
+        }
+        else
+        {
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GetAllDialUidCmd yes\r\n");
+
+        }
+        ble_data_type type_={0x01,0x2a,temp_data_size,1,1};
+        send_big_data(type_,dail_uid_buf,data_size);
+        //send_big_data(0,dail_uid_buf,data_size,temp_data_size,1,1,0x2a,1);
+
+        free(dail_uid_buf);
+        
+    }else
+    {
+        ble_reply_cmd(cmd,0);
+    }
+}
+//app获取目标步数设置
+static void GetTargetStepCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[25];
+    memset(value,0,25);
+    uint32_t tmp = 1;
+    uint32_t datalen = 7;
+    uint16_t tmp_data = 7;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x2b;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&datalen,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(1)
+    {
+        uint32_t targetStep = get_goal_stepcount();//目标步数 4字节
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"目标步数:%d\r\n",targetStep);
+
+        uint8_t ringOn = get_step_goal_notify_switch();//铃声提醒
+        uint8_t vibration = get_step_goal_notify_switch();//振动提醒
+        uint8_t notify = get_step_goal_notify_switch();//通知提醒
+
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"提醒开关:%d %d %d \r\n",ringOn,vibration,notify);
+
+        memcpy(&value[17],&targetStep,4);//目标步数
+
+        value[21] = ringOn;//铃声提醒
+        value[22] = vibration;//振动提醒
+        value[23] = notify;//通知提醒
+
+        value[24] = Calculate_CRC(value,24);
+        sendBleData(value,25);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+//app其他目标设置
+static void GetTargetOtherCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[26];
+    memset(value,0,26);
+    uint32_t tmp = 1;
+    uint32_t datalen = 8;
+    uint16_t tmp_data = 8;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x2c;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&datalen,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(1)
+    {
+        uint16_t targetKcal = 0;//目标卡路里
+        uint8_t targetKm = 0;//目标里程
+        uint8_t targetstand = 0;//目标站立
+        uint8_t targetfat = 0;//目标燃脂时间
+        uint8_t ringTime = 0;//铃声提醒
+        uint8_t vibration = 0;//振动提醒
+        uint8_t notify = 0;//通知提醒
+
+        targetKcal = get_goal_caloriescount();
+        targetKm = get_goal_discount();
+        targetstand =get_goal_standupcount();
+        targetfat = get_goal_durationcount();
+
+        ringTime = get_other_goal_notify_switch ();
+        vibration = get_other_goal_notify_switch();
+        notify = get_other_goal_notify_switch();
+        
+        memcpy(&value[17],&targetKcal,2);//目标卡路里
+        value[19] = targetKm;//
+        value[20] = targetstand;//
+        value[21] = targetfat;//
+
+        value[22] = ringTime;//
+        value[23] = vibration;//
+        value[24] = notify;//通知提醒
+        value[25] = Calculate_CRC(value,25);
+        sendBleData(value,26);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+} 
+
+static void GetPasswordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint32_t datalen = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x2f;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&datalen,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(1)
+    {
+        uint8_t data=ble_get_password();
+        memcpy(&value[17],&data,1);//
+     
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+static void GetmsgconfigCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[36];
+    memset(value,0,36);
+    uint32_t tmp = 1;
+    uint32_t datalen = 18;
+    uint16_t tmp_data = 18;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x33;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&datalen,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(1)
+    {
+        uint8_t data_buf[filtration_data_count];
+        uint8_t  data_buf_len=0;
+        // memset(data,1,18);
+        filtration_on_get((uint8_t*)data_buf,&data_buf_len);
+        // printf("data_buf_len %d\r\n",data_buf_len);
+        memcpy(&value[17],data_buf,data_buf_len);//
+        value[17+data_buf_len] = Calculate_CRC(value,17+data_buf_len);
+        sendBleData(value,18+data_buf_len);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+
+
+
+bool get_AI_PATH_and_size(char *path,uint32_t *size)
+{
+
+    memcpy((void*)path,ble_get_ai_audio_path_str(),strlen(ble_get_ai_audio_path_str()));
+
+    FILE *fp= fopen(path,"r+");
+    if(fp)
+    {
+        fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
+        *size = ftell(fp);       // 获取当前文件指针位置,即文件大小
+        fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头
+        fclose(fp);
+
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+#define SEND_AIVOICE_PACKAGE_DELAY 15
+//APP获取录音文件,录音文件上传
+static void GetAiRecordCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint32_t datalen = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x2f;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&datalen,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    char file_name[64]={0};
+    uint32_t file_size=0;
+    if(get_AI_PATH_and_size(file_name,&file_size))
+    {
+        int num=(ble_nus_max_data_len-18); 
+        if(num>482)num=482;
+
+        char *data= (char *)malloc(num+1);
+        
+        uint16_t read_size=0;
+        FILE *fp=fopen(file_name,"rb+");
+        
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"GetAiRecordCmd size %d\r\n",file_size);
+        uint32_t pack=file_size/num+1;
+        uint32_t pack_id=1;
+        if(fp==NULL)
+        {
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_name);
+            goto GetAiRecordFail;
+        }
+        do
+        {
+            memset_s(data,num+1,0,num+1);
+            read_size=fread(data,1,num,fp);
+
+            if(read_size!=0)
+            {
+                ble_data_type type_={0x01,0x34,file_size,pack,pack_id};
+                send_big_data(type_,data,read_size);
+            }
+            pack_id++;
+         
+
+        } while (read_size==num);
+        free(data);
+        fclose(fp);
+    }else
+    {
+        GetAiRecordFail:
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+static void GetSOSDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint32_t data_len=0;
+    uint8_t *bin_data = ble_get_sos_all_data_malloc(&data_len);
+    if(bin_data==NULL)
+    {
+        ble_data_type type_={0x01,0x36,0,1,1};
+        send_big_data(type_,NULL,0);
+        return;
+    }
+    uint32_t surplus_len=data_len;
+    uint32_t offset=0;
+
+    uint32_t pack;
+    uint16_t pack_size=(ble_nus_max_data_len-18);
+    if(pack_size>482)pack_size=482;
+
+    if(data_len%pack_size==0)
+    {
+        pack=data_len/pack_size;
+    }
+    else
+    {   
+        pack=data_len/pack_size+1;
+    }
+    uint32_t pack_id=1;
+    while (surplus_len!=0)
+    {
+        if(surplus_len>=pack_size)
+        {
+            surplus_len=surplus_len-pack_size;
+
+            ble_data_type type_={0x01,0x36,data_len,pack,pack_id};
+            send_big_data(type_,(char *)bin_data+offset,pack_size);
+            offset+=pack_size;
+        }
+        else
+        {
+            
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);
+            ble_data_type type_={0x01,0x36,data_len,pack,pack_id};
+            send_big_data(type_,(char *)bin_data+offset,surplus_len);
+            break;
+        }
+        pack_id++;
+    }
+    free(bin_data);
+    
+  
+}
+//AI录音已经就绪
+static void AiIsReadyCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+
+    if(data[0])
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AiIsReadyCmd succ\r\n");  
+    }else
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"AiIsReadyCmd fail\r\n");  
+    }
+}
+//app发送解除配对消息
+static void UnpairMessCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint32_t datalen = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x2d;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&datalen,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        
+        value[17] = 1;//
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+uint8_t is_connect_synchronization_time=0;
+
+//app发送同步数据结束消息
+static void GetSynDataEndCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    uint32_t datalen = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x2e;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&datalen,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        value[17] = 1;//
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+        uapi_save_runtime_log(RUNTIME_LOG_BLE_APP_SYN_END);
+
+        if(is_connect_synchronization_time)
+        {
+            watch_synchronization_time();
+        }
+        else
+        {
+            if(g_ble_conn_id)
+            {
+                is_connect_synchronization_time=1;
+            }
+            
+        }
+        
+
+
+        uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);
+
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+//同步基础训练历史数据 training history data
+static void Send_json_Data_Cmd(uint8_t day,uint16_t pack_size,uint8_t id)
+{
+
+    
+        char *json_format = NULL;
+        switch (id)
+        {
+            case 0x49:
+                json_format=struct_to_json_buf_malloc_(day);
+                break;
+            case 0x01:
+                json_format=struct_to_json_buf_malloc_Alarm();
+                break;
+            case 0x21:
+                json_format=dir_to_json_buf_malloc(day);
+                break;
+
+            default:
+                break;
+        }
+       
+        if(json_format == NULL) return ;
+
+        uint32_t data_len = strlen(json_format);
+        uint32_t surplus_len=data_len;
+        uint32_t pack;
+        if(data_len%pack_size==0)
+        {
+            pack=data_len/pack_size;
+        }
+        else
+        {   
+            pack=data_len/pack_size+1;
+        }
+        uint32_t pack_id=1;
+        uint32_t offset=0;
+        while (surplus_len!=0)
+        {
+           if(surplus_len>=pack_size)
+           {
+                surplus_len=surplus_len-pack_size;
+
+                ble_data_type type_={0x01,id,data_len,pack,pack_id};
+                send_big_data(type_,json_format+offset,pack_size);
+
+                //send_big_data(1,json_format+offset,pack_size,data_len,pack_id,pack,id,1);
+                offset+=pack_size;
+           }
+           else
+           {
+                
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);
+                ble_data_type type_={0x01,id,data_len,pack,pack_id};
+                send_big_data(type_,json_format+offset,surplus_len);
+                //send_big_data(1,json_format+offset,surplus_len,data_len,pack_id,pack,id,1);
+                break;
+           }
+           pack_id++;
+        }
+        cJSON_free(json_format);
+}
+
+//同步数据结束完成
+static void synEndDataCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint8_t value[18+1];
+    memset(value,0,18+1);
+    uint32_t tmp = 1;
+    uint32_t tmpToall = 0;
+    uint16_t tmp_data = 0;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x2e;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmpToall,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    if(Check_CRC(data,len,crcvalue))
+    {
+        value[17] = 1;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+
+        uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);
+
+    }else
+    {
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+
+
+
+//01类型 
+/*
+cmd: 指令uint16_t 协议01 02 拼接成0x0102 去协议文档对应是切换表盘
+*data:数据,不包含前面17个字节的包头和最后一位的校验和
+len 就是data的长度
+*totaldata:总的数据内容 包含包头和校验预览做接口是用  如果要计算totaldata的长度直接是len+17+1 就是加上包头和校验和
+crcvalue;数据的校验和 不包含包头和校验和的计算结果
+*/
+// 73 01 31 01 00 00 00 01 00 00 00 01 00 00 00 00 00 2 FE
+void SetDMPModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//设置入库模式 0关闭 1电信 2-255移动
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    value[0] =0x72;
+    value[1] =0x01;
+    value[2] =0x31;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp,2);
+    
+    if(Check_CRC(data,len,crcvalue))
+    {
+        
+        int state = 0;
+        state = data[0];
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"data[0];%d state:%d\r\n",data[0],state);
+        Set_DmpChangeMode(state);
+        value[17] = 1;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else{
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+// 73 01 32 01 00 00 00 00 00 00 00 01 00 00 00 00 00 crc
+
+void GetDMPModeCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取入库模式 0关闭 1电信 2-255移动
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    value[0] =0x72;
+    value[1] =0x01;
+    value[2] =0x32;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp,2);
+    
+    if(Check_CRC(data,len,crcvalue))
+    {
+        int state = Get_DmpChangeMode();
+        value[17] = state;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else{
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+void type2AE3Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint16_t cmd = cmd_buf[1]*256+cmd_buf[2];
+     #ifdef BLE_LOG
+    
+    #endif
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE3Data:0x%04X\r\n",cmd);
+    // uint8_t typeID = cmd_buf[2];
+    switch (cmd)
+    {
+        case SEND_UPPAIR_CMD://清除配对指令
+            clearPaireCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case SWITCH_DIAL_CMD://表盘切换
+            switchDialCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case ABOUT_DEV_CMD://关于本机内容
+            aboutDeviceCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case FIND_WATCH_CMD://查找手表
+            findWatchCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_SD_SPACE_CMD://获取sdk的剩余空间
+            GetSDSpaceCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_CURR_DATA_CMD://获取当前数据 卡路里 
+            GetCurDataCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_BATTERY_LEVEL_CMD://获取手表电池电量 
+            GetBatteryLevelCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case SWITCH_MESS_CMD://开关消息推送功能 
+            SetSwitchMessCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case REVOKE_CURR_FILE_TRANS_CMD://撤销文件传输
+            RemoveFileCmd(buffer_handle,cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case DELETE_SPECIF_TYPE_FILE_CMD://删除指定类型的所有文件
+            DeleteFileTypeCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case SWITCH_SPORT_MODE_CMD://开启指定运动模式
+            OpenSportModeCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case STOP_SPORT_MODE_CMD://结束运动模式
+            StopSportModeCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case SET_LANGUGAE_CMD://设置语言
+            SetLanguageCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_REAL_HEART_CMD://获取实时训练数据
+            GetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case SWITCH_GET_REAL_HEART_CMD://开启/关闭自动获取实时训练数据
+            SetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case SET_REAL_DATA_FREQ_CMD://设置训练实时数据采集频率
+            SetRTDataFreCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+
+        case SET_MAX_HR_REMID_CMD://设置最高心疼提醒 255关闭
+            SetMaxHrRemindCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case SPORT_PAUSE_RESET_CMD://训练暂停/恢复
+            GetSportPasueResetCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case SEND_CURR_DIAL_TOAPP_CMD://发送当前表盘
+            SendDialToAppCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case SEND_CURR_STATUS_CMD: //获取手表当前状态
+            GetWatchStatusCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_WATCH_LCD_PARAM_CMD: //获取手表屏幕参数
+            GetScreenParamCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case DELETE_DIAL_CMD://删除表盘UID
+            DeleteDialUidCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_WATCH_VOICE_VIBRATE_CMD://获取手表声音与振动参数
+            GetSoundVibrationCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_WATCH_AUXIL_FUN_PARAM_CMD://获取手表辅助功能参数                                                                                                     
+            GetWatchAuxFuncCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_WATCH_HR_SET_PARAM_CMD://获取手表心率设置
+            GetHrGetParamCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_WATCH_SPO2_SET_PARAM_CMD://获取手表血氧设置
+            GetSpo2GetParamCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_GESTURE_CARMERA_CMD://获取手势拍照
+            carmeraCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_DRINK_SWITCH_CMD://获取喝水提醒设置
+            GetDrinkParamCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case FACTORY_SET_CMD://app发送恢复出厂设置
+            GetFactoryCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case RESET_WATCH_CMD://app发送重启指令
+            GetResetCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case POWER_OFF_CMD://app发送关机
+            GetPowerOffCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case KM_MILE_CMD://app设置手表公英制单位
+            GetMetricCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case SLEEP_GET_CMD://app获取睡眠设置
+            GetSleepParamCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_SEDENT_CMD:
+            GetSedentParamCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case DELETE_ALL_DILA_CMD://app所有表盘UID
+            GetAllDialUidCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_TARGET_STEP_CMD://app获取目标步数设置
+            GetTargetStepCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_OTHER_TARGET_CMD://app获取其他目标
+            GetTargetOtherCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_UNPAIR_CMD://发送解除配对消息
+            UnpairMessCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case SYN_DATA_END_CMD: //app发送同步数据结束消息
+            GetSynDataEndCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_PASSWORD_CMD: //获取手表密码
+            GetPasswordCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case SYN_GET_MSG_CONFIG_CMD: //获取手表消息设置
+            GetmsgconfigCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+            
+        case APP_GET_AI_PCM_DATA_CMD:
+            GetAiRecordCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case APP_GET_SOS_DATA_CMD:
+            GetSOSDataCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        
+        case GET_SPECIF_TYPE_FILE_CMD://获取指定类型文件目录 
+        case AI_IS_READ_DATA_CMD:
+        case SYN_HEART_HISTORY_DATA_CMD://同步心率历史数据
+        case SYN_SPO2_HISTORY_DATA_CMD://同步血氧历史数据
+        case SYN_STEP_HISTORY_DATA_CMD: //同步步数历史数据
+        case SYN_FAT_BURN_HISTORY_DATA_CMD://同步燃脂时间数据
+        case SYN_STAND_HISTORY_DATA_CMD://同步站立历史数据
+        case SYN_KCAL_HISTORY_DATA_CMD://同步卡路里历史数据
+        case SYN_DIS_HISTORY_DATA_CMD://同步距离历史数据
+        case SYN_BASIC_TRANIN_HISTORY_DATA_CMD://同步基础训练历史数据
+        case SYN_SLEEP_HISTORY_DATA_CMD://睡眠历史数据
+        case ALARM_CMD://获取手表闹钟//同步闹钟
+
+            readDevDataBle(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case SET_DMP_MODE_CMD://0X0131
+            SetDMPModeCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        case GET_DMP_MODE_CMD://0X0132
+            GetDMPModeCmd(cmd,data,datalen,totaldata,crcvalue);
+            break;
+        default:
+            break;
+    }
+
+
+}
+
+
+//05 类型
+void typeHexFiveData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen)
+{
+    uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];
+    switch (typeID) //ID
+    {
+        case FIND_PHONE_CMD://查找手机
+            // (data,datalen);
+            break;
+        case GET_CURR_TIME_CMD://手表获取系统时间
+            // getPhoneInfo(data,datalen);
+            break;
+        case SEND_PARI_SUCESS_CMD:
+            // GetUTCtime(data,datalen);//获取时间app下发的时间进行解析
+            break;
+        case GET_TRANS_END_CMD:
+            // getPhoneInfo_test();
+            break;
+        case SEND_FACTORY_RECORD_CMD:
+            break;
+        case REQUEST_EPO_FILE_CMD:
+            break;
+        case SEND_TRAIN_STATUS_CMD:
+            break;
+        default:
+            break;
+    }
+}
+
+
+#define STEP_DATA_LEN 8
+#define KCAL_DATA_LEN 8
+#define DIS_DATA_LEN 8
+#define STAND_DATA_LEN 8
+#define FATTIME_DATA_LEN 6
+#define HEART_DATA_LEN 5
+#define SPO2_DATA_LEN 5
+uint8_t bleSendTypeID=0;      //发送的数据类型
+//发送读出来的设备数据to APP
+uint16_t max_mtu_szie_data_len = 200;
+uint32_t EACH_DATA_LEN=0;//每种数据类型的的长度
+
+
+void Send_Sleep_Bin_Data(uint8_t day, uint16_t num)
+{
+   
+    char *data=NULL;
+    uint32_t file_size=1;
+    uint8_t sleep_count = ble_get_sleep_data_dir(&file_size,day);
+
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Send_Sleep_Bin_Data file_size : %d \r\n",file_size);
+
+    data=(char *)malloc(file_size);
+
+    if(data==NULL)
+    {
+        return;
+    }
+
+    memset(data,0,file_size);
+
+    data[0]=sleep_count;
+
+    if(data==NULL)
+    {
+        #ifdef BLE_LOG
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"malloc\r\n");
+        #endif
+
+        return;
+    }
+    ble_get_sleep_data(file_size,day,(uint8_t*)data+1);
+
+
+    if(data==NULL || file_size==1)
+    {
+        ble_data_type type_={0x01,0x4b,0,1,1};
+        send_big_data(type_,NULL,0);
+        //send_big_data(1,NULL,0,0,1,1,0x4b,1);
+        return;
+    }
+    
+    uint32_t surplus_len=file_size;
+    uint32_t pack;
+    if(file_size%num==0)
+    {
+        pack=file_size/num;
+    }
+    else
+    {   
+        pack=file_size/num+1;
+    }
+        //  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);
+    uint32_t pack_id=1;
+    uint32_t offset=0;
+    while (surplus_len!=0)
+    {
+        if(surplus_len>=num)
+        {
+            surplus_len=surplus_len-num;
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",num,file_size,pack_id,pack);
+
+            ble_data_type type_={0x01,0x4b,file_size,pack,pack_id};
+            send_big_data(type_,data+offset,num);
+            offset+=num;
+        }
+        else
+        {
+            //#ifdef BLE_LOG
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",surplus_len,file_size,pack_id,pack);
+            //#endif
+            ble_data_type type_={0x01,0x4b,file_size,pack,pack_id};
+            send_big_data(type_,data+offset,surplus_len);
+               WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"开始\r\n");
+            for(int i=0;i<surplus_len;i++)
+            {
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%02X ",(uint8_t)data[i]);
+            }
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"结束\r\n");
+            break;
+        }
+        pack_id++;
+    }
+    free(data);
+    
+}
+
+
+bool Read_Health_BIN_file_buf_send_bin_Data(uint8_t day, uint16_t num,uint16_t id)
+{
+   
+    // send_big_data(1,NULL,0,0,1,1,id,1);
+    // return;
+    char *buf=NULL;
+    char path[128]={0};
+    switch (id)
+    {
+        case 0x40://同步心率历史数据
+            get_health_HEART_data_path(path,day,128);
+            break;
+        case 0x41://同步血氧历史数据
+            get_health_OXYGEN_data_path(path,day,128);
+            break;
+    }
+    uint32_t file_size=0;
+    FILE *fp= fopen(path,"r+");
+    if(fp==NULL)
+    {
+          WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"打开文件失败 %s \r\n",path);
+        return false;
+    }
+    fseek(fp, 0, SEEK_END); // 将文件指针移动到文件末尾
+    file_size = ftell(fp);       // 获取当前文件指针位置,即文件大小
+    fseek(fp, 0, SEEK_SET); // 将文件指针移回文件开头
+
+    int num_check=file_size%5;
+    if(num_check!=0)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "数据有误 %d %d \r\n", file_size, num);
+        fclose(fp);
+        return false;
+    }
+    
+    buf = (char *)ym_malloc(sizeof(char)*num+1);
+    if(buf==NULL){fclose(fp); return false;}
+
+    uint32_t pack=1;
+    if(file_size%num==0)
+    pack=file_size/num;
+    else
+    pack=file_size/num+1;
+    uint32_t pack_id=1;
+    uint32_t read_size=0;
+    do
+    {
+        memset_s(buf,num+1,0,num+1);
+        read_size=fread(buf,1,num,fp);
+        if(read_size!=0)
+        {
+            ble_data_type type_={0x01,id,file_size,pack,pack_id};
+            send_big_data(type_, buf, read_size);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"%d %d %d %d %d\r\n",read_size,file_size,pack_id,pack);
+        }
+        
+
+        //send_big_data(1,buf,read_size,file_size,pack_id,pack,id,1);
+        pack_id++;
+    } while (read_size==num);
+
+    fclose(fp);
+    free(buf);
+    return true;
+}
+
+void Read_BIN_file_buf_send_bin_Data(uint8_t day,uint32_t pack_size,uint16_t id)
+{
+
+    const char *data=NULL;
+    uint32_t data_len = 0;
+   
+    data=ble_sywee_history(day,&data_len,id);
+
+    if(data==NULL)
+    {
+        ble_data_type type_={0x01,id,0,1,1};
+        send_big_data(type_,NULL,0);
+
+        //send_big_data(1,NULL,0,0,1,1,id,1);
+        return;
+    }
+    uint8_t single_data=8;
+    if(id==0x44)
+    {
+        single_data=6;
+    }
+    else if (id==0x45)
+    {
+        single_data=4;
+    }
+    int check_num=data_len%single_data;
+    if(check_num!=0)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"数据有误 %d \r\n",id);
+        free(data);
+        ble_data_type type_={0x01,id,0,1,1};
+        send_big_data(type_,NULL,0);
+
+        return ;
+    }
+
+    uint32_t surplus_len=data_len;
+    uint32_t pack;
+    if(data_len%pack_size==0)
+    {
+        pack=data_len/pack_size;
+    }
+    else
+    {   
+        pack=data_len/pack_size+1;
+    }
+        //  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);
+    uint32_t pack_id=1;
+    uint32_t offset=0;
+    while (surplus_len!=0)
+    {
+        if(surplus_len>=pack_size)
+        {
+            surplus_len=surplus_len-pack_size;
+            ble_data_type type_={0x01,id,data_len,pack,pack_id};
+            send_big_data(type_,data+offset,pack_size);
+            //send_big_data(1,data+offset,pack_size,data_len,pack_id,pack,id,1);
+            offset+=pack_size;
+        }
+        else
+        {
+            #ifdef BLE_LOG
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d %d %d %d\r\n",data_len,surplus_len,pack_id,pack);
+            #endif
+
+            ble_data_type type_={0x01,id,data_len,pack,pack_id};
+            send_big_data(type_,data+offset,surplus_len);
+
+            //send_big_data(1,data+offset,surplus_len,data_len,pack_id,pack,id,1);
+            break;
+        }
+        pack_id++;
+    }
+    free(data);
+    
+}
+
+//手机app下发读设备数据指令
+void readDevDataBle(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)
+{
+   
+    uint8_t sendBuf[19];
+    memset(sendBuf,0,19);
+    uint8_t type = cmd/256;
+    uint8_t typeID = cmd-((cmd/256)*256);
+    uint32_t totaldata_pack = 1;
+    uint32_t totaldata_packlen = 0;
+    uint32_t pack_count = 0;
+    uint16_t pack_datalen = 0;
+    sendBuf[0]=0x72;
+    sendBuf[1]=type;
+    sendBuf[2]=typeID;
+    memcpy(sendBuf+3,&totaldata_pack,4);//总的数据包
+    memcpy(sendBuf+7,&totaldata_packlen,4);//总的数据包长度
+    memcpy(sendBuf+11,&pack_count,4);//分包索引号
+
+    memcpy(sendBuf+15,&pack_datalen,2);//分包数据长度
+
+    if(Check_CRC(data,len,crcvalue))
+    {
+        bleSendTypeID=cmd-((cmd/256)*256);
+        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"同步第%d天的数据\r\n",data[0]);
+        int num;
+
+        switch (bleSendTypeID)
+        {
+            case 0x40://同步心率历史数据
+                if(uapi_dev_runtime_get_heartrate_storage_status())
+                {
+                    ble_reply_cmdarr(SYN_HEART_HISTORY_DATA_CMD,NULL,0);
+                    return;
+                }
+
+                num=(ble_nus_max_data_len-18);
+                if(num>482)num=482;
+                #ifdef BLE_LOG
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"同步心率数据,每包最多:%d 数据 data:%d %d\r\n",num,data[0],len);
+                #endif
+                uapi_dev_runtime_set_heartrate_storage_status(1);
+                if(!Read_Health_BIN_file_buf_send_bin_Data(data[0],num,0x40))
+                {
+                    ble_data_type type_={0x01,0x40,0,1,1};
+                    send_big_data(type_,NULL,0);
+                }
+                uapi_dev_runtime_set_heartrate_storage_status(0);
+                //send_big_data(1,NULL,0,0,1,1,0x40,1);
+
+                break;
+            case 0x41://同步血氧历史数据
+                if(uapi_dev_runtime_get_bloodoxygen_storage_status())
+                {
+                    ble_reply_cmdarr(SYN_SPO2_HISTORY_DATA_CMD,NULL,0);
+                    return;
+                }
+
+
+                num=(ble_nus_max_data_len-18);
+                if(num>482)num=482;
+                 uapi_dev_runtime_set_bloodoxygen_storage_status(1);
+                if(!Read_Health_BIN_file_buf_send_bin_Data(data[0],num,0x41))
+                {
+                    ble_data_type type_={0x01,0x41,0,1,1};
+                    send_big_data(type_,NULL,0);
+                }
+                 uapi_dev_runtime_set_bloodoxygen_storage_status(0);
+
+                break;
+            case 0x43: //同步步数历史数据
+
+                if(uapi_dev_runtime_get_goal_storage_status())
+                {
+                    ble_reply_cmdarr(SYN_STEP_HISTORY_DATA_CMD,NULL,0);
+                    return;
+                }
+            
+                num=(ble_nus_max_data_len-18);
+                if(num>482)num=482;
+                 uapi_dev_runtime_set_goal_storage_status(1);
+                 Read_BIN_file_buf_send_bin_Data(data[0],num,0x43);
+                  uapi_dev_runtime_set_goal_storage_status(0);
+
+                break;
+            case 0x44://同步燃脂时间数据
+
+                if(uapi_dev_runtime_get_goal_storage_status())
+                {
+                    ble_reply_cmdarr(SYN_FAT_BURN_HISTORY_DATA_CMD,NULL,0);
+                    return;
+                }
+
+                num=(ble_nus_max_data_len-18);
+                if(num>482)num=482;
+                 uapi_dev_runtime_set_goal_storage_status(1);
+                 Read_BIN_file_buf_send_bin_Data(data[0],num,0x44);
+                  uapi_dev_runtime_set_goal_storage_status(0);
+                break;
+            case 0x45://同步站立历史数据
+
+                if(uapi_dev_runtime_get_goal_storage_status())
+                {
+                    ble_reply_cmdarr(SYN_STAND_HISTORY_DATA_CMD,NULL,0);
+                    return;
+                }
+
+
+                num=(ble_nus_max_data_len-18);
+                if(num>482)
+                {
+                    num=482;
+                }
+                 uapi_dev_runtime_set_goal_storage_status(1);
+                 Read_BIN_file_buf_send_bin_Data(data[0],num,0x45);
+                  uapi_dev_runtime_set_goal_storage_status(0);
+
+                break;
+            case 0x46://同步卡路里历史数据
+                 if(uapi_dev_runtime_get_goal_storage_status())
+                {
+                    ble_reply_cmdarr(SYN_KCAL_HISTORY_DATA_CMD,NULL,0);
+                    return;
+                }
+
+                num=(ble_nus_max_data_len-18);
+                if(num>482)
+                {
+                    num=482;
+                }
+                 uapi_dev_runtime_set_goal_storage_status(1);
+                Read_BIN_file_buf_send_bin_Data(data[0],num,0x46);
+                 uapi_dev_runtime_set_goal_storage_status(0);
+                break;
+            case 0x47://同步距离历史数据
+
+                if(uapi_dev_runtime_get_goal_storage_status())
+                {
+                    ble_reply_cmdarr(SYN_DIS_HISTORY_DATA_CMD,NULL,0);
+                    return;
+                }
+
+                 num=(ble_nus_max_data_len-18);
+                if(num>482)
+                {
+                    num=482;
+                }
+                 uapi_dev_runtime_set_goal_storage_status(1);
+                Read_BIN_file_buf_send_bin_Data(data[0],num,0x47);
+                 uapi_dev_runtime_set_goal_storage_status(0);
+                break;
+            case 0x49://同步基础训练历史数据
+
+                if(uapi_dev_runtime_get_train_storage_status())
+                {
+                    ble_reply_cmdarr(SYN_BASIC_TRANIN_HISTORY_DATA_CMD,NULL,0);
+                    return;
+                }
+
+                EACH_DATA_LEN = DIS_DATA_LEN;
+                num=(ble_nus_max_data_len-18);
+                if(num>482)
+                {
+                    num=482;
+                }
+                 uapi_dev_runtime_set_train_storage_status(1);
+                Send_json_Data_Cmd(data[0],num,0x49);
+                 uapi_dev_runtime_set_train_storage_status(0);
+                break;
+            case 0x01://同步闹钟
+                EACH_DATA_LEN = DIS_DATA_LEN;
+                num=(ble_nus_max_data_len-18);
+                if(num>482)
+                {
+                    num=482;
+                }
+                Send_json_Data_Cmd(data[0],num,0x01);
+                break;
+            case 0x4b://睡眠历史数据
+
+                if(uapi_dev_runtime_get_sleep_storage_status())
+                {
+                    ble_reply_cmdarr(SYN_SLEEP_HISTORY_DATA_CMD,NULL,0);
+                    return;
+                }
+
+                EACH_DATA_LEN = DIS_DATA_LEN;
+                num=(ble_nus_max_data_len-18);
+                if(num>482)num=482;
+                 uapi_dev_runtime_set_sleep_storage_status(1);
+                Send_Sleep_Bin_Data(data[0],num);
+                 uapi_dev_runtime_set_sleep_storage_status(0);
+                break;
+            case 0x21://文件目录
+                EACH_DATA_LEN = DIS_DATA_LEN;
+                num=(ble_nus_max_data_len-18);
+                if(num>482)
+                {
+                    num=482;
+                }
+                Send_json_Data_Cmd(data[0],num,0x21);
+                break;
+
+            default:
+                break;
+        }
+        //sendReadData();
+    }else{
+        sendBuf[18] = 0;
+        sendBleData(sendBuf,19);
+    }
+}
+
+
+
+
+void getPhoneInfo_test(void)
+{
+    /*
+    cJSON *dataJSON = cJSON_CreateObject();
+    cJSON* data_arryJSON = cJSON_CreateArray();
+    cJSON_AddNumberToObject(dataJSON,"code",1);
+    
+    for(uint8_t i =0;i<3;i++)
+    {
+        cJSON* itemJSON = cJSON_CreateObject();
+        cJSON* arrayJSON = cJSON_CreateArray();
+        for(uint8_t id = 0;id<7;id++)
+        {
+            cJSON_AddNumberToObject(arrayJSON,"id",id);
+        }
+        
+        cJSON_AddNumberToObject(itemJSON,"id",i);
+        cJSON_AddItemToObject(itemJSON,"repeat",arrayJSON);
+        cJSON_AddNumberToObject(itemJSON,"hour",2+20*i);
+        cJSON_AddNumberToObject(itemJSON,"minute",30+i*0);
+        cJSON_AddNumberToObject(itemJSON,"enable",1);
+        cJSON_AddItemReferenceToArray(data_arryJSON,itemJSON);
+    }
+    cJSON_AddItemToObject(dataJSON,"alarm",data_arryJSON);
+
+    char *json_format = cJSON_PrintUnformatted(dataJSON);
+         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%d\n",strlen(json_format));
+    cJSON_Delete(dataJSON);
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%s\n",json_format);
+    uint32_t data_len = strlen(json_format);
+    uint8_t value[data_len+18];
+    uint32_t tmp = 1;
+    uint16_t tmp_data = 1;
+    value[0] = 0x72;
+    value[1] = 0x01;
+    value[2] = 0x01;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp_data,2);
+    memcpy(value+17,(uint8_t *)json_format,data_len);
+    unsigned char  lrc = Calculate_CRC(value,data_len+17);
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"lrc:%d",lrc);
+    value[data_len+18] = lrc;
+    sendBleData(value,data_len+18);
+    */
+
+    // uint8_t value[128];
+    // memset(value,0,128);
+    
+    // value[0] = 0x72;
+    // value[1] = 0x01;
+    // value[2] = 0x0f;
+    // char buf[128];
+    // memset(buf,0,128);
+    // getSportData(&buf);
+    // uint32_t tmp = 1;
+    // uint32_t datalen = 1;
+    // uint16_t tmp_data = 1;
+    // datalen = strlen(buf);
+    // tmp_data = datalen;
+    // memcpy(value+3,&tmp,4);
+    // memcpy(value+7,&datalen,4);
+    // memcpy(value+11,&tmp,4);
+    // memcpy(value+15,&tmp_data,2);
+    // memcpy(&value[17],buf,strlen(buf));
+
+    // comfirmPaire(0);
+
+}
+
+bool creatMessageDir(void)//创建消息文件夹
+{
+    struct stat info;
+    if (stat(ANCS_DATA_CONFIG_DIR, &info) != 0)
+    {
+        if (mkdir(ANCS_DATA_CONFIG_DIR, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0)
+        {
+            return false; // Failed to create folder
+        }
+    }
+    return true;
+}
+char *get_message_dir_path(void)//获取信息的文件夹路径
+{
+    return ANCS_DATA_CONFIG_DIR;
+}
+
+void message_data(int uid,int appid,char  *title,char  *msg,int hasCode)
+{
+
+    uint32_t timestampe = 0;
+    if (uapi_get_timestampe_ss(&timestampe) != ERRCODE_SUCC)
+    {
+        timestampe = 0;
+    }
+    ancs_data_info_t data;
+    data.title=malloc(strlen(title)+1);
+    data.msg = malloc(strlen(msg) + 1);
+    memset_s(data.title, TITLE_BUF_LEN, 0, strlen(title) + 1);
+    memset_s(data.msg, MSG_BUF_LEN, 0, strlen(msg) + 1);
+    memcpy_s(data.title, TITLE_BUF_LEN + 1, title, strlen(title));
+    memcpy_s(data.msg, MSG_BUF_LEN + 1, msg, strlen(msg));
+
+
+    data.appid = appid;
+    data.uid=uid;
+    data.time=timestampe;
+    data.read=0;
+    data.hasCode = hasCode;
+
+    data.msglen = strlen(msg);
+    data.titlelen = strlen(title);
+    
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"message_data %p %p\r\n",  data.title,   data.msg);
+
+    CustomEventPublish_TOPIC_EVENT_MESSAGENOTE(&data);
+    return ;
+
+}
+int uft8_check(char *chinese_string,int length)
+{
+    int i = 0;
+     for (i = 0; i < length;) {
+        // 判断是否为ASCII字符
+        if ((unsigned char)chinese_string[i] < 0x80) {
+            //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ASCII character: %d\n", (int)(unsigned char)chinese_string[i]);
+            i++;
+        } else {
+            // 假设这里我们只处理3字节的UTF-8字符
+            // 实际上,中文字符通常是4字节
+            if ((unsigned char)chinese_string[i] >= 0xF0) {
+                // 这里应处理4字节UTF-8字符的逻辑
+                // 例如: return (chinese_string[i] << 24) | (chinese_string[i + 1] << 16) | (chinese_string[i + 2] << 8) | chinese_string[i + 3];
+                i += 4; // 跳过4个字节
+            } else if ((unsigned char)chinese_string[i] >= 0xE0) {
+                // 这里应处理3字节UTF-8字符的逻辑
+                // 例如: return (chinese_string[i] << 16) | (chinese_string[i + 1] << 8) | chinese_string[i + 2];
+                i += 3; // 跳过3个字节
+            } else {
+                // 这里应处理2字节UTF-8字符的逻辑
+                // 例如: return (chinese_string[i] << 8) | chinese_string[i + 1];
+                i += 2; // 跳过2个字节
+            }
+        }
+        if(i+4 > length)
+            break;
+    }
+    return i;
+}
+
+
+//安卓消息接收解析数据 //ANCS 2AE1
+uint8_t jscheck_ancs(uint8_t *data)
+{
+    uint8_t *json;
+    json = data;
+    cJSON* root = cJSON_Parse((const char *)json);
+    if (root == NULL) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"信息解析 JSON解析 失败\n");
+        return 2;
+    }
+
+    int uid_t = 0;
+    int appid_t = 0;
+    int hasCode_t = 0;
+    char *titleBuf;
+    char *msgBuf;
+    titleBuf = ym_malloc(TITLE_BUF_LEN+1);
+    msgBuf = ym_malloc(MSG_BUF_LEN+1);
+    if(titleBuf == NULL || msgBuf == NULL)//申请内存失败不在申请
+    {
+        return 2;
+    }
+    memset(titleBuf,0,TITLE_BUF_LEN+1);
+    memset(msgBuf,0,MSG_BUF_LEN+1);
+    cJSON* uid = cJSON_GetObjectItem(root, "uid");
+    if (uid && cJSON_IsNumber(uid)) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"uid_t: %d\n", uid->valueint);
+        uid_t = uid->valueint;
+    }
+    cJSON* appid = cJSON_GetObjectItem(root, "appid");
+    if (appid && cJSON_IsNumber(appid)) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"appid_t: %d\n", appid->valueint);
+        appid_t = appid->valueint;
+    }
+    cJSON* title_c = cJSON_GetObjectItem(root, "title");
+    if (title_c && cJSON_IsString(title_c)) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"titleBuf: %s\n", title_c->valuestring);
+        int len = strlen(title_c->valuestring);
+        if(len >= TITLE_BUF_LEN){
+            len = uft8_check(title_c->valuestring,TITLE_BUF_LEN-4);
+            title_c->valuestring[len++] ='.';
+            title_c->valuestring[len++] = '.';
+            title_c->valuestring[len++] = '.';
+            title_c->valuestring[len++] = 0;
+        }
+        memcpy_s(titleBuf,TITLE_BUF_LEN,(uint8_t *)title_c->valuestring,len);
+    }
+    cJSON* msg = cJSON_GetObjectItem(root, "msg");
+    if (msg && cJSON_IsString(msg)) {
+        int len = strlen(msg->valuestring);
+        if(len >= MSG_BUF_LEN-4){
+            len = uft8_check(msg->valuestring,MSG_BUF_LEN-4);
+            msg->valuestring[len++] ='.';
+            msg->valuestring[len++] = '.';
+            msg->valuestring[len++] = '.';
+            msg->valuestring[len++] = 0;
+        }
+        memcpy_s(msgBuf,MSG_BUF_LEN,(uint8_t *)msg->valuestring,len);
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"msgBuf: %s\n",msgBuf);
+    }
+    cJSON* time = cJSON_GetObjectItem(root, "time");
+    if (time && cJSON_IsString(time)) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"time: %s\n", time->valuestring);
+        // timeBuf = time->valueint;
+    }
+    cJSON* hasCode = cJSON_GetObjectItem(root, "hasCode");
+    if (hasCode && cJSON_IsNumber(hasCode)) {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"hasCode_t: %d\n", hasCode->valueint);
+        hasCode_t = hasCode->valueint;
+    }
+    cJSON_Delete(root);
+
+    // if(ancs_msg_data!=NULL)
+    // {
+    //     free(ancs_msg_data);
+    //     ancs_msg_data=NULL;
+    // }
+
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"send message\r\n");
+    message_data(uid_t,appid_t,titleBuf,msgBuf,hasCode_t);
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"send message ok\r\n");
+
+    if(titleBuf != NULL){
+        ym_free(titleBuf);
+        titleBuf = NULL;
+    }
+    if(msgBuf != NULL){
+        ym_free(msgBuf);
+        msgBuf = NULL;
+    }
+    return 1;
+}
+
+void ancsDataShowCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//
+{
+    uint8_t value[19];
+    memset(value,0,19);
+    uint32_t tmp = 1;
+    value[0] =0x72;
+    value[1] =0x02;
+    value[2] =0x01;
+    memcpy(value+3,&tmp,4);
+    memcpy(value+7,&tmp,4);
+    memcpy(value+11,&tmp,4);
+    memcpy(value+15,&tmp,2);
+    
+    if(Check_CRC(data,len,crcvalue))
+    {
+        //解析ancs数据并且显示出来
+        uint8_t check_ok= 1;
+        check_ok = jscheck_ancs(data);
+        value[17] = 1;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }else{
+        value[17] = 0;
+        value[18] = Calculate_CRC(value,18);
+        sendBleData(value,19);
+    }
+}
+
+void CustomEventPublish_TOPIC_EVENT_MESSAGENOTE(void *data)
+{
+    CustomEventPublish(TOPIC_EVENT_MESSAGE_UPDATA,(uint8_t*)data,sizeof(ancs_data_info_t));
+}
+
+void type2AE1Data(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue)
+{
+    uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];
+     #ifdef BLE_LOG
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE1Data typeID:0x%4X\r\n",typeID);
+    #endif
+    switch (typeID) //ID
+    {
+        case ANDROID_ANCS_CMD://
+            ancsDataShowCmd(typeID,data,datalen,totalData,crcvalue);
+            break;
+    }
+}
+
+void bleRecvANCSData(uint8_t *data, uint16_t data_size,uint8_t *buf_cmd,uint8_t *totalData,uint8_t crcvalue)//buf_cmd 指令前17个字节数据
+{
+    uint8_t type = buf_cmd[1];
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type:%d %d data_size:%d data:%d crcvalue:%x\r\n",buf_cmd[0],type,data_size,data[0],crcvalue);
+    switch (type)
+    {
+        case 0x03://
+            type2AE1Data(buf_cmd,data,data_size,totalData,crcvalue);
+            break;
+        default:
+            break;
+    }
+}
+
+/**
+ * less than 20bytes msg reply
+*/
+errcode_t ble_reply_msgarr(uint8_t msg_cmdtype,uint8_t msg_cmdid,uint8_t *replydata,uint16_t replydata_len)
+{
+
+        //发送校验失败
+
+        if (replydata_len > 20)
+        {
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"datalen is larger than 20, please send with other api !\n");
+            return ERRCODE_FAIL;
+        }
+        uint16_t replybuflen=sizeof(msg_header_t)+replydata_len+1;
+        uint8_t *replybuf=malloc(replybuflen);
+        if(replybuf != NULL)
+        {
+            msg_header_t *reply_cmd_header=(msg_header_t*)replybuf;
+            reply_cmd_header->direction = MSG_DIRECTION_SEND;
+            reply_cmd_header->cmdtype   =msg_cmdtype;
+            reply_cmd_header->cmdid   = msg_cmdid;
+            reply_cmd_header->package_count = 1;
+            reply_cmd_header->package_index = 1;
+            reply_cmd_header->package_len = replydata_len;
+            reply_cmd_header->total_data_len = replydata_len;
+            memcpy_s(replybuf+sizeof(msg_header_t),replydata_len,replydata,replydata_len);            
+            uint8_t crc_value = Calculate_CRC( replybuf, replybuflen - 1);
+            replybuf[ replybuflen - 1 ] = crc_value ; //CRC
+            errcode_t ret=0;
+            if(msg_cmdtype==6)
+            {
+                ret=sendBleData_zhihui(replybuf,replybuflen);
+
+            }else
+            {
+                 ret= sendBleData(replybuf,replybuflen);
+            }
+           
+
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ble_reply_msgarr cmdtype %02X cmdid %02X package %d/%d , len %d,total len %d , data[0] %02X crc %02X\n",
+            reply_cmd_header->cmdtype,
+            reply_cmd_header->cmdid,
+            reply_cmd_header->package_index,
+            reply_cmd_header->package_count,
+            reply_cmd_header->package_len,
+            reply_cmd_header->total_data_len,
+            (replybuf+sizeof(msg_header_t))[0],
+            crc_value
+            );
+            free(replybuf);
+            return ret;
+        }else{
+            return ERRCODE_MALLOC;
+        }
+}
+
+errcode_t ble_reply_cmdarr(uint16_t msg_cmd,uint8_t *replydata,uint16_t replydata_len)
+{
+
+    uint8_t cmdtype = (uint8_t)((msg_cmd&0xFF00)>>8);
+    uint8_t cmdid = (uint8_t)(msg_cmd&0x00FF);
+    
+    return ble_reply_msgarr(cmdtype,cmdid,replydata,replydata_len);
+
+}
+errcode_t ble_reply_cmd(uint16_t msg_cmd,uint8_t replydata)
+{
+    uint8_t cmdtype = (uint8_t)((msg_cmd&0xFF00)>>8);
+    uint8_t cmdid = (uint8_t)(msg_cmd&0x00FF);
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"msg_cmd %04X cmdtype %02X cmdid %02X\n",msg_cmd,cmdtype,cmdid);
+    return ble_reply_msg(cmdtype,cmdid,replydata);
+}
+errcode_t ble_reply_msg(uint8_t msg_cmdtype,uint8_t msg_cmdid,uint8_t replydata)
+{
+    return ble_reply_msgarr(msg_cmdtype,msg_cmdid,&replydata,1);
+}
+
+static uint32_t last_package_id=0;
+static void  ble_transfer_Timer_CallBack(int data)
+{
+    timer_flie_flag--;
+
+    if(timer_flie_flag==0)
+    {
+        cancel_recv_file(1);
+    }
+}
+uint8_t OTA_FILE_value=0;
+
+errcode_t decode_ota_data(ble_read_data *buffer_handle,uint8_t *data,uint16_t datalen,uint8_t crcvalue)
+{
+    if(datalen<sizeof(msg_header_t))
+    {
+        return ERRCODE_FAIL;
+    }
+
+    msg_header_t *header =  (msg_header_t*)data; 
+
+    if(header->cmdtype!=0x06)
+    {
+        return ERRCODE_FAIL;
+    }
+
+    uint8_t* data_=data+sizeof(msg_header_t);
+        //datalen-=18;
+    datalen=header->package_len;
+
+    if(header->cmdid==0x0B)
+    {   
+        //取消文件传输
+        if(Check_CRC(data_,datalen,crcvalue))
+        {
+            cancel_recv_file(0);
+            uint8_t replydata= 1;
+            ble_reply_msgarr(6,0x0B,&replydata,1);
+        }
+        else
+        {
+             cancel_recv_file(0);
+            uint8_t replydata= 0;
+            ble_reply_msgarr(6,0x0B,&replydata,1);
+        }
+
+    }
+    else if(header->cmdid==0x02)
+    {
+
+        uint32_t package_id=header->package_index;
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"package_id: %d \r\n",package_id);
+        if(Check_CRC(data_,datalen,crcvalue))
+        {
+        
+            if(package_id==0)
+            {
+            last_package_id=package_id;
+            if((buffer_handle->file_recv_stat.recv_file_stat <= 0) && buffer_handle->file_recv_stat.file == NULL )
+            {
+                buffer_handle->file_recv_stat.lrcvalue = 0;
+                if (buffer_handle->file_recv_stat.file_type == 1)
+                {
+
+                    buffer_handle->file_recv_stat.file = fopen(UP_DATE_FWPKG_PATH,"w+");
+                    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",UP_DATE_FWPKG_PATH,buffer_handle->file_recv_stat.file);
+
+
+                }
+                else if (buffer_handle->file_recv_stat.file_type == 2)
+                {
+                    char musicpath[64]={0};
+                    get_music_path(musicpath,64);
+                    //"/user/userdata/music"
+                    char filepath[256]={0};
+                    create_mp3_name(filepath,musicpath,buffer_handle->file_recv_stat.file_name);
+
+                    buffer_handle->file_recv_stat.file = fopen(filepath,"w+");
+                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);
+                }
+                 else if (buffer_handle->file_recv_stat.file_type == 4)
+                {
+                   char filepath[128]={0};
+                    if (get_app_file_path(buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)
+                    {
+                        buffer_handle->file_recv_stat.file = fopen(filepath,"w+");//?
+                        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);
+                    }else{
+                          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);
+                    }            
+                }
+                else
+                {
+                    char filepath[128]={0};
+                    if (get_file_recv_file_path(buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)
+                    {
+                        buffer_handle->file_recv_stat.file = fopen(filepath,"w+");
+                          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);
+                    }else{
+                          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);
+                    }            
+                }
+
+
+
+                if (buffer_handle->file_recv_stat.file == NULL)
+                {
+                      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"6185 buffer_handle->file_recv_stat.file  \n");
+                    return ERRCODE_FAIL;
+                }
+                size_t writtensize = fwrite(data_,1,datalen,buffer_handle->file_recv_stat.file);
+                if(writtensize == datalen)
+                {
+                    timer_flie_flag=10;
+
+                    buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_,datalen,buffer_handle->file_recv_stat.lrcvalue);
+                            buffer_handle->file_recv_stat.received_size += datalen;
+                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d\n",buffer_handle->file_recv_stat.received_size);
+                    OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;
+
+
+                }else{
+                      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen);
+                    return ERRCODE_FAIL;
+                }
+
+
+                buffer_handle->file_recv_stat.recv_file_stat = 1;
+                ////////////////创建文件传输超时定时器//////////////////
+                uint32_t tick;
+                osStatus_t retTimer;
+                if(BR_TRANSFER_timer!=NULL)
+                {
+                    osTimerDelete(BR_TRANSFER_timer);
+                    BR_TRANSFER_timer = NULL;
+                }
+                ble_read_timer_p=buffer_handle;
+                timer_flie_flag=10;
+
+                BR_TRANSFER_timer = osTimerNew((osTimerFunc_t)ble_transfer_Timer_CallBack, osTimerPeriodic, NULL, NULL);
+                tick =1000;// osMs2Tick(1000);
+                retTimer = osTimerStart(BR_TRANSFER_timer, tick);
+                if (retTimer != osOK && BR_TRANSFER_timer != NULL) {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
+                    osTimerDelete(BR_TRANSFER_timer);
+                    BR_TRANSFER_timer = NULL;
+                    return ERRCODE_FAIL;
+                }
+
+                {
+                    if(buffer_handle->file_recv_stat.file_type==3)
+                    TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING;
+                    
+                    if(buffer_handle->file_recv_stat.file_type==1)
+                    TRANSMIT_DATA=TRANS_OTA_TRANSMITTING;
+                
+                    if(buffer_handle->file_recv_stat.file_type==2)
+                    TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;
+
+                     if(buffer_handle->file_recv_stat.file_type==4)
+                    TRANSMIT_DATA=TRANS_BIN_TRANSMITTING;
+                    
+                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                }
+            }
+            ///////////////////////////////////////////////////////////
+        }
+        else if ((last_package_id+1)==package_id)
+        {
+            last_package_id=package_id;
+            if (buffer_handle->file_recv_stat.file == NULL)
+            {
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6194 buffer_handle->file_recv_stat.file  \n");
+                return ERRCODE_FAIL;
+            }
+            //写入文件
+            size_t writtensize = fwrite(data_,1,datalen,buffer_handle->file_recv_stat.file);
+            if(writtensize == datalen)
+            {
+                timer_flie_flag=10;
+
+                buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data_,datalen,buffer_handle->file_recv_stat.lrcvalue);
+                        buffer_handle->file_recv_stat.received_size += datalen;
+                OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;
+                  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d %0.3lf\n",buffer_handle->file_recv_stat.received_size
+                  ,(float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size);
+
+            }else{
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,datalen);
+                return ERRCODE_FAIL;
+            }
+
+        //检查文件是否写完
+            if(buffer_handle->file_recv_stat.file_size == buffer_handle->file_recv_stat.received_size)
+            {
+                if (buffer_handle->file_recv_stat.file!=NULL)
+                {
+                    fclose(buffer_handle->file_recv_stat.file);
+                    buffer_handle->file_recv_stat.file = NULL;
+                }
+                if (buffer_handle->file_recv_stat.file_name != NULL)
+                {
+                    free(buffer_handle->file_recv_stat.file_name);
+                    buffer_handle->file_recv_stat.file_name=NULL;
+                }
+                buffer_handle->file_recv_stat.recv_file_stat = 2;
+                buffer_handle->receive_file_flag = 0;
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received success \n");
+
+                if(BR_TRANSFER_timer)
+                {
+                    osTimerStop(BR_TRANSFER_timer);
+                    osTimerDelete(BR_TRANSFER_timer);
+                    BR_TRANSFER_timer = NULL;
+                }
+                ble_read_timer_p=NULL;
+
+                TRANSMIT_DATA=FILE_IS_DONE;
+        
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+
+                ble_reply_cmd(OTA_FILE_SUCC_CMD,1);//接收成功
+            }
+
+            }
+            else if (last_package_id==package_id)
+            {
+                uint32_t replydata=0xffffffff;
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"0xffffffff 包重复\r\n");
+                //ble_reply_msgarr(6,4,&replydata,4);
+            }
+            else if (last_package_id!=package_id)
+            {
+                uint32_t replydata= last_package_id+1;
+                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"包错漏\r\n");
+                
+
+                ble_reply_msgarr(0x06,0x04,&replydata,4);
+            }
+            return ERRCODE_SUCC;
+        }
+        else
+        {
+            return ERRCODE_FAIL;
+        }
+    }
+    return ERRCODE_FAIL;
+}
+
+
+
+
+errcode_t decode_ota_json(ble_read_data *buffer_handle) {
+
+    if (uapi_dev_runtime_get_train_status() == 1) {
+       return ERRCODE_FAIL;
+    }
+
+    uint8_t *data = buffer_handle->data+sizeof(msg_header_t);
+    uint16_t datalen = buffer_handle->totalDataLen;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"ota_json_file_save %s\n",data);
+
+    cJSON* root = cJSON_Parse((const char *)data);
+    if(root != NULL)
+    {    
+        cJSON* ota_size_json = cJSON_GetObjectItem(root, "size");
+        if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json))
+        {
+            buffer_handle->file_recv_stat.file_size = ota_size_json->valueint;
+            if(is_free_ota_update(ota_size_json->valueint)==false)
+            {
+                TRANSMIT_DATA=TRANS_OTA_FAIL;
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                cJSON_Delete(root);
+
+                return ERRCODE_FAIL;
+            }
+        }
+
+        cJSON* ota_type_json = cJSON_GetObjectItem(root, "type");
+        if(ota_type_json != NULL && cJSON_IsNumber(ota_type_json))
+        {
+            buffer_handle->file_recv_stat.file_type = ota_type_json->valueint;
+        }
+
+        cJSON* ota_name_json = cJSON_GetObjectItem(root, "name");
+        if ( ota_name_json != NULL && cJSON_IsString(ota_name_json)) {
+            uint32_t filenamelen=strlen(ota_name_json->valuestring)+1;
+            if (filenamelen > 0 && filenamelen < 255)
+            {
+                buffer_handle->file_recv_stat.file_name = malloc(filenamelen);
+                if (buffer_handle->file_recv_stat.file_name!=NULL)
+                    memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen);
+                //下载完成再在 cancel download 里 free filename
+            }else{
+                buffer_handle->file_recv_stat.file_name = NULL;
+            }
+        }else{
+            buffer_handle->file_recv_stat.file_name = NULL;
+        }
+        
+        cJSON* ota_major_json = cJSON_GetObjectItem(root, "major");
+        if(ota_major_json != NULL && cJSON_IsNumber(ota_major_json))
+        {
+            buffer_handle->file_recv_stat.ota_major = ota_major_json->valueint;
+        }
+        cJSON* ota_mid_json = cJSON_GetObjectItem(root, "mid");
+        if(ota_mid_json != NULL && cJSON_IsNumber(ota_mid_json))
+        {
+            buffer_handle->file_recv_stat.ota_mid = ota_mid_json->valueint;
+        }
+        cJSON* ota_minor_json = cJSON_GetObjectItem(root, "minor");
+        if(ota_minor_json != NULL && cJSON_IsNumber(ota_minor_json))
+        {
+            buffer_handle->file_recv_stat.ota_minor = ota_minor_json->valueint;
+        }
+        cJSON* ota_isforced_json = cJSON_GetObjectItem(root, "isForced");
+        if(ota_isforced_json != NULL && cJSON_IsNumber(ota_isforced_json))
+        {
+            buffer_handle->file_recv_stat.ota_isforced = ota_isforced_json->valueint;
+        }
+        cJSON_Delete(root);
+
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"  ota_type= %d, ota_name=%s, ota_size=%d, ota_major=%d, ota_mid=%d, ota_minor=%d, ota_isforced=%d \n",
+            buffer_handle->file_recv_stat.file_type,
+            buffer_handle->file_recv_stat.file_name,
+            buffer_handle->file_recv_stat.file_size,
+            buffer_handle->file_recv_stat.ota_major,
+            buffer_handle->file_recv_stat.ota_mid,
+            buffer_handle->file_recv_stat.ota_minor,
+            buffer_handle->file_recv_stat.ota_isforced
+        );
+        buffer_handle->file_recv_stat.received_size = 0;
+        buffer_handle->file_recv_stat.lrcvalue = 0;
+        buffer_handle->receive_file_flag = 1;
+        uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);
+        //进入特殊UI
+        TRANSMIT_DATA=TRANS_OTA_TRANSMITTING;
+        CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+        return ERRCODE_SUCC;
+    }else{
+        buffer_handle->receive_file_flag = 0;        
+        return ERRCODE_FAIL;
+    }
+}
+
+
+errcode_t decode_mp3_json(ble_read_data *buffer_handle)
+{
+    if (uapi_dev_runtime_get_train_status() == 1) {
+       return ERRCODE_FAIL;
+    }
+  
+    uint8_t *data = buffer_handle->data+sizeof(msg_header_t);
+    uint16_t datalen = buffer_handle->totalDataLen;
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"MP3_file_save %s\n",data);
+
+    cJSON* root = cJSON_Parse((const char *)data);
+    
+    if(root != NULL)
+    {         
+        cJSON* ota_type_json = cJSON_GetObjectItem(root, "type");
+        if(ota_type_json != NULL && cJSON_IsNumber(ota_type_json))
+        {
+            buffer_handle->file_recv_stat.file_type = ota_type_json->valueint;
+        }
+
+        cJSON* ota_name_json = cJSON_GetObjectItem(root, "name");
+        if ( ota_name_json != NULL && cJSON_IsString(ota_name_json)) {
+            uint32_t filenamelen=strlen(ota_name_json->valuestring)+1;
+
+            if (filenamelen > 0 && filenamelen < 255)
+            {
+                if(buffer_handle->file_recv_stat.file_name)
+                {
+                    free(buffer_handle->file_recv_stat.file_name);
+                    buffer_handle->file_recv_stat.file_name=NULL;
+                }
+                buffer_handle->file_recv_stat.file_name = malloc(filenamelen);
+                if (buffer_handle->file_recv_stat.file_name!=NULL)
+                {
+                    memset_s(buffer_handle->file_recv_stat.file_name,filenamelen,0,filenamelen);
+                    memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen);
+                }
+                    
+                //下载完成再在 cancel download 里 free filename
+            }else{
+                buffer_handle->file_recv_stat.file_name = NULL;
+            }
+        }
+
+        cJSON* ota_size_json = cJSON_GetObjectItem(root, "size");
+        if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json))
+        {
+            buffer_handle->file_recv_stat.file_size = ota_size_json->valueint;
+        }
+            cJSON_Delete(root);
+
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"  MP3_type= %d, MP3_name=%s, MP3_size=%d \n",
+            buffer_handle->file_recv_stat.file_type,
+            buffer_handle->file_recv_stat.file_name,
+            buffer_handle->file_recv_stat.file_size
+        );
+        // buffer_handle->file_recv_stat.received_size = 0;
+        // buffer_handle->file_recv_stat.lrcvalue = 0;
+        // buffer_handle->receive_file_flag = 1;
+        // uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);
+        // TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;
+        // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+        if(IS_free_save_Mp3(ota_size_json->valueint)==false)
+        {
+            free(buffer_handle->file_recv_stat.file_name);
+            buffer_handle->file_recv_stat.file_name=NULL;
+
+            TRANSMIT_DATA=TRANS_MP3_MAX_FAIL;
+            CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+            return  ERRCODE_FAIL;
+        }
+        else
+        {
+             buffer_handle->file_recv_stat.received_size = 0;
+            buffer_handle->file_recv_stat.lrcvalue = 0;
+            buffer_handle->receive_file_flag = 1;
+            uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);
+
+            return ERRCODE_SUCC;
+        }
+
+    }else{
+        buffer_handle->receive_file_flag = 0;        
+        return ERRCODE_FAIL;
+    }
+}
+
+
+errcode_t decode_bin_json(ble_read_data *buffer_handle)
+{
+    if (uapi_dev_runtime_get_train_status() == 1) {
+       return ERRCODE_FAIL;
+    }
+  
+    uint8_t *data = buffer_handle->data+sizeof(msg_header_t);
+    uint16_t datalen = buffer_handle->totalDataLen;
+    // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"decode_bin_json %s\n",data);
+
+    cJSON* root = cJSON_Parse((const char *)data);
+    
+    if(root != NULL)
+    {         
+        cJSON* ota_type_json = cJSON_GetObjectItem(root, "type");
+        if(ota_type_json != NULL && cJSON_IsNumber(ota_type_json))
+        {
+            buffer_handle->file_recv_stat.file_type = ota_type_json->valueint;
+        }
+
+        cJSON* ota_name_json = cJSON_GetObjectItem(root, "name");
+        if ( ota_name_json != NULL && cJSON_IsString(ota_name_json)) {
+            uint32_t filenamelen=strlen(ota_name_json->valuestring)+1;
+
+            if (filenamelen > 0 && filenamelen < 255)
+            {
+                if(buffer_handle->file_recv_stat.file_name)
+                {
+                    free(buffer_handle->file_recv_stat.file_name);
+                    buffer_handle->file_recv_stat.file_name=NULL;
+                }
+                buffer_handle->file_recv_stat.file_name = malloc(filenamelen);
+                if (buffer_handle->file_recv_stat.file_name!=NULL)
+                {
+                    memset_s(buffer_handle->file_recv_stat.file_name,filenamelen,0,filenamelen);
+                    memcpy_s(buffer_handle->file_recv_stat.file_name,filenamelen,ota_name_json->valuestring,filenamelen);
+                }
+                    
+                //下载完成再在 cancel download 里 free filename
+            }else{
+                buffer_handle->file_recv_stat.file_name = NULL;
+            }
+        }
+
+        cJSON* ota_size_json = cJSON_GetObjectItem(root, "size");
+        if(ota_size_json != NULL && cJSON_IsNumber(ota_size_json))
+        {
+            buffer_handle->file_recv_stat.file_size = ota_size_json->valueint;
+        }
+            cJSON_Delete(root);
+
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"  bin type = %d, bin name =%s, bin size =%d \n",
+            buffer_handle->file_recv_stat.file_type,
+            buffer_handle->file_recv_stat.file_name,
+            buffer_handle->file_recv_stat.file_size
+        );
+        // buffer_handle->file_recv_stat.received_size = 0;
+        // buffer_handle->file_recv_stat.lrcvalue = 0;
+        // buffer_handle->receive_file_flag = 1;
+        // uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);
+        // TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;
+        // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+        if(IS_free_save_Mp3(ota_size_json->valueint)==false)
+        {
+            free(buffer_handle->file_recv_stat.file_name);
+            buffer_handle->file_recv_stat.file_name=NULL;
+
+            TRANSMIT_DATA=TRANS_MP3_MAX_FAIL;
+            CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+            return  ERRCODE_FAIL;
+        }
+        else
+        {
+             buffer_handle->file_recv_stat.received_size = 0;
+            buffer_handle->file_recv_stat.lrcvalue = 0;
+            buffer_handle->receive_file_flag = 1;
+            uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);
+
+            memset_s(app_name,64,0,64);
+            memcpy_s(app_name,64, buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name));
+            
+
+            return ERRCODE_SUCC;
+        }
+
+    }else{
+        buffer_handle->receive_file_flag = 0;        
+        return ERRCODE_FAIL;
+    }
+}
+static uint16_t  ble_dial_uid=0;
+
+errcode_t decode_dial_info(ble_read_data *buffer_handle)
+{
+
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"decode_dial_info \n");
+    for(uint8_t i = 0;i<buffer_handle->data_len;i++)
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buffer_handle->data[i]);
+    }
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n");
+    if (buffer_handle->data_len == 6)
+    {
+
+        return ERRCODE_SUCC;
+    }
+    uint8_t *data = buffer_handle->data+sizeof(msg_header_t);
+    uint16_t datalen = buffer_handle->totalDataLen;
+
+    msg_recv_dial_info_t dialinfo={0};
+    msg_recv_dial_info_t *pdialinfo=(msg_recv_dial_info_t*)data;
+
+    // dialinfo.dial_count = pdialinfo->dial_count;
+    dialinfo.dial_uid = pdialinfo->dial_uid;
+    if(dialinfo.dial_uid<=4)
+    {
+        
+        msg_recv_custom_dial_info_t *custom_dial_info=(msg_recv_custom_dial_info_t*)data;
+        custom_dial_info->dial_uid+=1;
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"custom_dial_info %d %d %d %d",
+        custom_dial_info->dial_uid,
+        custom_dial_info->battery,
+        custom_dial_info->time,
+        custom_dial_info->time_font);
+
+        ble_save_dial_custom(custom_dial_info);
+        ble_dial_file_count=*(data+sizeof(msg_recv_custom_dial_info_t));
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," custom_dial file_count %d\r\n",ble_dial_file_count);
+        
+    }
+    else
+    {
+        dialinfo.file_name_len = pdialinfo->file_name_len;
+        // dialinfo.file_type = pdialinfo->file_type;
+
+        if (dialinfo.file_name_len < 0 || dialinfo.file_name_len >255)
+        {
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name len should in [0,255] \n");
+            return ERRCODE_FAIL;
+        }
+
+        char * filename = malloc(dialinfo.file_name_len);
+
+        ble_dial_file_count= data[sizeof(msg_recv_dial_info_t)+dialinfo.file_name_len];
+        if (filename == NULL)
+        {
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name malloc failed  filename_len %d\n",dialinfo.file_name_len);
+            return ERRCODE_FAIL;
+        }
+        memcpy_s(filename,dialinfo.file_name_len,data+sizeof(msg_recv_dial_info_t),dialinfo.file_name_len);
+
+        buffer_handle->file_recv_stat.file_name = filename;
+        
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," dial name = %s, dial file count = %d \n",
+            filename,ble_dial_file_count);
+
+        free(filename);
+        buffer_handle->file_recv_stat.file_name=NULL;
+    }
+
+    ble_dial_uid = dialinfo.dial_uid;
+   
+    buffer_handle->file_recv_stat.received_size = 0;
+    buffer_handle->file_recv_stat.lrcvalue = 0;
+    buffer_handle->receive_file_flag = 0;
+    
+    return ERRCODE_SUCC;
+
+}
+
+errcode_t decode_single_dial_info(ble_read_data *buffer_handle)
+{
+
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"decode_single_dial_info \n");
+    for(uint8_t i = 0;i<buffer_handle->data_len;i++)
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x ",buffer_handle->data[i]);
+    }
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"\n");
+    if (buffer_handle->data_len == 6)
+    {
+        return ERRCODE_SUCC;
+    }
+    uint8_t *data = buffer_handle->data+sizeof(msg_header_t);
+    uint16_t datalen = buffer_handle->totalDataLen;
+
+    msg_recv_single_dial_info_t dialinfo={0};
+    msg_recv_single_dial_info_t *pdialinfo=(msg_recv_single_dial_info_t*)data;
+
+    dialinfo.dial_count = pdialinfo->dial_count;
+
+    ble_dial_file_index= dialinfo.dial_count;
+
+    dialinfo.dial_uid = pdialinfo->dial_uid;
+    dialinfo.file_name_len = pdialinfo->file_name_len;
+    dialinfo.file_type = pdialinfo->file_type;
+
+    if (dialinfo.file_name_len < 6 || dialinfo.file_name_len >255)
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name len should in [6,255] \n");
+        return ERRCODE_FAIL;
+    }
+
+    if (uapi_dev_runtime_get_train_status() == 1) {
+       return ERRCODE_FAIL;
+    }
+    
+
+    char * filename = malloc(dialinfo.file_name_len+1);
+    //下载完成再在 cancel download 里 free filename
+
+    uint32_t file_size = 0;
+    memcpy_s((void*)&file_size,sizeof(uint32_t),(void*)&data[sizeof(msg_recv_single_dial_info_t)+dialinfo.file_name_len],sizeof(uint32_t));
+    if (filename == NULL)
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"file name malloc failed  filename_len %d\n",dialinfo.file_name_len);
+        return ERRCODE_FAIL;
+    }
+    memcpy_s(filename,dialinfo.file_name_len,data+sizeof(msg_recv_single_dial_info_t),dialinfo.file_name_len);
+    filename[dialinfo.file_name_len] ='\0';
+    //在runtime中备份一个安装文件名。
+    uapi_dev_runtime_set_dialname(filename);
+    
+    if (check_dial_freespace(dialinfo.dial_uid, file_size) == false)
+    {
+        free(filename);
+        filename=NULL;
+
+        TRANSMIT_DATA=TRANS_DIAL_MAX_FAIL;
+        CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+        return ERRCODE_FAIL;
+    }
+
+    //存表盘id
+    ble_dial_uid = dialinfo.dial_uid;
+    // if(ble_dial_uid<=4)
+    // ble_dial_uid++;
+
+    if(buffer_handle->file_recv_stat.file_name)
+    {
+        free(buffer_handle->file_recv_stat.file_name);
+        buffer_handle->file_recv_stat.file_name=NULL;
+    }
+    
+    buffer_handle->file_recv_stat.file_name = filename;
+    buffer_handle->file_recv_stat.file_size = file_size;
+    buffer_handle->file_recv_stat.file_type = 3;//表盘
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"  filetype = %d, file_name=%s, file_size=%d , dial_uid %04X ,dial_count %d, dial_filetype %d\n",
+        buffer_handle->file_recv_stat.file_type,
+        buffer_handle->file_recv_stat.file_name,
+        buffer_handle->file_recv_stat.file_size,
+        dialinfo.dial_uid,
+        dialinfo.dial_count,
+        dialinfo.file_type
+
+    );
+    buffer_handle->file_recv_stat.received_size = 0;
+    buffer_handle->file_recv_stat.lrcvalue = 0;
+    buffer_handle->receive_file_flag = 1;
+    uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_HIGH);
+
+    // TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING;
+    // CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+    return ERRCODE_SUCC;
+    
+
+  
+
+   
+
+}
+static errcode_t install_dial(void)
+{
+    char *lzmapkgname = uapi_dev_runtime_get_dialname();
+    // 增加初始参数校验打印
+    if (lzmapkgname == NULL) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取到的表盘包名为空\n");
+        return ERRCODE_FAIL;
+    }
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 开始安装表盘,包名:%s\n", lzmapkgname);
+
+    // 检查是否为lzma格式包
+    char *lzmaindex = strstr(lzmapkgname, ".lzma");
+    if (lzmaindex == NULL) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:包名中未找到.lzma后缀,不是有效压缩包\n");
+        return ERRCODE_FAIL;
+    }
+
+    // 创建表盘目录(若不存在)
+    struct stat info;
+    if (stat(get_dial_path(), &info) != 0) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录不存在,尝试创建...\n");
+        if (mkdir(get_dial_path(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) != 0) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:创建表盘目录失败\n");
+            return ERRCODE_FAIL;
+        }
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录创建成功\n");
+    } else {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘目录已存在,无需创建\n");
+    }
+
+    // 解析表盘基础名称(去除.lzma后缀)
+    char dial_basename[64] = {0};
+    int dial_basenamelen = lzmaindex - lzmapkgname;
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析基础名称长度:%d\n", dial_basenamelen);
+    if (dial_basenamelen <= 0 || dial_basenamelen >= sizeof(dial_basename)) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:基础名称长度无效(%d),超出缓冲区大小\n", dial_basenamelen);
+        return ERRCODE_FAIL;
+    }
+    memcpy_s(dial_basename, sizeof(dial_basename), lzmapkgname, dial_basenamelen);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解析到表盘基础名称:%s\n", dial_basename);
+
+    // 确定解压后bin文件路径
+    char dialbin_filepath[128] = {0};
+    if (ble_dial_uid > 5) {
+        if (get_dial_file_path(dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取常规表盘文件路径失败\n");
+            return ERRCODE_FAIL;
+        }
+    } else {
+        if (get_custom_dial_file_path(ble_dial_uid, dial_basename, strlen(dial_basename), dialbin_filepath, sizeof(dialbin_filepath)) != ERRCODE_SUCC) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取自定义表盘文件路径失败\n");
+            return ERRCODE_FAIL;
+        }
+    }
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压目标bin文件路径:%s\n", dialbin_filepath);
+
+    // 确定源lzma文件路径
+    char lzma_filepath[128] = {0};
+    if (get_file_recv_file_path(lzmapkgname, strlen(lzmapkgname), lzma_filepath, sizeof(lzma_filepath)) != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:获取源lzma文件路径失败\n");
+        return ERRCODE_FAIL;
+    }
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件路径:%s\n", lzma_filepath);
+
+    // 执行解压操作
+    errcode_t ret = uapi_dial_pkg_decompress(lzma_filepath, dialbin_filepath);
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压操作完成,返回码:0x%X(%s)\n", ret, 
+                 (ret == ERRCODE_SUCC) ? "成功" : "失败");
+
+    // 关键:检查解压后bin文件是否存在及大小
+    struct stat bin_info;
+    if (stat(dialbin_filepath, &bin_info) != 0) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件不存在或无法访问(路径:%s)\n", dialbin_filepath);
+        ret = ERRCODE_FAIL; // 即使解压返回成功,文件不存在也视为失败
+    } else {
+        if (bin_info.st_size <= 0) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 错误:解压后bin文件大小为空(%ld字节),无效文件\n", bin_info.st_size);
+            ret = ERRCODE_FAIL; // 大小为空视为失败
+        } else {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压后bin文件大小正常:%ld字节\n", bin_info.st_size);
+        }
+    }
+
+    // 若解压失败,直接返回
+    if (ret != ERRCODE_SUCC) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 解压失败,终止安装流程\n");
+        return ret;
+    }
+
+    // 注册并设置表盘
+    char *namebuf = strtok(lzmapkgname, ".");
+    if (ble_dial_uid > 5) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 注册常规表盘:%s(ID:%d)\n", namebuf, ble_dial_uid);
+        install_Register_dial(namebuf, ble_dial_uid);
+        ble_set_dial_by_id(ble_dial_uid);
+    } else {
+        if (ble_dial_file_index == ble_dial_file_count) {
+            char name_str[32] = {0};
+            ble_get_custom_dial(ble_dial_uid, name_str);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘安装完毕,注册:%s(ID:%d)\n", name_str, ble_dial_uid);
+            install_Register_dial(name_str, ble_dial_uid);
+            ble_set_dial_by_id(ble_dial_uid);
+        } else {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 自定义表盘未达安装条件(当前索引:%d,总数:%d)\n", 
+                         ble_dial_file_index, ble_dial_file_count);
+        }
+    }
+
+    // 删除源lzma文件
+    #if 1
+    if (remove(lzma_filepath) != 0) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 警告:删除源lzma文件失败(路径:%s),可能残留冗余文件\n", lzma_filepath);
+        // 此处不返回失败,仅警告,因为核心安装已完成
+    } else {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 源lzma文件已成功删除\n");
+    }
+    #endif
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "[install_dial] 表盘安装流程全部完成,返回成功\n");
+    return ERRCODE_SUCC;
+}
+static char file_name[128]={0};
+static uint32_t file_size=0;
+
+bool Read_tar_file_buf_send_Data(uint16_t pack_size,uint8_t id)
+{
+
+    char *data= (char *)malloc(pack_size+1);
+    uint16_t read_size=0;
+    FILE *fp=fopen(file_name,"rb+");
+    
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",file_size);
+
+    uint32_t pack=file_size/pack_size+1;
+    uint32_t pack_id=1;
+    if(fp==NULL)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"fopen fail %s\r\n",file_name);
+        free(data);
+        return false;
+    }
+
+    do
+    {
+        memset_s(data,pack_size+1,0,pack_size+1);
+        read_size=fread(data,1,pack_size,fp);
+        if(read_size!=0)
+        {
+            ble_data_type type_={0x05,id,file_size,pack,pack_id};
+            send_big_data(type_,(char *)data,read_size);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"Read_tar_file_buf_send_Data size %d\r\n",read_size);
+        }
+        
+
+        //send_big_data(1,data,read_size,file_size,pack_id,pack,id,5);
+        pack_id++;
+       
+    } while (read_size==pack_size);
+    free(data);
+    fclose(fp);
+    sendbigDataBufState = false;
+    return true;
+}
+
+
+void delete_app(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue)
+{
+    
+       if(Check_CRC(data,len,crcvalue))
+       {
+        if(ble_app_delete(data))
+        {
+            ble_reply_cmd(cmd,1);
+        }
+        else
+        {
+            ble_reply_cmd(cmd,2);
+        }
+
+    }
+       else
+       {
+               ble_reply_cmd(cmd,0);
+    }
+    
+}
+
+void get_app_list(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue)
+{
+    
+       if(Check_CRC(data,len,crcvalue))
+       {
+        cJSON *jdata=ble_app_list();
+
+        if(jdata)
+        {
+            
+            char *jsonString = cJSON_PrintUnformatted(jdata);
+            
+            if (jsonString == NULL) {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n");
+                cJSON_Delete(jdata);
+                return;
+            }
+            
+            uint32_t data_len = strlen(jsonString);
+            cJSON_Delete(jdata);
+            
+            if (data_len == 0) {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n");
+                return;
+            }
+            int num=(ble_nus_max_data_len-18); 
+            if(num>482)num=482;
+
+            send_long_data(jsonString,num,0x06,0x0E);
+
+            cJSON_free(jsonString);
+        }
+
+
+    }
+       else
+       {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"CRC ERROR!");
+               ble_reply_cmd(cmd,0);
+    }
+    
+}
+
+void get_watch_msg(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t crcvalue)
+{
+    
+       if(Check_CRC(data,len,crcvalue))
+       {
+        cJSON *jdata=ble_get_watch_msg();
+
+        if(jdata)
+        {
+            
+            char *jsonString = cJSON_PrintUnformatted(jdata);
+            
+            if (jsonString == NULL) {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error printing JSON to string\n");
+                cJSON_Delete(jdata);
+                return;
+            }
+            
+            uint32_t data_len = strlen(jsonString);
+            cJSON_Delete(jdata);
+            
+            if (data_len == 0) {
+                WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error: JSON string length is 0\n");
+                return;
+            }
+            int num=(ble_nus_max_data_len-18); 
+            if(num>482)num=482;
+
+            send_long_data(jsonString,num,0x06,0x0F);
+
+            cJSON_free(jsonString);
+        }
+
+
+    }
+       else
+       {
+               ble_reply_cmd(cmd,0);
+    }
+    
+}
+
+
+bool read_dir_send_json()
+{
+   
+    char *send_buf=NULL;
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"read_dir_send_json xxxxxxxx\r\n");
+    memset_s(file_name,128,0,128);
+    send_buf=tar_dir_to_json_buf_malloc_(file_name,&file_size);
+     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"read_dir_send_json end\r\n");
+    if( send_buf!=NULL)
+    {
+        //send_big_data(1,send_buf,strlen(send_buf),strlen(send_buf),1,1,0x26,0x04);
+
+        ble_data_type type_={0x04,0x26,strlen(send_buf),1,1};
+        
+        send_big_data(type_,(char *)send_buf,strlen(send_buf));
+
+        free(send_buf);
+        return true;
+    }
+    else
+    {
+         return false;
+    }
+}
+
+void decode_file_checksum_2AE6(ble_read_data *buffer_handle)
+{
+    uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);
+
+    uint8_t msg_crc = get_crc_from_lrc(buffer_handle->lrcvalue);
+    if ((msg_crc == buffer_handle->crcvalue) 
+    || (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID ))
+    {
+        uint8_t file_crc = get_crc_from_lrc(buffer_handle->file_recv_stat.lrcvalue);
+        uint8_t crc_recv = buffer_handle->data[sizeof(msg_header_t)];
+#if 1
+        if ((file_crc == crc_recv) ||
+            (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID))
+#else
+        if (file_crc == crc_recv) 
+#endif
+        {
+            ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,1);
+            switch(buffer_handle->file_recv_stat.file_type)
+            {
+                case 1: //ota
+                    ble_reply_cmd(FILE_SUCC_TRANSFER,1);
+                    do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_STARTOTA,NULL,0);
+                    TRANSMIT_DATA=TRANS_OTA_SUCC;
+                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+        
+                    break;
+                case 2://mp3
+                    TRANSMIT_DATA=TRANS_MP3_SUCC;
+                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                    
+                    ble_reply_cmd(FILE_SUCC_TRANSFER,1);
+                    ble_mp3_list_update();
+
+                    break;
+                case 3://dial
+                    //TODO: 设置成当前下载的表盘
+                    if (install_dial() == ERRCODE_SUCC)
+                    {
+                        //ble_set_dial_by_id(ble_dial_uid);
+
+                        if(ble_dial_uid>5 ||  ble_dial_file_index==ble_dial_file_count)
+                        {
+                            TRANSMIT_DATA= TRANS_DIAL_SUCC;
+                            CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                        //0504
+                            ble_reply_cmd(DIAL_SUCC_INSTALL,1);
+                        }
+                        
+
+
+                      //  ble_reply_cmd(GET_TRANS_END_CMD,1);
+                        
+                    }
+                    else
+                    {
+                        TRANSMIT_DATA= TRANS_DIAL_FAIL;
+                        CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+                        ble_reply_cmd(DIAL_SUCC_INSTALL,0);
+
+                    }
+                    break;
+                case 4://dial
+                     TRANSMIT_DATA=TRANS_BIN_SUCC;
+                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                    if( ble_bin_install(app_name))
+                    ble_reply_cmd(FILE_SUCC_TRANSFER,1);
+                    else
+                    ble_reply_cmd(FILE_SUCC_TRANSFER,0);
+
+                    // ble_mp3_list_update();
+
+                    break;
+                default:
+                    break;
+            }
+        }else{
+            ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,2);
+            switch (buffer_handle->file_recv_stat.file_type)
+            {
+             case 1: //ota
+                    TRANSMIT_DATA=TRANS_OTA_FAIL;
+                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                    break;
+            case 2://mp3
+                    TRANSMIT_DATA=TRANS_MP3_FAIL;
+                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+                    break;
+            case 3://dial
+                    TRANSMIT_DATA= TRANS_DIAL_FAIL;
+                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                    break;
+
+            case 4://dial
+                    TRANSMIT_DATA= TRANS_BIN_FAIL;
+                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+        
+                    break;
+                default:
+                    break;
+            }
+
+        }
+    }else{
+        ble_reply_cmd(FILE_CHECKSUM_RECV_CMD_ZHIHUI,0);
+        switch (buffer_handle->file_recv_stat.file_type)
+        {
+            case 1: //ota
+                TRANSMIT_DATA=TRANS_OTA_FAIL;
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                break;
+        case 2://mp3
+                TRANSMIT_DATA=TRANS_MP3_FAIL;
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+                break;
+        case 3://dial
+                TRANSMIT_DATA= TRANS_DIAL_FAIL;
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                break;
+        case 4://dial
+                TRANSMIT_DATA= TRANS_BIN_FAIL;
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                break;
+            default:
+                break;
+        }
+    }
+    buffer_handle->file_recv_stat.recv_file_stat=0; 
+}
+
+void decode_file_checksum(ble_read_data *buffer_handle)
+{
+    uapi_ble_connect_param_update(BLE_CONNECT_INTERVAL_SLOW);
+
+    uint8_t msg_crc = get_crc_from_lrc(buffer_handle->lrcvalue);
+    if ((msg_crc == buffer_handle->crcvalue) 
+    || (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID ))
+    {
+        uint8_t file_crc = get_crc_from_lrc(buffer_handle->file_recv_stat.lrcvalue);
+        uint8_t crc_recv = buffer_handle->data[sizeof(msg_header_t)];
+#if 1
+        if ((file_crc == crc_recv) ||
+            (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID))
+#else
+        if (file_crc == crc_recv) 
+#endif
+        {
+            ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,1);
+            switch(buffer_handle->file_recv_stat.file_type)
+            {
+                case 1: //ota
+                    do_custom_cmd_service_check_msg(CUSTOM_CMD_MSG_TYPE_STARTOTA,NULL,0);
+                   
+                    TRANSMIT_DATA=TRANS_OTA_SUCC;
+                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                    
+
+                    break;
+                case 2://mp3
+                    TRANSMIT_DATA=TRANS_MP3_SUCC;
+                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                    
+                    ble_reply_cmd(DIAL_INSTALL_REPY_CMD,1);
+                    ble_mp3_list_update();
+
+                    break;
+                case 3://dial
+                    //TODO: 设置成当前下载的表盘
+                    if (install_dial() == ERRCODE_SUCC)
+                    {
+                        //ble_set_dial_by_id(ble_dial_uid);
+
+                        if(ble_dial_uid>5 ||  ble_dial_file_index==ble_dial_file_count)
+                        {
+                            TRANSMIT_DATA= TRANS_DIAL_SUCC;
+                            CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                        //0504
+                            ble_reply_cmd(DIAL_INSTALL_REPY_CMD,1);
+                        }
+                        
+
+
+                      //  ble_reply_cmd(GET_TRANS_END_CMD,1);
+                        
+                    }
+                    else
+                    {
+                        TRANSMIT_DATA= TRANS_DIAL_FAIL;
+                        CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+                        ble_reply_cmd(DIAL_INSTALL_REPY_CMD,0);
+
+                    }
+                    break;
+                default:
+                    break;
+            }
+        }else{
+            ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,2);
+            switch (buffer_handle->file_recv_stat.file_type)
+            {
+             case 1: //ota
+                    TRANSMIT_DATA=TRANS_OTA_FAIL;
+                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                    break;
+            case 2://mp3
+                    TRANSMIT_DATA=TRANS_MP3_FAIL;
+                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+                    break;
+            case 3://dial
+                    TRANSMIT_DATA= TRANS_DIAL_FAIL;
+                    CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+        
+                    break;
+                default:
+                    break;
+            }
+
+        }
+    }else{
+        ble_reply_cmd(FILE_CHECKSUM_RECV_CMD,0);
+        switch (buffer_handle->file_recv_stat.file_type)
+        {
+            case 1: //ota
+                TRANSMIT_DATA=TRANS_OTA_FAIL;
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                break;
+        case 2://mp3
+                TRANSMIT_DATA=TRANS_MP3_FAIL;
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+
+                break;
+        case 3://dial
+                TRANSMIT_DATA= TRANS_DIAL_FAIL;
+                CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+                break;
+            default:
+                break;
+        }
+    }
+    buffer_handle->file_recv_stat.recv_file_stat=0; 
+   
+}
+
+void type2AE0Data(ble_read_data *buffer_handle)
+{
+    uint16_t typeID = buffer_handle->cmd_header.cmdtype*256 + buffer_handle->cmd_header.cmdid;
+   
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE0Data typeID:0x%04X datalen %d\r\n",typeID,buffer_handle->totalDataLen);
+    
+    bool checkcrc = (get_crc_from_lrc(buffer_handle->lrcvalue) == buffer_handle->crcvalue);
+
+    uint32_t num;
+    if ( (checkcrc == true ) || 
+    (buffer_handle->cmd_header.direction == MSG_DIRECTION_RECV_ANDROID))
+    {
+        switch (typeID) //ID
+        {
+            case OTA_FILE_RECV_CMD://
+                {
+                    if (decode_ota_json( buffer_handle) == ERRCODE_SUCC)
+                    {
+                        ble_reply_cmd(OTA_FILE_RECV_CMD,1);
+                    }else{
+                        ble_reply_cmd(OTA_FILE_RECV_CMD,2);
+                    }               
+                }
+                break;
+            case MP3_FILE_RECV_CMD:
+                {
+                    if (decode_mp3_json( buffer_handle) == ERRCODE_SUCC)
+                    {
+                        ble_reply_cmd(MP3_FILE_RECV_CMD,1);
+                    }else{
+                        ble_reply_cmd(MP3_FILE_RECV_CMD,2);
+                    }               
+                }
+                break;
+            case DIAL_FILE_RECV_CMD:
+                {
+                    if (decode_dial_info( buffer_handle) == ERRCODE_SUCC)
+                    {
+                    
+                        //if(ble_dial_uid >=5 && 
+                        // if(get_dial_num()>=MAX_BLE_EVENT_DIAL_NUM)
+                        // {
+                        //     ble_reply_cmd(DIAL_FILE_RECV_CMD,3);
+
+                        // }
+                        //else
+                        {
+                           
+                            ble_reply_cmd(DIAL_FILE_RECV_CMD,1);
+                        }
+                        
+                    }else{
+                        ble_reply_cmd(DIAL_FILE_RECV_CMD,2);
+                    }               
+                }
+                break;
+            case FILE_CHECKSUM_RECV_CMD:
+                decode_file_checksum(buffer_handle);
+                break;
+            case SINGLE_DIAL_FILE_RECV_CMD:
+                if (decode_single_dial_info(buffer_handle) == ERRCODE_SUCC)
+                {
+                    ble_reply_cmd(SINGLE_DIAL_FILE_RECV_CMD,1);
+                } else {
+                    ble_reply_cmd(SINGLE_DIAL_FILE_RECV_CMD,2);
+                }         
+                break;
+            case EPO_DATA_RECV_CMD:
+                break;
+            case APP_INAUIRE_EXC_FILE_CMD:
+                get_tar_dir_file_count();
+
+                if(!read_dir_send_json())
+                {
+                    ble_reply_cmd(APP_INAUIRE_EXC_FILE_CMD,2);
+                }
+                break;
+                
+           case APP_START_SEND_EXC_FILE_CMD:
+                num=(ble_nus_max_data_len-18); 
+                if(num>482)num=482;
+                if(!Read_tar_file_buf_send_Data(num,0x63))
+                {
+                    ble_reply_cmd(APP_START_SEND_EXC_FILE_CMD,2);
+                }
+                break;
+            case APP_SEND_EXC_FILE_END_CMD:
+                if(!tar_rmove(file_name))
+                {
+                    ble_reply_cmd(APP_SEND_EXC_FILE_END_CMD,2);
+                }
+                if(!read_dir_send_json())
+                {
+                    ble_reply_cmd(APP_SEND_EXC_FILE_END_CMD,2);
+                }
+                break;
+                
+
+            default:
+                break;            
+        }
+        
+    }else{
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type2AE0Data CRC failed!\n");
+    }
+   
+}
+//
+void type2AE6Data(ble_read_data *buffer_handle,uint8_t *cmd_buf ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue)
+{
+    uint16_t cmd = cmd_buf[1]*256+cmd_buf[2];
+     #ifdef BLE_LOG
+    
+    #endif
+      WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"type2AE6Data:0x%04X\r\n",cmd);
+    // uint8_t typeID = cmd_buf[2];
+    switch (cmd)
+    {
+        case OTA_FILE_MSG_CMD  :
+        {
+            if (decode_ota_json( buffer_handle) == ERRCODE_SUCC)
+            {
+                ble_reply_cmd(OTA_FILE_MSG_CMD,1);
+            }else{
+                ble_reply_cmd(OTA_FILE_MSG_CMD,2);
+            }               
+        }
+        break;
+
+        case OTA_FILE_RECV_CMD://
+        {
+            if (decode_ota_json( buffer_handle) == ERRCODE_SUCC)
+            {
+                ble_reply_cmd(OTA_FILE_RECV_CMD,1);
+            }else{
+                ble_reply_cmd(OTA_FILE_RECV_CMD,2);
+            }               
+        }
+        break;
+
+
+        case DIAL_COLLECT_FILE_CMD  :
+        {
+            if (decode_dial_info( buffer_handle) == ERRCODE_SUCC)
+            {
+                ble_reply_cmd(DIAL_COLLECT_FILE_CMD,1);
+            }else{
+                ble_reply_cmd(DIAL_COLLECT_FILE_CMD,2);
+            }
+            break;             
+        }
+
+        case DIAL_SINGEL_FILE_CMD  :
+        {
+           if (decode_single_dial_info(buffer_handle) == ERRCODE_SUCC)
+            {
+                ble_reply_cmd(DIAL_SINGEL_FILE_CMD,1);
+
+           } else {
+
+                ble_reply_cmd(DIAL_SINGEL_FILE_CMD,2);
+
+            }         
+            break;      
+        }
+        case MP3_FILE_CMD  :
+        {
+            if (decode_mp3_json( buffer_handle) == ERRCODE_SUCC)
+            {
+                ble_reply_cmd(MP3_FILE_CMD,1);
+            }else{
+                ble_reply_cmd(MP3_FILE_CMD,2);
+            }              
+        }
+        break;
+        case BIN_FILE_CMD  :
+        {
+            if (decode_bin_json( buffer_handle) == ERRCODE_SUCC)
+            {
+                ble_reply_cmd(BIN_FILE_CMD,1);
+            }else{
+                ble_reply_cmd(BIN_FILE_CMD,2);
+            }              
+        }
+        break;
+
+  
+        case FILE_CHECKSUM_RECV_CMD:
+            decode_file_checksum(buffer_handle);
+            break;
+        // case OTA_FILE_DATA_CMD :
+        // {
+        //     if (decode_ota_data( buffer_handle,data,datalen, crcvalue) == ERRCODE_SUCC)
+        //     {
+
+        //     }else{
+        //         ble_reply_cmd(OTA_FILE_DATA_CMD,0);
+        //     }               
+        // }
+
+        case FILE_CHECKSUM_RECV_CMD_ZHIHUI :
+            decode_file_checksum_2AE6(buffer_handle);
+            break;
+            
+        case OTA_FILE_FAIL_CMD :
+
+            break;
+
+       case APP_DELETE_CMD  :
+            delete_app( cmd, data,datalen,crcvalue);
+            break;          
+        case GET_LIST_CMD :
+
+            get_app_list( cmd, data,datalen,crcvalue);
+
+            break;          
+        case GET_APP_MSG_CMD:
+            get_watch_msg( cmd, data,datalen,crcvalue);
+
+            break;         
+        default:
+            break;
+    }
+}
+   
+
+
+
+void dumpHeader(msg_header_t *msgheader)
+{
+    #ifdef BLE_LOG
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"dumpHeader(%d) direction %02X, type %02X, id %02X, package_count %d, total_data_len %d,package_index %d , package_len %d\n",
+    sizeof(msg_header_t),
+    msgheader->direction,  
+    msgheader->cmdtype,  
+    msgheader->cmdid,  
+    msgheader->package_count,
+    msgheader->total_data_len,  
+    msgheader->package_index,  
+    msgheader->package_len  
+    );
+    #endif
+}
+
+errcode_t check_header(msg_header_t *header )
+{
+    if( (header->direction == MSG_DIRECTION_RECV || header->direction == MSG_DIRECTION_RECV_ANDROID) 
+    && (header->cmdtype > 0 && header->cmdtype <= 6 )
+    && (header->cmdid > 0 && header->cmdid <= 0x50 )
+    )
+    {
+        // 这个是合理的值,可以当做header来处理
+        dumpHeader(header);
+        return ERRCODE_SUCC;
+    }else{
+        //非header
+        //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"not first package , no header!\n");
+        return ERRCODE_FAIL;
+    }
+}
+
+
+errcode_t cancel_recv_file(uint8_t flag)
+{
+    if(BR_TRANSFER_timer)
+    {
+        timer_flie_flag=0;
+        osTimerStop(BR_TRANSFER_timer);
+        osTimerDelete(BR_TRANSFER_timer);
+        BR_TRANSFER_timer = NULL;
+    }
+
+    if(ble_read_timer_p)
+    {
+        if(flag)
+        {
+            if(ble_read_timer_p->file_recv_stat.file_type==1)
+            {
+                TRANSMIT_DATA=TRANS_OTA_FAIL;
+            }
+            else if (ble_read_timer_p->file_recv_stat.file_type==3)
+            {
+                TRANSMIT_DATA=TRANS_DIAL_FAIL;
+            }
+            else if(ble_read_timer_p->file_recv_stat.file_type==2)
+            {
+                TRANSMIT_DATA=TRANS_MP3_FAIL;
+            }
+             else if(ble_read_timer_p->file_recv_stat.file_type==4)
+            {
+                TRANSMIT_DATA=TRANS_BIN_FAIL;
+            }
+
+            else
+            {
+                TRANSMIT_DATA=TRANS_FREE;
+            }
+            ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,0);//接收失败
+        }
+        else
+        {
+            TRANSMIT_DATA=TRANS_FREE;
+        }
+
+        ble_read_timer_p->receive_file_flag = 0;
+
+        if (ble_read_timer_p->file_recv_stat.recv_file_stat != 2) //已经下载完毕的文件,没有必要cancel了。
+        {
+            if (ble_read_timer_p->file_recv_stat.file!=NULL)
+            {
+                fclose(ble_read_timer_p->file_recv_stat.file);
+                ble_read_timer_p->file_recv_stat.file = NULL;
+            }
+
+            if (ble_read_timer_p->file_recv_stat.file_type == 2)
+            {
+                char musicpath[64]={0};
+                get_music_path(musicpath,64);
+                //"/user/userdata/music"
+                char filepath[256]={0};
+                create_mp3_name(filepath,musicpath,ble_read_timer_p->file_recv_stat.file_name);
+                remove(filepath);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);
+            }
+            else if (ble_read_timer_p->file_recv_stat.file_type == 3)
+            {
+                char filepath[128]={0};
+                if (get_file_recv_file_path(ble_read_timer_p->file_recv_stat.file_name,strlen(ble_read_timer_p->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)
+                {
+                    remove(filepath);
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);
+                }
+            }
+
+            if (ble_read_timer_p->file_recv_stat.file_name != NULL)
+            {
+                free(ble_read_timer_p->file_recv_stat.file_name);
+                ble_read_timer_p->file_recv_stat.file_name=NULL;
+            }
+            ble_read_timer_p->file_recv_stat.recv_file_stat = -1;
+            //ble_read_timer_p=NULL;
+            CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+        }
+        // else
+        // {
+        //     CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+        // }
+        ble_read_timer_p=NULL;
+       
+    }
+    
+   
+
+    return ERRCODE_SUCC;
+}
+
+uint8_t get_OTA_recv_value()
+{
+    return OTA_FILE_value;
+}
+
+void Set_OTA_recv_value()
+{
+    OTA_FILE_value=0;
+    return;
+}
+
+static errcode_t save_package_sample(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size)
+{
+
+    //保存前 4 bytes + 最后 1 byte
+    int save_len = 4;
+    uint8_t last_byte = calculate_lrc(data,event_size,0x00);
+    if (event_size < 4)
+    {
+        save_len = event_size;
+    }
+    memset(buffer_handle->last_data_sample,0,sizeof(buffer_handle->last_data_sample));
+    buffer_handle->last_data_size = event_size;
+    memcpy_s(buffer_handle->last_data_sample,sizeof(buffer_handle->last_data_sample),data,save_len);
+    buffer_handle->last_data_sample[4]=last_byte;
+
+    return ERRCODE_SUCC;
+}
+static errcode_t check_package_same(uint8_t* lastdata,uint8_t *newdata , uint16_t cmp_size)
+{
+
+
+    //对比前 4 bytes + 最后 1 byte    
+    int save_len = 4;
+    uint8_t current_sample_data[5];
+    uint8_t last_byte = calculate_lrc(newdata,cmp_size,0x00);
+    if (cmp_size < 4)
+    {
+        save_len = cmp_size;
+    }
+    memset(current_sample_data,0,sizeof(current_sample_data));    
+    memcpy_s(current_sample_data,sizeof(current_sample_data),newdata,save_len);
+    current_sample_data[4]=last_byte;
+    
+    if (memcmp(lastdata,newdata,5)==0)
+    {
+        return ERRCODE_SUCC;
+    }else{
+        return ERRCODE_FAIL;
+    }
+}
+
+errcode_t handle_recv_file(ble_read_data *buffer_handle,uint8_t *data, uint16_t event_size)
+{
+
+    if( event_size == 0 || data == NULL ) return ERRCODE_FAIL;
+    
+    if (buffer_handle->last_data_size == event_size)
+    {
+        if (check_package_same(buffer_handle->last_data_sample,data,event_size) == ERRCODE_SUCC)
+        {
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"Error handle_recv_file recve same package header 0x%02X%02X%02X%02X end 0x%02X skip \n"
+            ,buffer_handle->last_data_sample[0]
+            ,buffer_handle->last_data_sample[1]
+            ,buffer_handle->last_data_sample[2]
+            ,buffer_handle->last_data_sample[3]
+            ,buffer_handle->last_data_sample[4]);
+            // return ERRCODE_FAIL;
+        }
+    }
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file %d\n",event_size);
+    save_package_sample(buffer_handle,data,event_size);
+
+
+    //第一帧要创建文件
+    if((buffer_handle->file_recv_stat.recv_file_stat <= 0) && buffer_handle->file_recv_stat.file == NULL )
+    {
+        buffer_handle->file_recv_stat.lrcvalue = 0;
+        if (buffer_handle->file_recv_stat.file_type == 1)
+        {
+
+            buffer_handle->file_recv_stat.file = fopen(UP_DATE_FWPKG_PATH,"w+");
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",UP_DATE_FWPKG_PATH,buffer_handle->file_recv_stat.file);
+
+        }
+        else if (buffer_handle->file_recv_stat.file_type == 2)
+        {
+            char musicpath[64]={0};
+            get_music_path(musicpath,64);
+            //"/user/userdata/music"
+            char filepath[256]={0};
+            create_mp3_name(filepath,musicpath,buffer_handle->file_recv_stat.file_name);
+
+            buffer_handle->file_recv_stat.file = fopen(filepath,"w+");
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"filepath %s\r\n",filepath);
+        }
+        else
+        {
+            char filepath[128]={0};
+            if (get_file_recv_file_path(buffer_handle->file_recv_stat.file_name,strlen(buffer_handle->file_recv_stat.file_name),filepath,sizeof(filepath)) == ERRCODE_SUCC)
+            {
+                buffer_handle->file_recv_stat.file = fopen(filepath,"w+");
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s %X\n",filepath,buffer_handle->file_recv_stat.file);
+            }else{
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create file %s error %X\n",buffer_handle->file_recv_stat.file_name,buffer_handle->file_recv_stat.file);
+            }            
+        }
+        if (buffer_handle->file_recv_stat.file == NULL)
+        {
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6185 buffer_handle->file_recv_stat.file  NULL\n");
+            return ERRCODE_FAIL;
+        }
+        buffer_handle->file_recv_stat.recv_file_stat = 1;
+        OTA_FILE_value=0;
+        ////////////////创建文件传输超时定时器//////////////////
+        uint32_t tick;
+        osStatus_t retTimer;
+        if(BR_TRANSFER_timer!=NULL)
+        {
+            osTimerDelete(BR_TRANSFER_timer);
+            BR_TRANSFER_timer = NULL;
+        }
+        ble_read_timer_p=buffer_handle;
+        timer_flie_flag=10;
+
+        BR_TRANSFER_timer = osTimerNew((osTimerFunc_t)ble_transfer_Timer_CallBack, osTimerPeriodic, NULL, NULL);
+        tick =1000;// osMs2Tick(1000);
+        retTimer = osTimerStart(BR_TRANSFER_timer, tick);
+        if (retTimer != osOK && BR_TRANSFER_timer != NULL) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
+            osTimerDelete(BR_TRANSFER_timer);
+            BR_TRANSFER_timer = NULL;
+            return ERRCODE_FAIL;
+        }
+        //  if(buffer_handle->file_recv_stat.received_size==0)
+    {
+        if(buffer_handle->file_recv_stat.file_type==3)
+        TRANSMIT_DATA=TRANS_DIAL_TRANSMITTING;
+        
+        if(buffer_handle->file_recv_stat.file_type==1)
+        TRANSMIT_DATA=TRANS_OTA_TRANSMITTING;
+    
+        if(buffer_handle->file_recv_stat.file_type==2)
+        TRANSMIT_DATA=TRANS_MP3_TRANSMITTING;
+
+        CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+    }
+    
+        ///////////////////////////////////////////////////////////
+    }
+    if (buffer_handle->file_recv_stat.file == NULL)
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"6194 buffer_handle->file_recv_stat.file  \n");
+        return ERRCODE_FAIL;
+    }
+    //写入文件
+    size_t writtensize = fwrite(data,1,event_size,buffer_handle->file_recv_stat.file);
+    if(writtensize == event_size)
+    {
+        timer_flie_flag=10;
+
+        buffer_handle->file_recv_stat.lrcvalue = calculate_lrc(data,event_size,buffer_handle->file_recv_stat.lrcvalue);
+                buffer_handle->file_recv_stat.received_size += event_size;
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received_size %d\n",buffer_handle->file_recv_stat.received_size);
+        OTA_FILE_value= ((float) buffer_handle->file_recv_stat.received_size / (float)buffer_handle->file_recv_stat.file_size) *100;
+
+
+    }else{
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file write file failed! ret %d != %d\n",writtensize,event_size);
+        return ERRCODE_FAIL;
+    }
+
+    //检查文件是否写完
+    if(buffer_handle->file_recv_stat.file_size == buffer_handle->file_recv_stat.received_size)
+    {
+        if (buffer_handle->file_recv_stat.file!=NULL)
+        {
+            fclose(buffer_handle->file_recv_stat.file);
+            buffer_handle->file_recv_stat.file = NULL;
+        }
+        if (buffer_handle->file_recv_stat.file_name != NULL)
+        {
+            free(buffer_handle->file_recv_stat.file_name);
+            buffer_handle->file_recv_stat.file_name=NULL;
+        }
+        buffer_handle->file_recv_stat.recv_file_stat = 2;
+        buffer_handle->receive_file_flag = 0;
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_recv_file received success \n");
+
+        if(BR_TRANSFER_timer)
+        {
+            osTimerStop(BR_TRANSFER_timer);
+            osTimerDelete(BR_TRANSFER_timer);
+            BR_TRANSFER_timer = NULL;
+        }
+        ble_read_timer_p=NULL;
+        TRANSMIT_DATA=FILE_IS_DONE;
+
+        CustomEventPublish(TOPIC_EVENT_BLE_TRANSMIT,&TRANSMIT_DATA,1);
+       
+        ble_reply_cmd(FILE_RECV_REPLY_STAT_CMD,1);//接收成功
+    }
+
+    return ERRCODE_SUCC;
+}
+
+//长数据解析
+void bleLongRecvData(ble_read_data *buffer_handle,uint8_t *data, uint16_t data_size,uint8_t *buf_cmd,uint8_t *totalData,uint8_t crcvalue)//buf_cmd 指令前17个字节数据
+{
+    uint8_t type=buf_cmd[1];
+    #ifdef BLE_LOG
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"type:%d %d data_size:%d data:%x crcvalue:%x\r\n",
+    buffer_handle->cmd_header.cmdtype,
+    buffer_handle->cmd_header.cmdid,
+    data_size,
+    data,
+    crcvalue);
+    #endif
+
+    if(buffer_handle->handle==data2ae4Cmd)
+    {
+        type2AE4Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue);
+    }
+    else if (buffer_handle->handle==data2ae3Cmd)
+    {
+        type2AE3Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue);
+    }
+    else if (buffer_handle->handle==data2ae1Cmd)
+    {
+        type2AE1Data(buf_cmd,data,data_size,totalData,crcvalue);
+    }
+    else if (buffer_handle->handle==data2ae0Cmd)
+    {
+        type2AE0Data(buffer_handle);
+    }
+    else if (buffer_handle->handle==data2ae6Cmd)
+    {
+        type2AE6Data(buffer_handle,buf_cmd,data,data_size,totalData,crcvalue);
+    }
+}
+
+
+/// @brief 解码收到的msg
+/// @param buffer_handle 
+/// @return 
+static errcode_t handle_ble_msg(ble_read_data *buffer_handle)
+{
+
+    if(buffer_handle->buffer_to_file == 0)
+    {
+        bleLongRecvData(buffer_handle,buffer_handle->data+sizeof(msg_header_t),buffer_handle->totalDataLen,(uint8_t*)(&buffer_handle->cmd_header),buffer_handle->data,buffer_handle->crcvalue);
+
+    }else{
+        //处理缓存成文件的 
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle ble msg file buffer! not implement\n");
+    }
+    return ERRCODE_SUCC;
+}
+/*****
+ * 组包函数
+ * 组包校验完成,在分发给对应的handler去解码协议。
+ * 
+*/
+errcode_t combine_data_internal(ble_read_data *buffer_handle,uint8_t *totalData, uint16_t event_size)
+{
+
+
+    if(buffer_handle->receive_file_flag == 1 )
+    {
+        //接收文件
+        if(buffer_handle->handle==data2ae6Cmd)
+        return decode_ota_data( buffer_handle,totalData,event_size,totalData[event_size-1]);
+        else
+        return handle_recv_file(buffer_handle,totalData,event_size);
+    }
+
+    msg_header_t *header =  (msg_header_t*)totalData;        
+    //第一帧
+    if (event_size > sizeof(msg_header_t) && check_header(header) == ERRCODE_SUCC  )
+    {
+
+        if (header->direction == MSG_DIRECTION_RECV_ANDROID)
+        {
+            //uapi_dev_runtime_set_android_connection_status(1);
+        }else{
+           // uapi_dev_runtime_set_android_connection_status(0);
+        }
+        buffer_handle->cmd_header.direction = header->direction;
+        buffer_handle->cmd_header.cmdtype = header->cmdtype;
+        buffer_handle->cmd_header.cmdid = header->cmdid;
+        buffer_handle->cmd_header.package_count = header->package_count;
+        buffer_handle->cmd_header.total_data_len = header->total_data_len;
+        buffer_handle->cmd_header.package_len = header->package_len;
+        buffer_handle->cmd_header.package_index = header->package_index;
+        //如果有历史数据,没有被清空,可能是历史错误数据,则清空内存。
+        if (buffer_handle->data!=NULL && buffer_handle->data_len > 0)
+        {
+            free(buffer_handle->data);
+            buffer_handle->data = NULL;
+        }
+        if (buffer_handle->tmpfilehandle!=NULL && buffer_handle->data_len>0)
+        {
+            fclose(buffer_handle->tmpfilehandle);
+            buffer_handle->tmpfilehandle = NULL;
+        }
+        buffer_handle->data_len = 0;
+        buffer_handle->crcvalue = 0;
+        buffer_handle->lrcvalue = 0;
+        buffer_handle->buffer_to_file = 0;
+        buffer_handle->decode_type = 0;
+        buffer_handle->tmpfilehandle = NULL;
+        uint32_t timestamp_ble=0;
+        uapi_get_timestampe_ss(&timestamp_ble);
+        buffer_handle->last_timestamp = timestamp_ble;
+        buffer_handle->totalDataLen =  buffer_handle->cmd_header.total_data_len;
+        if (buffer_handle->totalDataLen > MAX_BLE_MSG_PACKAGE_LEN || buffer_handle->totalDataLen < 0 )
+        {
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"package is too lardge (%d) than (%d) or too small !\n",buffer_handle->totalDataLen,MAX_BLE_MSG_PACKAGE_LEN);
+            return ERRCODE_FAIL;
+        }
+        if(buffer_handle->totalDataLen+sizeof(msg_header_t)+1 > MAX_BLE_MSG_PACKAGE_LEN)
+        {
+            //如果总长度超过限定大小,则写入文件做缓存。
+            buffer_handle->buffer_to_file = 1;
+            int filelen = strlen(BLE_MSG_TMP_FILE_NAME);
+            buffer_handle->data = malloc(filelen);
+            if (buffer_handle->data== NULL) 
+            {
+                return ERRCODE_MALLOC;
+            }
+            //生成临时文件名
+            sprintf_s((char*)buffer_handle->data,filelen,BLE_MSG_TMP_FILE_NAME,buffer_handle->handle);
+            buffer_handle->tmpfilehandle = fopen((const char*)buffer_handle->data,"w+");
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"create ble protocol tmpfile %s handle %X\n",buffer_handle->data,buffer_handle->tmpfilehandle);
+            if (buffer_handle->tmpfilehandle != NULL)
+            {
+                //写buffer到文件
+                size_t ret =fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle);
+                buffer_handle->lrcvalue = calculate_lrc(totalData+sizeof(msg_header_t),header->package_len,0x00);
+                  WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"write %d to buffer file!\n",ret);
+            }
+            buffer_handle->data_len += event_size;
+           
+        }else{
+            //如果长度在限定大小之内。则写入内存中缓存。
+            buffer_handle->buffer_to_file = 0;
+            buffer_handle->data = malloc(buffer_handle->totalDataLen+sizeof(msg_header_t)+1);
+            if (buffer_handle->data== NULL) 
+            {
+                return ERRCODE_MALLOC;
+            }
+            //创建缓存开始存储包数据
+            if(buffer_handle->cmd_header.package_len >=0)
+            {
+                memcpy_s(buffer_handle->data,buffer_handle->totalDataLen+sizeof(msg_header_t)+1,totalData,event_size);
+                buffer_handle->lrcvalue = calculate_lrc(totalData+sizeof(msg_header_t),header->package_len,0x00);
+                buffer_handle->data_len += event_size;
+            }
+
+            //单一包
+            if(event_size == sizeof(msg_header_t)+buffer_handle->totalDataLen+1)
+            {
+                buffer_handle->crcvalue = totalData[event_size-1];
+            }
+        }  
+        
+    }else{
+        //处理第二包以后的数据
+
+        //经过第一包处理,仍然data==NULL证明第一帧就是错的,要退出解析。
+        if (buffer_handle->data== NULL) 
+        {
+            return ERRCODE_MALLOC;
+        }
+        //此处是最后一帧 event_size = (buffer_handle->totalDataLen-buffer_handle->data_len) + 1
+        if (event_size == (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 -buffer_handle->data_len ))
+        {
+            if(buffer_handle->buffer_to_file == 1)
+            {
+                fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle);
+            
+            }else{
+                memcpy_s(buffer_handle->data+buffer_handle->data_len,buffer_handle->totalDataLen,totalData,event_size);
+                    
+            }
+            buffer_handle->lrcvalue = calculate_lrc(totalData,event_size,buffer_handle->lrcvalue);
+            buffer_handle->data_len += event_size;                
+        }else if (event_size < (buffer_handle->totalDataLen + sizeof(msg_header_t) + 1 - buffer_handle->data_len))  //中间帧
+        {
+            if(buffer_handle->buffer_to_file == 1)
+            {
+                fwrite(totalData,1,event_size,buffer_handle->tmpfilehandle);
+            
+            }else{
+                memcpy_s(buffer_handle->data+buffer_handle->data_len,(buffer_handle->totalDataLen  + sizeof(msg_header_t) + 1 - buffer_handle->data_len),totalData,event_size);
+                    
+            }
+            buffer_handle->lrcvalue = calculate_lrc(totalData,event_size,buffer_handle->lrcvalue);
+            buffer_handle->data_len += event_size;                            
+        }else{ //异常帧
+              WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"error event_size %d , should <= %d\n",event_size, (buffer_handle->totalDataLen  + sizeof(msg_header_t) + 1 - buffer_handle->data_len) );
+            
+        }
+        
+    }
+    //如果包完整接收,进行crc校验
+    if( (buffer_handle->totalDataLen  + sizeof(msg_header_t) + 1 ) == buffer_handle->data_len )
+    {
+        //我们认为最后一个包,应该不包含其他包,因此其最后一位,应当就是crc值,因此可直接获取crc值
+        buffer_handle->crcvalue = buffer_handle->data[buffer_handle->data_len - 1];//获取crc
+        //最后一位校验位清0,方便字符串处理
+        buffer_handle->data[buffer_handle->data_len - 1] = 0;
+
+        //缓存到文件的,处理方法会不同因此单独解决
+        if(buffer_handle->buffer_to_file == 1)
+        {
+            //先关闭临时文件,然后把文件名给协议解析函数即可。
+            if (buffer_handle->tmpfilehandle != NULL)
+            {
+                fclose(buffer_handle->tmpfilehandle);
+                buffer_handle->tmpfilehandle=NULL;
+            }
+        }
+        // #define COMMON_CRC_MSG 
+        //通用回复crc校验结果,不是所有指令都一致,暂时取消,在每个指令内部进行回复
+        #ifdef COMMON_CRC_MSG 
+        if (get_crc_from_lrc(buffer_handle->lrcvalue) != buffer_handle->crcvalue)
+        {
+            //发送校验失败
+            ble_reply_msg(buffer_handle->cmd_header.cmdtype,buffer_handle->cmd_header.cmdid,0);
+
+        }else        
+        #endif 
+        {
+            //协议解析指令
+            handle_ble_msg(buffer_handle);
+        }
+        //所有操作都完成,要释放 data 
+        if(buffer_handle->data != NULL)
+        {
+            free(buffer_handle->data);
+            buffer_handle->data=NULL;
+        }
+        
+    }
+    return ERRCODE_SUCC;
+}
+
+
+
+void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)
+{
+
+    if (event_size < sizeof(msg_header_t))
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"event size (%d) is less than msg_header_t (%d) ",event_size,sizeof(msg_header_t));
+       // return ;
+    }
+    #ifdef BLE_LOG
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"bleDataRecv handle:%d\r\n",handle); 
+    #endif
+    int last_unused_handle_index = -1;
+    int handle_index_found = -1;
+    for(int i = 0;i<MAX_HANDLE_NUM;i++)
+    {   
+        if(handle_l[i].handle == 0 && last_unused_handle_index == -1)
+        {
+            last_unused_handle_index = i;            
+        }
+        if(handle_l[i].handle == handle)
+        {
+            //找到当前handle的缓存数据 ,进行组包
+            handle_index_found = i;
+            break;
+        }
+    }
+    //如果没找到已经用到的handle_l,就用第一个空的handle_l
+    if(last_unused_handle_index >=0 && handle_index_found == -1)
+    {
+        handle_index_found = last_unused_handle_index;            
+    }
+
+    if(handle_index_found>=0)
+    {
+       //   WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle_index_found:index %d addr %X\r\n",handle_index_found,&handle_l[handle_index_found]); 
+        handle_l[handle_index_found].handle = handle;
+        combine_data_internal(&handle_l[handle_index_found],totalData,event_size);
+    }
+    else
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"no empty handle_l found! skip this msg!\n");
+
+    
+}
+
+void free_ble_data(void)//以防断开蓝牙没有释放数据类型
+{
+    blesrv_service_recv_msg_handler(0xff,(uint8_t*)"clean",6);
+    return;
+    
+}
+
+
+void cancel_AI_cur_chat(void)
+{
+    blesrv_service_recv_msg_handler(0xff,(uint8_t*)"AI_cancel_AI",13);
+    return;
+    //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5);
+}
+
+void free_ble_data_Event(void)//以防断开蓝牙没有释放数据类型
+{
+   
+    totalpack = 0;
+    muiltFlag = 0; 
+    packdataLen = 0;
+    totalDataLen = 0;
+    ANCSBigBufFlag = 0;
+
+    recvBigDataBufState = false;
+    sendbigDataBufState = false;
+
+    is_connect_synchronization_time=0;
+
+
+    cancel_recv_file(1);
+
+    for (int i = 0 ; i < MAX_HANDLE_NUM ; i++)
+    {
+        if (handle_l[i].data != NULL)
+        {
+            free(handle_l[i].data);
+            handle_l[i].data=NULL;
+        }
+        memset((void*)&handle_l[i],0,sizeof(ble_read_data));
+    }
+    return;
+    
+}
+
+//发送AI录音准备就绪国内/
+/*使用模型:
+0:文心一言
+1:ChatGPT
+2:KIMI
+3:豆包*/
+bool send_AI_is_ready_(uint8_t type)
+{
+    
+    if(AI_is_end_state==0)
+    {  
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪\r\n");
+        ble_data_type type_={0x05,0x05,1,1,1};
+        send_big_data(type_,(char *)&type,1);
+        AI_is_end_state=1;
+        return true;
+    }
+    else
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪失败,没有正确回复结束\r\n");
+        return false;
+    }
+    //send_big_data(0, (char *)&type, 1, 1, 1, 1, 0x05, 5);
+}
+
+static uint8_t AI_is_ready_type=0;
+
+bool send_AI_is_ready(uint8_t type)
+{
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"发送AI准备就绪\r\n");
+    AI_is_ready_type=type;
+    blesrv_service_recv_msg_handler(0xff,(uint8_t*)"AI_is_ready",12);
+    return true;
+}
+
+void cancel_AI_cur_chat_(void)
+{
+    //if(AI_is_end_state)
+    {
+          WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"取消当前AI对话\r\n");
+        uint8_t data=1;
+        ble_data_type type_={0x05,0x07,1,1,1};
+        send_big_data(type_,(char *)&data,1);
+        AI_is_end_state=0;
+        
+    }
+    //else
+    // {
+    //       WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"已经取消当前AI对话无需再次取消\r\n");
+    // }
+    
+
+    //send_big_data(0, (char *)&data, 1, 1, 1, 1, 0x07, 5);
+}
+
+//接收app下发的原始数据 
+void revBleOldData(uint8_t *buf, uint16_t event_size,uint16_t handle)//每包的数据大小
+{
+      WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"handle :%d %s event_size %d\r\n",handle,getHandlname(handle),event_size);
+    if(handle==0xff)
+    {
+        if(strcmp("AI_cancel_AI",(char *)buf)==0)
+        {
+            cancel_AI_cur_chat_();
+        }
+        else if(strcmp("AI_is_ready",(char *)buf)==0)
+        {
+           send_AI_is_ready_(AI_is_ready_type);
+        }
+        else
+        {
+            free_ble_data_Event();
+        }
+       
+        return;
+    }
+
+    bleDataRecv(buf,event_size,handle);
+}
+#endif
+#endif
+#ifdef __cplusplus
+}
 #endif
\ No newline at end of file