优化bleService Ai_msg_queue接收,修复内存泄漏
author孙春阳 <snickersun@163.com>
Wed, 6 Aug 2025 11:58:44 +0000 (19:58 +0800)
committer孙春阳 <snickersun@163.com>
Wed, 6 Aug 2025 11:58:44 +0000 (19:58 +0800)
code/sdk/application/wearable/service/ble_service/bleservice/bleService.c

index 2ac1d6a..4bc19d0 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
-\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
-\r
-#include "bts_le_gap.h"\r
-#include "bts_br_gap.h"\r
-#include "battery_hal.h"\r
-#include "bleService.h"\r
-#include "alipay_feature.h"\r
-#include "alipay_bluetooth.h"\r
-#include "bts_a2dp_sink.h"\r
-#include "osal_timer.h"\r
-#include "bleEvent.h"\r
-#include "hidService.h"\r
-#include "factorytestService.h"\r
-#include "ppgBleService.h"\r
-#include "build_version.h"\r
-#include "custom_runtime.h"\r
-#include "custom_utils.h"\r
-#include "bletest.h"\r
-#include "ConfigModelC.h"\r
-#ifdef SUPPORT_AT_CYWEE\r
-#include "cywee_ble_Service.h"\r
-#endif\r
-#ifdef SUPPORT_AT_OHOSFWK\r
-#include "BluetoothWrapper.h"\r
-#endif\r
-#include "custom_save_runtime.h"\r
-#include "aivoice/include/AiVoiceModelC.h"\r
-#include "voice_call_volte_sample_wrapper.h"\r
-#include "cat1_ws.h"\r
-\r
-// extern void bts_data_to_uuid_len2(uint16_t uuid_data, bt_uuid_t *out_uuid);\r
-// extern void bts_init_128bit_uuid(const bt_uuid_t *uuid);\r
-// #include "ble_hid_take_photo_server.h"\r
-/* Gatt service UUID */\r
-#define BLE_SERVICE_UUID 0x18e0\r
-/* Gatt Characteristic UUID */\r
-//自定义 ota 文件传输特征值\r
-#define BLE_ZHIHUI_OTA_ID 0x2ae6\r
-#define BLE_ZHIHUI_OTA_REPLY_ID 0x2ae7\r
-\r
-#define BLE_ZHIHUI_AI_ID 0x2ae8\r
-\r
-#define BLE_CHARACTERISTIC_RECV_ID 0x2ae5\r
-#define BLE_CHARACTERISTIC_SNED_SHORT_ID 0x2ae3\r
-\r
-#define BLE_CHARACTERISTIC_SNED_LONG_ID 0x2ae4\r
-#define BLE_CHARACTERISTIC_SNED_OTA_ID 0x2ae0\r
-#define BLE_CHARACTERISTIC_SNED_ANDRIOD_ID 0x2ae1\r
-#define BLE_CHARACTERISTIC_READ_BATTERY_ID 0x2ae2\r
-/* Client Characteristic Configuration UUID */\r
-#define BLE_UUID_CLIENT_CHARACTERISTIC_CONF 0x2902\r
-/*user Characteristic Configuration UUID*/\r
-#define BLE_UUID_USER_CHARACTERISTIC_CONF 0x2901\r
-/* Gatt Characteristic max length */\r
-#define BLE_CHARACTERISTIC_MAX_LENGTH 256\r
-#define BLE_ADV_ID 1\r
-#define BLE_ADV_DATA_MAX_LENGTH 31\r
-#define BLE_ADV_BLE_NAME_MAX_LENGTH 31 // 31-4-2-3-9 = 13\r
-#define BLE_NAME_LENGTH 32\r
-#define BLE_ADV_MAC_HEAD_LENTH 4\r
-#define BLE_ADV_MAC_LENTH 10\r
-#define BLE_SCAN_DATA_LENTH 31 //扫描数据\r
-#define BLE_ADV_TYPE_LENTH 3\r
-#define BLE_ADV_UUID_LENTH 4\r
-\r
-#define BLE_DEFAULT_NAME_LEN 32\r
-#define BLE_MAC_MAX_LEN 6 //蓝牙mac地址最大个数6个\r
-\r
-\r
-\r
-#define SWAP_U16(x) ((uint16_t)((((uint16_t)(x) & (uint16_t)0x00ffU) << 8) | \\r
-                    (((uint16_t)(x) & (uint16_t)0xff00U) >> 8)))\r
-\r
-static uint8_t exit_alipay_gui = 0;\r
-//  蓝牙模块全局变量\r
-static gap_ble_callbacks_t g_ble_gapble_cbs;\r
-static gatts_callbacks_t g_ble_gatts_cbs;\r
-static gap_call_backs_t g_btGapCallBacks;\r
-\r
-\r
-static bool g_ble_adv_start_state = false;\r
-uint16_t g_ble_server_id = 1;\r
-\r
-static uint16_t g_ble_read_handle = 0;\r
-uint16_t g_ble_conn_id = 0;\r
-uint16_t g_ble_Alipay_conn_id = 0;\r
-uint16_t g_ble_server_handle = 0;\r
-static uint8_t g_ble_character_buf[BLE_CHARACTERISTIC_MAX_LENGTH] = {0};\r
-static const uint8_t ble_adv_type[BLE_ADV_TYPE_LENTH] = {2, 1, 0xA};\r
-static const uint8_t ble_adv_uuid[BLE_ADV_UUID_LENTH] = {0x3, 0x3, 0xe0, 0x18};\r
-static const uint8_t ble_adv_tx[4] = {0x03,0x03,0xe0,0x18};\r
-static bool AdverFlag = false;\r
-\r
-static uint8_t scan_data[BLE_SCAN_DATA_LENTH] = {0};\r
-\r
-uint8_t phone_mac_data[6]={0};\r
-\r
-#define ble_add_max_num 10\r
-static bd_addr_t phone_addr[ble_add_max_num]={0};\r
-static uint16_t ble_conn_id[ble_add_max_num]={0};\r
-\r
-\r
-bd_addr_t disconect_addr;//断开连接地址不需要反序\r
-\r
-uint8_t Bleconnect = 0;//蓝牙默认是断开 0 1 为连接\r
-uint8_t devpair_state = 0;//设备配对状态 0 未配对 1已配对成功\r
-uint8_t bond_flag = 0;//绑定标识\r
-uint16_t ble_nus_max_data_len = SDK_BLE_MTU_MIN - 3; \r
-\r
-uint16_t data2ae3Cmd = 0;//2ae3短指令特征值\r
-uint16_t data2ae4Cmd = 0;\r
-uint16_t data2ae5Cmd = 0;\r
-uint16_t data2ae2Cmd = 0;//read\r
-uint16_t data2ae1Cmd = 0;//安卓消息来电\r
-uint16_t data2ae0Cmd = 0;//OTA\r
-uint16_t data2ae6Cmd = 0;//自定义OTA \r
-uint16_t data2ae7Cmd = 0;//自定义OTA \r
-uint16_t data2ae8Cmd = 0;//AI\r
-\r
-#define handle_max_len 40\r
-\r
-static uint16_t Is_value_handle[handle_max_len]={0};\r
-\r
-static uint32_t handle_num=0;\r
-\r
-\r
-void get_phone_addr(bd_addr_t *addr,uint16_t conn_id)\r
-{\r
-    if (addr==NULL)\r
-    return;\r
-\r
-    for(int i=0;i<ble_add_max_num;i++)\r
-    {\r
-        if(conn_id==ble_conn_id[i])\r
-        {\r
-            memcpy(addr,&phone_addr[i],sizeof(bd_addr_t));\r
-        }\r
-    }\r
-    \r
-}\r
-static uint16_t add_num=0;\r
-\r
-static void set_phone_info(bd_addr_t *addr,uint16_t conn_id)//保存手机信息 包含手机mac地址\r
-{\r
-    memcpy(&phone_addr[add_num],addr,sizeof(bd_addr_t));\r
-    ble_conn_id[add_num]=conn_id;\r
-\r
-    add_num++;\r
-    if(add_num==ble_add_max_num)\r
-    {\r
-        add_num=0;\r
-    }\r
-}\r
-\r
-\r
-static void clean_phone_info(uint16_t conn_id)//保存手机信息 包含手机mac地址\r
-{\r
-   for(int i=0;i<ble_add_max_num;i++)\r
-   {\r
-        if(conn_id==ble_conn_id[i])\r
-        {\r
-            bd_addr_t addr={0};\r
-            memcpy(&phone_addr[i],&addr,sizeof(bd_addr_t));\r
-            ble_conn_id[i]=0;\r
-            return;\r
-        }\r
-   }\r
-}\r
-\r
-\r
-bool get_ble_connect(void)//保存手机信息 包含手机mac地址\r
-{\r
-   for(int i=0;i<ble_add_max_num;i++)\r
-   {\r
-        if(ble_conn_id[i]!=0)\r
-        {\r
-            return true;\r
-        }\r
-   }\r
-   return false;\r
-}\r
-\r
-bool get_Alipay_ble_connect(void)//保存手机信息 包含手机mac地址\r
-{\r
-    uint8_t connect=0;\r
-   for(int i=0;i<ble_add_max_num;i++)\r
-   {\r
-        if(ble_conn_id[i]!=0)\r
-        {\r
-            if(g_ble_Alipay_conn_id==ble_conn_id[i])\r
-            return true;\r
-        }\r
-   }\r
-\r
-   {\r
-        return false;\r
-   }\r
-\r
-}\r
-\r
-enum{\r
-    BLE_CHARACTERISTIC_RECV_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_NOTIFY|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP|GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_READ,\r
-    BLE_CHARACTERISTIC_SNED_SHORT_ID_PROPERTIES =  GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,\r
-    BLE_CHARACTERISTIC_SNED_LONG_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,\r
-    BLE_CHARACTERISTIC_SNED_OTA_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,\r
-    BLE_CHARACTERISTIC_SNED_ANDRIOD_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,\r
-    BLE_CHARACTERISTIC_READ_BATTERY_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_READ|GATT_CHARACTER_PROPERTY_BIT_NOTIFY,\r
-    BLE_ZHIHUI_OTA_ID_ID_PROPERTIES=GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,\r
-    BLE_ZHIHUI_AI_ID_ID_PROPERTIES=GATT_CHARACTER_PROPERTY_BIT_NOTIFY|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP|GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_READ,\r
-    BLE_ZHIHUI_OTA_REPLY_ID_PROPERTIES=GATT_CHARACTER_PROPERTY_BIT_NOTIFY|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP|GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_READ,\r
-};\r
-static uint8_t ble_adv_falg = 0;\r
-static bool g_custom_ble_init_flag = false;\r
-\r
-errcode_t svr_ble_adv_stop(void)\r
-{\r
-    ble_adv_falg = 0;\r
-    return gap_ble_stop_adv(BLE_ADV_ID);\r
-}\r
-void svr_ble_adv_start(void)\r
-{\r
-    ble_adv_falg = 1;\r
-    if(AdverFlag==true)\r
-    gap_ble_start_adv(BLE_ADV_ID);\r
-}\r
-\r
-\r
-void br_adv_start(uint8_t sec)\r
-{\r
-    //ble广播开启\r
-    svr_ble_adv_start_param();\r
-\r
-    if(!get_br_is_pair())\r
-    { \r
-\r
-    }\r
-}\r
-\r
-void br_adv_stop(void)\r
-{\r
-    gap_br_set_bt_scan_mode(GAP_SCAN_MODE_NONE, 0);\r
-}\r
-//留档保存,方便后面查看此数据是否正确\r
-static uint8_t save_adv_data[BLE_ADV_DATA_MAX_LENGTH] = {0};\r
-\r
-void get_adv_data(char *data)\r
-{\r
-    uint32_t data_len=0;\r
-    for(int i=0;i<BLE_ADV_DATA_MAX_LENGTH;i++)\r
-    {\r
-        char UintBUF[3]={0};\r
-        sprintf(UintBUF,"%02X",save_adv_data[i]);\r
-        memcpy_s(data+data_len,2,UintBUF,2);\r
-        data_len+=2;\r
-    }\r
-\r
-}\r
-\r
-/* adapt ios adv data. *///设置广播和扫描数据\r
-static void svr_ble_adv_data_set(int adv_id)\r
-{\r
-    uint8_t ble_name[BLE_NAME_LENGTH] = {0};\r
-    uint8_t ble_name_len = BLE_NAME_LENGTH;\r
-    uint8_t adv_data[BLE_ADV_DATA_MAX_LENGTH] = {0};\r
-    uint8_t adv_data_len = 0;\r
-    uint8_t scan_data_len = 0;\r
-    uint8_t ble_data_name[BLE_ADV_BLE_NAME_MAX_LENGTH + 1 ] = {0}; // +TYPE LENGTH\r
-    uint8_t ble_data_mac_switch[BD_ADDR_LEN] = {0};\r
-    uint8_t adv_mac_head[BLE_ADV_MAC_LENTH] = {0x9, 0x16, 0x02, 0x38};\r
-    gap_ble_config_adv_data_t adv_data_info;\r
-    memset_s(&adv_data_info, sizeof(gap_ble_config_adv_data_t), 0, sizeof(gap_ble_config_adv_data_t));\r
-    unsigned char addr[BLE_MAC_MAX_LEN] = {0};\r
-    unsigned int len = BLE_MAC_MAX_LEN;\r
-    errcode_t ret = 0;\r
-\r
-    memset(addr,0,6);    \r
-    bluetooth_get_local_addr(&addr[0],len);\r
-    ret = bluetooth_get_local_name(ble_name, &ble_name_len);\r
-    if (ret != 0) {\r
-        memset_s(ble_name, BLE_NAME_LENGTH, 0, BLE_NAME_LENGTH);\r
-        (void)sprintf_s((char*)ble_name, BLE_NAME_LENGTH, "%s %02X%02X",BLE_DEFAULT_NAME,addr[1],addr[0]);\r
-        ble_name_len = strlen((char*)ble_name) + 1;        \r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gap_ble_get_local_name fail,rename name:%s,len:%u,ret:%u.", ble_name, ble_name_len, ret);\r
-    }\r
-    int k = BD_ADDR_LEN;\r
-    for (int i = 0; i < BD_ADDR_LEN; i++) {\r
-        ble_data_mac_switch[--k] = addr[i];\r
-    }\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gap_ble_get_local_name name:%s,len:%u,ret:%u.", ble_name, ble_name_len, ret);\r
-    memcpy_s(adv_data, sizeof(ble_adv_type), ble_adv_type, sizeof(ble_adv_type));//0x02 0x01 0x02\r
-    adv_data_len = sizeof(ble_adv_type);\r
-    // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"adv_data_len!!!!:%d\r\n",adv_data_len);\r
-\r
-    adv_data[adv_data_len++] = 0x0f;//长度 \r
-    adv_data[adv_data_len++] = 0xff;//数据类型 manufactory data\r
-#if defined(BOARD_W9) \r
-    adv_data[adv_data_len++] = 'W';\r
-    adv_data[adv_data_len++] = '9';\r
-// #elif defined(BOARD_N9)\r
-//     adv_data[adv_data_len++] = 'N';\r
-//     adv_data[adv_data_len++] = '9';\r
-#else \r
-    adv_data[adv_data_len++] = 'J';\r
-    adv_data[adv_data_len++] = 'H';\r
-#endif\r
-    adv_data[adv_data_len++] = bond_flag;//是否绑定\r
-    adv_data[adv_data_len++] = ble_data_mac_switch[5];\r
-    adv_data[adv_data_len++] = ble_data_mac_switch[4];\r
-    adv_data[adv_data_len++] = ble_data_mac_switch[3];\r
-    adv_data[adv_data_len++] = ble_data_mac_switch[2];\r
-    adv_data[adv_data_len++] = ble_data_mac_switch[1];\r
-    adv_data[adv_data_len++] = ble_data_mac_switch[0];\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "adv_data_info.adv_length.adv_data_len:%d\r\n",adv_data_len);\r
-#if defined(BOARD_W9) \r
-    adv_data[adv_data_len++] = 0x06; //w9 app\r
-    adv_data[adv_data_len++] = 0x06;\r
-// #elif defined(BOARD_N9) \r
-//     adv_data[adv_data_len++] = 0x07; //n9 app\r
-//     adv_data[adv_data_len++] = 0x07;\r
-#else\r
-    adv_data[adv_data_len++] = 0x05;\r
-    adv_data[adv_data_len++] = 0x05;\r
-#endif\r
-\r
-    uint8_t _major,_mid,_minor;\r
-    uapi_get_fw_version(&_major,&_mid,&_minor);\r
-    adv_data[adv_data_len++] = _major;\r
-    adv_data[adv_data_len++] = _mid;\r
-    adv_data[adv_data_len++] = _minor;\r
-    \r
-    if(adv_data_len > BLE_ADV_DATA_MAX_LENGTH)\r
-    {\r
-        adv_data_len = BLE_ADV_DATA_MAX_LENGTH;\r
-    }\r
-\r
-    //scan_data \r
-    if (ble_name_len > BLE_ADV_BLE_NAME_MAX_LENGTH) {\r
-        ble_name_len = BLE_ADV_BLE_NAME_MAX_LENGTH;\r
-    }\r
-    ble_data_name[0] = ble_name_len;\r
-    ble_data_name[1] = 0x9;\r
-    memcpy_s(&ble_data_name[2], ble_name_len - 1, ble_name, ble_name_len - 1);\r
-\r
-    memcpy_s(scan_data + scan_data_len, ble_name_len + 1, ble_data_name, ble_name_len + 1);\r
-\r
-    scan_data_len = scan_data_len + ble_name_len + 1;\r
-    // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"scan_data_len!!!22:%d ble_name_len:%d\r\n",scan_data_len,ble_name_len);\r
-    memcpy_s(scan_data + scan_data_len, sizeof(ble_adv_uuid), ble_adv_uuid, sizeof(ble_adv_uuid));//这是tx power\r
-    scan_data_len = scan_data_len + sizeof(ble_adv_uuid);\r
-    // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"scan_data_len!!!!3333:%d\r\n",scan_data_len);\r
-   \r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble_info:%02x:%02x:%02x:%02x:%02x:%02x", ble_data_mac_switch[0], ble_data_mac_switch[1],\r
-        ble_data_mac_switch[2], ble_data_mac_switch[3], ble_data_mac_switch[4], ble_data_mac_switch[5]);    \r
-   \r
-    memcpy_s(adv_mac_head + BLE_ADV_MAC_HEAD_LENTH, BD_ADDR_LEN, ble_data_mac_switch, BD_ADDR_LEN);\r
-\r
-    memcpy_s(scan_data + scan_data_len, sizeof(adv_mac_head), adv_mac_head, sizeof(adv_mac_head));\r
-    scan_data_len = scan_data_len + sizeof(adv_mac_head);\r
-    // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"adv_data_len!!!!4444:%d\r\n",scan_data_len);\r
-   \r
-\r
-    if (scan_data_len > BLE_SCAN_DATA_LENTH){\r
-        scan_data_len = BLE_SCAN_DATA_LENTH;\r
-    }\r
-    //\r
-    memcpy_s(save_adv_data,BLE_ADV_DATA_MAX_LENGTH,adv_data,BLE_ADV_DATA_MAX_LENGTH);\r
-    \r
-    adv_data_info.scan_rsp_data = scan_data;//扫描数据\r
-    adv_data_info.scan_rsp_length = scan_data_len;//扫描长度\r
-    adv_data_info.adv_data = adv_data;//广播数据 \r
-    adv_data_info.adv_length = adv_data_len;//广播长度\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "adv_data_info.adv_length:%u. scan_data_len:%d\r\n", adv_data_len,scan_data_len);\r
-\r
-    gap_ble_set_adv_data(adv_id, &adv_data_info);\r
-\r
-    return;\r
-}\r
-\r
-\r
-void svr_ble_adv_factory_test_start_param(void)\r
-{\r
-    errcode_t ret = 0;\r
-    int adv_id = BLE_ADV_ID;\r
-    if (ble_adv_falg == 1) { //已经开始广播了,不需要重复开启广播\r
-        ret=gap_ble_stop_adv(adv_id);\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble adv need restart , gap_ble_stop_adv ret %x\n",ret);\r
-        osDelay(50);\r
-    }\r
-\r
-    gap_ble_adv_params_t adv_para;\r
-    memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));\r
-\r
-    adv_para.min_interval = 0x64;//0x640;\r
-    adv_para.max_interval = 0x64;\r
-    adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;\r
-    //adv_para.tx_power=20;\r
-    adv_para.channel_map = 0x07;\r
-    adv_para.duration = 0;\r
-\r
-    gap_ble_set_adv_param(adv_id, &adv_para);//设置广播参数\r
-    gap_ble_set_local_appearance(GAP_BLE_APPEARANCE_TYPE_GENERIC_WATCH);//仅是手表\r
-    svr_ble_adv_data_set(adv_id);//开始广播和扫描数据\r
-    ble_adv_falg = 1;\r
-    ret = gap_ble_start_adv(adv_id);\r
-    if (ret) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_adv_start bt gap_ble_start_adv1  ret = 0x%x", ret);\r
-    }\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_adv_start bt gap_ble_start_adv2  ret = 0x%x", ret);\r
-}\r
-\r
-\r
-static int8_t ble_adv_init_falg=100;\r
-\r
-static osTimerId_t ble_adv_timer=NULL;\r
-\r
-static uint32_t last_package_id=0;\r
-\r
-static void  ble_adv_Timer_CallBack(int data)\r
-{\r
-    ble_adv_init_falg--;\r
-\r
-    if(ble_adv_init_falg<=0)\r
-    {\r
-        int adv_id = BLE_ADV_ID;\r
-\r
-        errcode_t ret = 0;\r
-        if(get_ble_adv_status())\r
-        {\r
-            ret=gap_ble_stop_adv(adv_id);\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble adv need restart , gap_ble_stop_adv ret %x\n",ret);\r
-            osDelay(50);\r
-\r
-            if(!uapi_dev_runtime_get_factory_test_status_flag())\r
-            {\r
-                gap_ble_adv_params_t adv_para;\r
-                memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));\r
-                adv_para.min_interval = 0x640;\r
-                adv_para.max_interval = 0x640;\r
-                adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;\r
-                adv_para.channel_map = 0x7;\r
-                adv_para.duration = 0;\r
-\r
-                ret=gap_ble_set_adv_param(adv_id, &adv_para);//设置广播参数\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble adv need restart , gap_ble_set_adv_param ret %x\n",ret);\r
-\r
-            }\r
-            if(get_ble_connect()==false)\r
-            {\r
-                ret=gap_ble_start_adv(adv_id);\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble adv need restart , gap_ble_start_adv ret %x\n",ret);\r
-            }\r
-          \r
-\r
-        }\r
-        else\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "no sdv\n");\r
-            if(!uapi_dev_runtime_get_factory_test_status_flag())\r
-            {\r
-\r
-                gap_ble_adv_params_t adv_para;\r
-                memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));\r
-                adv_para.min_interval = 0x640;\r
-                adv_para.max_interval = 0x640;\r
-                adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;\r
-                adv_para.channel_map = 0x7;\r
-                adv_para.duration = 0;\r
-                ret=gap_ble_set_adv_param(adv_id, &adv_para);//设置广播参数\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble adv need restart , gap_ble_set_adv_param ret %x\n",ret);\r
-\r
-            }\r
-           \r
-\r
-           \r
-        }\r
-\r
-\r
-        osTimerStop(ble_adv_timer);\r
-        osTimerDelete(ble_adv_timer);\r
-        ble_adv_timer = NULL;\r
-        \r
-    }\r
-}\r
-\r
-\r
-\r
-void svr_ble_adv_start_param(void)\r
-{\r
-    errcode_t ret = 0;\r
-    int adv_id = BLE_ADV_ID;\r
-    if (ble_adv_falg == 1) { //已经开始广播了,不需要重复开启广播\r
-        ret=gap_ble_stop_adv(adv_id);\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble adv need restart , gap_ble_stop_adv ret %x\n",ret);\r
-        osDelay(50);\r
-    }\r
-\r
-    if(ble_adv_init_falg)\r
-    {\r
-        gap_ble_adv_params_t adv_para;\r
-        memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));\r
-        adv_para.min_interval = 0x64;\r
-        adv_para.max_interval = 0x64;\r
-        adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;\r
-        adv_para.channel_map = 0x7;\r
-        adv_para.duration = 0;\r
-        gap_ble_set_adv_param(adv_id, &adv_para);//设置广播参数\r
-\r
-        uint32_t tick;\r
-        osStatus_t retTimer;\r
-        if(ble_adv_timer!=NULL)\r
-        {\r
-            osTimerStop(ble_adv_timer);\r
-            osTimerDelete(ble_adv_timer);\r
-            ble_adv_timer = NULL;\r
-        }\r
-\r
-        ble_adv_timer = osTimerNew((osTimerFunc_t)ble_adv_Timer_CallBack, osTimerPeriodic, NULL, NULL);\r
-        tick =osMs2Tick(1000);\r
-        retTimer = osTimerStart(ble_adv_timer, tick);\r
-        if (retTimer != osOK && ble_adv_timer != NULL) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);\r
-            osTimerDelete(ble_adv_timer);\r
-            ble_adv_timer = NULL;\r
-            return;\r
-        }\r
-\r
-    }\r
-    else\r
-    {\r
-         if(!uapi_dev_runtime_get_factory_test_status_flag())\r
-         {\r
-            gap_ble_adv_params_t adv_para;\r
-            memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));\r
-            adv_para.min_interval = 0x640;\r
-            adv_para.max_interval = 0x640;\r
-            adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;\r
-            adv_para.channel_map = 0x7;\r
-            adv_para.duration = 0;\r
-            gap_ble_set_adv_param(adv_id, &adv_para);//设置广播参数\r
-         }\r
-         else\r
-         {\r
-             gap_ble_adv_params_t adv_para;\r
-            memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));\r
-            adv_para.min_interval = 0x64;\r
-            adv_para.max_interval = 0x64;\r
-            adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;\r
-            adv_para.channel_map = 0x7;\r
-            adv_para.duration = 0;\r
-            gap_ble_set_adv_param(adv_id, &adv_para);//设置广播参数\r
-        }\r
-\r
-    }\r
-    \r
-    gap_ble_set_local_appearance(GAP_BLE_APPEARANCE_TYPE_GENERIC_WATCH);//仅是手表\r
-    svr_ble_adv_data_set(adv_id);//开始广播和扫描数据\r
-    ble_adv_falg = 1;\r
-    ret = gap_ble_start_adv(adv_id);\r
-    if (ret) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_adv_start bt gap_ble_start_adv1  ret = 0x%x", ret);\r
-    }\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_adv_start bt gap_ble_start_adv2  ret = 0x%x", ret);\r
-}\r
-\r
-void svr_ble_connstate_change_cb(unsigned short conn_id, bd_addr_t *addr, gap_ble_conn_state_t conn_state,\r
-    gap_ble_pair_state_t pair_state, gap_ble_disc_reason_t disc_reason)\r
-{\r
-    \r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
-     "svr_ble_connstate_change_cb gap_ble_conn_state_t conn_state:%d  pair_state:%d disc_reason:%d\r\n",\r
-     conn_state,pair_state,disc_reason);\r
-\r
-    if (GAP_BLE_STATE_DISCONNECTED == conn_state) \r
-    { // restart ble adv when disconnected\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GAP_BLE_STATE_DISCONNECTED!!! \r\n");\r
-        uapi_save_runtime_log(RUNTIME_LOG_BLE_DISCONNECT);\r
-\r
-        clean_phone_info(conn_id);\r
-\r
-        //如果ble连接全部断连,则需要重新开启广播\r
-        //可能因ble连接不够稳定,快速断开ble连接,无法将连接判定为app连接导致断连的时候没有正确重新开启广播\r
-        \r
-        if(conn_id==g_ble_conn_id || !get_ble_connect())\r
-        {\r
-            free_ble_data(); \r
-                \r
-            ble_disconnect_ok();\r
-\r
-            g_ble_conn_id=0;\r
-\r
-            //APP断连\r
-            Bleconnect = GAP_BLE_STATE_DISCONNECTED;//蓝牙已断开\r
-\r
-            if(get_ble_pair())\r
-            {\r
-                ble_ancs_client_clear(conn_id);\r
-            }\r
-\r
-            svr_ble_adv_start();\r
-        }\r
-        else if (ble_is_Alipay_bind()==true)\r
-        {\r
-            //如果当前页面处于支付宝界面,则重新开广播\r
-            svr_ble_adv_start();\r
-        }\r
-\r
-        if(g_ble_Alipay_conn_id==conn_id)\r
-        {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "支付宝断开连接 \r\n");\r
-        }\r
-     \r
-    }   \r
-    else \r
-    {\r
-        devpair_state = 0;//\r
-\r
-        uapi_save_runtime_log(RUNTIME_LOG_BLE_CONNECT);\r
-\r
-\r
-        if( g_ble_conn_id !=0 && conn_id!=g_ble_conn_id)\r
-        {\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"支付宝连接");\r
-        }\r
-\r
-      \r
-        int ret =svr_ble_adv_stop();\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x",ret);\r
-        \r
-        set_phone_info(addr,conn_id);\r
-       \r
-        ble_connect_ok();\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x \n",\r
-         addr->addr[3], addr->addr[2], addr->addr[1], addr->addr[0]); /* 3 2 1 0 idx */\r
-\r
-\r
-        Bleconnect = GAP_BLE_STATE_CONNECTED;//蓝牙已连接\r
-       \r
-\r
-    }\r
-\r
-    uapi_dev_runtime_set_ble_connect_stat(Bleconnect);\r
-}\r
-\r
-static uint16_t need_update_connect_param=BLE_CONNECT_INTERVAL_HIGH;\r
-\r
-static osTimerId_t ble_connect_timer=NULL;\r
-\r
-static int8_t connect_updata_count=3;\r
-\r
-static void  ble_connect_Timer_CallBack(int data)\r
-{\r
-    if(get_ble_connect() && connect_updata_count>0)\r
-    {\r
-        gap_conn_param_update_t conn_param = { 0 };\r
-        conn_param.conn_handle = g_ble_conn_id;    /* param 0: conn_handle */\r
-        conn_param.interval_min =need_update_connect_param;    /* param 1: interval_min 1.25ms */\r
-        conn_param.interval_max = need_update_connect_param;    /* param 2: interval_max */\r
-        conn_param.slave_latency = 6;    /* param 3: slave_latency */\r
-        conn_param.timeout_multiplier = 500;    /* param 4: timeout_multiplier 10ms */\r
-        int ret = gap_ble_connect_param_update(&conn_param);\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "触发 连接参数timer更新");\r
-        connect_updata_count--;\r
-\r
-    }\r
-    else\r
-    {\r
-        osTimerStop(ble_connect_timer);\r
-        osTimerDelete(ble_connect_timer);\r
-        ble_connect_timer = NULL;\r
-    }\r
-}\r
-\r
-static uint16_t ble_interval=50; \r
-\r
-uint16_t get_ble_interval(void)\r
-{\r
-    float temp_data =(float)ble_interval*1.25f;\r
-\r
-    return (uint16_t)temp_data;\r
-   \r
-}\r
-\r
-void srv_gap_ble_connect_param_update_callback(uint16_t conn_id, errcode_t status,\r
-    const gap_ble_conn_param_update_t *param)\r
-{\r
-    if(param->interval==50)\r
-    uapi_save_runtime_log(RUNTIME_LOG_BLE_CONNECT_UPDATE_50);\r
-    else if(param->interval==12)\r
-    uapi_save_runtime_log(RUNTIME_LOG_BLE_CONNECT_UPDATE_12);\r
-    else\r
-    uapi_save_runtime_log(RUNTIME_LOG_BLE_CONNECT_UPDATE|param->interval);\r
-\r
-    ble_interval=param->interval;\r
-\r
-    if(ble_connect_timer!=NULL)\r
-    {\r
-        osTimerStop(ble_connect_timer);\r
-        osTimerDelete(ble_connect_timer);\r
-        ble_connect_timer = NULL;\r
-    }\r
-\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, \r
-    "conn_id %d status %d gap_ble_conn_param_update_t interval %d latency%d  timeout %d ",conn_id,status,param->interval,param->latency,param->timeout);\r
-}\r
-\r
-\r
-\r
-void uapi_ble_connect_param_update(uint16_t data)\r
-{\r
-    gap_conn_param_update_t conn_param = { 0 };\r
-    conn_param.conn_handle = g_ble_conn_id;    /* param 0: conn_handle */\r
-    conn_param.interval_min =data;    /* param 1: interval_min 1.25ms */\r
-    conn_param.interval_max = data;    /* param 2: interval_max */\r
-    conn_param.slave_latency = 6;    /* param 3: slave_latency */\r
-    conn_param.timeout_multiplier = 500;    /* param 4: timeout_multiplier 10ms */\r
-    int ret = gap_ble_connect_param_update(&conn_param);\r
-\r
-    need_update_connect_param=data;\r
-\r
-   \r
-\r
-    uint32_t tick;\r
-    osStatus_t retTimer;\r
-    if(ble_connect_timer!=NULL)\r
-    {\r
-        osTimerStop(ble_connect_timer);\r
-        osTimerDelete(ble_connect_timer);\r
-        ble_connect_timer = NULL;\r
-    }\r
-\r
-    ble_connect_timer = osTimerNew((osTimerFunc_t)ble_connect_Timer_CallBack, osTimerPeriodic, NULL, NULL);\r
-    tick =osMs2Tick(3000);\r
-    retTimer = osTimerStart(ble_connect_timer, tick);\r
-    if (retTimer != osOK && ble_connect_timer != NULL) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);\r
-        osTimerDelete(ble_connect_timer);\r
-        ble_connect_timer = NULL;\r
-        return;\r
-    }\r
-    connect_updata_count=3;\r
-\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"gap ble update connection parameters %d ret: %X\n",data,ret);   \r
-}\r
-void svr_pair_result_cbt_cb(uint16_t conn_id, const bd_addr_t *addr, errcode_t status)\r
-{\r
-    devpair_state = 1;//代表配对成功了\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, \r
-    "svr_pair_result_cbt_cb!!! addr 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x status:0x%x\r\n",addr->addr[0],addr->addr[1],\r
-    addr->addr[2],addr->addr[3],addr->addr[4],addr->addr[5],status);\r
-    if(status==ERRCODE_SUCC)\r
-    {\r
-        if(get_ble_pair())\r
-        ble_ancs_client_cmd_setup_and_subscribe(conn_id);\r
-\r
-        if(get_ctkd_flag() && uapi_dev_runtime_get_bt_powerstat())\r
-        {\r
-\r
-            if(get_ble_pair()&&( cm_get_A2DP_switch() || cm_get_HFP_switch()))\r
-            {\r
-                if(cm_get_A2DP_switch() && cm_get_A2DP_switch())\r
-                {\r
-                    int ret=gap_reconnect_media_device(addr);\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
-            else\r
-            { \r
-                if(get_br_is_pair())\r
-                {\r
-                    bd_addr_t bdaddr={0};\r
-                    uapi_get_br_address(&bdaddr);\r
-                    if(false==(bt_is_acl_connected(&bdaddr)))\r
-                    {\r
-                        if(cm_get_A2DP_switch() || cm_get_HFP_switch())\r
-                        {\r
-                            int ret=gap_reconnect_media_device(&bdaddr);\r
-                            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gap_reconnect_media_device!!! %X\r\n",ret);\r
-                        }\r
-                        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_reconnect_media_device!!! \r\n");    \r
-                    }\r
-                    else\r
-                    {\r
-                        if(cm_get_A2DP_switch() || cm_get_HFP_switch())\r
-                        uapi_a2dp_snk_connect();\r
-                        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_a2dp_snk_connect!!! \r\n");\r
-                    }\r
-                }\r
-            } \r
-        }\r
-        hand_watch_first_time_Paired();\r
-\r
-    }\r
-}\r
- \r
-//添加ota特征值\r
-static void srv_ble_add_chart_decr_ota(uint8_t server_id,uint16_t srv_handle)\r
-{   \r
-    errcode_t ret = 0;\r
-    static uint8_t ota_point_val[] = {0x00, 0x00};\r
-    gatts_add_chara_info_t character;\r
-    gatts_add_desc_info_t descriptor;\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_OTA_ID, &character.chara_uuid);\r
-    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;\r
-    character.properties = BLE_CHARACTERISTIC_SNED_OTA_ID_PROPERTIES;\r
-    character.value_len = (uint16_t)sizeof(ota_point_val);\r
-    character.value = ota_point_val;\r
-\r
-    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
-    }\r
-    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
-    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;\r
-    descriptor.value_len = (uint16_t)sizeof(ota_point_val);\r
-    descriptor.value = ota_point_val;\r
-    \r
-    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
-    }\r
-}\r
-\r
-//自定义 ota 文件传输协议\r
-static void srv_ble_add_chart_decr_Zhihui_ota(uint8_t server_id,uint16_t srv_handle)\r
-{   \r
-    errcode_t ret = 0;\r
-    static uint8_t ota_val[] = {0x00, 0x00};\r
-    gatts_add_chara_info_t character;\r
-    gatts_add_desc_info_t descriptor;\r
-    bts_data_to_uuid_len2(BLE_ZHIHUI_OTA_ID, &character.chara_uuid);\r
-    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;\r
-    character.properties = BLE_ZHIHUI_OTA_ID_ID_PROPERTIES;\r
-    character.value_len = (uint16_t)sizeof(ota_val);\r
-    character.value = ota_val;\r
-\r
-    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
-    }\r
-    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
-    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;\r
-    descriptor.value_len = (uint16_t)sizeof(ota_val);\r
-    descriptor.value = ota_val;\r
-    \r
-    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
-    }\r
-}\r
-\r
-static void srv_ble_add_Zhihui_AI(uint8_t server_id,uint16_t srv_handle)\r
-{\r
-    errcode_t ret = 0;\r
-    static uint8_t battery_point_val[] = {0x00, 0x00};\r
-    gatts_add_chara_info_t character;\r
-    gatts_add_desc_info_t descriptor;\r
-\r
-    bts_data_to_uuid_len2(BLE_ZHIHUI_AI_ID, &character.chara_uuid);\r
-    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
-    character.properties = BLE_ZHIHUI_AI_ID_ID_PROPERTIES;\r
-    character.value_len = (uint16_t)sizeof(battery_point_val);\r
-    character.value = battery_point_val;\r
-\r
-    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
-    }\r
-    bts_data_to_uuid_len2(BLE_UUID_CLIENT_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
-    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE;\r
-    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
-    descriptor.value = battery_point_val;\r
-    \r
-    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
-    }\r
-\r
-    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
-    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE | GATT_ATTRIBUTE_PERMISSION_READ;;\r
-    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
-    descriptor.value = battery_point_val;\r
-    \r
-    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
-    }\r
-}\r
-\r
-\r
-//用于adnriod发送消息添加特征值和描述符\r
-static void srv_ble_add_chart_decr_andriod(uint8_t server_id,uint16_t srv_handle)\r
-{   \r
-    errcode_t ret = 0;\r
-    static uint8_t andriod_point_val[] = {0x00, 0x00};\r
-    gatts_add_chara_info_t character;\r
-    gatts_add_desc_info_t descriptor;\r
-\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_ANDRIOD_ID, &character.chara_uuid);\r
-    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;\r
-    character.properties = BLE_CHARACTERISTIC_SNED_ANDRIOD_ID_PROPERTIES;\r
-    character.value_len = (uint16_t)sizeof(andriod_point_val);\r
-    character.value = andriod_point_val;\r
-\r
-    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
-    }\r
-    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
-    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;\r
-    descriptor.value_len = (uint16_t)sizeof(andriod_point_val);\r
-    descriptor.value = andriod_point_val;\r
-    \r
-    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
-    }\r
-}\r
-//添加battery特征值和描述符\r
-static void srv_ble_add_chart_decr_battery(uint8_t server_id,uint16_t srv_handle)\r
-{\r
-    errcode_t ret = 0;\r
-    static uint8_t battery_point_val[20] = {0};\r
-    uint8_t battery_value[20];\r
-    memset(battery_value,0,20);\r
-    // 获取电池电压值\r
-    float voltage = 0.0F;\r
-    uint8_t power = 0;\r
-    power = battery_get_voltage(&voltage);\r
-    battery_point_val[0] = power;//电量90\r
-\r
-    uint16_t dial = ble_get_dial_id();\r
-    memcpy_s(&battery_point_val[1],2,&dial,2);\r
-\r
-    uint8_t _major,_mid,_minor;\r
-    uapi_get_fw_version(&_major,&_mid,&_minor);\r
-\r
-    battery_point_val[3] = _major;//固件版本号\r
-    battery_point_val[4] = _mid;\r
-    battery_point_val[5] = _minor;\r
-\r
-    bd_addr_t addr_info;\r
-    ret = gap_ble_get_local_addr(&addr_info);\r
-    battery_point_val[6] = addr_info.addr[5];\r
-    battery_point_val[7] = addr_info.addr[4];\r
-    battery_point_val[8] = addr_info.addr[3];\r
-    battery_point_val[9] = addr_info.addr[2];\r
-    battery_point_val[10] = addr_info.addr[1];\r
-    battery_point_val[11] = addr_info.addr[0];\r
-\r
-    battery_point_val[12] = 0;//消息推送开关 默认是关闭 0\r
-    battery_point_val[13] = 0;//多媒体开关\r
-    #if defined(BOARD_W9) \r
-    battery_point_val[14] = 6;//客户编号\r
-    battery_point_val[15] = 6;//产品编号\r
-    // #elif defined(BOARD_N9) \r
-    // battery_point_val[14] = 7;//客户编号\r
-    // battery_point_val[15] = 7;//产品编号\r
-    #else\r
-    battery_point_val[14] = 5;//客户编号\r
-    battery_point_val[15] = 5;//产品编号\r
-    #endif\r
-\r
-    battery_point_val[16] = 0;//硬件版本号\r
-    battery_point_val[17] = 1;\r
-\r
-    battery_point_val[18] = 0;//ble版本号\r
-    battery_point_val[19] = 1;\r
-    gatts_add_chara_info_t character;\r
-    gatts_add_desc_info_t descriptor;\r
-\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_READ_BATTERY_ID, &character.chara_uuid);\r
-    character.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE;\r
-    character.properties = BLE_CHARACTERISTIC_READ_BATTERY_ID_PROPERTIES;\r
-    character.value_len = (uint16_t)sizeof(battery_point_val);\r
-    character.value = battery_point_val;\r
-\r
-    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
-    }\r
-    static uint8_t report_reference_val_output[] = {0x01, 0x00};\r
-    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
-    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;\r
-    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
-    descriptor.value = battery_point_val;\r
-    \r
-    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
-    }\r
-\r
-}\r
-//添加短指令特征值和描述符 20个字节\r
-static void srv_ble_add_chart_decr_short_cmd(uint8_t server_id,uint16_t srv_handle)\r
-{\r
-    errcode_t ret = 0;\r
-    static uint8_t battery_point_val[] = {0x00, 0x00};\r
-    gatts_add_chara_info_t character;\r
-    gatts_add_desc_info_t descriptor;\r
-\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_SHORT_ID, &character.chara_uuid);\r
-    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
-    character.properties = BLE_CHARACTERISTIC_SNED_SHORT_ID_PROPERTIES;\r
-    character.value_len = (uint16_t)sizeof(battery_point_val);\r
-    character.value = battery_point_val;\r
-\r
-    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
-    }\r
-    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
-    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;\r
-    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
-    descriptor.value = battery_point_val;\r
-    \r
-    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
-    }\r
-}\r
-//添加长指令特征值和描述符 大于20个字节\r
-static void srv_ble_add_chart_decr_long_cmd(uint8_t server_id,uint16_t srv_handle)\r
-{\r
-    errcode_t ret = 0;\r
-    static uint8_t battery_point_val[] = {0x00, 0x00};\r
-    gatts_add_chara_info_t character;\r
-    gatts_add_desc_info_t descriptor;\r
-\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_LONG_ID, &character.chara_uuid);\r
-    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
-    character.properties = BLE_CHARACTERISTIC_SNED_LONG_ID_PROPERTIES;\r
-    character.value_len = (uint16_t)sizeof(battery_point_val);\r
-    character.value = battery_point_val;\r
-\r
-    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
-    }\r
-    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
-    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;\r
-    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
-    descriptor.value = battery_point_val;\r
-    \r
-    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
-    }\r
-}\r
-//添加客户端接收特征值和描述符 \r
-static void srv_ble_add_chart_decr_recv_cmd(uint8_t server_id,uint16_t srv_handle)\r
-{\r
-    errcode_t ret = 0;\r
-    static uint8_t battery_point_val[] = {0x00, 0x00};\r
-    gatts_add_chara_info_t character;\r
-    gatts_add_desc_info_t descriptor;\r
-\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_RECV_ID, &character.chara_uuid);\r
-    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
-    character.properties = BLE_CHARACTERISTIC_RECV_ID_PROPERTIES;\r
-    character.value_len = (uint16_t)sizeof(battery_point_val);\r
-    character.value = battery_point_val;\r
-\r
-    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
-    }\r
-    bts_data_to_uuid_len2(BLE_UUID_CLIENT_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
-    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE;\r
-    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
-    descriptor.value = battery_point_val;\r
-    \r
-    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
-    }\r
-\r
-    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
-    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE | GATT_ATTRIBUTE_PERMISSION_READ;;\r
-    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
-    descriptor.value = battery_point_val;\r
-    \r
-    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
-    }\r
-}\r
-\r
-\r
-static void srv_ble_add_ZHIHUIOTA_REPLY_chart_decr_recv_cmd(uint8_t server_id,uint16_t srv_handle)\r
-{\r
-    errcode_t ret = 0;\r
-    static uint8_t battery_point_val[] = {0x00, 0x00};\r
-    gatts_add_chara_info_t character;\r
-    gatts_add_desc_info_t descriptor;\r
-\r
-    bts_data_to_uuid_len2(BLE_ZHIHUI_OTA_REPLY_ID, &character.chara_uuid);\r
-    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
-    character.properties = BLE_ZHIHUI_OTA_REPLY_ID_PROPERTIES;\r
-    character.value_len = (uint16_t)sizeof(battery_point_val);\r
-    character.value = battery_point_val;\r
-\r
-    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
-    }\r
-    bts_data_to_uuid_len2(BLE_UUID_CLIENT_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
-    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE;\r
-    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
-    descriptor.value = battery_point_val;\r
-    \r
-    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
-    }\r
-\r
-    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
-    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE | GATT_ATTRIBUTE_PERMISSION_READ;;\r
-    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
-    descriptor.value = battery_point_val;\r
-    \r
-    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
-    }\r
-}\r
-\r
-\r
-static uint8_t g_alipay_character_buf[256] = {0};\r
-static void alipay_add_chart_decr_recv_cmd1(uint8_t server_id,uint16_t srv_handle)\r
-{\r
-    errcode_t ret = 0;\r
-    // uint16_t id = ALIPAYY_CHARACTERISTIC_ID;\r
-    gatts_add_chara_info_t character;\r
-    uint16_t value = 0;\r
-    bt_uuid_t alipay_service_uuid = {0};\r
-    bts_data_to_uuid_len2(ALIPAYY_CHARACTERISTIC_ID, &alipay_service_uuid);\r
-    memset_s(&character, sizeof(gatts_add_chara_info_t), 0, sizeof(gatts_add_chara_info_t));\r
-    // character.chara_uuid.uuid_len = sizeof(id);\r
-    // memcpy_s(character.chara_uuid.uuid, sizeof    (character.chara_uuid.uuid), (char *)&id, sizeof(id));\r
-    character.chara_uuid = alipay_service_uuid;\r
-    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
-    character.properties =\r
-        GATT_CHARACTER_PROPERTY_BIT_READ | GATT_CHARACTER_PROPERTY_BIT_WRITE | GATT_CHARACTER_PROPERTY_BIT_NOTIFY;\r
-    character.value_len = 256;\r
-    character.value = g_alipay_character_buf;\r
-\r
-    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
-    if (ret != ERRCODE_SUCC) {\r
-        ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
-    }\r
-\r
-    uint8_t bas_ccc_val[] = {\r
-            0x01,\r
-            0x00\r
-        };\r
-    bt_uuid_t ccc_uuid = { 0 };\r
-    bts_data_to_uuid_len2(0x2902, &ccc_uuid);\r
-    // bts_data_to_uuid_len2(0x2902, &ccc_uuid);\r
-    gatts_add_desc_info_t descriptor;\r
-    descriptor.desc_uuid = ccc_uuid;\r
-    descriptor.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
-    descriptor.value_len = (uint16_t)sizeof(bas_ccc_val);\r
-    descriptor.value = bas_ccc_val;\r
-    \r
-    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
-    if (ret != ERRCODE_SUCC) {\r
-        ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
-    }\r
-    bd_addr_t addr_info;\r
-    gatts_add_desc_info_t descriptor_ap;\r
-    gap_ble_get_local_addr(&addr_info);\r
-    bts_data_to_uuid_len2(0x4b02, &ccc_uuid);\r
-    descriptor_ap.desc_uuid = ccc_uuid;\r
-    descriptor_ap.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
-    descriptor_ap.value_len = BD_ADDR_LEN;\r
-    uint8_t ble_data_mac_switch[BD_ADDR_LEN] = {0};\r
-    int k = BD_ADDR_LEN;\r
-    for (int i = 0; i < BD_ADDR_LEN; i++) {\r
-        ble_data_mac_switch[--k] = addr_info.addr[i];\r
-    }\r
-    descriptor_ap.value = ble_data_mac_switch;\r
-    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor_ap);\r
-    if (ret != ERRCODE_SUCC) {\r
-        ALIPAY_PRINT_ERR(0, "gatts_add_descriptor second fail, ret:%u.\r\n", ret);\r
-    }\r
-}\r
-\r
-\r
-\r
-static uint16_t ble_server_handle = 0;\r
-\r
-void alipay_add_chart_decr_cb(uint8_t server_id,uint16_t srv_handle)\r
-{\r
-    errcode_t ret = 0;\r
-    static uint8_t ota_point_val[] = {0x00, 0x00};\r
-    gatts_add_chara_info_t character;\r
-    gatts_add_desc_info_t descriptor;\r
-    bts_data_to_uuid_len2(0x4a02, &character.chara_uuid);\r
-    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;\r
-    character.properties = BLE_CHARACTERISTIC_SNED_OTA_ID_PROPERTIES;\r
-    character.value_len = (uint16_t)sizeof(ota_point_val);\r
-    character.value = ota_point_val;\r
-\r
-    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
-    }\r
-    bts_data_to_uuid_len2(0x2902, &descriptor.desc_uuid);\r
-    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;\r
-    descriptor.value_len = (uint16_t)sizeof(ota_point_val);\r
-    descriptor.value = ota_point_val;\r
-    \r
-    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
-    if (ret != ERRCODE_SUCC) {\r
-        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
-    }\r
-    }\r
-\r
-//这个回调函数添加新的服务UUID\r
-static void svr_ble_bt_gatts_service_add_cb(uint8_t server_id, bt_uuid_t *uuid, uint16_t srv_handle,\r
-    errcode_t status)\r
-{\r
-    if (uuid->uuid_len != sizeof(uint16_t)) return ;\r
-    uint16_t uuid_tmp = *((uint16_t*)uuid->uuid);\r
-    uuid_tmp = SWAP_U16(uuid_tmp);\r
-    if ( uuid_tmp == BLE_SERVICE_UUID \r
-        || uuid_tmp == BLE_UUID_HUMAN_INTERFACE_DEVICE \r
-        || uuid_tmp == BLE_UUID_ATE_FACTORYTEST_SERVICE \r
-        || uuid_tmp == BLE_UUID_PPG_BLE_SERVICE \r
-        || uuid_tmp == ALIPAYY_SERVICE_ID\r
-#ifdef SUPPORT_AT_CYWEE\r
-        || uuid_tmp == BLE_UUID_CYWEE_REPORT_SERVICE\r
-#endif\r
-         ) \r
-    {\r
-         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " 0x%x\r\n",uuid_tmp);\r
-    }else{\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_service_add_cb UUID not supported 0x%x\r\n",uuid_tmp);\r
-        return ;\r
-    }\r
-    ble_server_handle = srv_handle;\r
-    // ALIPAY_PRINT_DEBUG(0, "BtGattsServiceAddCallback 0x%x 0x%x 0x%x 0x%x", status, server_id, srv_handle,\r
-        // *((uint16_t *)uuid->uuid));\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_service_add_cb srv_handle 0x%x\r\n",srv_handle);\r
-    if (status != ERRCODE_BT_SUCCESS)\r
-    {\r
-        return;\r
-    }\r
-    bt_uuid_t ble_service_uuid = {0};\r
-    bts_data_to_uuid_len2(BLE_SERVICE_UUID, &ble_service_uuid);\r
-\r
-    bt_uuid_t hid_service_uuid = {0};\r
-    bts_data_to_uuid_len2(BLE_UUID_HUMAN_INTERFACE_DEVICE, &hid_service_uuid);\r
-\r
-    // bt_uuid_t alipay_service_uuid = {0};\r
-    // bts_data_to_uuid_len2(ALIPAYY_SERVICE_ID, &alipay_service_uuid);//0x3802\r
-\r
-    bt_uuid_t factory_service_uuid = {0};\r
-    bts_data_to_uuid_len2(BLE_UUID_ATE_FACTORYTEST_SERVICE, &factory_service_uuid);\r
-\r
-    bt_uuid_t ppg_service_uuid = {0};\r
-    bts_data_to_uuid_len2(BLE_UUID_PPG_BLE_SERVICE, &ppg_service_uuid);\r
-\r
-\r
-#ifdef SUPPORT_AT_CYWEE\r
-\r
-    bt_uuid_t cywee_ble_service_uuid = {0};\r
-    bts_data_to_uuid_len2(BLE_UUID_CYWEE_REPORT_SERVICE, &cywee_ble_service_uuid);\r
-\r
-#endif\r
-\r
-\r
-    errcode_t ret = 0;\r
-    if (ble_gatts_cmp_uuid(uuid, &ble_service_uuid) == true) {//通过传入的uuid进行比较\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_service_add_cb ble_service_uuid\r\n");\r
-        srv_ble_add_chart_decr_ota(server_id,srv_handle);//ota特征值\r
-        srv_ble_add_chart_decr_andriod(server_id,srv_handle);//对18e0这个服务进行添加andiod特征值和描述符\r
-        srv_ble_add_chart_decr_battery(server_id,srv_handle);//电池电量特征值\r
-        srv_ble_add_chart_decr_short_cmd(server_id,srv_handle);\r
-        srv_ble_add_chart_decr_long_cmd(server_id,srv_handle);\r
-        srv_ble_add_chart_decr_recv_cmd(server_id,srv_handle);\r
-        srv_ble_add_chart_decr_Zhihui_ota(server_id,srv_handle);\r
-        srv_ble_add_Zhihui_AI(server_id,srv_handle);\r
-        \r
-        // srv_ble_add_chart_decr_Zhihui_AI(server_id,srv_handle);\r
-        srv_ble_add_ZHIHUIOTA_REPLY_chart_decr_recv_cmd(server_id,srv_handle);\r
-        gatts_start_service(server_id, srv_handle);\r
-    }\r
-    if (ble_gatts_cmp_uuid(uuid, &hid_service_uuid) == true){\r
-        ble_hid_add_characters_and_descriptors(server_id, srv_handle);\r
-        ret = gatts_start_service(server_id, srv_handle);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "hid service svr_ble_bt_gatts_service_add_cb ret:%d\r\n",ret);\r
-    }\r
-    if (ble_gatts_cmp_uuid(uuid, &factory_service_uuid) == true){\r
-        ble_factorytest_add_characters_and_descriptors(server_id,srv_handle);\r
-        ret = gatts_start_service(server_id, srv_handle);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "factorytest service svr_ble_bt_gatts_service_add_cb ret:%d\r\n",ret);\r
-    }\r
-\r
-    if (ble_gatts_cmp_uuid(uuid, &ppg_service_uuid) == true){\r
-        ble_ppgtest_add_characters_and_descriptors(server_id,srv_handle);\r
-        ret = gatts_start_service(server_id, srv_handle);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ppg ble service svr_ble_bt_gatts_service_add_cb ret:%d\r\n",ret);\r
-    }\r
-\r
-#ifdef SUPPORT_AT_CYWEE\r
-    if (ble_gatts_cmp_uuid(uuid, &cywee_ble_service_uuid) == true){\r
-        ble_cywee_add_characters_and_descriptors(server_id,srv_handle);\r
-        ret = gatts_start_service(server_id, srv_handle);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "cywee ble service svr_ble_bt_gatts_service_add_cb ret:%d\r\n",ret);\r
-    }   \r
-\r
-#endif\r
-    // if (ble_gatts_cmp_uuid(uuid, &alipay_service_uuid) == true){\r
-    //     alipay_add_chart_decr_recv_cmd1(server_id,srv_handle);\r
-    //     ret = gatts_start_service(server_id, srv_handle);\r
-    //     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "alipay_service_uuid service svr_ble_bt_gatts_service_add_cb ret:%d\r\n",ret);\r
-    // }\r
-    \r
-}\r
-uint16_t alipay_handle = 0;\r
-uint16_t g_hid_server_handle = 0;\r
-static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t *uuid, uint16_t srv_handle,\r
-    gatts_add_character_result_t *result, errcode_t status)\r
-{\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bt_gatts_characteristic_add_cb uuid:0x%02x%02x 0x%x %d %d , status %x\r\n",\r
-        uuid->uuid[0],uuid->uuid[1],\r
-        srv_handle,result->handle,\r
-        result->value_handle,status);\r
-    bt_uuid_t chara_uuid_data_2ae0 = {0};\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_OTA_ID, &chara_uuid_data_2ae0);\r
-\r
-    bt_uuid_t chara_uuid_data_2ae1 = {0};\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_ANDRIOD_ID, &chara_uuid_data_2ae1);\r
-\r
-    bt_uuid_t chara_uuid_data_2ae5 = {0};\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_RECV_ID, &chara_uuid_data_2ae5);\r
-\r
-    bt_uuid_t chara_uuid_data_2ae3  = {0};\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_SHORT_ID, &chara_uuid_data_2ae3);\r
-    bt_uuid_t chara_uuid_data_2ae4 = {0};\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_LONG_ID, &chara_uuid_data_2ae4);\r
-    \r
-    \r
-    bt_uuid_t chara_uuid_data_2ae2 = {0};\r
-    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_READ_BATTERY_ID, &chara_uuid_data_2ae2);\r
-\r
-    bt_uuid_t hid_report_uuid_2a4d = {0};\r
-    bts_data_to_uuid_len2(BLE_UUID_REPORT, &hid_report_uuid_2a4d);\r
-\r
-    bt_uuid_t hid_report_uuid_2ae6 = {0};\r
-    bts_data_to_uuid_len2(BLE_ZHIHUI_OTA_ID, &hid_report_uuid_2ae6);\r
-\r
-    bt_uuid_t chara_uuid_data_2ae7 = {0};\r
-    bts_data_to_uuid_len2(BLE_ZHIHUI_OTA_REPLY_ID, &chara_uuid_data_2ae7);\r
-\r
-    bt_uuid_t chara_uuid_data_2ae8 = {0};\r
-    bts_data_to_uuid_len2(BLE_ZHIHUI_AI_ID, &chara_uuid_data_2ae8);\r
-\r
-    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae8))\r
-    {\r
-        if(data2ae8Cmd==0)\r
-        {\r
-            data2ae8Cmd=result->value_handle;\r
-        }\r
-        Is_value_handle[handle_num]=result->value_handle;\r
-        handle_num++;\r
-    }\r
-\r
-    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae7))\r
-    {\r
-        if(data2ae7Cmd==0)\r
-        {\r
-            data2ae7Cmd=result->value_handle;\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "data2ae7Cmd");\r
-        }\r
-        Is_value_handle[handle_num]=result->value_handle;\r
-        handle_num++;\r
-    }\r
-\r
-\r
-    if(ble_gatts_cmp_uuid(uuid, &hid_report_uuid_2ae6))\r
-    {\r
-        if(data2ae6Cmd==0)\r
-        {\r
-            data2ae6Cmd=result->value_handle;\r
-        }\r
-        Is_value_handle[handle_num]=data2ae6Cmd;\r
-        handle_num++;\r
-    }\r
-    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae5))\r
-    {\r
-        if(g_ble_server_handle == 0)\r
-        {\r
-            g_ble_server_handle = result->value_handle;\r
-        }\r
-        if(data2ae5Cmd == 0){\r
-            data2ae5Cmd = result->value_handle;\r
-        }\r
-        Is_value_handle[handle_num]=result->value_handle;\r
-        handle_num++;\r
-        \r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " 2ae5 result->value_handle1  %d\r\n",result->value_handle);\r
-    }\r
-    \r
-    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae3 ))\r
-    {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "2ae3 result->value_handle2  %d\r\n",result->value_handle);\r
-        if(data2ae3Cmd == 0)\r
-        {\r
-            data2ae3Cmd = result->value_handle;\r
-        }\r
-       Is_value_handle[handle_num]=result->value_handle;\r
-        handle_num++;\r
-            \r
-    }\r
-    \r
-    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae0))\r
-    {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "2ae0 result->value_handle4  %d\r\n",result->value_handle);\r
-        if(data2ae0Cmd == 0)\r
-        {\r
-            data2ae0Cmd = result->value_handle;\r
-        }\r
-        Is_value_handle[handle_num]=result->value_handle;\r
-        handle_num++;\r
-    }\r
-    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae1))\r
-    {\r
-        if(data2ae1Cmd == 0)\r
-        {\r
-            data2ae1Cmd = result->value_handle;\r
-        }\r
-       Is_value_handle[handle_num]=result->value_handle;\r
-        handle_num++;\r
-\r
-        // data2ae1Cmd = result->value_handle;\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "2ae1 result->value_handle5  %d\r\n",result->value_handle);\r
-        // shortCmdChara = result->value_handle;\r
-    }\r
-    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae2))\r
-    {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "2ae2 result->value_handle6  %d\r\n",result->value_handle);\r
-        // shortCmdChara = result->value_handle;\r
-         if(data2ae2Cmd == 0){\r
-            data2ae2Cmd = result->value_handle;\r
-        }\r
-        Is_value_handle[handle_num]=result->value_handle;\r
-        handle_num++;\r
-    }\r
-    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae4))\r
-    {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "2ae4 result->value_handle3  %d\r\n",result->value_handle);\r
-        if(data2ae4Cmd == 0)\r
-        {\r
-            data2ae4Cmd = result->value_handle;\r
-        }\r
-        Is_value_handle[handle_num]=result->value_handle;\r
-        handle_num++;\r
-        //  = result->value_handle;\r
-    }\r
-    if (ble_gatts_cmp_uuid(uuid, &hid_report_uuid_2a4d) == true) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "result->hid_report_uuid_2a4d  %d\r\n",result->value_handle);\r
-        if(g_hid_server_handle == 0){\r
-            g_hid_server_handle = result->value_handle;\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_hid_server_handle  %d\r\n",g_hid_server_handle);\r
-            ble_hid_add_characters_input_report_cbk(g_hid_server_handle);\r
-        }\r
-    }\r
-\r
-    bt_uuid_t factorytest_recv_uuid = {0};\r
-    bts_data_to_uuid_len2(BLE_UUID_ATE_TX, &factorytest_recv_uuid);\r
-\r
-    if (ble_gatts_cmp_uuid(uuid, &factorytest_recv_uuid) == true) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "result->factorytest_recv_uuid  %d\r\n",result->value_handle);\r
-\r
-        Is_value_handle[handle_num]=result->value_handle;\r
-        handle_num++;\r
-\r
-        ble_factorytest_store_recv_handle(result->value_handle) ;\r
-        // }\r
-    }\r
-\r
-    bt_uuid_t factorytest_report_uuid = {0};\r
-    bts_data_to_uuid_len2(BLE_UUID_ATE_RX, &factorytest_report_uuid);\r
-\r
-    if (ble_gatts_cmp_uuid(uuid, &factorytest_report_uuid) == true) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "result->factorytest_report_uuid  %d\r\n",result->value_handle);\r
-        Is_value_handle[handle_num]=result->value_handle;\r
-        handle_num++;\r
-        ble_factorytest_store_report_handle(result->value_handle);\r
-        // }\r
-    }\r
-\r
-    bt_uuid_t factorytest_ota_recv_uuid = {0};\r
-    bts_data_to_uuid_len2(BLE_UUID_OTA_TX, &factorytest_ota_recv_uuid);\r
-\r
-    if (ble_gatts_cmp_uuid(uuid, &factorytest_ota_recv_uuid) == true) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "result->factorytest_ota_recv_uuid  %d\r\n",result->value_handle);\r
-       Is_value_handle[handle_num]=result->value_handle;\r
-        handle_num++;\r
-        ble_factorytest_store_ota_recv_handle(result->value_handle) ;\r
-        // }\r
-    }\r
-\r
-    bt_uuid_t factorytest_ota_report_uuid = {0};\r
-    bts_data_to_uuid_len2(BLE_UUID_OTA_RX, &factorytest_ota_report_uuid);\r
-\r
-    if (ble_gatts_cmp_uuid(uuid, &factorytest_ota_report_uuid) == true) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "result->factorytest_ota_report_uuid  %d\r\n",result->value_handle);\r
-         Is_value_handle[handle_num]=result->value_handle;\r
-        handle_num++;\r
-        ble_factorytest_store_ota_report_handle(result->value_handle);\r
-        // }\r
-    }\r
-\r
-\r
-    bt_uuid_t ppgtest_report_uuid = {0};\r
-    bts_data_to_uuid_len2(BLE_UUID_PPG_NOTIFY, &ppgtest_report_uuid);\r
-    if (ble_gatts_cmp_uuid(uuid, &ppgtest_report_uuid) == true) {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "result->ble_ppgtest_store_report_handle  %d\r\n",result->value_handle);\r
-        Is_value_handle[handle_num]=result->value_handle;\r
-        handle_num++;\r
-        ble_ppgtest_store_report_handle(result->value_handle);\r
-    }\r
-    \r
-#ifdef SUPPORT_AT_CYWEE\r
-    bt_uuid_t cywee_report_uuid = {0};\r
-    bts_data_to_uuid_len2(BLE_UUID_CYWEE_RX, &cywee_report_uuid);\r
-\r
-    if (ble_gatts_cmp_uuid(uuid, &cywee_report_uuid) == true) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->cywee_report_uuid  %d\r\n",result->value_handle);\r
-\r
-        Is_value_handle[handle_num]=result->value_handle;\r
-        handle_num++;\r
-\r
-        ble_cywee_store_report_handle(result->value_handle);\r
-        // }\r
-\r
-        ble_cywee_store_recv_handle(73);\r
-    }\r
-#endif\r
-    return;\r
-}\r
-\r
-errcode_t svr_ble_bt_gatts_noyify(uint8_t *data, uint16_t data_len)//这里是设备数据上报给app手机端\r
-{\r
-    gatts_ntf_ind_t data_info;\r
-    data_info.attr_handle = g_ble_server_handle;\r
-    data_info.value = data;\r
-    data_info.value_len = data_len;\r
-    if (g_ble_conn_id == 0)\r
-      return 0;\r
-    errcode_t ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
-    uapi_save_runtime_log(RUNTIME_LOG_BLE_WATCH_REPLY);\r
-    if(ret!=ERRCODE_SUCC)\r
-    {\r
-        msleep(50);\r
-        ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
-        uapi_save_runtime_log(RUNTIME_LOG_BLE_WATCH_REPLY);\r
-        if(ret!=ERRCODE_SUCC)\r
-        {\r
-            msleep(100);\r
-            ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
-\r
-            uapi_save_runtime_log(RUNTIME_LOG_BLE_WATCH_REPLY);\r
-\r
-            if(ret!=ERRCODE_SUCC)\r
-            {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,\r
-                g_ble_conn_id, g_ble_server_handle,data_len);\r
-\r
-                // ble_set_ai_Answer_str("BLE NOTIF ERROR",5);\r
-            }\r
-       \r
-        }\r
-    }\r
-    return ret;  \r
-}\r
-\r
-\r
-errcode_t svr_ble_bt_gatts_noyify_zhihui(uint8_t *data, uint16_t data_len)//这里是设备数据上报给app手机端\r
-{\r
-    gatts_ntf_ind_t data_info;\r
-    data_info.attr_handle = data2ae7Cmd;\r
-    data_info.value = data;\r
-    data_info.value_len = data_len;\r
-     if (g_ble_conn_id == 0)\r
-     {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id");\r
-        // return 0;\r
-     }\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id %d g_ble_conn_id %d",g_ble_server_id,g_ble_conn_id);\r
-    errcode_t ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
-    if(ret!=ERRCODE_SUCC)\r
-    {\r
-        msleep(50);\r
-        ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
-        if(ret!=ERRCODE_SUCC)\r
-        {\r
-            msleep(100);\r
-            ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
-\r
-            if(ret!=ERRCODE_SUCC)\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,\r
-                    g_ble_conn_id, g_ble_server_handle,data_len);\r
-        }\r
-    }\r
-    return ret;  \r
-}\r
-\r
-errcode_t svr_ble_bt_gatts_noyify_AI(uint8_t *data, uint16_t data_len)//这里是设备数据上报给app手机端\r
-{\r
-    gatts_ntf_ind_t data_info;\r
-    data_info.attr_handle = data2ae8Cmd;\r
-    data_info.value = data;\r
-    data_info.value_len = data_len;\r
-     if (g_ble_conn_id == 0)\r
-     {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id");\r
-        // return 0;\r
-     }\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id %d g_ble_conn_id %d",g_ble_server_id,g_ble_conn_id);\r
-    errcode_t ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
-    if(ret!=ERRCODE_SUCC)\r
-    {\r
-        msleep(50);\r
-        ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
-        if(ret!=ERRCODE_SUCC)\r
-        {\r
-            msleep(100);\r
-            ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
-\r
-            if(ret!=ERRCODE_SUCC)\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,\r
-                    g_ble_conn_id, g_ble_server_handle,data_len);\r
-        }\r
-    }\r
-    return ret;  \r
-}\r
-\r
-errcode_t svr_ble_read_data_value_updata_noyify(void)//2ae2\r
-{\r
-    gatts_ntf_ind_t data_info;\r
-    data_info.attr_handle = data2ae2Cmd;\r
-    static uint8_t battery_point_val[20] = {0};\r
-    // 获取电池电压值\r
-    float voltage = 0.0F;\r
-    uint8_t power = 0;\r
-    power =battery_get_voltage(&voltage);\r
-    battery_point_val[0] =power;//power ;//power;//电量90\r
-    uint16_t dial = ble_get_dial_id();\r
-    memcpy_s(&battery_point_val[1],2,&dial,2);\r
-\r
-    uint8_t _major,_mid,_minor;\r
-    uapi_get_fw_version(&_major,&_mid,&_minor);\r
-\r
-    battery_point_val[3] = _major;//固件版本号\r
-    battery_point_val[4] = _mid;\r
-    battery_point_val[5] = _minor;\r
-\r
-    bd_addr_t addr_info;\r
-    errcode_t ret = gap_ble_get_local_addr(&addr_info);\r
-    battery_point_val[6] = addr_info.addr[5];\r
-    battery_point_val[7] = addr_info.addr[4];\r
-    battery_point_val[8] = addr_info.addr[3];\r
-    battery_point_val[9] = addr_info.addr[2];\r
-    battery_point_val[10] = addr_info.addr[1];\r
-    battery_point_val[11] = addr_info.addr[0];\r
-\r
-    battery_point_val[12] = 0;//消息推送开关 默认是关闭 0\r
-    battery_point_val[13] = 0;//多媒体开关\r
-    \r
-    #if defined(BOARD_W9) \r
-    battery_point_val[14] = 6;//客户编号\r
-    battery_point_val[15] = 6;//产品编号\r
-    // #elif defined(BOARD_N9) \r
-    // battery_point_val[14] = 7;//客户编号\r
-    // battery_point_val[15] = 7;//产品编号\r
-    #else\r
-    battery_point_val[14] = 5;//客户编号\r
-    battery_point_val[15] = 5;//产品编号\r
-    #endif\r
-\r
-    battery_point_val[16] = 0;//硬件版本号\r
-    battery_point_val[17] = 1;\r
-\r
-    battery_point_val[18] = 0;//ble版本号\r
-    battery_point_val[19] = 1;\r
-\r
-\r
-    data_info.value = battery_point_val;\r
-    data_info.value_len = 20;\r
-\r
-    // if (g_ble_conn_id == 0)\r
-    // return 0;\r
-     \r
-     ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,\r
-        g_ble_conn_id, g_ble_server_handle,20);\r
-    \r
-    return ret;  \r
-}\r
-\r
-errcode_t svr_ble_read_data_value_updata_noyify_test(uint8_t test)//2ae2\r
-{\r
-    gatts_ntf_ind_t data_info;\r
-    data_info.attr_handle = data2ae2Cmd;\r
-    static uint8_t battery_point_val[20] = {0};\r
-\r
-    battery_point_val[0] =test;//power ;//power;//电量90\r
-\r
-    uint16_t dial = ble_get_dial_id();\r
-    memcpy_s(&battery_point_val[1],2,&dial,2);\r
-\r
-    uint8_t _major,_mid,_minor;\r
-    uapi_get_fw_version(&_major,&_mid,&_minor);\r
-\r
-    battery_point_val[3] = _major;//固件版本号\r
-    battery_point_val[4] = _mid;\r
-    battery_point_val[5] = _minor;\r
-\r
-    bd_addr_t addr_info;\r
-    errcode_t ret = gap_ble_get_local_addr(&addr_info);\r
-    battery_point_val[6] = addr_info.addr[5];\r
-    battery_point_val[7] = addr_info.addr[4];\r
-    battery_point_val[8] = addr_info.addr[3];\r
-    battery_point_val[9] = addr_info.addr[2];\r
-    battery_point_val[10] = addr_info.addr[1];\r
-    battery_point_val[11] = addr_info.addr[0];\r
-\r
-    battery_point_val[12] = 0;//消息推送开关 默认是关闭 0\r
-    battery_point_val[13] = 0;//多媒体开关\r
-\r
-    #if defined(BOARD_W9) \r
-    battery_point_val[14] = 6;//客户编号\r
-    battery_point_val[15] = 6;//产品编号\r
-    // #elif defined(BOARD_N9) \r
-    // battery_point_val[14] = 7;//客户编号\r
-    // battery_point_val[15] = 7;//产品编号\r
-    #else\r
-    battery_point_val[14] = 5;//客户编号\r
-    battery_point_val[15] = 5;//产品编号\r
-    #endif\r
-\r
-    battery_point_val[16] = 0;//硬件版本号\r
-    battery_point_val[17] = 1;\r
-\r
-    battery_point_val[18] = 0;//ble版本号\r
-    battery_point_val[19] = 1;\r
-\r
-\r
-    data_info.value = battery_point_val;\r
-    data_info.value_len = 20;\r
-     ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,\r
-        g_ble_conn_id, g_ble_server_handle,20);\r
-    \r
-    return ret;  \r
-}\r
-\r
-static uint8_t flag=1;\r
-static void svr_ble_bt_gatts_req_read_cb(uint8_t server_id, uint16_t conn_id, gatts_req_read_cb_t *read_cb_para,\r
-    errcode_t status)\r
-{\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_req_read_cb ret:is_long:%d %d",read_cb_para->is_long,status);\r
-\r
-    //WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_req_read_cb ret:is_long:%d  2ae2 %d read_cb_para->handle :%d",read_cb_para->is_long,data2ae2Cmd,read_cb_para->handle);\r
-    if(read_cb_para->handle==data2ae2Cmd && get_ble_connect() && status==0 )\r
-    {\r
-        g_ble_conn_id=conn_id;\r
-\r
-    static uint8_t battery_point_val[20] = {0};\r
-    // 获取电池电压值\r
-    float voltage = 0.0F;\r
-    uint8_t power = 0;\r
-    power =battery_get_voltage(&voltage);\r
-    battery_point_val[0] =power;//power ;//power;//电量90\r
-    uint16_t dial = ble_get_dial_id();\r
-    memcpy_s(&battery_point_val[1],2,&dial,2);\r
-\r
-    uint8_t _major,_mid,_minor;\r
-    uapi_get_fw_version(&_major,&_mid,&_minor);\r
-\r
-    battery_point_val[3] = _major;//固件版本号\r
-    battery_point_val[4] = _mid;\r
-    battery_point_val[5] = _minor;\r
-\r
-    bd_addr_t addr_info;\r
-    errcode_t ret = gap_ble_get_local_addr(&addr_info);\r
-    battery_point_val[6] = addr_info.addr[5];\r
-    battery_point_val[7] = addr_info.addr[4];\r
-    battery_point_val[8] = addr_info.addr[3];\r
-    battery_point_val[9] = addr_info.addr[2];\r
-    battery_point_val[10] = addr_info.addr[1];\r
-    battery_point_val[11] = addr_info.addr[0];\r
-\r
-    battery_point_val[12] = 0;//消息推送开关 默认是关闭 0\r
-    battery_point_val[13] = 0;//多媒体开关\r
-\r
-    #if defined(BOARD_W9) \r
-    battery_point_val[14] = 6;//客户编号\r
-    battery_point_val[15] = 6;//产品编号\r
-    // #elif defined(BOARD_N9) \r
-    // battery_point_val[14] = 7;//客户编号\r
-    // battery_point_val[15] = 7;//产品编号\r
-    #else\r
-    battery_point_val[14] = 5;//客户编号\r
-    battery_point_val[15] = 5;//产品编号\r
-    #endif\r
-\r
-    battery_point_val[16] = 0;//硬件版本号\r
-    battery_point_val[17] = 1;\r
-\r
-    battery_point_val[18] = 0;//ble版本号\r
-    battery_point_val[19] = 1;\r
-\r
-    static gatts_ntf_ind_t  gatts_ntf_ind;\r
-    gatts_ntf_ind.attr_handle=read_cb_para->handle;\r
-    gatts_ntf_ind.value=battery_point_val;\r
-    gatts_ntf_ind.value_len=20;\r
-    // read_cb_para->need_rsp=0;\r
-    \r
-    uapi_save_runtime_log(RUNTIME_LOG_BLE_APP_READ);\r
-    gatts_notify_indicate(server_id,conn_id,&gatts_ntf_ind);\r
-    }\r
-}\r
-\r
-\r
-static uint8_t falg = 0;\r
-\r
-\r
-static bool Is_App_ble_handle(uint16_t handle)\r
-{\r
-    for(int i=0;i<handle_max_len;i++)\r
-    {\r
-        if(Is_value_handle[i]==handle)\r
-        return true;\r
-    }\r
-    return false;\r
-\r
-}\r
-\r
-static void svr_ble_bt_gatts_req_write_cb(uint8_t server_id, uint16_t conn_id, gatts_req_write_cb_t *write_cb_para,\r
-    errcode_t status)\r
-{ \r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_ble_server_handle %d conn_id :%d write_cb_para->length:%d write_cb_para->handle %d write_cb_para->request_id:%d",g_ble_server_handle,conn_id,write_cb_para->length,\r
-    write_cb_para->handle,write_cb_para->request_id);\r
-    if(write_cb_para->handle==data2ae0Cmd)\r
-    {\r
-        if(status!=ERRCODE_SUCC)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"ota fial ");\r
-           //如果存在此文件证明ota出现失败过\r
-            FILE *fp= fopen("/user/updata/Ble_ota_file.txt","ab+");\r
-            fwrite("x",1,1,fp);\r
-            fclose(fp);\r
-        }\r
-    }\r
-    if(Is_App_ble_handle(write_cb_para->handle))\r
-    {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," %d %d\r\n",conn_id,write_cb_para->handle);\r
-        g_ble_conn_id=conn_id;\r
-        uapi_save_runtime_log(RUNTIME_LOG_BLE_APP_CMD);\r
-    }\r
-    if(is_alipay_handle(write_cb_para->handle))\r
-    {\r
-        g_ble_Alipay_conn_id=conn_id;\r
-        uapi_save_runtime_log(RUNTIME_LOG_BLE_ALIPAY_CMD);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"g_ble_Alipay_conn_id\r\n");\r
-    }\r
-    // else\r
-    // {\r
-    //     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," ?????\r\n");\r
-    // }\r
-    blesrv_service_recv_msg_handler(write_cb_para->handle,write_cb_para->value,write_cb_para->length);\r
-}\r
-\r
-void ble_test_ANCS(void)\r
-{\r
-    ble_ancs_client_cmd_setup_and_subscribe(g_ble_conn_id);\r
-}\r
-\r
-\r
-void ble_test_ANCS_notify(uint8_t type)\r
-{\r
-    ble_ancs_client_subscribe_notify(g_ble_conn_id,type);\r
-}\r
-\r
-static void svr_ble_mtu_exchange(uint8_t server_id, uint16_t conn_id, uint16_t mtu_size, errcode_t status)\r
-{\r
-    ble_nus_max_data_len = mtu_size-3;\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_mtu_exchange %d %d %d\r\n",server_id,conn_id,mtu_size);\r
-}\r
-/*******************  gap_ble  ************************************/\r
-void svr_gap_ble_auth_complete_callback(uint16_t conn_id, const bd_addr_t *addr, errcode_t status,ble_auth_info_evt_t* evt)\r
-{\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sendParieSuccess");\r
-\r
-\r
-    sendParieSuccess(1,addr);\r
-    uapi_set_br_address(addr);\r
-}\r
-\r
-static bool ble_adv_start=false;\r
-\r
-bool get_ble_adv_status(void)\r
-{\r
-    return ble_adv_start;\r
-}\r
-\r
-static void svr_ble_adv_start_cb(uint8_t adv_id, adv_status_t status)\r
-{\r
-    if (adv_id == BLE_ADV_ID) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"BleAdvStartCallback adv_id: %d, status:%d\n", adv_id, status);\r
-        ble_adv_start=1;\r
-        uapi_save_runtime_log(RUNTIME_LOG_BLE_BROADCAST_ON);\r
-\r
-    }\r
-}\r
-\r
-static void svr_ble_adv_stop_cb(uint8_t adv_id, adv_status_t status)\r
-{\r
-    if (adv_id == BLE_ADV_ID) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"svr_ble_adv_stop_cb adv_id: %d, status:%d\n", adv_id, status);\r
-        ble_adv_start=0;\r
-        uapi_save_runtime_log(RUNTIME_LOG_BLE_BROADCAST_OFF);\r
-    }\r
-}\r
-\r
-\r
-\r
-static void srv_BleAdvTerminateCallback(uint8_t advId, adv_status_t status)\r
-{\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "srv_BleAdvTerminateCallback advId: %d, status:%d\n", advId, status);\r
-\r
-}\r
-void srv_ble_server_register_gap_ble_callbacks(void)//ble基础通讯服务注册回调函数\r
-{\r
-    g_ble_gapble_cbs.conn_state_change_cb = svr_ble_connstate_change_cb;\r
-    g_ble_gapble_cbs.pair_result_cb = svr_pair_result_cbt_cb;\r
-    g_ble_gapble_cbs.terminate_adv_cb =  srv_BleAdvTerminateCallback;\r
-    g_ble_gapble_cbs.auth_complete_cb = svr_gap_ble_auth_complete_callback;\r
-    g_ble_gapble_cbs.start_adv_cb=svr_ble_adv_start_cb;\r
-    g_ble_gapble_cbs.stop_adv_cb=svr_ble_adv_stop_cb;\r
-    g_ble_gapble_cbs.conn_param_update_cb=srv_gap_ble_connect_param_update_callback;\r
-#ifndef SUPPORT_AT_OHOSFWK\r
-    gap_ble_register_callbacks(&g_ble_gapble_cbs);\r
-#else\r
-    wrapper_gap_ble_register_callbacks(&g_ble_gapble_cbs);\r
-#endif\r
-}\r
-void srv_ble_server_register_gatt_callbacks(void)\r
-{\r
-    errcode_t ret = ERRCODE_BT_SUCCESS;\r
-    g_ble_gatts_cbs.add_service_cb = svr_ble_bt_gatts_service_add_cb;\r
-    g_ble_gatts_cbs.add_characteristic_cb = svr_ble_bt_gatts_characteristic_add_cb;\r
-\r
-    g_ble_gatts_cbs.read_request_cb = svr_ble_bt_gatts_req_read_cb;\r
-    g_ble_gatts_cbs.write_request_cb = svr_ble_bt_gatts_req_write_cb;\r
-    g_ble_gatts_cbs.mtu_changed_cb = svr_ble_mtu_exchange;\r
-\r
-#ifndef SUPPORT_AT_OHOSFWK\r
-    gatts_register_callbacks(&g_ble_gatts_cbs);\r
-#else\r
-    wrapper_gatts_register_callbacks(&g_ble_gatts_cbs);\r
-#endif\r
-    return;\r
-}\r
-static uint8_t g_server_id = 0;\r
-static void svr_ble_register_service(void)\r
-{\r
-    uint16_t srevr_id = BLE_SERVICE_UUID;\r
-    uint16_t ser_id = BLE_SERVICE_UUID;\r
-    uint8_t serverId = 0;\r
-    bt_uuid_t uuid;\r
-    errcode_t ret = 0;\r
-    uuid.uuid_len = (uint8_t)sizeof(ser_id);\r
-    memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&ser_id, sizeof(ser_id));\r
-\r
-#ifndef SUPPORT_AT_OHOSFWK\r
-    ret = gatts_register_server(&uuid, &serverId); /* 注册gatt server */\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_register_server ret: 0x%x serverId = 0x%x uuid.uuid_len:%d", ret, serverId,uuid.uuid_len);\r
-#else\r
-    ret = wrapper_gatts_register_server(&uuid, &serverId); /* 注册gatt server */\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "wrapper_gatts_register_server ret: 0x%x serverId = 0x%x uuid.uuid_len:%d", ret, serverId,uuid.uuid_len);\r
-#endif\r
-    g_ble_server_id = serverId;\r
-\r
-    bt_uuid_t ble_service_uuid = {0};\r
-    bts_data_to_uuid_len2(srevr_id, &ble_service_uuid);\r
-\r
-#ifndef SUPPORT_AT_OHOSFWK\r
-    ret = gatts_add_service(serverId, &ble_service_uuid, true);\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_service ret: 0x%x", ret);\r
-#else\r
-    ret = wrapper_gatts_add_service(serverId, &ble_service_uuid, true);\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "wrapper_gatts_add_service ret: 0x%x", ret);\r
-#endif\r
-\r
-   \r
-\r
-    return;\r
-}\r
-bool ble_gatts_cmp_uuid(const bt_uuid_t *tgt_uuid, const bt_uuid_t *src_uuid)//比较源uuid和给定的uuid是否匹配\r
-{\r
-    uint8_t *tgt = (uint8_t *)bts_init_128bit_uuid(tgt_uuid);\r
-    bool result = false;\r
-    if (tgt == NULL) {\r
-        return false;\r
-    }\r
-    uint8_t *src = (uint8_t *)bts_init_128bit_uuid(src_uuid);\r
-    if (src == NULL) {\r
-        bt_os_free(tgt);\r
-        return false;\r
-    }\r
-    if (memcmp(tgt, src, BT_UUID_MAX_LEN) == 0) {\r
-        result = true;\r
-    }\r
-    bt_os_free(src);\r
-    bt_os_free(tgt);\r
-    return result;\r
-}\r
-// extern void alipay_unregist_server(void);\r
-void ble_unregist_server(void)\r
-{\r
-    svr_ble_adv_stop();\r
-    gatts_delete_all_services(g_ble_server_id);\r
-    gatts_unregister_server(g_ble_server_id);\r
-    \r
-}\r
-\r
-\r
-void svr_ble_bluetooth_init(void)\r
-{\r
-    // memset(&phone_addr,0,sizeof(bd_addr_t));\r
-    \r
-    srv_ble_server_register_gap_ble_callbacks();\r
-    srv_ble_server_register_gatt_callbacks();\r
-\r
-    //add server and ble service\r
-    svr_ble_register_service();\r
-    \r
-    #ifdef SUPPORT_HID_SERVICE\r
-    // ble_hid_server_init();\r
-    #endif\r
-    svr_alipay_bluetooth_init(g_ble_server_id);\r
-\r
-    ble_factory_server_init(g_ble_server_id);\r
-    \r
-    ble_ppgtest_server_init(g_ble_server_id);\r
-\r
-#ifdef SUPPORT_AT_CYWEE\r
-    ble_cywee_server_init(g_ble_server_id);\r
-#endif\r
-    gattc_reg_id();\r
-\r
-    g_custom_ble_init_flag = true;\r
-    return;\r
-}\r
-//关闭蓝牙\r
-void custom_ble_service_stop(void)\r
-{\r
-    AdverFlag = false;\r
-    errcode_t ret = 0;\r
-    bd_addr_t addr={0};\r
-    get_phone_addr(&addr,g_ble_conn_id);\r
-\r
-    if(Bleconnect == GAP_BLE_STATE_CONNECTED){//设备连接需要断开\r
-        ret = gap_ble_disconnect_remote_device((const bd_addr_t *)&addr);//与固定的mac设置地址进行断开连接\r
-    }\r
-\r
-    // 一键双连去使能\r
-    ret = gap_ble_set_ctkd_enable(false);\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gap_ble_set_ctkd_disable ret = %u", ret);\r
-    \r
-    svr_ble_adv_stop();//停止广播 不发送广播数据 就是app搜索不到该设备了\r
-    free_ble_data(); //删除所有协议缓存数据\r
-}\r
-\r
-void uapi_ble_disconnect_device()\r
-{\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((const bd_addr_t *)&addr);//与固定的mac设置地址进行断开连接\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gap_ble_disconnect_remote_device ret = %X", ret);\r
-\r
-}\r
-//开启蓝牙\r
-void custom_ble_service_start(void)\r
-{\r
-    AdverFlag = true;\r
-    svr_ble_adv_start_param();\r
-}\r
-\r
-void custom_ble_service_start_(uint8_t data)\r
-{\r
-    AdverFlag = true;\r
-    svr_ble_adv_start_param();\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "custom_ble_service_start_ ");\r
-    gap_br_set_bt_scan_mode(GAP_SCAN_MODE_CONNECTABLE, data);\r
-   \r
-}\r
-#define MODE_BLE_ADV_SRV (0)\r
-#define MODE_ALIPAY_ADV_SRV (1)\r
-void ble_avd_mode_change(uint8_t mode)\r
-{\r
-    \r
-    uint8_t adv_ok = 0;\r
-    switch(mode)\r
-    {\r
-        case MODE_BLE_ADV_SRV:\r
-            \r
-            if(get_ble_connect() && g_ble_conn_id!=0)\r
-            {\r
-                svr_ble_adv_stop();\r
-            }\r
-            break;\r
-        case MODE_ALIPAY_ADV_SRV:\r
-\r
-            \r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"alipay_ble_advd_start!!!!!!!!! ble_adv_falg: %d ,AdverFlag: %d",ble_adv_falg,AdverFlag);\r
-            svr_ble_adv_start(); \r
-          \r
-            break;\r
-        default:\r
-            break;\r
-    }\r
-}\r
-/**=================protocol recv decode service (task)=============================================================================================*/\r
-typedef struct\r
-{\r
-    uint16_t service_handle;\r
-    uint32_t msg_len;\r
-    uint8_t *msg_data;\r
-} blesrv_custom_cmd_t;\r
-\r
-#define MAX_BUF_LEN  sizeof(blesrv_custom_cmd_t) //sizeof(blesrv_custom_cmd_t) /*MTU max 514 , sizeof(blesrv_custom_cmd_t)*/\r
-static unsigned long g_blesrv_queue = 0xFFFFFFFF;\r
-static uint8_t g_blesrv_queue_created = 0;\r
-\r
-void blesrv_service_recv_msg_handler(uint16_t srv_handle, uint8_t * msg_data, uint32_t msg_len)\r
-{\r
-    int ret;\r
-    blesrv_custom_cmd_t blesrv_mail={0};\r
-    if( g_blesrv_queue_created == 0) return ;\r
-    if (msg_data == NULL) return;\r
-\r
-   \r
-    // mail = (blesrv_custom_cmd_t*)malloc(sizeof(blesrv_custom_cmd_t));\r
-    uint32_t sendlen = MAX_BUF_LEN;\r
-\r
-    \r
-    blesrv_mail.service_handle = srv_handle;\r
-    blesrv_mail.msg_len = msg_len;\r
-    blesrv_mail.msg_data = (uint8_t*)malloc(msg_len);\r
-\r
-    if(blesrv_mail.msg_data==NULL)\r
-    {\r
-        return ;\r
-    }\r
-    memcpy_s((blesrv_mail.msg_data),msg_len,msg_data,msg_len);\r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"g_blesrv_queue:%d ble_recv:mail.msg_data %X %02X %02X %02X msg_data:%02X %02X %02X\r\n",\r
-        g_blesrv_queue,\r
-        blesrv_mail.msg_data,\r
-        blesrv_mail.msg_data[0],\r
-        blesrv_mail.msg_data[1],\r
-        blesrv_mail.msg_data[2],\r
-        msg_data[0],\r
-        msg_data[1],\r
-        msg_data[2]\r
-        );\r
-    ret = osal_msg_queue_write_copy(g_blesrv_queue, (void *)&blesrv_mail, sendlen , 0);\r
-\r
-    if (ret != OSAL_SUCCESS)\r
-    {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"Error blesrv Check send failed! err=0x%X! \r\n", ret);\r
-    }\r
-}   \r
-\r
-static void blesrv_service_check_task(void const *arg)\r
-{\r
-    unused(arg);\r
-    int32_t ret;\r
-    blesrv_custom_cmd_t mail={0};\r
-    uint32_t msgsize = MAX_BUF_LEN;\r
-\r
-    while (1)\r
-    {\r
-        ret = osal_msg_queue_read_copy(g_blesrv_queue, (void *)&mail, &msgsize,\r
-                                       OSAL_MSGQ_WAIT_FOREVER);\r
-        if (ret != OSAL_SUCCESS)\r
-        {\r
-            //WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"OSAL_SUCCESS");\r
-            continue;\r
-        }\r
-        \r
-        uint8_t *p_msgbuf = (mail.msg_data);\r
-        uint16_t server_handle = mail.service_handle;\r
-        uint32_t msg_len = mail.msg_len;\r
-\r
-        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"mail.msg_data:%X,g_blesrv_queue:%d ble_recv:%d %d %02X %02X %02X mail.msg_data: %02X %02X %02X\r\n",\r
-        //     mail.msg_data,\r
-        //     g_blesrv_queue,\r
-        //     msg_len,\r
-        //     server_handle,\r
-        //     p_msgbuf[0],\r
-        //     p_msgbuf[1],\r
-        //     p_msgbuf[2],\r
-        //     mail.msg_data[0],\r
-        //     mail.msg_data[1],\r
-        //     mail.msg_data[2]);\r
-\r
-        #if 1\r
-        if (server_handle == get_factory_ate_write_handl()) \r
-        {\r
-            factory_recv_cmd_data(p_msgbuf,msg_len,server_handle);\r
-        }\r
-        else if (server_handle == get_factory_ota_write_handl())\r
-        {\r
-            factory_recv_ota_data(p_msgbuf,msg_len,server_handle);\r
-        }\r
-\r
-#ifdef SUPPORT_AT_CYWEE\r
-        else if (server_handle == get_cywee_ate_write_handl())\r
-        {\r
-            cywee_recv_cmd_data(p_msgbuf,msg_len,server_handle);\r
-        }\r
-#endif\r
-        // else if(server_handle == alipay_handle)\r
-        // {\r
-        //     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"alipay wirte!!!!!");\r
-        //     // // svr_alipay_bt_gatts_noyify(buf,5);\r
-        //     // errcode_t ret = svr_alipay_msg_write(ALIPAY_MSG_BT, p_msgbuf, msg_len, false);\r
-\r
-        // }\r
-        else{\r
-            revBleOldData(p_msgbuf,msg_len,server_handle);\r
-        }\r
-        #endif\r
-        if(mail.msg_data)\r
-        {\r
-            free(mail.msg_data);\r
-            mail.msg_data = NULL;\r
-        }\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"ble_recv:end\r\n");\r
-    }\r
-}\r
-#define BLESRV_APP_BOARD_MSG_COUNT 256\r
-#define BLESRV_APP_BOARD_TASK_SIZE 0x3000\r
-#define BLESRV_BOARD_TASK_PRIO 7\r
-void create_blesrv_queue(void)\r
-{\r
-    if (osal_msg_queue_create("blesrv_service_queue", BLESRV_APP_BOARD_MSG_COUNT, &g_blesrv_queue,\r
-                              0, MAX_BUF_LEN) != ERRCODE_SUCC)\r
-    {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"[blesrv][service] app create mail fail g_blesrv_queue:%d\n",g_blesrv_queue);\r
-        g_blesrv_queue_created = 0;\r
-    }else{\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"[blesrv][service] app create mail success g_blesrv_queue:%d\n",g_blesrv_queue);\r
-        g_blesrv_queue_created = 1;\r
-    }\r
-\r
-}\r
-errcode_t uapi_blesrv_service_init(void)\r
-{\r
-\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"uapi_blesrv_service_init !\r\n");\r
-    app_task_definition_t taskcfg = {0};\r
-    taskcfg.create_queue_handle = create_blesrv_queue;\r
-    taskcfg.attr.name = "blesrv_recv_service";\r
-    taskcfg.attr.priority = osPriorityNormal;\r
-    taskcfg.attr.stack_size = BLESRV_APP_BOARD_TASK_SIZE;\r
-    taskcfg.func = blesrv_service_check_task;\r
-    taskcfg.use_mem = USE_EXTEND_MEM;\r
-\r
-    errcode_t ret = uapi_create_osThread_custom(&taskcfg);\r
-    if (ret != ERRCODE_SUCC)\r
-    {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"create blesrv_service failed %d!\r\n", ret);\r
-        return ERRCODE_FAIL;\r
-    }\r
-\r
-    return ERRCODE_SUCC;\r
-}\r
-\r
-\r
-void send_pair_succ(bd_addr_t *addr)\r
-{\r
-    sendParieSuccess(1,addr);\r
-}\r
-\r
- static uint8_t get_ble_Check_adv_status_falg=0;\r
-\r
-void Check_ble_adv_status(void)\r
-{\r
-\r
-    if(get_ble_connect())\r
-    {\r
-        \r
-        return;\r
-    }\r
-    else\r
-    {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"get_ble_adv_status %s \n", get_ble_adv_status()?"true":"fales");\r
-       \r
-        if(get_ble_adv_status()==0)\r
-        {\r
-            get_ble_Check_adv_status_falg++;\r
-            if(AdverFlag && get_ble_Check_adv_status_falg>=3)\r
-            {\r
-                if(uapi_dev_runtime_get_factory_test_status_flag())\r
-                svr_ble_adv_factory_test_start_param();\r
-                else\r
-                svr_ble_adv_start_param(); \r
-            }\r
-        }\r
-        else\r
-        {\r
-            get_ble_Check_adv_status_falg=0;\r
-        }\r
-    }\r
-    return;\r
-}\r
-\r
-static unsigned long g_ble_Ai_record_queue = 0xFFFFFFFF;\r
-static uint8_t g_ble_Ai_record_queue_created = 0;\r
-\r
-void create_Ai_record_queue(void)\r
-{\r
-    if (osal_msg_queue_create("Ai_record_queue", BLESRV_APP_BOARD_MSG_COUNT, &g_ble_Ai_record_queue,\r
-                              0, MAX_BUF_LEN) != ERRCODE_SUCC)\r
-    {\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"[blesrv][service] app create mail fail g_blesrv_queue:%d\n",g_ble_Ai_record_queue);\r
-        g_ble_Ai_record_queue_created = 0;\r
-    }else{\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"[blesrv][service] app create mail success g_blesrv_queue:%d\n",g_ble_Ai_record_queue);\r
-        g_ble_Ai_record_queue_created = 1;\r
-    }\r
-\r
-}\r
-\r
-\r
-#define Ai_TEST 0\r
-static uint32_t AI_data_count=0;\r
-\r
-\r
-static uint8_t AI_interval=5;\r
-\r
-void set_AI_interval(uint8_t data)\r
-{\r
-    AI_interval=data;\r
-}\r
-\r
-void send_Ai_record(uint16_t len,uint8_t *data,uint32_t count)\r
-{\r
-    uint8_t ai_buf[SDK_BLE_MTU_MAX]={0};\r
-    if(count)\r
-    {\r
-        \r
-        memcpy_s(ai_buf,SDK_BLE_MTU_MAX,&count,4);\r
-        memcpy_s(&ai_buf[4],SDK_BLE_MTU_MAX-4,data,len);\r
-        len+=4;\r
-    }\r
-    else\r
-    {\r
-        memcpy_s(ai_buf,SDK_BLE_MTU_MAX,data,len);\r
-    }\r
-   \r
-    svr_ble_bt_gatts_noyify_AI(ai_buf,len);\r
-\r
-    LOS_Msleep(AI_interval+get_ble_interval());\r
-}\r
-\r
-static void blesrvAi_send_service_task(void const *arg)\r
-{\r
-    unused(arg);\r
-    int32_t ret;\r
-    blesrv_custom_cmd_t mail={0};\r
-    uint32_t msgsize = MAX_BUF_LEN;\r
-\r
-    #if Ai_TEST\r
-        FILE* fp= fopen("user/airecord.pcm","wb+");\r
-    #endif\r
-    while (1)\r
-    {\r
-        ret = osal_msg_queue_read_copy(g_ble_Ai_record_queue, (void *)&mail, &msgsize,\r
-                                       OSAL_MSGQ_WAIT_FOREVER);\r
-        if (ret != OSAL_SUCCESS)\r
-        {\r
-            continue;\r
-        }\r
-        \r
-\r
-        uint8_t *p_msgbuf = (mail.msg_data);\r
-        uint16_t server_handle = mail.service_handle;\r
-        uint32_t msg_len = mail.msg_len;\r
-\r
-        if(server_handle==1 || server_handle==2)\r
-        {\r
-            AI_data_count=0;\r
-        }\r
-        else\r
-        {\r
-            AI_data_count++;\r
-        }\r
-\r
-        #if Ai_TEST\r
-            fwrite(fp,1,mail.msg_len,mail.msg_data);\r
-        #endif\r
-        // if(get_ble_connect())\r
-        \r
-\r
-        if(getselect4gorbtai() == 1) //选择的是4g\r
-        {\r
-            if(get_clear_queue_stream())\r
-            {\r
-                // osal_msg_queue_write_head_copy(g_ble_Ai_record_queue, (void *)&mail,sizeof(blesrv_custom_cmd_t), 0);\r
-                int quesize = osal_msg_queue_get_msg_num(g_ble_Ai_record_queue);\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_MAIN_SERVICE,"osal_msg_queue_get_msg_num %d\n",quesize);\r
-                while(quesize)\r
-                {\r
-                    ret = osal_msg_queue_read_copy(g_ble_Ai_record_queue, (void *)&mail, &msgsize,\r
-                                        OSAL_MSGQ_WAIT_FOREVER);\r
-                    if (ret != OSAL_SUCCESS)\r
-                    {\r
-                        continue;\r
-                    }\r
-                    if(mail.msg_data)\r
-                    {\r
-                        free(mail.msg_data);\r
-                        mail.msg_data = NULL;\r
-                    }\r
-                    quesize--;\r
-                }\r
-                set_clear_queue_stream(0);\r
-            }\r
-            if(mail.msg_data && mail.msg_len!=0)\r
-            {\r
-                if(server_handle == 200 ||server_handle == 201 )\r
-                {\r
-                    if(server_handle == 201)\r
-                    {\r
-                        AIStreamWrite(NULL,1);\r
-                    }\r
-                    else\r
-                    {\r
-                        AIStreamWrite(mail.msg_data,mail.msg_len);\r
-                    }\r
-                    \r
-                }\r
-                else{\r
-                    if(server_handle==2)\r
-                    {\r
-                        uapi_stop_asr();\r
-                    }\r
-                    else\r
-                    {\r
-                        send_ai_bin(mail.msg_data,mail.msg_len);\r
-                    }\r
-                    \r
-                }\r
-            }\r
-        }\r
-        else //蓝牙\r
-        {\r
-            if(mail.msg_data && mail.msg_len!=0)\r
-            {\r
-                send_Ai_record(mail.msg_len,mail.msg_data,AI_data_count);\r
-            }\r
-        }\r
-            \r
-\r
-        if(mail.msg_data)\r
-        {\r
-            free(mail.msg_data);\r
-            mail.msg_data = NULL;\r
-        }\r
-        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"ble_recv:end\r\n");\r
-    }\r
-}\r
-\r
-\r
-static blesrv_custom_cmd_t g_blesrv_mail={0};\r
-\r
-errcode_t uapi_Ai_send_service_init(void)\r
-{\r
-\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"uapi_blesrv_service_init !\r\n");\r
-    app_task_definition_t taskcfg = {0};\r
-    taskcfg.create_queue_handle = create_Ai_record_queue;\r
-    taskcfg.attr.name = "Ai_record_queue_service";\r
-    taskcfg.attr.priority = osPriorityNormal;\r
-    // taskcfg.attr.stack_size = BLESRV_APP_BOARD_TASK_SIZE;\r
-    taskcfg.attr.stack_size = 0x4000;\r
-    taskcfg.func = blesrvAi_send_service_task;\r
-    taskcfg.use_mem = USE_EXTEND_MEM;\r
-\r
-    g_blesrv_mail.msg_len=0;\r
-    g_blesrv_mail.msg_data=NULL;\r
-\r
-\r
-    errcode_t ret = uapi_create_osThread_custom(&taskcfg);\r
-    if (ret != ERRCODE_SUCC)\r
-    {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"create blesrv_service failed %d!\r\n", ret);\r
-        return ERRCODE_FAIL;\r
-    }\r
-\r
-    return ERRCODE_SUCC;\r
-}\r
-\r
-\r
-uint32_t send_msg_data_into_Ai_msg_queue_count=0;\r
-\r
-\r
-void AI_data_assembly(uint8_t type,uint8_t *buf,uint8_t aitype)\r
-{\r
-   \r
-    memset_s(buf,ble_nus_max_data_len,0,19);\r
-    // 设置消息头部信息\r
-    buf[0] = 0x72; // 消息头\r
-    buf[1] = 0x08; // 类型\r
-    if(type)\r
-    buf[2] = 0x01; // 类型ID\r
-    else\r
-    buf[2] = 0x02; // 类型ID\r
-    uint32_t temp_data=1;\r
-    memcpy(buf + 3, &temp_data, 4); // 总包数\r
-    memcpy(buf + 7, &temp_data, 4); // 总数据长度\r
-    memcpy(buf + 11, &temp_data, 4); // 数据包ID\r
-    memcpy(buf + 15, &temp_data, 2); // 包数据长度\r
-    \r
-    buf[17] = aitype;\r
-    buf[18] = Calculate_CRC_AI(buf,18);; // 计算CRC\r
-}\r
-\r
-static uint8_t g_blesrv_mail_flag=0;\r
-\r
-#define OSAL_INVALID_MSG_NUM 0xFFFFFFFF\r
-#define QUEUE_FULL_THRESHOLD 0.8f  // 80% 阈值\r
-// 判断AI消息队列是否接近满(超过阈值)\r
-int get_ai_osal_msg_queue_is_full(void)\r
-{\r
-    // 检查队列有效性\r
-    if (g_ble_Ai_record_queue == 0) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "invalid queue id");\r
-        return -1;  // 队列无效\r
-    }\r
-\r
-    // 获取当前消息数\r
-    unsigned int current_num = osal_msg_queue_get_msg_num(g_ble_Ai_record_queue);\r
-    if (current_num ==  OSAL_INVALID_MSG_NUM) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "get msg num failed");\r
-        return -1;  // 获取失败\r
-    }\r
-\r
-    // 计算占比,超过阈值则视为“即将满”\r
-    float ratio = (float)current_num / BLESRV_APP_BOARD_MSG_COUNT;\r
-    if (ratio >= QUEUE_FULL_THRESHOLD) {\r
-        return 1;  // 达到或超过阈值(接近满)\r
-    } else {\r
-        return 0;  // 未达阈值(未满)\r
-    }\r
-}\r
-\r
-int send_msg_data_into_Ai_msg_queue(void *buff,uint16_t len,uint8_t type)\r
-{\r
-    blesrv_custom_cmd_t blesrv_mail={0};\r
-     uint32_t ret ;\r
-    if( g_blesrv_queue_created == 0) return ERRCODE_FAIL;\r
-    if (buff == NULL) return ERRCODE_FAIL;\r
-\r
-    uint32_t sendlen = sizeof(blesrv_custom_cmd_t);\r
-    // uint32_t singlebuflen= ble_nus_max_data_len-20;\r
-    uint32_t singlebuflen = 0;\r
-    if(getselect4gorbtai() == 1) {\r
-        singlebuflen = 288*4;//4G\r
-    } else {\r
-        singlebuflen = ble_nus_max_data_len-20;//BT\r
-    }\r
-    blesrv_mail.msg_data=0;\r
-\r
-    if(type == 200 || type == 201)\r
-    {\r
-    \r
-        blesrv_mail.service_handle = type;\r
-        blesrv_mail.msg_len = len;\r
-        blesrv_mail.msg_data = (uint8_t*)malloc(len);\r
-\r
-        if(blesrv_mail.msg_data==NULL)\r
-        {\r
-            return  ERRCODE_FAIL;\r
-        }\r
-        memcpy_s((void *)(blesrv_mail.msg_data),len,buff,len);\r
-\r
-        const static int QUEUE_RETRY_DELAY_MS =  50;      // 重试间隔(ms)\r
-        // 检查队列是否已满(提前判断,减少失败概率)\r
-        if (osal_msg_queue_is_full(g_ble_Ai_record_queue)) {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "queue is full");\r
-            osal_msleep(QUEUE_RETRY_DELAY_MS);  // 等待队列消费\r
-        }\r
-        ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);\r
-        if (ret != OSAL_SUCCESS)\r
-        {\r
-            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);\r
-            osal_msleep(QUEUE_RETRY_DELAY_MS);  // 等待队列消费\r
-            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);\r
-            if (ret != OSAL_SUCCESS)\r
-            {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"retry len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);    \r
-            }\r
-        }\r
-        return OSAL_SUCCESS;\r
-        \r
-    }\r
-    if(len<=singlebuflen)\r
-    {\r
-        if(type==1)\r
-        {\r
-            blesrv_mail.service_handle = 1;\r
-            blesrv_mail.msg_len = len;\r
-            blesrv_mail.msg_data = (uint8_t*)malloc(len);\r
-\r
-            if(blesrv_mail.msg_data==NULL)\r
-            {\r
-                return  ERRCODE_FAIL;\r
-            }\r
-            memcpy_s((void *)(blesrv_mail.msg_data),len,buff,len);\r
-\r
-            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);\r
-            if (ret != OSAL_SUCCESS)\r
-            {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);\r
-            }\r
-\r
-            if(g_blesrv_mail.msg_data)\r
-            {\r
-                free(g_blesrv_mail.msg_data);\r
-                g_blesrv_mail.msg_data=NULL;\r
-                g_blesrv_mail.msg_len=0;\r
-            }\r
-            return OSAL_SUCCESS;\r
-\r
-        }\r
-        else if(type==2)\r
-        {\r
-\r
-             blesrv_custom_cmd_t blesrv_mail_end={0};\r
-\r
-            if(g_blesrv_mail.msg_len!=0 && g_blesrv_mail.msg_data!=NULL)\r
-            {\r
-                blesrv_mail_end.msg_len=g_blesrv_mail.msg_len;\r
-                blesrv_mail_end.msg_data=malloc(g_blesrv_mail.msg_len);\r
-                if(blesrv_mail_end.msg_data==NULL)\r
-                {\r
-                    return  ERRCODE_FAIL;\r
-                }\r
-\r
-                memcpy_s( blesrv_mail_end.msg_data,singlebuflen,g_blesrv_mail.msg_data,g_blesrv_mail.msg_len);\r
-                free(g_blesrv_mail.msg_data);\r
-                g_blesrv_mail.msg_data=NULL;\r
-                g_blesrv_mail.msg_len=0;\r
-\r
-                ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail_end, sendlen , 0);\r
-                if (ret != OSAL_SUCCESS)\r
-                {\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);\r
-                }\r
-                \r
-            }\r
-\r
-            \r
-           \r
-\r
-            blesrv_mail.service_handle = 2;\r
-            blesrv_mail.msg_len = len;\r
-            blesrv_mail.msg_data = (uint8_t*)malloc(len);\r
-\r
-            if(blesrv_mail.msg_data==NULL)\r
-            {\r
-                return  ERRCODE_FAIL;\r
-            }\r
-            memcpy_s((void *)(blesrv_mail.msg_data),len,buff,len);\r
-\r
-            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);\r
-            if (ret != OSAL_SUCCESS)\r
-            {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);\r
-            }\r
-            return OSAL_SUCCESS;\r
-        }\r
-        //以下为文件数据处理\r
-        if(g_blesrv_mail.msg_len+len<singlebuflen)\r
-        {\r
-           if (g_blesrv_mail.msg_len!=0 || g_blesrv_mail.msg_data!=NULL)\r
-           {\r
-                // g_blesrv_mail.msg_data=realloc( g_blesrv_mail.msg_data,g_blesrv_mail.msg_len+len);\r
-                uint8_t* temp_g_blesrv_mail_msg_data=malloc(g_blesrv_mail.msg_len+len);\r
-                if(temp_g_blesrv_mail_msg_data==NULL)\r
-                {\r
-                    return  ERRCODE_FAIL;\r
-                }\r
-                memcpy_s(temp_g_blesrv_mail_msg_data+ g_blesrv_mail.msg_len,singlebuflen,buff,len);\r
-                memcpy_s(temp_g_blesrv_mail_msg_data,singlebuflen,g_blesrv_mail.msg_data,g_blesrv_mail.msg_len);\r
-\r
-                free(g_blesrv_mail.msg_data);\r
-                g_blesrv_mail.msg_data=temp_g_blesrv_mail_msg_data;\r
-                g_blesrv_mail.msg_len+=len;\r
-           }\r
-           else\r
-           {\r
-                g_blesrv_mail.msg_data=malloc(len);\r
-                if(g_blesrv_mail.msg_data==NULL)\r
-                {\r
-                    return  ERRCODE_FAIL;\r
-                }\r
-\r
-                memcpy_s(g_blesrv_mail.msg_data+ g_blesrv_mail.msg_len,singlebuflen,buff,len);\r
-                g_blesrv_mail.msg_len=len;\r
-           }\r
-           \r
-            \r
-            return OSAL_SUCCESS;\r
-        }\r
-        else if(g_blesrv_mail.msg_len+len==singlebuflen)\r
-        {\r
-            // g_blesrv_mail.msg_data=realloc( g_blesrv_mail.msg_data,g_blesrv_mail.msg_len+len);\r
-\r
-            blesrv_mail.msg_len = singlebuflen;\r
-            blesrv_mail.msg_data = (uint8_t*)malloc(singlebuflen);\r
-             if(blesrv_mail.msg_data==NULL)\r
-            {\r
-                return  ERRCODE_FAIL;\r
-            }\r
-\r
-            memcpy_s( blesrv_mail.msg_data,singlebuflen,g_blesrv_mail.msg_data,g_blesrv_mail.msg_len);\r
-            memcpy_s( blesrv_mail.msg_data+ g_blesrv_mail.msg_len,singlebuflen,buff,len);\r
-\r
-            g_blesrv_mail.msg_len=0;\r
-            free( g_blesrv_mail.msg_data);\r
-            g_blesrv_mail.msg_data=NULL;\r
-\r
-            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);\r
-            if (ret != OSAL_SUCCESS)\r
-            {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);\r
-            }\r
-            return OSAL_SUCCESS; \r
-\r
-        }\r
-        else\r
-        {\r
-            if(g_blesrv_mail.msg_len!=0 && g_blesrv_mail.msg_data!=NULL)\r
-            {\r
-                blesrv_mail.msg_len=g_blesrv_mail.msg_len;\r
-                blesrv_mail.msg_data=malloc(g_blesrv_mail.msg_len);\r
-                if(blesrv_mail.msg_data==NULL)\r
-                {\r
-                    return  ERRCODE_FAIL;\r
-                }\r
-                \r
-                memcpy_s( blesrv_mail.msg_data,singlebuflen,g_blesrv_mail.msg_data,g_blesrv_mail.msg_len);\r
-                free(g_blesrv_mail.msg_data);\r
-\r
-                ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);\r
-                if (ret != OSAL_SUCCESS)\r
-                {\r
-                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);\r
-                }\r
-\r
-            }\r
-        \r
-            g_blesrv_mail.msg_len=len;\r
-            g_blesrv_mail.msg_data=malloc(len);\r
-            memcpy_s( g_blesrv_mail.msg_data,singlebuflen,buff,len);\r
-     \r
-           \r
-            return OSAL_SUCCESS; \r
-        }\r
-\r
-    }\r
-    else\r
-    {\r
-        uint8_t count=len/singlebuflen;\r
-        if(len%singlebuflen)\r
-        {\r
-            count++;\r
-        }\r
-        uint16_t residue_len=len;\r
-        for(int i=0;i<count;i++)\r
-        {\r
-            blesrv_mail.service_handle = 0;\r
-            if(residue_len>=singlebuflen)\r
-            {\r
-                blesrv_mail.msg_len = singlebuflen;\r
-                blesrv_mail.msg_data = (uint8_t*)malloc(singlebuflen);\r
-                \r
-                if(blesrv_mail.msg_data==NULL)\r
-                {\r
-                    return ERRCODE_FAIL;\r
-                }\r
-                memcpy_s((void *)(blesrv_mail.msg_data),singlebuflen,buff+i*singlebuflen,singlebuflen);\r
-                residue_len-=singlebuflen;\r
-            }\r
-            else if(len%singlebuflen)\r
-            {\r
-                blesrv_mail.msg_len = len%singlebuflen;\r
-                blesrv_mail.msg_data = (uint8_t*)malloc( len%singlebuflen);\r
-                \r
-                if(blesrv_mail.msg_data==NULL)\r
-                {\r
-                    return ERRCODE_FAIL;\r
-                }\r
-                memcpy_s((void *)(blesrv_mail.msg_data),len%singlebuflen,buff+i*singlebuflen,len%singlebuflen);\r
-            }\r
-          \r
-\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"g_blesrv_queue:%d ble_recv:mail.msg_data %X %02X %02X %02X msg_data:%02X %02X %02X\r\n",\r
-                g_ble_Ai_record_queue,\r
-                blesrv_mail.msg_data,\r
-                blesrv_mail.msg_data[0],\r
-                blesrv_mail.msg_data[1],\r
-                blesrv_mail.msg_data[2],\r
-                msg_data[0],\r
-                msg_data[1],\r
-                msg_data[2]\r
-                );\r
-            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);\r
-            if (ret != OSAL_SUCCESS)\r
-            {\r
-                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"else Error blesrv Check send failed! err=0x%X %d %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count,len);\r
-            }\r
-        }\r
-    }\r
-  \r
-   \r
-    return ret;\r
-}\r
-\r
-//获取设备是否有网(4G,蓝牙)\r
-bool uapi_is_device_online(void)\r
-{\r
-    bool isbleconnected = get_ble_connect(); // 获取蓝牙连接状态\r
-    bool is4Gconnected = uapi_dev_runtime_get_cat1_networkstat(); // 获取4G连接状态\r
-    if(isbleconnected || is4Gconnected)\r
-    {\r
-        return true;\r
-    }\r
-    else\r
-    {\r
-        return false;\r
-    }\r
-}\r
-\r
-\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_le_gap.h"
+#include "bts_br_gap.h"
+#include "battery_hal.h"
+#include "bleService.h"
+#include "alipay_feature.h"
+#include "alipay_bluetooth.h"
+#include "bts_a2dp_sink.h"
+#include "osal_timer.h"
+#include "bleEvent.h"
+#include "hidService.h"
+#include "factorytestService.h"
+#include "ppgBleService.h"
+#include "build_version.h"
+#include "custom_runtime.h"
+#include "custom_utils.h"
+#include "bletest.h"
+#include "ConfigModelC.h"
+#ifdef SUPPORT_AT_CYWEE
+#include "cywee_ble_Service.h"
+#endif
+#ifdef SUPPORT_AT_OHOSFWK
+#include "BluetoothWrapper.h"
+#endif
+#include "custom_save_runtime.h"
+#include "aivoice/include/AiVoiceModelC.h"
+#include "voice_call_volte_sample_wrapper.h"
+#include "cat1_ws.h"
+
+// extern void bts_data_to_uuid_len2(uint16_t uuid_data, bt_uuid_t *out_uuid);
+// extern void bts_init_128bit_uuid(const bt_uuid_t *uuid);
+// #include "ble_hid_take_photo_server.h"
+/* Gatt service UUID */
+#define BLE_SERVICE_UUID 0x18e0
+/* Gatt Characteristic UUID */
+//自定义 ota 文件传输特征值
+#define BLE_ZHIHUI_OTA_ID 0x2ae6
+#define BLE_ZHIHUI_OTA_REPLY_ID 0x2ae7
+
+#define BLE_ZHIHUI_AI_ID 0x2ae8
+
+#define BLE_CHARACTERISTIC_RECV_ID 0x2ae5
+#define BLE_CHARACTERISTIC_SNED_SHORT_ID 0x2ae3
+
+#define BLE_CHARACTERISTIC_SNED_LONG_ID 0x2ae4
+#define BLE_CHARACTERISTIC_SNED_OTA_ID 0x2ae0
+#define BLE_CHARACTERISTIC_SNED_ANDRIOD_ID 0x2ae1
+#define BLE_CHARACTERISTIC_READ_BATTERY_ID 0x2ae2
+/* Client Characteristic Configuration UUID */
+#define BLE_UUID_CLIENT_CHARACTERISTIC_CONF 0x2902
+/*user Characteristic Configuration UUID*/
+#define BLE_UUID_USER_CHARACTERISTIC_CONF 0x2901
+/* Gatt Characteristic max length */
+#define BLE_CHARACTERISTIC_MAX_LENGTH 256
+#define BLE_ADV_ID 1
+#define BLE_ADV_DATA_MAX_LENGTH 31
+#define BLE_ADV_BLE_NAME_MAX_LENGTH 31 // 31-4-2-3-9 = 13
+#define BLE_NAME_LENGTH 32
+#define BLE_ADV_MAC_HEAD_LENTH 4
+#define BLE_ADV_MAC_LENTH 10
+#define BLE_SCAN_DATA_LENTH 31 //扫描数据
+#define BLE_ADV_TYPE_LENTH 3
+#define BLE_ADV_UUID_LENTH 4
+
+#define BLE_DEFAULT_NAME_LEN 32
+#define BLE_MAC_MAX_LEN 6 //蓝牙mac地址最大个数6个
+
+
+
+#define SWAP_U16(x) ((uint16_t)((((uint16_t)(x) & (uint16_t)0x00ffU) << 8) | \
+                    (((uint16_t)(x) & (uint16_t)0xff00U) >> 8)))
+
+static uint8_t exit_alipay_gui = 0;
+//  蓝牙模块全局变量
+static gap_ble_callbacks_t g_ble_gapble_cbs;
+static gatts_callbacks_t g_ble_gatts_cbs;
+static gap_call_backs_t g_btGapCallBacks;
+
+
+static bool g_ble_adv_start_state = false;
+uint16_t g_ble_server_id = 1;
+
+static uint16_t g_ble_read_handle = 0;
+uint16_t g_ble_conn_id = 0;
+uint16_t g_ble_Alipay_conn_id = 0;
+uint16_t g_ble_server_handle = 0;
+static uint8_t g_ble_character_buf[BLE_CHARACTERISTIC_MAX_LENGTH] = {0};
+static const uint8_t ble_adv_type[BLE_ADV_TYPE_LENTH] = {2, 1, 0xA};
+static const uint8_t ble_adv_uuid[BLE_ADV_UUID_LENTH] = {0x3, 0x3, 0xe0, 0x18};
+static const uint8_t ble_adv_tx[4] = {0x03,0x03,0xe0,0x18};
+static bool AdverFlag = false;
+
+static uint8_t scan_data[BLE_SCAN_DATA_LENTH] = {0};
+
+uint8_t phone_mac_data[6]={0};
+
+#define ble_add_max_num 10
+static bd_addr_t phone_addr[ble_add_max_num]={0};
+static uint16_t ble_conn_id[ble_add_max_num]={0};
+
+
+bd_addr_t disconect_addr;//断开连接地址不需要反序
+
+uint8_t Bleconnect = 0;//蓝牙默认是断开 0 1 为连接
+uint8_t devpair_state = 0;//设备配对状态 0 未配对 1已配对成功
+uint8_t bond_flag = 0;//绑定标识
+uint16_t ble_nus_max_data_len = SDK_BLE_MTU_MIN - 3; 
+
+uint16_t data2ae3Cmd = 0;//2ae3短指令特征值
+uint16_t data2ae4Cmd = 0;
+uint16_t data2ae5Cmd = 0;
+uint16_t data2ae2Cmd = 0;//read
+uint16_t data2ae1Cmd = 0;//安卓消息来电
+uint16_t data2ae0Cmd = 0;//OTA
+uint16_t data2ae6Cmd = 0;//自定义OTA 
+uint16_t data2ae7Cmd = 0;//自定义OTA 
+uint16_t data2ae8Cmd = 0;//AI
+
+#define handle_max_len 40
+
+static uint16_t Is_value_handle[handle_max_len]={0};
+
+static uint32_t handle_num=0;
+
+
+void get_phone_addr(bd_addr_t *addr,uint16_t conn_id)
+{
+    if (addr==NULL)
+    return;
+
+    for(int i=0;i<ble_add_max_num;i++)
+    {
+        if(conn_id==ble_conn_id[i])
+        {
+            memcpy(addr,&phone_addr[i],sizeof(bd_addr_t));
+        }
+    }
+    
+}
+static uint16_t add_num=0;
+
+static void set_phone_info(bd_addr_t *addr,uint16_t conn_id)//保存手机信息 包含手机mac地址
+{
+    memcpy(&phone_addr[add_num],addr,sizeof(bd_addr_t));
+    ble_conn_id[add_num]=conn_id;
+
+    add_num++;
+    if(add_num==ble_add_max_num)
+    {
+        add_num=0;
+    }
+}
+
+
+static void clean_phone_info(uint16_t conn_id)//保存手机信息 包含手机mac地址
+{
+   for(int i=0;i<ble_add_max_num;i++)
+   {
+        if(conn_id==ble_conn_id[i])
+        {
+            bd_addr_t addr={0};
+            memcpy(&phone_addr[i],&addr,sizeof(bd_addr_t));
+            ble_conn_id[i]=0;
+            return;
+        }
+   }
+}
+
+
+bool get_ble_connect(void)//保存手机信息 包含手机mac地址
+{
+   for(int i=0;i<ble_add_max_num;i++)
+   {
+        if(ble_conn_id[i]!=0)
+        {
+            return true;
+        }
+   }
+   return false;
+}
+
+bool get_Alipay_ble_connect(void)//保存手机信息 包含手机mac地址
+{
+    uint8_t connect=0;
+   for(int i=0;i<ble_add_max_num;i++)
+   {
+        if(ble_conn_id[i]!=0)
+        {
+            if(g_ble_Alipay_conn_id==ble_conn_id[i])
+            return true;
+        }
+   }
+
+   {
+        return false;
+   }
+
+}
+
+enum{
+    BLE_CHARACTERISTIC_RECV_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_NOTIFY|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP|GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_READ,
+    BLE_CHARACTERISTIC_SNED_SHORT_ID_PROPERTIES =  GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,
+    BLE_CHARACTERISTIC_SNED_LONG_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,
+    BLE_CHARACTERISTIC_SNED_OTA_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,
+    BLE_CHARACTERISTIC_SNED_ANDRIOD_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,
+    BLE_CHARACTERISTIC_READ_BATTERY_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_READ|GATT_CHARACTER_PROPERTY_BIT_NOTIFY,
+    BLE_ZHIHUI_OTA_ID_ID_PROPERTIES=GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,
+    BLE_ZHIHUI_AI_ID_ID_PROPERTIES=GATT_CHARACTER_PROPERTY_BIT_NOTIFY|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP|GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_READ,
+    BLE_ZHIHUI_OTA_REPLY_ID_PROPERTIES=GATT_CHARACTER_PROPERTY_BIT_NOTIFY|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP|GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_READ,
+};
+static uint8_t ble_adv_falg = 0;
+static bool g_custom_ble_init_flag = false;
+
+errcode_t svr_ble_adv_stop(void)
+{
+    ble_adv_falg = 0;
+    return gap_ble_stop_adv(BLE_ADV_ID);
+}
+void svr_ble_adv_start(void)
+{
+    ble_adv_falg = 1;
+    if(AdverFlag==true)
+    gap_ble_start_adv(BLE_ADV_ID);
+}
+
+
+void br_adv_start(uint8_t sec)
+{
+    //ble广播开启
+    svr_ble_adv_start_param();
+
+    if(!get_br_is_pair())
+    { 
+
+    }
+}
+
+void br_adv_stop(void)
+{
+    gap_br_set_bt_scan_mode(GAP_SCAN_MODE_NONE, 0);
+}
+//留档保存,方便后面查看此数据是否正确
+static uint8_t save_adv_data[BLE_ADV_DATA_MAX_LENGTH] = {0};
+
+void get_adv_data(char *data)
+{
+    uint32_t data_len=0;
+    for(int i=0;i<BLE_ADV_DATA_MAX_LENGTH;i++)
+    {
+        char UintBUF[3]={0};
+        sprintf(UintBUF,"%02X",save_adv_data[i]);
+        memcpy_s(data+data_len,2,UintBUF,2);
+        data_len+=2;
+    }
+
+}
+
+/* adapt ios adv data. *///设置广播和扫描数据
+static void svr_ble_adv_data_set(int adv_id)
+{
+    uint8_t ble_name[BLE_NAME_LENGTH] = {0};
+    uint8_t ble_name_len = BLE_NAME_LENGTH;
+    uint8_t adv_data[BLE_ADV_DATA_MAX_LENGTH] = {0};
+    uint8_t adv_data_len = 0;
+    uint8_t scan_data_len = 0;
+    uint8_t ble_data_name[BLE_ADV_BLE_NAME_MAX_LENGTH + 1 ] = {0}; // +TYPE LENGTH
+    uint8_t ble_data_mac_switch[BD_ADDR_LEN] = {0};
+    uint8_t adv_mac_head[BLE_ADV_MAC_LENTH] = {0x9, 0x16, 0x02, 0x38};
+    gap_ble_config_adv_data_t adv_data_info;
+    memset_s(&adv_data_info, sizeof(gap_ble_config_adv_data_t), 0, sizeof(gap_ble_config_adv_data_t));
+    unsigned char addr[BLE_MAC_MAX_LEN] = {0};
+    unsigned int len = BLE_MAC_MAX_LEN;
+    errcode_t ret = 0;
+
+    memset(addr,0,6);    
+    bluetooth_get_local_addr(&addr[0],len);
+    ret = bluetooth_get_local_name(ble_name, &ble_name_len);
+    if (ret != 0) {
+        memset_s(ble_name, BLE_NAME_LENGTH, 0, BLE_NAME_LENGTH);
+        (void)sprintf_s((char*)ble_name, BLE_NAME_LENGTH, "%s %02X%02X",BLE_DEFAULT_NAME,addr[1],addr[0]);
+        ble_name_len = strlen((char*)ble_name) + 1;        
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gap_ble_get_local_name fail,rename name:%s,len:%u,ret:%u.", ble_name, ble_name_len, ret);
+    }
+    int k = BD_ADDR_LEN;
+    for (int i = 0; i < BD_ADDR_LEN; i++) {
+        ble_data_mac_switch[--k] = addr[i];
+    }
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gap_ble_get_local_name name:%s,len:%u,ret:%u.", ble_name, ble_name_len, ret);
+    memcpy_s(adv_data, sizeof(ble_adv_type), ble_adv_type, sizeof(ble_adv_type));//0x02 0x01 0x02
+    adv_data_len = sizeof(ble_adv_type);
+    // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"adv_data_len!!!!:%d\r\n",adv_data_len);
+
+    adv_data[adv_data_len++] = 0x0f;//长度 
+    adv_data[adv_data_len++] = 0xff;//数据类型 manufactory data
+#if defined(BOARD_W9) 
+    adv_data[adv_data_len++] = 'W';
+    adv_data[adv_data_len++] = '9';
+// #elif defined(BOARD_N9)
+//     adv_data[adv_data_len++] = 'N';
+//     adv_data[adv_data_len++] = '9';
+#else 
+    adv_data[adv_data_len++] = 'J';
+    adv_data[adv_data_len++] = 'H';
+#endif
+    adv_data[adv_data_len++] = bond_flag;//是否绑定
+    adv_data[adv_data_len++] = ble_data_mac_switch[5];
+    adv_data[adv_data_len++] = ble_data_mac_switch[4];
+    adv_data[adv_data_len++] = ble_data_mac_switch[3];
+    adv_data[adv_data_len++] = ble_data_mac_switch[2];
+    adv_data[adv_data_len++] = ble_data_mac_switch[1];
+    adv_data[adv_data_len++] = ble_data_mac_switch[0];
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "adv_data_info.adv_length.adv_data_len:%d\r\n",adv_data_len);
+#if defined(BOARD_W9) 
+    adv_data[adv_data_len++] = 0x06; //w9 app
+    adv_data[adv_data_len++] = 0x06;
+// #elif defined(BOARD_N9) 
+//     adv_data[adv_data_len++] = 0x07; //n9 app
+//     adv_data[adv_data_len++] = 0x07;
+#else
+    adv_data[adv_data_len++] = 0x05;
+    adv_data[adv_data_len++] = 0x05;
+#endif
+
+    uint8_t _major,_mid,_minor;
+    uapi_get_fw_version(&_major,&_mid,&_minor);
+    adv_data[adv_data_len++] = _major;
+    adv_data[adv_data_len++] = _mid;
+    adv_data[adv_data_len++] = _minor;
+    
+    if(adv_data_len > BLE_ADV_DATA_MAX_LENGTH)
+    {
+        adv_data_len = BLE_ADV_DATA_MAX_LENGTH;
+    }
+
+    //scan_data 
+    if (ble_name_len > BLE_ADV_BLE_NAME_MAX_LENGTH) {
+        ble_name_len = BLE_ADV_BLE_NAME_MAX_LENGTH;
+    }
+    ble_data_name[0] = ble_name_len;
+    ble_data_name[1] = 0x9;
+    memcpy_s(&ble_data_name[2], ble_name_len - 1, ble_name, ble_name_len - 1);
+
+    memcpy_s(scan_data + scan_data_len, ble_name_len + 1, ble_data_name, ble_name_len + 1);
+
+    scan_data_len = scan_data_len + ble_name_len + 1;
+    // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"scan_data_len!!!22:%d ble_name_len:%d\r\n",scan_data_len,ble_name_len);
+    memcpy_s(scan_data + scan_data_len, sizeof(ble_adv_uuid), ble_adv_uuid, sizeof(ble_adv_uuid));//这是tx power
+    scan_data_len = scan_data_len + sizeof(ble_adv_uuid);
+    // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"scan_data_len!!!!3333:%d\r\n",scan_data_len);
+   
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble_info:%02x:%02x:%02x:%02x:%02x:%02x", ble_data_mac_switch[0], ble_data_mac_switch[1],
+        ble_data_mac_switch[2], ble_data_mac_switch[3], ble_data_mac_switch[4], ble_data_mac_switch[5]);    
+   
+    memcpy_s(adv_mac_head + BLE_ADV_MAC_HEAD_LENTH, BD_ADDR_LEN, ble_data_mac_switch, BD_ADDR_LEN);
+
+    memcpy_s(scan_data + scan_data_len, sizeof(adv_mac_head), adv_mac_head, sizeof(adv_mac_head));
+    scan_data_len = scan_data_len + sizeof(adv_mac_head);
+    // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"adv_data_len!!!!4444:%d\r\n",scan_data_len);
+   
+
+    if (scan_data_len > BLE_SCAN_DATA_LENTH){
+        scan_data_len = BLE_SCAN_DATA_LENTH;
+    }
+    //
+    memcpy_s(save_adv_data,BLE_ADV_DATA_MAX_LENGTH,adv_data,BLE_ADV_DATA_MAX_LENGTH);
+    
+    adv_data_info.scan_rsp_data = scan_data;//扫描数据
+    adv_data_info.scan_rsp_length = scan_data_len;//扫描长度
+    adv_data_info.adv_data = adv_data;//广播数据 
+    adv_data_info.adv_length = adv_data_len;//广播长度
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "adv_data_info.adv_length:%u. scan_data_len:%d\r\n", adv_data_len,scan_data_len);
+
+    gap_ble_set_adv_data(adv_id, &adv_data_info);
+
+    return;
+}
+
+
+void svr_ble_adv_factory_test_start_param(void)
+{
+    errcode_t ret = 0;
+    int adv_id = BLE_ADV_ID;
+    if (ble_adv_falg == 1) { //已经开始广播了,不需要重复开启广播
+        ret=gap_ble_stop_adv(adv_id);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble adv need restart , gap_ble_stop_adv ret %x\n",ret);
+        osDelay(50);
+    }
+
+    gap_ble_adv_params_t adv_para;
+    memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));
+
+    adv_para.min_interval = 0x64;//0x640;
+    adv_para.max_interval = 0x64;
+    adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;
+    //adv_para.tx_power=20;
+    adv_para.channel_map = 0x07;
+    adv_para.duration = 0;
+
+    gap_ble_set_adv_param(adv_id, &adv_para);//设置广播参数
+    gap_ble_set_local_appearance(GAP_BLE_APPEARANCE_TYPE_GENERIC_WATCH);//仅是手表
+    svr_ble_adv_data_set(adv_id);//开始广播和扫描数据
+    ble_adv_falg = 1;
+    ret = gap_ble_start_adv(adv_id);
+    if (ret) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_adv_start bt gap_ble_start_adv1  ret = 0x%x", ret);
+    }
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_adv_start bt gap_ble_start_adv2  ret = 0x%x", ret);
+}
+
+
+static int8_t ble_adv_init_falg=100;
+
+static osTimerId_t ble_adv_timer=NULL;
+
+static uint32_t last_package_id=0;
+
+static void  ble_adv_Timer_CallBack(int data)
+{
+    ble_adv_init_falg--;
+
+    if(ble_adv_init_falg<=0)
+    {
+        int adv_id = BLE_ADV_ID;
+
+        errcode_t ret = 0;
+        if(get_ble_adv_status())
+        {
+            ret=gap_ble_stop_adv(adv_id);
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble adv need restart , gap_ble_stop_adv ret %x\n",ret);
+            osDelay(50);
+
+            if(!uapi_dev_runtime_get_factory_test_status_flag())
+            {
+                gap_ble_adv_params_t adv_para;
+                memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));
+                adv_para.min_interval = 0x640;
+                adv_para.max_interval = 0x640;
+                adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;
+                adv_para.channel_map = 0x7;
+                adv_para.duration = 0;
+
+                ret=gap_ble_set_adv_param(adv_id, &adv_para);//设置广播参数
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble adv need restart , gap_ble_set_adv_param ret %x\n",ret);
+
+            }
+            if(get_ble_connect()==false)
+            {
+                ret=gap_ble_start_adv(adv_id);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble adv need restart , gap_ble_start_adv ret %x\n",ret);
+            }
+          
+
+        }
+        else
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "no sdv\n");
+            if(!uapi_dev_runtime_get_factory_test_status_flag())
+            {
+
+                gap_ble_adv_params_t adv_para;
+                memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));
+                adv_para.min_interval = 0x640;
+                adv_para.max_interval = 0x640;
+                adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;
+                adv_para.channel_map = 0x7;
+                adv_para.duration = 0;
+                ret=gap_ble_set_adv_param(adv_id, &adv_para);//设置广播参数
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble adv need restart , gap_ble_set_adv_param ret %x\n",ret);
+
+            }
+           
+
+           
+        }
+
+
+        osTimerStop(ble_adv_timer);
+        osTimerDelete(ble_adv_timer);
+        ble_adv_timer = NULL;
+        
+    }
+}
+
+
+
+void svr_ble_adv_start_param(void)
+{
+    errcode_t ret = 0;
+    int adv_id = BLE_ADV_ID;
+    if (ble_adv_falg == 1) { //已经开始广播了,不需要重复开启广播
+        ret=gap_ble_stop_adv(adv_id);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble adv need restart , gap_ble_stop_adv ret %x\n",ret);
+        osDelay(50);
+    }
+
+    if(ble_adv_init_falg)
+    {
+        gap_ble_adv_params_t adv_para;
+        memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));
+        adv_para.min_interval = 0x64;
+        adv_para.max_interval = 0x64;
+        adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;
+        adv_para.channel_map = 0x7;
+        adv_para.duration = 0;
+        gap_ble_set_adv_param(adv_id, &adv_para);//设置广播参数
+
+        uint32_t tick;
+        osStatus_t retTimer;
+        if(ble_adv_timer!=NULL)
+        {
+            osTimerStop(ble_adv_timer);
+            osTimerDelete(ble_adv_timer);
+            ble_adv_timer = NULL;
+        }
+
+        ble_adv_timer = osTimerNew((osTimerFunc_t)ble_adv_Timer_CallBack, osTimerPeriodic, NULL, NULL);
+        tick =osMs2Tick(1000);
+        retTimer = osTimerStart(ble_adv_timer, tick);
+        if (retTimer != osOK && ble_adv_timer != NULL) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
+            osTimerDelete(ble_adv_timer);
+            ble_adv_timer = NULL;
+            return;
+        }
+
+    }
+    else
+    {
+         if(!uapi_dev_runtime_get_factory_test_status_flag())
+         {
+            gap_ble_adv_params_t adv_para;
+            memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));
+            adv_para.min_interval = 0x640;
+            adv_para.max_interval = 0x640;
+            adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;
+            adv_para.channel_map = 0x7;
+            adv_para.duration = 0;
+            gap_ble_set_adv_param(adv_id, &adv_para);//设置广播参数
+         }
+         else
+         {
+             gap_ble_adv_params_t adv_para;
+            memset_s(&adv_para, sizeof(gap_ble_adv_params_t), 0, sizeof(gap_ble_adv_params_t));
+            adv_para.min_interval = 0x64;
+            adv_para.max_interval = 0x64;
+            adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;
+            adv_para.channel_map = 0x7;
+            adv_para.duration = 0;
+            gap_ble_set_adv_param(adv_id, &adv_para);//设置广播参数
+        }
+
+    }
+    
+    gap_ble_set_local_appearance(GAP_BLE_APPEARANCE_TYPE_GENERIC_WATCH);//仅是手表
+    svr_ble_adv_data_set(adv_id);//开始广播和扫描数据
+    ble_adv_falg = 1;
+    ret = gap_ble_start_adv(adv_id);
+    if (ret) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_adv_start bt gap_ble_start_adv1  ret = 0x%x", ret);
+    }
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_adv_start bt gap_ble_start_adv2  ret = 0x%x", ret);
+}
+
+void svr_ble_connstate_change_cb(unsigned short conn_id, bd_addr_t *addr, gap_ble_conn_state_t conn_state,
+    gap_ble_pair_state_t pair_state, gap_ble_disc_reason_t disc_reason)
+{
+    
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,
+     "svr_ble_connstate_change_cb gap_ble_conn_state_t conn_state:%d  pair_state:%d disc_reason:%d\r\n",
+     conn_state,pair_state,disc_reason);
+
+    if (GAP_BLE_STATE_DISCONNECTED == conn_state) 
+    { // restart ble adv when disconnected
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GAP_BLE_STATE_DISCONNECTED!!! \r\n");
+        uapi_save_runtime_log(RUNTIME_LOG_BLE_DISCONNECT);
+
+        clean_phone_info(conn_id);
+
+        //如果ble连接全部断连,则需要重新开启广播
+        //可能因ble连接不够稳定,快速断开ble连接,无法将连接判定为app连接导致断连的时候没有正确重新开启广播
+        
+        if(conn_id==g_ble_conn_id || !get_ble_connect())
+        {
+            free_ble_data(); 
+                
+            ble_disconnect_ok();
+
+            g_ble_conn_id=0;
+
+            //APP断连
+            Bleconnect = GAP_BLE_STATE_DISCONNECTED;//蓝牙已断开
+
+            if(get_ble_pair())
+            {
+                ble_ancs_client_clear(conn_id);
+            }
+
+            svr_ble_adv_start();
+        }
+        else if (ble_is_Alipay_bind()==true)
+        {
+            //如果当前页面处于支付宝界面,则重新开广播
+            svr_ble_adv_start();
+        }
+
+        if(g_ble_Alipay_conn_id==conn_id)
+        {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "支付宝断开连接 \r\n");
+        }
+     
+    }   
+    else 
+    {
+        devpair_state = 0;//
+
+        uapi_save_runtime_log(RUNTIME_LOG_BLE_CONNECT);
+
+
+        if( g_ble_conn_id !=0 && conn_id!=g_ble_conn_id)
+        {
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"支付宝连接");
+        }
+
+      
+        int ret =svr_ble_adv_stop();
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"%x",ret);
+        
+        set_phone_info(addr,conn_id);
+       
+        ble_connect_ok();
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x \n",
+         addr->addr[3], addr->addr[2], addr->addr[1], addr->addr[0]); /* 3 2 1 0 idx */
+
+
+        Bleconnect = GAP_BLE_STATE_CONNECTED;//蓝牙已连接
+       
+
+    }
+
+    uapi_dev_runtime_set_ble_connect_stat(Bleconnect);
+}
+
+static uint16_t need_update_connect_param=BLE_CONNECT_INTERVAL_HIGH;
+
+static osTimerId_t ble_connect_timer=NULL;
+
+static int8_t connect_updata_count=3;
+
+static void  ble_connect_Timer_CallBack(int data)
+{
+    if(get_ble_connect() && connect_updata_count>0)
+    {
+        gap_conn_param_update_t conn_param = { 0 };
+        conn_param.conn_handle = g_ble_conn_id;    /* param 0: conn_handle */
+        conn_param.interval_min =need_update_connect_param;    /* param 1: interval_min 1.25ms */
+        conn_param.interval_max = need_update_connect_param;    /* param 2: interval_max */
+        conn_param.slave_latency = 6;    /* param 3: slave_latency */
+        conn_param.timeout_multiplier = 500;    /* param 4: timeout_multiplier 10ms */
+        int ret = gap_ble_connect_param_update(&conn_param);
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "触发 连接参数timer更新");
+        connect_updata_count--;
+
+    }
+    else
+    {
+        osTimerStop(ble_connect_timer);
+        osTimerDelete(ble_connect_timer);
+        ble_connect_timer = NULL;
+    }
+}
+
+static uint16_t ble_interval=50; 
+
+uint16_t get_ble_interval(void)
+{
+    float temp_data =(float)ble_interval*1.25f;
+
+    return (uint16_t)temp_data;
+   
+}
+
+void srv_gap_ble_connect_param_update_callback(uint16_t conn_id, errcode_t status,
+    const gap_ble_conn_param_update_t *param)
+{
+    if(param->interval==50)
+    uapi_save_runtime_log(RUNTIME_LOG_BLE_CONNECT_UPDATE_50);
+    else if(param->interval==12)
+    uapi_save_runtime_log(RUNTIME_LOG_BLE_CONNECT_UPDATE_12);
+    else
+    uapi_save_runtime_log(RUNTIME_LOG_BLE_CONNECT_UPDATE|param->interval);
+
+    ble_interval=param->interval;
+
+    if(ble_connect_timer!=NULL)
+    {
+        osTimerStop(ble_connect_timer);
+        osTimerDelete(ble_connect_timer);
+        ble_connect_timer = NULL;
+    }
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, 
+    "conn_id %d status %d gap_ble_conn_param_update_t interval %d latency%d  timeout %d ",conn_id,status,param->interval,param->latency,param->timeout);
+}
+
+
+
+void uapi_ble_connect_param_update(uint16_t data)
+{
+    gap_conn_param_update_t conn_param = { 0 };
+    conn_param.conn_handle = g_ble_conn_id;    /* param 0: conn_handle */
+    conn_param.interval_min =data;    /* param 1: interval_min 1.25ms */
+    conn_param.interval_max = data;    /* param 2: interval_max */
+    conn_param.slave_latency = 6;    /* param 3: slave_latency */
+    conn_param.timeout_multiplier = 500;    /* param 4: timeout_multiplier 10ms */
+    int ret = gap_ble_connect_param_update(&conn_param);
+
+    need_update_connect_param=data;
+
+   
+
+    uint32_t tick;
+    osStatus_t retTimer;
+    if(ble_connect_timer!=NULL)
+    {
+        osTimerStop(ble_connect_timer);
+        osTimerDelete(ble_connect_timer);
+        ble_connect_timer = NULL;
+    }
+
+    ble_connect_timer = osTimerNew((osTimerFunc_t)ble_connect_Timer_CallBack, osTimerPeriodic, NULL, NULL);
+    tick =osMs2Tick(3000);
+    retTimer = osTimerStart(ble_connect_timer, tick);
+    if (retTimer != osOK && ble_connect_timer != NULL) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"StartCallTimer osTimerStart failed, ret = %lx!!", retTimer);
+        osTimerDelete(ble_connect_timer);
+        ble_connect_timer = NULL;
+        return;
+    }
+    connect_updata_count=3;
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"gap ble update connection parameters %d ret: %X\n",data,ret);   
+}
+void svr_pair_result_cbt_cb(uint16_t conn_id, const bd_addr_t *addr, errcode_t status)
+{
+    devpair_state = 1;//代表配对成功了
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, 
+    "svr_pair_result_cbt_cb!!! addr 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x status:0x%x\r\n",addr->addr[0],addr->addr[1],
+    addr->addr[2],addr->addr[3],addr->addr[4],addr->addr[5],status);
+    if(status==ERRCODE_SUCC)
+    {
+        if(get_ble_pair())
+        ble_ancs_client_cmd_setup_and_subscribe(conn_id);
+
+        if(get_ctkd_flag() && uapi_dev_runtime_get_bt_powerstat())
+        {
+
+            if(get_ble_pair()&&( cm_get_A2DP_switch() || cm_get_HFP_switch()))
+            {
+                if(cm_get_A2DP_switch() && cm_get_A2DP_switch())
+                {
+                    int ret=gap_reconnect_media_device(addr);
+                }
+                else if(cm_get_A2DP_switch())
+                {
+                    uapi_a2dp_snk_connect();
+                }
+                else if(cm_get_HFP_switch())
+                {
+                    uapi_hfp_connect();
+                }
+
+
+            }
+            else
+            { 
+                if(get_br_is_pair())
+                {
+                    bd_addr_t bdaddr={0};
+                    uapi_get_br_address(&bdaddr);
+                    if(false==(bt_is_acl_connected(&bdaddr)))
+                    {
+                        if(cm_get_A2DP_switch() || cm_get_HFP_switch())
+                        {
+                            int ret=gap_reconnect_media_device(&bdaddr);
+                            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gap_reconnect_media_device!!! %X\r\n",ret);
+                        }
+                        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_reconnect_media_device!!! \r\n");    
+                    }
+                    else
+                    {
+                        if(cm_get_A2DP_switch() || cm_get_HFP_switch())
+                        uapi_a2dp_snk_connect();
+                        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "uapi_a2dp_snk_connect!!! \r\n");
+                    }
+                }
+            } 
+        }
+        hand_watch_first_time_Paired();
+
+    }
+}
+ 
+//添加ota特征值
+static void srv_ble_add_chart_decr_ota(uint8_t server_id,uint16_t srv_handle)
+{   
+    errcode_t ret = 0;
+    static uint8_t ota_point_val[] = {0x00, 0x00};
+    gatts_add_chara_info_t character;
+    gatts_add_desc_info_t descriptor;
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_OTA_ID, &character.chara_uuid);
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;
+    character.properties = BLE_CHARACTERISTIC_SNED_OTA_ID_PROPERTIES;
+    character.value_len = (uint16_t)sizeof(ota_point_val);
+    character.value = ota_point_val;
+
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);
+    }
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;
+    descriptor.value_len = (uint16_t)sizeof(ota_point_val);
+    descriptor.value = ota_point_val;
+    
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);
+    }
+}
+
+//自定义 ota 文件传输协议
+static void srv_ble_add_chart_decr_Zhihui_ota(uint8_t server_id,uint16_t srv_handle)
+{   
+    errcode_t ret = 0;
+    static uint8_t ota_val[] = {0x00, 0x00};
+    gatts_add_chara_info_t character;
+    gatts_add_desc_info_t descriptor;
+    bts_data_to_uuid_len2(BLE_ZHIHUI_OTA_ID, &character.chara_uuid);
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;
+    character.properties = BLE_ZHIHUI_OTA_ID_ID_PROPERTIES;
+    character.value_len = (uint16_t)sizeof(ota_val);
+    character.value = ota_val;
+
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);
+    }
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;
+    descriptor.value_len = (uint16_t)sizeof(ota_val);
+    descriptor.value = ota_val;
+    
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);
+    }
+}
+
+static void srv_ble_add_Zhihui_AI(uint8_t server_id,uint16_t srv_handle)
+{
+    errcode_t ret = 0;
+    static uint8_t battery_point_val[] = {0x00, 0x00};
+    gatts_add_chara_info_t character;
+    gatts_add_desc_info_t descriptor;
+
+    bts_data_to_uuid_len2(BLE_ZHIHUI_AI_ID, &character.chara_uuid);
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;
+    character.properties = BLE_ZHIHUI_AI_ID_ID_PROPERTIES;
+    character.value_len = (uint16_t)sizeof(battery_point_val);
+    character.value = battery_point_val;
+
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);
+    }
+    bts_data_to_uuid_len2(BLE_UUID_CLIENT_CHARACTERISTIC_CONF, &descriptor.desc_uuid);
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE;
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);
+    descriptor.value = battery_point_val;
+    
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);
+    }
+
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE | GATT_ATTRIBUTE_PERMISSION_READ;;
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);
+    descriptor.value = battery_point_val;
+    
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);
+    }
+}
+
+
+//用于adnriod发送消息添加特征值和描述符
+static void srv_ble_add_chart_decr_andriod(uint8_t server_id,uint16_t srv_handle)
+{   
+    errcode_t ret = 0;
+    static uint8_t andriod_point_val[] = {0x00, 0x00};
+    gatts_add_chara_info_t character;
+    gatts_add_desc_info_t descriptor;
+
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_ANDRIOD_ID, &character.chara_uuid);
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;
+    character.properties = BLE_CHARACTERISTIC_SNED_ANDRIOD_ID_PROPERTIES;
+    character.value_len = (uint16_t)sizeof(andriod_point_val);
+    character.value = andriod_point_val;
+
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);
+    }
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;
+    descriptor.value_len = (uint16_t)sizeof(andriod_point_val);
+    descriptor.value = andriod_point_val;
+    
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);
+    }
+}
+//添加battery特征值和描述符
+static void srv_ble_add_chart_decr_battery(uint8_t server_id,uint16_t srv_handle)
+{
+    errcode_t ret = 0;
+    static uint8_t battery_point_val[20] = {0};
+    uint8_t battery_value[20];
+    memset(battery_value,0,20);
+    // 获取电池电压值
+    float voltage = 0.0F;
+    uint8_t power = 0;
+    power = battery_get_voltage(&voltage);
+    battery_point_val[0] = power;//电量90
+
+    uint16_t dial = ble_get_dial_id();
+    memcpy_s(&battery_point_val[1],2,&dial,2);
+
+    uint8_t _major,_mid,_minor;
+    uapi_get_fw_version(&_major,&_mid,&_minor);
+
+    battery_point_val[3] = _major;//固件版本号
+    battery_point_val[4] = _mid;
+    battery_point_val[5] = _minor;
+
+    bd_addr_t addr_info;
+    ret = gap_ble_get_local_addr(&addr_info);
+    battery_point_val[6] = addr_info.addr[5];
+    battery_point_val[7] = addr_info.addr[4];
+    battery_point_val[8] = addr_info.addr[3];
+    battery_point_val[9] = addr_info.addr[2];
+    battery_point_val[10] = addr_info.addr[1];
+    battery_point_val[11] = addr_info.addr[0];
+
+    battery_point_val[12] = 0;//消息推送开关 默认是关闭 0
+    battery_point_val[13] = 0;//多媒体开关
+    #if defined(BOARD_W9) 
+    battery_point_val[14] = 6;//客户编号
+    battery_point_val[15] = 6;//产品编号
+    // #elif defined(BOARD_N9) 
+    // battery_point_val[14] = 7;//客户编号
+    // battery_point_val[15] = 7;//产品编号
+    #else
+    battery_point_val[14] = 5;//客户编号
+    battery_point_val[15] = 5;//产品编号
+    #endif
+
+    battery_point_val[16] = 0;//硬件版本号
+    battery_point_val[17] = 1;
+
+    battery_point_val[18] = 0;//ble版本号
+    battery_point_val[19] = 1;
+    gatts_add_chara_info_t character;
+    gatts_add_desc_info_t descriptor;
+
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_READ_BATTERY_ID, &character.chara_uuid);
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE;
+    character.properties = BLE_CHARACTERISTIC_READ_BATTERY_ID_PROPERTIES;
+    character.value_len = (uint16_t)sizeof(battery_point_val);
+    character.value = battery_point_val;
+
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);
+    }
+    static uint8_t report_reference_val_output[] = {0x01, 0x00};
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);
+    descriptor.value = battery_point_val;
+    
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);
+    }
+
+}
+//添加短指令特征值和描述符 20个字节
+static void srv_ble_add_chart_decr_short_cmd(uint8_t server_id,uint16_t srv_handle)
+{
+    errcode_t ret = 0;
+    static uint8_t battery_point_val[] = {0x00, 0x00};
+    gatts_add_chara_info_t character;
+    gatts_add_desc_info_t descriptor;
+
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_SHORT_ID, &character.chara_uuid);
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;
+    character.properties = BLE_CHARACTERISTIC_SNED_SHORT_ID_PROPERTIES;
+    character.value_len = (uint16_t)sizeof(battery_point_val);
+    character.value = battery_point_val;
+
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);
+    }
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);
+    descriptor.value = battery_point_val;
+    
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);
+    }
+}
+//添加长指令特征值和描述符 大于20个字节
+static void srv_ble_add_chart_decr_long_cmd(uint8_t server_id,uint16_t srv_handle)
+{
+    errcode_t ret = 0;
+    static uint8_t battery_point_val[] = {0x00, 0x00};
+    gatts_add_chara_info_t character;
+    gatts_add_desc_info_t descriptor;
+
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_LONG_ID, &character.chara_uuid);
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;
+    character.properties = BLE_CHARACTERISTIC_SNED_LONG_ID_PROPERTIES;
+    character.value_len = (uint16_t)sizeof(battery_point_val);
+    character.value = battery_point_val;
+
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);
+    }
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);
+    descriptor.value = battery_point_val;
+    
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);
+    }
+}
+//添加客户端接收特征值和描述符 
+static void srv_ble_add_chart_decr_recv_cmd(uint8_t server_id,uint16_t srv_handle)
+{
+    errcode_t ret = 0;
+    static uint8_t battery_point_val[] = {0x00, 0x00};
+    gatts_add_chara_info_t character;
+    gatts_add_desc_info_t descriptor;
+
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_RECV_ID, &character.chara_uuid);
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;
+    character.properties = BLE_CHARACTERISTIC_RECV_ID_PROPERTIES;
+    character.value_len = (uint16_t)sizeof(battery_point_val);
+    character.value = battery_point_val;
+
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);
+    }
+    bts_data_to_uuid_len2(BLE_UUID_CLIENT_CHARACTERISTIC_CONF, &descriptor.desc_uuid);
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE;
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);
+    descriptor.value = battery_point_val;
+    
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);
+    }
+
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE | GATT_ATTRIBUTE_PERMISSION_READ;;
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);
+    descriptor.value = battery_point_val;
+    
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);
+    }
+}
+
+
+static void srv_ble_add_ZHIHUIOTA_REPLY_chart_decr_recv_cmd(uint8_t server_id,uint16_t srv_handle)
+{
+    errcode_t ret = 0;
+    static uint8_t battery_point_val[] = {0x00, 0x00};
+    gatts_add_chara_info_t character;
+    gatts_add_desc_info_t descriptor;
+
+    bts_data_to_uuid_len2(BLE_ZHIHUI_OTA_REPLY_ID, &character.chara_uuid);
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;
+    character.properties = BLE_ZHIHUI_OTA_REPLY_ID_PROPERTIES;
+    character.value_len = (uint16_t)sizeof(battery_point_val);
+    character.value = battery_point_val;
+
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);
+    }
+    bts_data_to_uuid_len2(BLE_UUID_CLIENT_CHARACTERISTIC_CONF, &descriptor.desc_uuid);
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE;
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);
+    descriptor.value = battery_point_val;
+    
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);
+    }
+
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE | GATT_ATTRIBUTE_PERMISSION_READ;;
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);
+    descriptor.value = battery_point_val;
+    
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);
+    }
+}
+
+
+static uint8_t g_alipay_character_buf[256] = {0};
+static void alipay_add_chart_decr_recv_cmd1(uint8_t server_id,uint16_t srv_handle)
+{
+    errcode_t ret = 0;
+    // uint16_t id = ALIPAYY_CHARACTERISTIC_ID;
+    gatts_add_chara_info_t character;
+    uint16_t value = 0;
+    bt_uuid_t alipay_service_uuid = {0};
+    bts_data_to_uuid_len2(ALIPAYY_CHARACTERISTIC_ID, &alipay_service_uuid);
+    memset_s(&character, sizeof(gatts_add_chara_info_t), 0, sizeof(gatts_add_chara_info_t));
+    // character.chara_uuid.uuid_len = sizeof(id);
+    // memcpy_s(character.chara_uuid.uuid, sizeof    (character.chara_uuid.uuid), (char *)&id, sizeof(id));
+    character.chara_uuid = alipay_service_uuid;
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;
+    character.properties =
+        GATT_CHARACTER_PROPERTY_BIT_READ | GATT_CHARACTER_PROPERTY_BIT_WRITE | GATT_CHARACTER_PROPERTY_BIT_NOTIFY;
+    character.value_len = 256;
+    character.value = g_alipay_character_buf;
+
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);
+    if (ret != ERRCODE_SUCC) {
+        ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);
+    }
+
+    uint8_t bas_ccc_val[] = {
+            0x01,
+            0x00
+        };
+    bt_uuid_t ccc_uuid = { 0 };
+    bts_data_to_uuid_len2(0x2902, &ccc_uuid);
+    // bts_data_to_uuid_len2(0x2902, &ccc_uuid);
+    gatts_add_desc_info_t descriptor;
+    descriptor.desc_uuid = ccc_uuid;
+    descriptor.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;
+    descriptor.value_len = (uint16_t)sizeof(bas_ccc_val);
+    descriptor.value = bas_ccc_val;
+    
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);
+    if (ret != ERRCODE_SUCC) {
+        ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);
+    }
+    bd_addr_t addr_info;
+    gatts_add_desc_info_t descriptor_ap;
+    gap_ble_get_local_addr(&addr_info);
+    bts_data_to_uuid_len2(0x4b02, &ccc_uuid);
+    descriptor_ap.desc_uuid = ccc_uuid;
+    descriptor_ap.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;
+    descriptor_ap.value_len = BD_ADDR_LEN;
+    uint8_t ble_data_mac_switch[BD_ADDR_LEN] = {0};
+    int k = BD_ADDR_LEN;
+    for (int i = 0; i < BD_ADDR_LEN; i++) {
+        ble_data_mac_switch[--k] = addr_info.addr[i];
+    }
+    descriptor_ap.value = ble_data_mac_switch;
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor_ap);
+    if (ret != ERRCODE_SUCC) {
+        ALIPAY_PRINT_ERR(0, "gatts_add_descriptor second fail, ret:%u.\r\n", ret);
+    }
+}
+
+
+
+static uint16_t ble_server_handle = 0;
+
+void alipay_add_chart_decr_cb(uint8_t server_id,uint16_t srv_handle)
+{
+    errcode_t ret = 0;
+    static uint8_t ota_point_val[] = {0x00, 0x00};
+    gatts_add_chara_info_t character;
+    gatts_add_desc_info_t descriptor;
+    bts_data_to_uuid_len2(0x4a02, &character.chara_uuid);
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;
+    character.properties = BLE_CHARACTERISTIC_SNED_OTA_ID_PROPERTIES;
+    character.value_len = (uint16_t)sizeof(ota_point_val);
+    character.value = ota_point_val;
+
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);
+    }
+    bts_data_to_uuid_len2(0x2902, &descriptor.desc_uuid);
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;
+    descriptor.value_len = (uint16_t)sizeof(ota_point_val);
+    descriptor.value = ota_point_val;
+    
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);
+    if (ret != ERRCODE_SUCC) {
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);
+    }
+    }
+
+//这个回调函数添加新的服务UUID
+static void svr_ble_bt_gatts_service_add_cb(uint8_t server_id, bt_uuid_t *uuid, uint16_t srv_handle,
+    errcode_t status)
+{
+    if (uuid->uuid_len != sizeof(uint16_t)) return ;
+    uint16_t uuid_tmp = *((uint16_t*)uuid->uuid);
+    uuid_tmp = SWAP_U16(uuid_tmp);
+    if ( uuid_tmp == BLE_SERVICE_UUID 
+        || uuid_tmp == BLE_UUID_HUMAN_INTERFACE_DEVICE 
+        || uuid_tmp == BLE_UUID_ATE_FACTORYTEST_SERVICE 
+        || uuid_tmp == BLE_UUID_PPG_BLE_SERVICE 
+        || uuid_tmp == ALIPAYY_SERVICE_ID
+#ifdef SUPPORT_AT_CYWEE
+        || uuid_tmp == BLE_UUID_CYWEE_REPORT_SERVICE
+#endif
+         ) 
+    {
+         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " 0x%x\r\n",uuid_tmp);
+    }else{
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_service_add_cb UUID not supported 0x%x\r\n",uuid_tmp);
+        return ;
+    }
+    ble_server_handle = srv_handle;
+    // ALIPAY_PRINT_DEBUG(0, "BtGattsServiceAddCallback 0x%x 0x%x 0x%x 0x%x", status, server_id, srv_handle,
+        // *((uint16_t *)uuid->uuid));
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_service_add_cb srv_handle 0x%x\r\n",srv_handle);
+    if (status != ERRCODE_BT_SUCCESS)
+    {
+        return;
+    }
+    bt_uuid_t ble_service_uuid = {0};
+    bts_data_to_uuid_len2(BLE_SERVICE_UUID, &ble_service_uuid);
+
+    bt_uuid_t hid_service_uuid = {0};
+    bts_data_to_uuid_len2(BLE_UUID_HUMAN_INTERFACE_DEVICE, &hid_service_uuid);
+
+    // bt_uuid_t alipay_service_uuid = {0};
+    // bts_data_to_uuid_len2(ALIPAYY_SERVICE_ID, &alipay_service_uuid);//0x3802
+
+    bt_uuid_t factory_service_uuid = {0};
+    bts_data_to_uuid_len2(BLE_UUID_ATE_FACTORYTEST_SERVICE, &factory_service_uuid);
+
+    bt_uuid_t ppg_service_uuid = {0};
+    bts_data_to_uuid_len2(BLE_UUID_PPG_BLE_SERVICE, &ppg_service_uuid);
+
+
+#ifdef SUPPORT_AT_CYWEE
+
+    bt_uuid_t cywee_ble_service_uuid = {0};
+    bts_data_to_uuid_len2(BLE_UUID_CYWEE_REPORT_SERVICE, &cywee_ble_service_uuid);
+
+#endif
+
+
+    errcode_t ret = 0;
+    if (ble_gatts_cmp_uuid(uuid, &ble_service_uuid) == true) {//通过传入的uuid进行比较
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_service_add_cb ble_service_uuid\r\n");
+        srv_ble_add_chart_decr_ota(server_id,srv_handle);//ota特征值
+        srv_ble_add_chart_decr_andriod(server_id,srv_handle);//对18e0这个服务进行添加andiod特征值和描述符
+        srv_ble_add_chart_decr_battery(server_id,srv_handle);//电池电量特征值
+        srv_ble_add_chart_decr_short_cmd(server_id,srv_handle);
+        srv_ble_add_chart_decr_long_cmd(server_id,srv_handle);
+        srv_ble_add_chart_decr_recv_cmd(server_id,srv_handle);
+        srv_ble_add_chart_decr_Zhihui_ota(server_id,srv_handle);
+        srv_ble_add_Zhihui_AI(server_id,srv_handle);
+        
+        // srv_ble_add_chart_decr_Zhihui_AI(server_id,srv_handle);
+        srv_ble_add_ZHIHUIOTA_REPLY_chart_decr_recv_cmd(server_id,srv_handle);
+        gatts_start_service(server_id, srv_handle);
+    }
+    if (ble_gatts_cmp_uuid(uuid, &hid_service_uuid) == true){
+        ble_hid_add_characters_and_descriptors(server_id, srv_handle);
+        ret = gatts_start_service(server_id, srv_handle);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "hid service svr_ble_bt_gatts_service_add_cb ret:%d\r\n",ret);
+    }
+    if (ble_gatts_cmp_uuid(uuid, &factory_service_uuid) == true){
+        ble_factorytest_add_characters_and_descriptors(server_id,srv_handle);
+        ret = gatts_start_service(server_id, srv_handle);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "factorytest service svr_ble_bt_gatts_service_add_cb ret:%d\r\n",ret);
+    }
+
+    if (ble_gatts_cmp_uuid(uuid, &ppg_service_uuid) == true){
+        ble_ppgtest_add_characters_and_descriptors(server_id,srv_handle);
+        ret = gatts_start_service(server_id, srv_handle);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ppg ble service svr_ble_bt_gatts_service_add_cb ret:%d\r\n",ret);
+    }
+
+#ifdef SUPPORT_AT_CYWEE
+    if (ble_gatts_cmp_uuid(uuid, &cywee_ble_service_uuid) == true){
+        ble_cywee_add_characters_and_descriptors(server_id,srv_handle);
+        ret = gatts_start_service(server_id, srv_handle);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "cywee ble service svr_ble_bt_gatts_service_add_cb ret:%d\r\n",ret);
+    }   
+
+#endif
+    // if (ble_gatts_cmp_uuid(uuid, &alipay_service_uuid) == true){
+    //     alipay_add_chart_decr_recv_cmd1(server_id,srv_handle);
+    //     ret = gatts_start_service(server_id, srv_handle);
+    //     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "alipay_service_uuid service svr_ble_bt_gatts_service_add_cb ret:%d\r\n",ret);
+    // }
+    
+}
+uint16_t alipay_handle = 0;
+uint16_t g_hid_server_handle = 0;
+static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t *uuid, uint16_t srv_handle,
+    gatts_add_character_result_t *result, errcode_t status)
+{
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bt_gatts_characteristic_add_cb uuid:0x%02x%02x 0x%x %d %d , status %x\r\n",
+        uuid->uuid[0],uuid->uuid[1],
+        srv_handle,result->handle,
+        result->value_handle,status);
+    bt_uuid_t chara_uuid_data_2ae0 = {0};
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_OTA_ID, &chara_uuid_data_2ae0);
+
+    bt_uuid_t chara_uuid_data_2ae1 = {0};
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_ANDRIOD_ID, &chara_uuid_data_2ae1);
+
+    bt_uuid_t chara_uuid_data_2ae5 = {0};
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_RECV_ID, &chara_uuid_data_2ae5);
+
+    bt_uuid_t chara_uuid_data_2ae3  = {0};
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_SHORT_ID, &chara_uuid_data_2ae3);
+    bt_uuid_t chara_uuid_data_2ae4 = {0};
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_LONG_ID, &chara_uuid_data_2ae4);
+    
+    
+    bt_uuid_t chara_uuid_data_2ae2 = {0};
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_READ_BATTERY_ID, &chara_uuid_data_2ae2);
+
+    bt_uuid_t hid_report_uuid_2a4d = {0};
+    bts_data_to_uuid_len2(BLE_UUID_REPORT, &hid_report_uuid_2a4d);
+
+    bt_uuid_t hid_report_uuid_2ae6 = {0};
+    bts_data_to_uuid_len2(BLE_ZHIHUI_OTA_ID, &hid_report_uuid_2ae6);
+
+    bt_uuid_t chara_uuid_data_2ae7 = {0};
+    bts_data_to_uuid_len2(BLE_ZHIHUI_OTA_REPLY_ID, &chara_uuid_data_2ae7);
+
+    bt_uuid_t chara_uuid_data_2ae8 = {0};
+    bts_data_to_uuid_len2(BLE_ZHIHUI_AI_ID, &chara_uuid_data_2ae8);
+
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae8))
+    {
+        if(data2ae8Cmd==0)
+        {
+            data2ae8Cmd=result->value_handle;
+        }
+        Is_value_handle[handle_num]=result->value_handle;
+        handle_num++;
+    }
+
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae7))
+    {
+        if(data2ae7Cmd==0)
+        {
+            data2ae7Cmd=result->value_handle;
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "data2ae7Cmd");
+        }
+        Is_value_handle[handle_num]=result->value_handle;
+        handle_num++;
+    }
+
+
+    if(ble_gatts_cmp_uuid(uuid, &hid_report_uuid_2ae6))
+    {
+        if(data2ae6Cmd==0)
+        {
+            data2ae6Cmd=result->value_handle;
+        }
+        Is_value_handle[handle_num]=data2ae6Cmd;
+        handle_num++;
+    }
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae5))
+    {
+        if(g_ble_server_handle == 0)
+        {
+            g_ble_server_handle = result->value_handle;
+        }
+        if(data2ae5Cmd == 0){
+            data2ae5Cmd = result->value_handle;
+        }
+        Is_value_handle[handle_num]=result->value_handle;
+        handle_num++;
+        
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, " 2ae5 result->value_handle1  %d\r\n",result->value_handle);
+    }
+    
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae3 ))
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "2ae3 result->value_handle2  %d\r\n",result->value_handle);
+        if(data2ae3Cmd == 0)
+        {
+            data2ae3Cmd = result->value_handle;
+        }
+       Is_value_handle[handle_num]=result->value_handle;
+        handle_num++;
+            
+    }
+    
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae0))
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "2ae0 result->value_handle4  %d\r\n",result->value_handle);
+        if(data2ae0Cmd == 0)
+        {
+            data2ae0Cmd = result->value_handle;
+        }
+        Is_value_handle[handle_num]=result->value_handle;
+        handle_num++;
+    }
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae1))
+    {
+        if(data2ae1Cmd == 0)
+        {
+            data2ae1Cmd = result->value_handle;
+        }
+       Is_value_handle[handle_num]=result->value_handle;
+        handle_num++;
+
+        // data2ae1Cmd = result->value_handle;
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "2ae1 result->value_handle5  %d\r\n",result->value_handle);
+        // shortCmdChara = result->value_handle;
+    }
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae2))
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "2ae2 result->value_handle6  %d\r\n",result->value_handle);
+        // shortCmdChara = result->value_handle;
+         if(data2ae2Cmd == 0){
+            data2ae2Cmd = result->value_handle;
+        }
+        Is_value_handle[handle_num]=result->value_handle;
+        handle_num++;
+    }
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data_2ae4))
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "2ae4 result->value_handle3  %d\r\n",result->value_handle);
+        if(data2ae4Cmd == 0)
+        {
+            data2ae4Cmd = result->value_handle;
+        }
+        Is_value_handle[handle_num]=result->value_handle;
+        handle_num++;
+        //  = result->value_handle;
+    }
+    if (ble_gatts_cmp_uuid(uuid, &hid_report_uuid_2a4d) == true) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "result->hid_report_uuid_2a4d  %d\r\n",result->value_handle);
+        if(g_hid_server_handle == 0){
+            g_hid_server_handle = result->value_handle;
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_hid_server_handle  %d\r\n",g_hid_server_handle);
+            ble_hid_add_characters_input_report_cbk(g_hid_server_handle);
+        }
+    }
+
+    bt_uuid_t factorytest_recv_uuid = {0};
+    bts_data_to_uuid_len2(BLE_UUID_ATE_TX, &factorytest_recv_uuid);
+
+    if (ble_gatts_cmp_uuid(uuid, &factorytest_recv_uuid) == true) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "result->factorytest_recv_uuid  %d\r\n",result->value_handle);
+
+        Is_value_handle[handle_num]=result->value_handle;
+        handle_num++;
+
+        ble_factorytest_store_recv_handle(result->value_handle) ;
+        // }
+    }
+
+    bt_uuid_t factorytest_report_uuid = {0};
+    bts_data_to_uuid_len2(BLE_UUID_ATE_RX, &factorytest_report_uuid);
+
+    if (ble_gatts_cmp_uuid(uuid, &factorytest_report_uuid) == true) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "result->factorytest_report_uuid  %d\r\n",result->value_handle);
+        Is_value_handle[handle_num]=result->value_handle;
+        handle_num++;
+        ble_factorytest_store_report_handle(result->value_handle);
+        // }
+    }
+
+    bt_uuid_t factorytest_ota_recv_uuid = {0};
+    bts_data_to_uuid_len2(BLE_UUID_OTA_TX, &factorytest_ota_recv_uuid);
+
+    if (ble_gatts_cmp_uuid(uuid, &factorytest_ota_recv_uuid) == true) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "result->factorytest_ota_recv_uuid  %d\r\n",result->value_handle);
+       Is_value_handle[handle_num]=result->value_handle;
+        handle_num++;
+        ble_factorytest_store_ota_recv_handle(result->value_handle) ;
+        // }
+    }
+
+    bt_uuid_t factorytest_ota_report_uuid = {0};
+    bts_data_to_uuid_len2(BLE_UUID_OTA_RX, &factorytest_ota_report_uuid);
+
+    if (ble_gatts_cmp_uuid(uuid, &factorytest_ota_report_uuid) == true) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "result->factorytest_ota_report_uuid  %d\r\n",result->value_handle);
+         Is_value_handle[handle_num]=result->value_handle;
+        handle_num++;
+        ble_factorytest_store_ota_report_handle(result->value_handle);
+        // }
+    }
+
+
+    bt_uuid_t ppgtest_report_uuid = {0};
+    bts_data_to_uuid_len2(BLE_UUID_PPG_NOTIFY, &ppgtest_report_uuid);
+    if (ble_gatts_cmp_uuid(uuid, &ppgtest_report_uuid) == true) {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "result->ble_ppgtest_store_report_handle  %d\r\n",result->value_handle);
+        Is_value_handle[handle_num]=result->value_handle;
+        handle_num++;
+        ble_ppgtest_store_report_handle(result->value_handle);
+    }
+    
+#ifdef SUPPORT_AT_CYWEE
+    bt_uuid_t cywee_report_uuid = {0};
+    bts_data_to_uuid_len2(BLE_UUID_CYWEE_RX, &cywee_report_uuid);
+
+    if (ble_gatts_cmp_uuid(uuid, &cywee_report_uuid) == true) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->cywee_report_uuid  %d\r\n",result->value_handle);
+
+        Is_value_handle[handle_num]=result->value_handle;
+        handle_num++;
+
+        ble_cywee_store_report_handle(result->value_handle);
+        // }
+
+        ble_cywee_store_recv_handle(73);
+    }
+#endif
+    return;
+}
+
+errcode_t svr_ble_bt_gatts_noyify(uint8_t *data, uint16_t data_len)//这里是设备数据上报给app手机端
+{
+    gatts_ntf_ind_t data_info;
+    data_info.attr_handle = g_ble_server_handle;
+    data_info.value = data;
+    data_info.value_len = data_len;
+    if (g_ble_conn_id == 0)
+      return 0;
+    errcode_t ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);
+    uapi_save_runtime_log(RUNTIME_LOG_BLE_WATCH_REPLY);
+    if(ret!=ERRCODE_SUCC)
+    {
+        msleep(50);
+        ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);
+        uapi_save_runtime_log(RUNTIME_LOG_BLE_WATCH_REPLY);
+        if(ret!=ERRCODE_SUCC)
+        {
+            msleep(100);
+            ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);
+
+            uapi_save_runtime_log(RUNTIME_LOG_BLE_WATCH_REPLY);
+
+            if(ret!=ERRCODE_SUCC)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,
+                g_ble_conn_id, g_ble_server_handle,data_len);
+
+                // ble_set_ai_Answer_str("BLE NOTIF ERROR",5);
+            }
+       
+        }
+    }
+    return ret;  
+}
+
+
+errcode_t svr_ble_bt_gatts_noyify_zhihui(uint8_t *data, uint16_t data_len)//这里是设备数据上报给app手机端
+{
+    gatts_ntf_ind_t data_info;
+    data_info.attr_handle = data2ae7Cmd;
+    data_info.value = data;
+    data_info.value_len = data_len;
+     if (g_ble_conn_id == 0)
+     {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id");
+        // return 0;
+     }
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id %d g_ble_conn_id %d",g_ble_server_id,g_ble_conn_id);
+    errcode_t ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);
+    if(ret!=ERRCODE_SUCC)
+    {
+        msleep(50);
+        ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);
+        if(ret!=ERRCODE_SUCC)
+        {
+            msleep(100);
+            ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);
+
+            if(ret!=ERRCODE_SUCC)
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,
+                    g_ble_conn_id, g_ble_server_handle,data_len);
+        }
+    }
+    return ret;  
+}
+
+errcode_t svr_ble_bt_gatts_noyify_AI(uint8_t *data, uint16_t data_len)//这里是设备数据上报给app手机端
+{
+    gatts_ntf_ind_t data_info;
+    data_info.attr_handle = data2ae8Cmd;
+    data_info.value = data;
+    data_info.value_len = data_len;
+     if (g_ble_conn_id == 0)
+     {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id");
+        // return 0;
+     }
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_conn_id %d g_ble_conn_id %d",g_ble_server_id,g_ble_conn_id);
+    errcode_t ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);
+    if(ret!=ERRCODE_SUCC)
+    {
+        msleep(50);
+        ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);
+        if(ret!=ERRCODE_SUCC)
+        {
+            msleep(100);
+            ret=gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);
+
+            if(ret!=ERRCODE_SUCC)
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,
+                    g_ble_conn_id, g_ble_server_handle,data_len);
+        }
+    }
+    return ret;  
+}
+
+errcode_t svr_ble_read_data_value_updata_noyify(void)//2ae2
+{
+    gatts_ntf_ind_t data_info;
+    data_info.attr_handle = data2ae2Cmd;
+    static uint8_t battery_point_val[20] = {0};
+    // 获取电池电压值
+    float voltage = 0.0F;
+    uint8_t power = 0;
+    power =battery_get_voltage(&voltage);
+    battery_point_val[0] =power;//power ;//power;//电量90
+    uint16_t dial = ble_get_dial_id();
+    memcpy_s(&battery_point_val[1],2,&dial,2);
+
+    uint8_t _major,_mid,_minor;
+    uapi_get_fw_version(&_major,&_mid,&_minor);
+
+    battery_point_val[3] = _major;//固件版本号
+    battery_point_val[4] = _mid;
+    battery_point_val[5] = _minor;
+
+    bd_addr_t addr_info;
+    errcode_t ret = gap_ble_get_local_addr(&addr_info);
+    battery_point_val[6] = addr_info.addr[5];
+    battery_point_val[7] = addr_info.addr[4];
+    battery_point_val[8] = addr_info.addr[3];
+    battery_point_val[9] = addr_info.addr[2];
+    battery_point_val[10] = addr_info.addr[1];
+    battery_point_val[11] = addr_info.addr[0];
+
+    battery_point_val[12] = 0;//消息推送开关 默认是关闭 0
+    battery_point_val[13] = 0;//多媒体开关
+    
+    #if defined(BOARD_W9) 
+    battery_point_val[14] = 6;//客户编号
+    battery_point_val[15] = 6;//产品编号
+    // #elif defined(BOARD_N9) 
+    // battery_point_val[14] = 7;//客户编号
+    // battery_point_val[15] = 7;//产品编号
+    #else
+    battery_point_val[14] = 5;//客户编号
+    battery_point_val[15] = 5;//产品编号
+    #endif
+
+    battery_point_val[16] = 0;//硬件版本号
+    battery_point_val[17] = 1;
+
+    battery_point_val[18] = 0;//ble版本号
+    battery_point_val[19] = 1;
+
+
+    data_info.value = battery_point_val;
+    data_info.value_len = 20;
+
+    // if (g_ble_conn_id == 0)
+    // return 0;
+     
+     ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,
+        g_ble_conn_id, g_ble_server_handle,20);
+    
+    return ret;  
+}
+
+errcode_t svr_ble_read_data_value_updata_noyify_test(uint8_t test)//2ae2
+{
+    gatts_ntf_ind_t data_info;
+    data_info.attr_handle = data2ae2Cmd;
+    static uint8_t battery_point_val[20] = {0};
+
+    battery_point_val[0] =test;//power ;//power;//电量90
+
+    uint16_t dial = ble_get_dial_id();
+    memcpy_s(&battery_point_val[1],2,&dial,2);
+
+    uint8_t _major,_mid,_minor;
+    uapi_get_fw_version(&_major,&_mid,&_minor);
+
+    battery_point_val[3] = _major;//固件版本号
+    battery_point_val[4] = _mid;
+    battery_point_val[5] = _minor;
+
+    bd_addr_t addr_info;
+    errcode_t ret = gap_ble_get_local_addr(&addr_info);
+    battery_point_val[6] = addr_info.addr[5];
+    battery_point_val[7] = addr_info.addr[4];
+    battery_point_val[8] = addr_info.addr[3];
+    battery_point_val[9] = addr_info.addr[2];
+    battery_point_val[10] = addr_info.addr[1];
+    battery_point_val[11] = addr_info.addr[0];
+
+    battery_point_val[12] = 0;//消息推送开关 默认是关闭 0
+    battery_point_val[13] = 0;//多媒体开关
+
+    #if defined(BOARD_W9) 
+    battery_point_val[14] = 6;//客户编号
+    battery_point_val[15] = 6;//产品编号
+    // #elif defined(BOARD_N9) 
+    // battery_point_val[14] = 7;//客户编号
+    // battery_point_val[15] = 7;//产品编号
+    #else
+    battery_point_val[14] = 5;//客户编号
+    battery_point_val[15] = 5;//产品编号
+    #endif
+
+    battery_point_val[16] = 0;//硬件版本号
+    battery_point_val[17] = 1;
+
+    battery_point_val[18] = 0;//ble版本号
+    battery_point_val[19] = 1;
+
+
+    data_info.value = battery_point_val;
+    data_info.value_len = 20;
+     ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,
+        g_ble_conn_id, g_ble_server_handle,20);
+    
+    return ret;  
+}
+
+static uint8_t flag=1;
+static void svr_ble_bt_gatts_req_read_cb(uint8_t server_id, uint16_t conn_id, gatts_req_read_cb_t *read_cb_para,
+    errcode_t status)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_req_read_cb ret:is_long:%d %d",read_cb_para->is_long,status);
+
+    //WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_req_read_cb ret:is_long:%d  2ae2 %d read_cb_para->handle :%d",read_cb_para->is_long,data2ae2Cmd,read_cb_para->handle);
+    if(read_cb_para->handle==data2ae2Cmd && get_ble_connect() && status==0 )
+    {
+        g_ble_conn_id=conn_id;
+
+    static uint8_t battery_point_val[20] = {0};
+    // 获取电池电压值
+    float voltage = 0.0F;
+    uint8_t power = 0;
+    power =battery_get_voltage(&voltage);
+    battery_point_val[0] =power;//power ;//power;//电量90
+    uint16_t dial = ble_get_dial_id();
+    memcpy_s(&battery_point_val[1],2,&dial,2);
+
+    uint8_t _major,_mid,_minor;
+    uapi_get_fw_version(&_major,&_mid,&_minor);
+
+    battery_point_val[3] = _major;//固件版本号
+    battery_point_val[4] = _mid;
+    battery_point_val[5] = _minor;
+
+    bd_addr_t addr_info;
+    errcode_t ret = gap_ble_get_local_addr(&addr_info);
+    battery_point_val[6] = addr_info.addr[5];
+    battery_point_val[7] = addr_info.addr[4];
+    battery_point_val[8] = addr_info.addr[3];
+    battery_point_val[9] = addr_info.addr[2];
+    battery_point_val[10] = addr_info.addr[1];
+    battery_point_val[11] = addr_info.addr[0];
+
+    battery_point_val[12] = 0;//消息推送开关 默认是关闭 0
+    battery_point_val[13] = 0;//多媒体开关
+
+    #if defined(BOARD_W9) 
+    battery_point_val[14] = 6;//客户编号
+    battery_point_val[15] = 6;//产品编号
+    // #elif defined(BOARD_N9) 
+    // battery_point_val[14] = 7;//客户编号
+    // battery_point_val[15] = 7;//产品编号
+    #else
+    battery_point_val[14] = 5;//客户编号
+    battery_point_val[15] = 5;//产品编号
+    #endif
+
+    battery_point_val[16] = 0;//硬件版本号
+    battery_point_val[17] = 1;
+
+    battery_point_val[18] = 0;//ble版本号
+    battery_point_val[19] = 1;
+
+    static gatts_ntf_ind_t  gatts_ntf_ind;
+    gatts_ntf_ind.attr_handle=read_cb_para->handle;
+    gatts_ntf_ind.value=battery_point_val;
+    gatts_ntf_ind.value_len=20;
+    // read_cb_para->need_rsp=0;
+    
+    uapi_save_runtime_log(RUNTIME_LOG_BLE_APP_READ);
+    gatts_notify_indicate(server_id,conn_id,&gatts_ntf_ind);
+    }
+}
+
+
+static uint8_t falg = 0;
+
+
+static bool Is_App_ble_handle(uint16_t handle)
+{
+    for(int i=0;i<handle_max_len;i++)
+    {
+        if(Is_value_handle[i]==handle)
+        return true;
+    }
+    return false;
+
+}
+
+static void svr_ble_bt_gatts_req_write_cb(uint8_t server_id, uint16_t conn_id, gatts_req_write_cb_t *write_cb_para,
+    errcode_t status)
+{ 
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "g_ble_server_handle %d conn_id :%d write_cb_para->length:%d write_cb_para->handle %d write_cb_para->request_id:%d",g_ble_server_handle,conn_id,write_cb_para->length,
+    write_cb_para->handle,write_cb_para->request_id);
+    if(write_cb_para->handle==data2ae0Cmd)
+    {
+        if(status!=ERRCODE_SUCC)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"ota fial ");
+           //如果存在此文件证明ota出现失败过
+            FILE *fp= fopen("/user/updata/Ble_ota_file.txt","ab+");
+            fwrite("x",1,1,fp);
+            fclose(fp);
+        }
+    }
+    if(Is_App_ble_handle(write_cb_para->handle))
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP," %d %d\r\n",conn_id,write_cb_para->handle);
+        g_ble_conn_id=conn_id;
+        uapi_save_runtime_log(RUNTIME_LOG_BLE_APP_CMD);
+    }
+    if(is_alipay_handle(write_cb_para->handle))
+    {
+        g_ble_Alipay_conn_id=conn_id;
+        uapi_save_runtime_log(RUNTIME_LOG_BLE_ALIPAY_CMD);
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"g_ble_Alipay_conn_id\r\n");
+    }
+    // else
+    // {
+    //     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP," ?????\r\n");
+    // }
+    blesrv_service_recv_msg_handler(write_cb_para->handle,write_cb_para->value,write_cb_para->length);
+}
+
+void ble_test_ANCS(void)
+{
+    ble_ancs_client_cmd_setup_and_subscribe(g_ble_conn_id);
+}
+
+
+void ble_test_ANCS_notify(uint8_t type)
+{
+    ble_ancs_client_subscribe_notify(g_ble_conn_id,type);
+}
+
+static void svr_ble_mtu_exchange(uint8_t server_id, uint16_t conn_id, uint16_t mtu_size, errcode_t status)
+{
+    ble_nus_max_data_len = mtu_size-3;
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_mtu_exchange %d %d %d\r\n",server_id,conn_id,mtu_size);
+}
+/*******************  gap_ble  ************************************/
+void svr_gap_ble_auth_complete_callback(uint16_t conn_id, const bd_addr_t *addr, errcode_t status,ble_auth_info_evt_t* evt)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "sendParieSuccess");
+
+
+    sendParieSuccess(1,addr);
+    uapi_set_br_address(addr);
+}
+
+static bool ble_adv_start=false;
+
+bool get_ble_adv_status(void)
+{
+    return ble_adv_start;
+}
+
+static void svr_ble_adv_start_cb(uint8_t adv_id, adv_status_t status)
+{
+    if (adv_id == BLE_ADV_ID) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"BleAdvStartCallback adv_id: %d, status:%d\n", adv_id, status);
+        ble_adv_start=1;
+        uapi_save_runtime_log(RUNTIME_LOG_BLE_BROADCAST_ON);
+
+    }
+}
+
+static void svr_ble_adv_stop_cb(uint8_t adv_id, adv_status_t status)
+{
+    if (adv_id == BLE_ADV_ID) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"svr_ble_adv_stop_cb adv_id: %d, status:%d\n", adv_id, status);
+        ble_adv_start=0;
+        uapi_save_runtime_log(RUNTIME_LOG_BLE_BROADCAST_OFF);
+    }
+}
+
+
+
+static void srv_BleAdvTerminateCallback(uint8_t advId, adv_status_t status)
+{
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "srv_BleAdvTerminateCallback advId: %d, status:%d\n", advId, status);
+
+}
+void srv_ble_server_register_gap_ble_callbacks(void)//ble基础通讯服务注册回调函数
+{
+    g_ble_gapble_cbs.conn_state_change_cb = svr_ble_connstate_change_cb;
+    g_ble_gapble_cbs.pair_result_cb = svr_pair_result_cbt_cb;
+    g_ble_gapble_cbs.terminate_adv_cb =  srv_BleAdvTerminateCallback;
+    g_ble_gapble_cbs.auth_complete_cb = svr_gap_ble_auth_complete_callback;
+    g_ble_gapble_cbs.start_adv_cb=svr_ble_adv_start_cb;
+    g_ble_gapble_cbs.stop_adv_cb=svr_ble_adv_stop_cb;
+    g_ble_gapble_cbs.conn_param_update_cb=srv_gap_ble_connect_param_update_callback;
+#ifndef SUPPORT_AT_OHOSFWK
+    gap_ble_register_callbacks(&g_ble_gapble_cbs);
+#else
+    wrapper_gap_ble_register_callbacks(&g_ble_gapble_cbs);
+#endif
+}
+void srv_ble_server_register_gatt_callbacks(void)
+{
+    errcode_t ret = ERRCODE_BT_SUCCESS;
+    g_ble_gatts_cbs.add_service_cb = svr_ble_bt_gatts_service_add_cb;
+    g_ble_gatts_cbs.add_characteristic_cb = svr_ble_bt_gatts_characteristic_add_cb;
+
+    g_ble_gatts_cbs.read_request_cb = svr_ble_bt_gatts_req_read_cb;
+    g_ble_gatts_cbs.write_request_cb = svr_ble_bt_gatts_req_write_cb;
+    g_ble_gatts_cbs.mtu_changed_cb = svr_ble_mtu_exchange;
+
+#ifndef SUPPORT_AT_OHOSFWK
+    gatts_register_callbacks(&g_ble_gatts_cbs);
+#else
+    wrapper_gatts_register_callbacks(&g_ble_gatts_cbs);
+#endif
+    return;
+}
+static uint8_t g_server_id = 0;
+static void svr_ble_register_service(void)
+{
+    uint16_t srevr_id = BLE_SERVICE_UUID;
+    uint16_t ser_id = BLE_SERVICE_UUID;
+    uint8_t serverId = 0;
+    bt_uuid_t uuid;
+    errcode_t ret = 0;
+    uuid.uuid_len = (uint8_t)sizeof(ser_id);
+    memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&ser_id, sizeof(ser_id));
+
+#ifndef SUPPORT_AT_OHOSFWK
+    ret = gatts_register_server(&uuid, &serverId); /* 注册gatt server */
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_register_server ret: 0x%x serverId = 0x%x uuid.uuid_len:%d", ret, serverId,uuid.uuid_len);
+#else
+    ret = wrapper_gatts_register_server(&uuid, &serverId); /* 注册gatt server */
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "wrapper_gatts_register_server ret: 0x%x serverId = 0x%x uuid.uuid_len:%d", ret, serverId,uuid.uuid_len);
+#endif
+    g_ble_server_id = serverId;
+
+    bt_uuid_t ble_service_uuid = {0};
+    bts_data_to_uuid_len2(srevr_id, &ble_service_uuid);
+
+#ifndef SUPPORT_AT_OHOSFWK
+    ret = gatts_add_service(serverId, &ble_service_uuid, true);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_service ret: 0x%x", ret);
+#else
+    ret = wrapper_gatts_add_service(serverId, &ble_service_uuid, true);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "wrapper_gatts_add_service ret: 0x%x", ret);
+#endif
+
+   
+
+    return;
+}
+bool ble_gatts_cmp_uuid(const bt_uuid_t *tgt_uuid, const bt_uuid_t *src_uuid)//比较源uuid和给定的uuid是否匹配
+{
+    uint8_t *tgt = (uint8_t *)bts_init_128bit_uuid(tgt_uuid);
+    bool result = false;
+    if (tgt == NULL) {
+        return false;
+    }
+    uint8_t *src = (uint8_t *)bts_init_128bit_uuid(src_uuid);
+    if (src == NULL) {
+        bt_os_free(tgt);
+        return false;
+    }
+    if (memcmp(tgt, src, BT_UUID_MAX_LEN) == 0) {
+        result = true;
+    }
+    bt_os_free(src);
+    bt_os_free(tgt);
+    return result;
+}
+// extern void alipay_unregist_server(void);
+void ble_unregist_server(void)
+{
+    svr_ble_adv_stop();
+    gatts_delete_all_services(g_ble_server_id);
+    gatts_unregister_server(g_ble_server_id);
+    
+}
+
+
+void svr_ble_bluetooth_init(void)
+{
+    // memset(&phone_addr,0,sizeof(bd_addr_t));
+    
+    srv_ble_server_register_gap_ble_callbacks();
+    srv_ble_server_register_gatt_callbacks();
+
+    //add server and ble service
+    svr_ble_register_service();
+    
+    #ifdef SUPPORT_HID_SERVICE
+    // ble_hid_server_init();
+    #endif
+    svr_alipay_bluetooth_init(g_ble_server_id);
+
+    ble_factory_server_init(g_ble_server_id);
+    
+    ble_ppgtest_server_init(g_ble_server_id);
+
+#ifdef SUPPORT_AT_CYWEE
+    ble_cywee_server_init(g_ble_server_id);
+#endif
+    gattc_reg_id();
+
+    g_custom_ble_init_flag = true;
+    return;
+}
+//关闭蓝牙
+void custom_ble_service_stop(void)
+{
+    AdverFlag = false;
+    errcode_t ret = 0;
+    bd_addr_t addr={0};
+    get_phone_addr(&addr,g_ble_conn_id);
+
+    if(Bleconnect == GAP_BLE_STATE_CONNECTED){//设备连接需要断开
+        ret = gap_ble_disconnect_remote_device((const bd_addr_t *)&addr);//与固定的mac设置地址进行断开连接
+    }
+
+    // 一键双连去使能
+    ret = gap_ble_set_ctkd_enable(false);
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gap_ble_set_ctkd_disable ret = %u", ret);
+    
+    svr_ble_adv_stop();//停止广播 不发送广播数据 就是app搜索不到该设备了
+    free_ble_data(); //删除所有协议缓存数据
+}
+
+void uapi_ble_disconnect_device()
+{
+    errcode_t ret = 0;
+    bd_addr_t addr={0};
+    get_phone_addr(&addr,g_ble_conn_id);
+
+    ret = gap_ble_disconnect_remote_device((const bd_addr_t *)&addr);//与固定的mac设置地址进行断开连接
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gap_ble_disconnect_remote_device ret = %X", ret);
+
+}
+//开启蓝牙
+void custom_ble_service_start(void)
+{
+    AdverFlag = true;
+    svr_ble_adv_start_param();
+}
+
+void custom_ble_service_start_(uint8_t data)
+{
+    AdverFlag = true;
+    svr_ble_adv_start_param();
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "custom_ble_service_start_ ");
+    gap_br_set_bt_scan_mode(GAP_SCAN_MODE_CONNECTABLE, data);
+   
+}
+#define MODE_BLE_ADV_SRV (0)
+#define MODE_ALIPAY_ADV_SRV (1)
+void ble_avd_mode_change(uint8_t mode)
+{
+    
+    uint8_t adv_ok = 0;
+    switch(mode)
+    {
+        case MODE_BLE_ADV_SRV:
+            
+            if(get_ble_connect() && g_ble_conn_id!=0)
+            {
+                svr_ble_adv_stop();
+            }
+            break;
+        case MODE_ALIPAY_ADV_SRV:
+
+            
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"alipay_ble_advd_start!!!!!!!!! ble_adv_falg: %d ,AdverFlag: %d",ble_adv_falg,AdverFlag);
+            svr_ble_adv_start(); 
+          
+            break;
+        default:
+            break;
+    }
+}
+/**=================protocol recv decode service (task)=============================================================================================*/
+typedef struct
+{
+    uint16_t service_handle;
+    uint32_t msg_len;
+    uint8_t *msg_data;
+} blesrv_custom_cmd_t;
+
+#define MAX_BUF_LEN  sizeof(blesrv_custom_cmd_t) //sizeof(blesrv_custom_cmd_t) /*MTU max 514 , sizeof(blesrv_custom_cmd_t)*/
+static unsigned long g_blesrv_queue = 0xFFFFFFFF;
+static uint8_t g_blesrv_queue_created = 0;
+
+void blesrv_service_recv_msg_handler(uint16_t srv_handle, uint8_t * msg_data, uint32_t msg_len)
+{
+    int ret;
+    blesrv_custom_cmd_t blesrv_mail={0};
+    if( g_blesrv_queue_created == 0) return ;
+    if (msg_data == NULL) return;
+
+   
+    // mail = (blesrv_custom_cmd_t*)malloc(sizeof(blesrv_custom_cmd_t));
+    uint32_t sendlen = MAX_BUF_LEN;
+
+    
+    blesrv_mail.service_handle = srv_handle;
+    blesrv_mail.msg_len = msg_len;
+    blesrv_mail.msg_data = (uint8_t*)malloc(msg_len);
+
+    if(blesrv_mail.msg_data==NULL)
+    {
+        return ;
+    }
+    memcpy_s((blesrv_mail.msg_data),msg_len,msg_data,msg_len);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"g_blesrv_queue:%d ble_recv:mail.msg_data %X %02X %02X %02X msg_data:%02X %02X %02X\r\n",
+        g_blesrv_queue,
+        blesrv_mail.msg_data,
+        blesrv_mail.msg_data[0],
+        blesrv_mail.msg_data[1],
+        blesrv_mail.msg_data[2],
+        msg_data[0],
+        msg_data[1],
+        msg_data[2]
+        );
+    ret = osal_msg_queue_write_copy(g_blesrv_queue, (void *)&blesrv_mail, sendlen , 0);
+
+    if (ret != OSAL_SUCCESS)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"Error blesrv Check send failed! err=0x%X! \r\n", ret);
+    }
+}   
+
+static void blesrv_service_check_task(void const *arg)
+{
+    unused(arg);
+    int32_t ret;
+    blesrv_custom_cmd_t mail={0};
+    uint32_t msgsize = MAX_BUF_LEN;
+
+    while (1)
+    {
+        ret = osal_msg_queue_read_copy(g_blesrv_queue, (void *)&mail, &msgsize,
+                                       OSAL_MSGQ_WAIT_FOREVER);
+        if (ret != OSAL_SUCCESS)
+        {
+            //WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"OSAL_SUCCESS");
+            continue;
+        }
+        
+        uint8_t *p_msgbuf = (mail.msg_data);
+        uint16_t server_handle = mail.service_handle;
+        uint32_t msg_len = mail.msg_len;
+
+        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"mail.msg_data:%X,g_blesrv_queue:%d ble_recv:%d %d %02X %02X %02X mail.msg_data: %02X %02X %02X\r\n",
+        //     mail.msg_data,
+        //     g_blesrv_queue,
+        //     msg_len,
+        //     server_handle,
+        //     p_msgbuf[0],
+        //     p_msgbuf[1],
+        //     p_msgbuf[2],
+        //     mail.msg_data[0],
+        //     mail.msg_data[1],
+        //     mail.msg_data[2]);
+
+        #if 1
+        if (server_handle == get_factory_ate_write_handl()) 
+        {
+            factory_recv_cmd_data(p_msgbuf,msg_len,server_handle);
+        }
+        else if (server_handle == get_factory_ota_write_handl())
+        {
+            factory_recv_ota_data(p_msgbuf,msg_len,server_handle);
+        }
+
+#ifdef SUPPORT_AT_CYWEE
+        else if (server_handle == get_cywee_ate_write_handl())
+        {
+            cywee_recv_cmd_data(p_msgbuf,msg_len,server_handle);
+        }
+#endif
+        // else if(server_handle == alipay_handle)
+        // {
+        //     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"alipay wirte!!!!!");
+        //     // // svr_alipay_bt_gatts_noyify(buf,5);
+        //     // errcode_t ret = svr_alipay_msg_write(ALIPAY_MSG_BT, p_msgbuf, msg_len, false);
+
+        // }
+        else{
+            revBleOldData(p_msgbuf,msg_len,server_handle);
+        }
+        #endif
+        if(mail.msg_data)
+        {
+            free(mail.msg_data);
+            mail.msg_data = NULL;
+        }
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"ble_recv:end\r\n");
+    }
+}
+#define BLESRV_APP_BOARD_MSG_COUNT 256
+#define BLESRV_APP_BOARD_TASK_SIZE 0x3000
+#define BLESRV_BOARD_TASK_PRIO 7
+void create_blesrv_queue(void)
+{
+    if (osal_msg_queue_create("blesrv_service_queue", BLESRV_APP_BOARD_MSG_COUNT, &g_blesrv_queue,
+                              0, MAX_BUF_LEN) != ERRCODE_SUCC)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"[blesrv][service] app create mail fail g_blesrv_queue:%d\n",g_blesrv_queue);
+        g_blesrv_queue_created = 0;
+    }else{
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"[blesrv][service] app create mail success g_blesrv_queue:%d\n",g_blesrv_queue);
+        g_blesrv_queue_created = 1;
+    }
+
+}
+errcode_t uapi_blesrv_service_init(void)
+{
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"uapi_blesrv_service_init !\r\n");
+    app_task_definition_t taskcfg = {0};
+    taskcfg.create_queue_handle = create_blesrv_queue;
+    taskcfg.attr.name = "blesrv_recv_service";
+    taskcfg.attr.priority = osPriorityNormal;
+    taskcfg.attr.stack_size = BLESRV_APP_BOARD_TASK_SIZE;
+    taskcfg.func = blesrv_service_check_task;
+    taskcfg.use_mem = USE_EXTEND_MEM;
+
+    errcode_t ret = uapi_create_osThread_custom(&taskcfg);
+    if (ret != ERRCODE_SUCC)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"create blesrv_service failed %d!\r\n", ret);
+        return ERRCODE_FAIL;
+    }
+
+    return ERRCODE_SUCC;
+}
+
+
+void send_pair_succ(bd_addr_t *addr)
+{
+    sendParieSuccess(1,addr);
+}
+
+ static uint8_t get_ble_Check_adv_status_falg=0;
+
+void Check_ble_adv_status(void)
+{
+
+    if(get_ble_connect())
+    {
+        
+        return;
+    }
+    else
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"get_ble_adv_status %s \n", get_ble_adv_status()?"true":"fales");
+       
+        if(get_ble_adv_status()==0)
+        {
+            get_ble_Check_adv_status_falg++;
+            if(AdverFlag && get_ble_Check_adv_status_falg>=3)
+            {
+                if(uapi_dev_runtime_get_factory_test_status_flag())
+                svr_ble_adv_factory_test_start_param();
+                else
+                svr_ble_adv_start_param(); 
+            }
+        }
+        else
+        {
+            get_ble_Check_adv_status_falg=0;
+        }
+    }
+    return;
+}
+
+static unsigned long g_ble_Ai_record_queue = 0xFFFFFFFF;
+static uint8_t g_ble_Ai_record_queue_created = 0;
+
+void create_Ai_record_queue(void)
+{
+    if (osal_msg_queue_create("Ai_record_queue", BLESRV_APP_BOARD_MSG_COUNT, &g_ble_Ai_record_queue,
+                              0, MAX_BUF_LEN) != ERRCODE_SUCC)
+    {
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"[blesrv][service] app create mail fail g_blesrv_queue:%d\n",g_ble_Ai_record_queue);
+        g_ble_Ai_record_queue_created = 0;
+    }else{
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"[blesrv][service] app create mail success g_blesrv_queue:%d\n",g_ble_Ai_record_queue);
+        g_ble_Ai_record_queue_created = 1;
+    }
+
+}
+
+
+#define Ai_TEST 0
+static uint32_t AI_data_count=0;
+
+
+static uint8_t AI_interval=5;
+
+void set_AI_interval(uint8_t data)
+{
+    AI_interval=data;
+}
+
+void send_Ai_record(uint16_t len,uint8_t *data,uint32_t count)
+{
+    uint8_t ai_buf[SDK_BLE_MTU_MAX]={0};
+    if(count)
+    {
+        
+        memcpy_s(ai_buf,SDK_BLE_MTU_MAX,&count,4);
+        memcpy_s(&ai_buf[4],SDK_BLE_MTU_MAX-4,data,len);
+        len+=4;
+    }
+    else
+    {
+        memcpy_s(ai_buf,SDK_BLE_MTU_MAX,data,len);
+    }
+   
+    svr_ble_bt_gatts_noyify_AI(ai_buf,len);
+
+    LOS_Msleep(AI_interval+get_ble_interval());
+}
+
+static void blesrvAi_send_service_task(void const *arg)
+{
+    unused(arg);
+    int32_t ret;
+    blesrv_custom_cmd_t mail={0};
+    uint32_t msgsize = MAX_BUF_LEN;
+
+    #if Ai_TEST
+        FILE* fp= fopen("user/airecord.pcm","wb+");
+    #endif
+    while (1)
+    {
+        ret = osal_msg_queue_read_copy(g_ble_Ai_record_queue, (void *)&mail, &msgsize,
+                                       OSAL_MSGQ_WAIT_FOREVER);
+        if (ret != OSAL_SUCCESS)
+        {
+            continue;
+        }
+        
+
+        uint8_t *p_msgbuf = (mail.msg_data);
+        uint16_t server_handle = mail.service_handle;
+        uint32_t msg_len = mail.msg_len;
+
+        if(server_handle==1 || server_handle==2)
+        {
+            AI_data_count=0;
+        }
+        else
+        {
+            AI_data_count++;
+        }
+
+        #if Ai_TEST
+            fwrite(fp,1,mail.msg_len,mail.msg_data);
+        #endif
+        // if(get_ble_connect())
+        
+
+        if(getselect4gorbtai() == 1) //选择的是4g
+        {
+            if(get_clear_queue_stream())
+            {
+                // osal_msg_queue_write_head_copy(g_ble_Ai_record_queue, (void *)&mail,sizeof(blesrv_custom_cmd_t), 0);
+                int quesize = osal_msg_queue_get_msg_num(g_ble_Ai_record_queue);
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_MAIN_SERVICE,"osal_msg_queue_get_msg_num %d\n",quesize);
+                while(quesize)
+                {
+                    ret = osal_msg_queue_read_copy(g_ble_Ai_record_queue, (void *)&mail, &msgsize,
+                                        OSAL_MSGQ_WAIT_FOREVER);
+                    if (ret != OSAL_SUCCESS)
+                    {
+                        continue;
+                    }
+                    if(mail.msg_data)
+                    {
+                        free(mail.msg_data);
+                        mail.msg_data = NULL;
+                    }
+                    quesize--;
+                }
+                set_clear_queue_stream(0);
+            }
+            if(mail.msg_data && mail.msg_len!=0)
+            {
+                if(server_handle == 200 ||server_handle == 201 )
+                {
+                    if(server_handle == 201)
+                    {
+                        AIStreamWrite(NULL,1);
+                    }
+                    else
+                    {
+                        AIStreamWrite(mail.msg_data,mail.msg_len);
+                    }
+                    
+                }
+                else{
+                    if(server_handle==2)
+                    {
+                        uapi_stop_asr();
+                    }
+                    else
+                    {
+                        send_ai_bin(mail.msg_data,mail.msg_len);
+                    }
+                    
+                }
+            }
+        }
+        else //蓝牙
+        {
+            if(mail.msg_data && mail.msg_len!=0)
+            {
+                send_Ai_record(mail.msg_len,mail.msg_data,AI_data_count);
+            }
+        }
+            
+
+        if(mail.msg_data)
+        {
+            free(mail.msg_data);
+            mail.msg_data = NULL;
+        }
+        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"ble_recv:end\r\n");
+    }
+}
+
+
+static blesrv_custom_cmd_t g_blesrv_mail={0};
+
+errcode_t uapi_Ai_send_service_init(void)
+{
+
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"uapi_blesrv_service_init !\r\n");
+    app_task_definition_t taskcfg = {0};
+    taskcfg.create_queue_handle = create_Ai_record_queue;
+    taskcfg.attr.name = "Ai_record_queue_service";
+    taskcfg.attr.priority = osPriorityNormal;
+    // taskcfg.attr.stack_size = BLESRV_APP_BOARD_TASK_SIZE;
+    taskcfg.attr.stack_size = 0x4000;
+    taskcfg.func = blesrvAi_send_service_task;
+    taskcfg.use_mem = USE_EXTEND_MEM;
+
+    g_blesrv_mail.msg_len=0;
+    g_blesrv_mail.msg_data=NULL;
+
+
+    errcode_t ret = uapi_create_osThread_custom(&taskcfg);
+    if (ret != ERRCODE_SUCC)
+    {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"create blesrv_service failed %d!\r\n", ret);
+        return ERRCODE_FAIL;
+    }
+
+    return ERRCODE_SUCC;
+}
+
+
+uint32_t send_msg_data_into_Ai_msg_queue_count=0;
+
+
+void AI_data_assembly(uint8_t type,uint8_t *buf,uint8_t aitype)
+{
+   
+    memset_s(buf,ble_nus_max_data_len,0,19);
+    // 设置消息头部信息
+    buf[0] = 0x72; // 消息头
+    buf[1] = 0x08; // 类型
+    if(type)
+    buf[2] = 0x01; // 类型ID
+    else
+    buf[2] = 0x02; // 类型ID
+    uint32_t temp_data=1;
+    memcpy(buf + 3, &temp_data, 4); // 总包数
+    memcpy(buf + 7, &temp_data, 4); // 总数据长度
+    memcpy(buf + 11, &temp_data, 4); // 数据包ID
+    memcpy(buf + 15, &temp_data, 2); // 包数据长度
+    
+    buf[17] = aitype;
+    buf[18] = Calculate_CRC_AI(buf,18);; // 计算CRC
+}
+
+static uint8_t g_blesrv_mail_flag=0;
+
+#define OSAL_INVALID_MSG_NUM 0xFFFFFFFF
+#define QUEUE_FULL_THRESHOLD 0.8f  // 80% 阈值
+// 判断AI消息队列是否接近满(超过阈值)
+int get_ai_osal_msg_queue_is_full(void)
+{
+    // 检查队列有效性
+    if (g_ble_Ai_record_queue == 0) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "invalid queue id");
+        return -1;  // 队列无效
+    }
+
+    // 获取当前消息数
+    unsigned int current_num = osal_msg_queue_get_msg_num(g_ble_Ai_record_queue);
+    if (current_num ==  OSAL_INVALID_MSG_NUM) {
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "get msg num failed");
+        return -1;  // 获取失败
+    }
+
+    // 计算占比,超过阈值则视为“即将满”
+    float ratio = (float)current_num / BLESRV_APP_BOARD_MSG_COUNT;
+    if (ratio >= QUEUE_FULL_THRESHOLD) {
+        return 1;  // 达到或超过阈值(接近满)
+    } else {
+        return 0;  // 未达阈值(未满)
+    }
+}
+
+int send_msg_data_into_Ai_msg_queue(void *buff,uint16_t len,uint8_t type)
+{
+    blesrv_custom_cmd_t blesrv_mail={0};
+     uint32_t ret ;
+    if( g_blesrv_queue_created == 0) return ERRCODE_FAIL;
+    if (buff == NULL) return ERRCODE_FAIL;
+
+    uint32_t sendlen = sizeof(blesrv_custom_cmd_t);
+    // uint32_t singlebuflen= ble_nus_max_data_len-20;
+    uint32_t singlebuflen = 0;
+    if(getselect4gorbtai() == 1) {
+        singlebuflen = 288*4;//4G
+    } else {
+        singlebuflen = ble_nus_max_data_len-20;//BT
+    }
+    blesrv_mail.msg_data=0;
+
+    if(type == 200 || type == 201)
+    {
+    
+        blesrv_mail.service_handle = type;
+        blesrv_mail.msg_len = len;
+        blesrv_mail.msg_data = (uint8_t*)malloc(len);
+
+        if(blesrv_mail.msg_data==NULL)
+        {
+            return  ERRCODE_FAIL;
+        }
+        memcpy_s((void *)(blesrv_mail.msg_data),len,buff,len);
+
+        const static int QUEUE_RETRY_DELAY_MS =  50;      // 重试间隔(ms)
+        // 检查队列是否已满(提前判断,减少失败概率)
+        if (osal_msg_queue_is_full(g_ble_Ai_record_queue)) {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "queue is full");
+            osal_msleep(QUEUE_RETRY_DELAY_MS);  // 等待队列消费
+        }
+        ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);
+        if (ret != OSAL_SUCCESS)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);
+            osal_msleep(QUEUE_RETRY_DELAY_MS);  // 等待队列消费
+            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);
+            if (ret != OSAL_SUCCESS)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"retry len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);
+                // 修复内存泄漏:释放分配的内存
+                if (blesrv_mail.msg_data) {
+                    free(blesrv_mail.msg_data);
+                    blesrv_mail.msg_data = NULL;
+                }
+            }
+        }
+        return OSAL_SUCCESS;
+        
+    }
+    if(len<=singlebuflen)
+    {
+        if(type==1)
+        {
+            blesrv_mail.service_handle = 1;
+            blesrv_mail.msg_len = len;
+            blesrv_mail.msg_data = (uint8_t*)malloc(len);
+
+            if(blesrv_mail.msg_data==NULL)
+            {
+                return  ERRCODE_FAIL;
+            }
+            memcpy_s((void *)(blesrv_mail.msg_data),len,buff,len);
+
+            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);
+            if (ret != OSAL_SUCCESS)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);
+            }
+
+            if(g_blesrv_mail.msg_data)
+            {
+                free(g_blesrv_mail.msg_data);
+                g_blesrv_mail.msg_data=NULL;
+                g_blesrv_mail.msg_len=0;
+            }
+            return OSAL_SUCCESS;
+
+        }
+        else if(type==2)
+        {
+
+             blesrv_custom_cmd_t blesrv_mail_end={0};
+
+            if(g_blesrv_mail.msg_len!=0 && g_blesrv_mail.msg_data!=NULL)
+            {
+                blesrv_mail_end.msg_len=g_blesrv_mail.msg_len;
+                blesrv_mail_end.msg_data=malloc(g_blesrv_mail.msg_len);
+                if(blesrv_mail_end.msg_data==NULL)
+                {
+                    return  ERRCODE_FAIL;
+                }
+
+                memcpy_s( blesrv_mail_end.msg_data,singlebuflen,g_blesrv_mail.msg_data,g_blesrv_mail.msg_len);
+                free(g_blesrv_mail.msg_data);
+                g_blesrv_mail.msg_data=NULL;
+                g_blesrv_mail.msg_len=0;
+
+                ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail_end, sendlen , 0);
+                if (ret != OSAL_SUCCESS)
+                {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);
+                }
+                
+            }
+
+            
+           
+
+            blesrv_mail.service_handle = 2;
+            blesrv_mail.msg_len = len;
+            blesrv_mail.msg_data = (uint8_t*)malloc(len);
+
+            if(blesrv_mail.msg_data==NULL)
+            {
+                return  ERRCODE_FAIL;
+            }
+            memcpy_s((void *)(blesrv_mail.msg_data),len,buff,len);
+
+            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);
+            if (ret != OSAL_SUCCESS)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);
+            }
+            return OSAL_SUCCESS;
+        }
+        //以下为文件数据处理
+        if(g_blesrv_mail.msg_len+len<singlebuflen)
+        {
+           if (g_blesrv_mail.msg_len!=0 || g_blesrv_mail.msg_data!=NULL)
+           {
+                // g_blesrv_mail.msg_data=realloc( g_blesrv_mail.msg_data,g_blesrv_mail.msg_len+len);
+                uint8_t* temp_g_blesrv_mail_msg_data=malloc(g_blesrv_mail.msg_len+len);
+                if(temp_g_blesrv_mail_msg_data==NULL)
+                {
+                    return  ERRCODE_FAIL;
+                }
+                memcpy_s(temp_g_blesrv_mail_msg_data+ g_blesrv_mail.msg_len,singlebuflen,buff,len);
+                memcpy_s(temp_g_blesrv_mail_msg_data,singlebuflen,g_blesrv_mail.msg_data,g_blesrv_mail.msg_len);
+
+                free(g_blesrv_mail.msg_data);
+                g_blesrv_mail.msg_data=temp_g_blesrv_mail_msg_data;
+                g_blesrv_mail.msg_len+=len;
+           }
+           else
+           {
+                g_blesrv_mail.msg_data=malloc(len);
+                if(g_blesrv_mail.msg_data==NULL)
+                {
+                    return  ERRCODE_FAIL;
+                }
+
+                memcpy_s(g_blesrv_mail.msg_data+ g_blesrv_mail.msg_len,singlebuflen,buff,len);
+                g_blesrv_mail.msg_len=len;
+           }
+           
+            
+            return OSAL_SUCCESS;
+        }
+        else if(g_blesrv_mail.msg_len+len==singlebuflen)
+        {
+            // g_blesrv_mail.msg_data=realloc( g_blesrv_mail.msg_data,g_blesrv_mail.msg_len+len);
+
+            blesrv_mail.msg_len = singlebuflen;
+            blesrv_mail.msg_data = (uint8_t*)malloc(singlebuflen);
+             if(blesrv_mail.msg_data==NULL)
+            {
+                return  ERRCODE_FAIL;
+            }
+
+            memcpy_s( blesrv_mail.msg_data,singlebuflen,g_blesrv_mail.msg_data,g_blesrv_mail.msg_len);
+            memcpy_s( blesrv_mail.msg_data+ g_blesrv_mail.msg_len,singlebuflen,buff,len);
+
+            g_blesrv_mail.msg_len=0;
+            free( g_blesrv_mail.msg_data);
+            g_blesrv_mail.msg_data=NULL;
+
+            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);
+            if (ret != OSAL_SUCCESS)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);
+            }
+            return OSAL_SUCCESS; 
+
+        }
+        else
+        {
+            if(g_blesrv_mail.msg_len!=0 && g_blesrv_mail.msg_data!=NULL)
+            {
+                blesrv_mail.msg_len=g_blesrv_mail.msg_len;
+                blesrv_mail.msg_data=malloc(g_blesrv_mail.msg_len);
+                if(blesrv_mail.msg_data==NULL)
+                {
+                    return  ERRCODE_FAIL;
+                }
+                
+                memcpy_s( blesrv_mail.msg_data,singlebuflen,g_blesrv_mail.msg_data,g_blesrv_mail.msg_len);
+                free(g_blesrv_mail.msg_data);
+
+                ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);
+                if (ret != OSAL_SUCCESS)
+                {
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"len<=singlebuflen Error blesrv Check send failed! err=0x%X %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count);
+                }
+
+            }
+        
+            g_blesrv_mail.msg_len=len;
+            g_blesrv_mail.msg_data=malloc(len);
+            memcpy_s( g_blesrv_mail.msg_data,singlebuflen,buff,len);
+     
+           
+            return OSAL_SUCCESS; 
+        }
+
+    }
+    else
+    {
+        uint8_t count=len/singlebuflen;
+        if(len%singlebuflen)
+        {
+            count++;
+        }
+        uint16_t residue_len=len;
+        for(int i=0;i<count;i++)
+        {
+            blesrv_mail.service_handle = 0;
+            if(residue_len>=singlebuflen)
+            {
+                blesrv_mail.msg_len = singlebuflen;
+                blesrv_mail.msg_data = (uint8_t*)malloc(singlebuflen);
+                
+                if(blesrv_mail.msg_data==NULL)
+                {
+                    return ERRCODE_FAIL;
+                }
+                memcpy_s((void *)(blesrv_mail.msg_data),singlebuflen,buff+i*singlebuflen,singlebuflen);
+                residue_len-=singlebuflen;
+            }
+            else if(len%singlebuflen)
+            {
+                blesrv_mail.msg_len = len%singlebuflen;
+                blesrv_mail.msg_data = (uint8_t*)malloc( len%singlebuflen);
+                
+                if(blesrv_mail.msg_data==NULL)
+                {
+                    return ERRCODE_FAIL;
+                }
+                memcpy_s((void *)(blesrv_mail.msg_data),len%singlebuflen,buff+i*singlebuflen,len%singlebuflen);
+            }
+          
+
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP,"g_blesrv_queue:%d ble_recv:mail.msg_data %X %02X %02X %02X msg_data:%02X %02X %02X\r\n",
+                g_ble_Ai_record_queue,
+                blesrv_mail.msg_data,
+                blesrv_mail.msg_data[0],
+                blesrv_mail.msg_data[1],
+                blesrv_mail.msg_data[2],
+                msg_data[0],
+                msg_data[1],
+                msg_data[2]
+                );
+            ret  = osal_msg_queue_write_copy(g_ble_Ai_record_queue, (void *)&blesrv_mail, sendlen , 0);
+            if (ret != OSAL_SUCCESS)
+            {
+                WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"else Error blesrv Check send failed! err=0x%X %d %d! \r\n", ret,send_msg_data_into_Ai_msg_queue_count,len);
+            }
+        }
+    }
+  
+   
+    return ret;
+}
+
+//获取设备是否有网(4G,蓝牙)
+bool uapi_is_device_online(void)
+{
+    bool isbleconnected = get_ble_connect(); // 获取蓝牙连接状态
+    bool is4Gconnected = uapi_dev_runtime_get_cat1_networkstat(); // 获取4G连接状态
+    if(isbleconnected || is4Gconnected)
+    {
+        return true;
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+#ifdef __cplusplus
+}
 #endif
\ No newline at end of file