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