From 6a04d505ebec79bdb556a6b3dca58761b3cc5e67 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E5=AD=99=E6=98=A5=E9=98=B3?= Date: Wed, 6 Aug 2025 19:58:44 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96bleService=20Ai=5Fmsg=5Fqueue?= =?utf8?q?=E6=8E=A5=E6=94=B6=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=86=85=E5=AD=98?= =?utf8?q?=E6=B3=84=E6=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../ble_service/bleservice/bleService.c | 5789 +++++++++-------- 1 file changed, 2897 insertions(+), 2892 deletions(-) diff --git a/code/sdk/application/wearable/service/ble_service/bleservice/bleService.c b/code/sdk/application/wearable/service/ble_service/bleservice/bleService.c index 2ac1d6a59..4bc19d0f1 100644 --- a/code/sdk/application/wearable/service/ble_service/bleservice/bleService.c +++ b/code/sdk/application/wearable/service/ble_service/bleservice/bleService.c @@ -1,2893 +1,2898 @@ -/** - * 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 -#include -#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_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;ilength:%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); - } - } - 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) - { - 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 -} +/** + * 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 +#include +#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_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;ilength:%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) + { + 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 -- 2.17.1