--- /dev/null
+/**\r
+ * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
+ * Description: alipay bluetooth module.\r
+ * Author:\r
+ * Create:\r
+ */\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
+/* Gatt service UUID */\r
+#include "bts_br_gap.h"\r
+#include "battery_hal.h"\r
+#include "bleService.h"\r
+\r
+#define BLE_SERVICE_UUID 0x18e0\r
+/* Gatt Characteristic UUID */\r
+#define BLE_CHARACTERISTIC_RECV_ID 0xe52a\r
+#define BLE_CHARACTERISTIC_SNED_SHORT_ID 0xe32a\r
+\r
+#define BLE_CHARACTERISTIC_SNED_LONG_ID 0xe42a\r
+#define BLE_CHARACTERISTIC_SNED_OTA_ID 0xe02a\r
+#define BLE_CHARACTERISTIC_SNED_ANDRIOD_ID 0xe12a\r
+#define BLE_CHARACTERISTIC_READ_BATTERY_ID 0xe22a\r
+/* Client Characteristic Configuration UUID */\r
+#define BLE_UUID_CLIENT_CHARACTERISTIC_CONF 0x2902\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 13 // 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_MAC_LENTH 16 //扫描数据\r
+#define BLE_ADV_TYPE_LENTH 3\r
+#define BLE_ADV_UUID_LENTH 4\r
+#define BLE_DEFAULT_NAME "KUMI U6"\r
+#define BLE_DEFAULT_NAME_LEN 32\r
+#define BLE_MAC_MAX_LEN 6 //蓝牙mac地址最大个数6个\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
+static a2dp_src_callbacks_t g_a2dpSrcCallbacks;\r
+\r
+static bool g_ble_adv_start_state = false;\r
+static uint16_t g_ble_server_id = 1;\r
+static uint16_t g_ble_server_handle = 0;\r
+static uint16_t g_ble_conn_id = 0;\r
+static uint8_t g_ble_character_buf[BLE_CHARACTERISTIC_MAX_LENGTH] = {0};\r
+static bool g_ble_init_flag = false;\r
+static const uint8_t ble_adv_type[BLE_ADV_TYPE_LENTH] = {2, 1, 2};\r
+static const uint8_t ble_adv_uuid[BLE_ADV_UUID_LENTH] = {0x3, 0x3, 0xe0, 0x18};\r
+static bool AdverFlag = false;\r
+uint8_t Bleconnect = 0;//蓝牙默认是断开 0 1 为连接\r
+static uint8_t scan_data[BLE_SCAN_MAC_LENTH] = {0};\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,\r
+};\r
+\r
+static void svr_ble_ble_adv_stop(void)\r
+{\r
+ gap_ble_stop_adv(BLE_ADV_ID);\r
+}\r
+static void svr_ble_ble_adv_start(void)\r
+{\r
+ gap_ble_start_adv(BLE_ADV_ID);\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, 0xe0, 0x18};\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
+\r
+ \r
+ bd_addr_t addr_info;\r
+ int32_t ret= 0;\r
+ unsigned int len = BLE_MAC_MAX_LEN;\r
+ unsigned char addr[BLE_MAC_MAX_LEN] = {0};\r
+ bluetooth_get_local_addr(&addr[0],len);\r
+ // ret = gap_ble_get_local_addr(&addr_info);\r
+ char name[] = BLE_DEFAULT_NAME;\r
+\r
+ memset_s(name, sizeof(name), 0, sizeof(name));\r
+ (void)sprintf_s(name, sizeof(name), "0x%x0x%x",addr[0],addr[1]);\r
+ uint8_t name_len = strlen(name);\r
+ if (name_len > BLE_DEFAULT_NAME_LEN){\r
+ name_len = BLE_DEFAULT_NAME_LEN;\r
+ }\r
+ bluetooth_set_local_name((unsigned char*)name, name_len);//设置本地蓝牙名称\r
+\r
+ ret = bluetooth_get_local_name(ble_name, &ble_name_len);\r
+ if (ret != 0) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gap_ble_get_local_name fail, name:%s,len:%u,ret:%u.", ble_name, ble_name_len, ret);\r
+ memset_s(ble_name, BLE_NAME_LENGTH, 0, BLE_NAME_LENGTH);\r
+ memcpy_s(ble_name, BLE_NAME_LENGTH,BLE_DEFAULT_NAME, BLE_DEFAULT_NAME_LEN);\r
+ ble_name_len = BLE_DEFAULT_NAME_LEN + 1; \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
+\r
+ ret = gap_br_set_bt_scan_mode(GAP_SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE, 60); // start scan\r
+ if (ret == false) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ConnectPhonePresenter bt gap_br_set_bt_scan_mode ret = 0x%x", ret);\r
+ }\r
+\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gap_ble_get_local_addr, ret:%u.", ret);\r
+ memcpy_s(adv_data, sizeof(ble_adv_type), ble_adv_type, sizeof(ble_adv_type));\r
+ adv_data_len = sizeof(ble_adv_type);\r
+\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(adv_data + adv_data_len, ble_name_len + 1, ble_data_name, ble_name_len + 1);\r
+\r
+ adv_data_len = adv_data_len + ble_name_len + 1;\r
+ memcpy_s(adv_data + adv_data_len, sizeof(ble_adv_uuid), ble_adv_uuid, sizeof(ble_adv_uuid));\r
+ adv_data_len = adv_data_len + sizeof(ble_adv_uuid);\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, "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
+ memcpy_s(adv_mac_head + BLE_ADV_MAC_HEAD_LENTH, BD_ADDR_LEN, ble_data_mac_switch, BD_ADDR_LEN);\r
+\r
+ memcpy_s(adv_data + adv_data_len, sizeof(adv_mac_head), adv_mac_head, sizeof(adv_mac_head));\r
+ adv_data_len = adv_data_len + sizeof(adv_mac_head);\r
+\r
+ scan_data[0] = 0x0f;//长度\r
+ scan_data[1] = 0xff;//数据类型 manufactory data\r
+ scan_data[2] = 'J';\r
+ scan_data[3] = 'H';\r
+ scan_data[4] = 0x00;\r
+ memcpy_s(scan_data+5,BD_ADDR_LEN, ble_data_mac_switch, BD_ADDR_LEN);//拷贝蓝牙设备地址到厂商数据里面做广播扫描使用,app会扫描这里做连接使用\r
+ // scan_data_len = strlen((char *)scan_data);//转换成char型\r
+ scan_data_len = 11;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "adv_data_info.adv_length.scan_data_len:%d\r\n",scan_data_len);\r
+ scan_data[scan_data_len++] = 0x05;//未知 app\r
+ scan_data[scan_data_len++] = 0x05;\r
+ scan_data[scan_data_len++] = 0x00;\r
+ scan_data[scan_data_len++] = 0x00;\r
+ scan_data[scan_data_len++] = 0x01;\r
+ \r
+ if (scan_data_len > BLE_SCAN_MAC_LENTH){\r
+ scan_data_len = BLE_SCAN_MAC_LENTH;\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
+ gap_conn_param_update_t params;//更改连接参数\r
+ params.interval_min = 0x140;\r
+ params.interval_max = 0x200;\r
+ params.conn_handle = 1;\r
+ params.slave_latency = 0;\r
+ params.timeout_multiplier = 4000;\r
+ ret = gap_ble_connect_param_update(¶ms);\r
+ gap_ble_set_adv_data(adv_id, &adv_data_info);\r
+\r
+ return;\r
+}\r
+\r
+void svr_ble_adv_start(void)\r
+{\r
+ int adv_id = BLE_ADV_ID;\r
+ if (AdverFlag) { //已经开始广播了,不需要重复开启广播\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BleAdvStart already started1");\r
+ return;\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 = 0x140;\r
+ adv_para.max_interval = 0x200;\r
+ adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;\r
+ adv_para.channel_map = 0x7;\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
+ int32_t 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
+static 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
+ // ALIPAY_PRINT_DEBUG(0, "BleConnStateChangeCallback conn_id 0x%x, conn_state 0x%x, pair_state 0x%x", conn_id,\r
+ // conn_state, pair_state);\r
+ g_ble_conn_id = conn_id;\r
+ if (GAP_BLE_STATE_DISCONNECTED == conn_state) { // restart ble adv when disconnected\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GAP_BLE_STATE_DISCONNECTED!!! 0x%x\r\n",pair_state);\r
+ Bleconnect = GAP_BLE_STATE_DISCONNECTED;//蓝牙已断开\r
+ if(AdverFlag != true){\r
+ svr_ble_adv_start();\r
+ svr_ble_ble_adv_start();\r
+ } \r
+ } else {\r
+ Bleconnect = GAP_BLE_STATE_CONNECTED;//蓝牙已连接\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GAP_BLE_STATE_CONNECTED!!! 0x%x\r\n",pair_state);\r
+ \r
+ }\r
+}\r
+static void svr_pair_result_cbt_cb(uint16_t conn_id, const bd_addr_t *addr, errcode_t status)\r
+{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_pair_result_cbt_cb!!! 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x status:0x%x\r\n",addr->addr[0],status);\r
+}\r
+static void svr_ble_adv_start_cb(uint8_t adv_id, adv_status_t status)\r
+{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_adv_start_cb!!! 0x%x %d",adv_id,status);\r
+ \r
+}\r
+\r
+static void svr_ble_set_adv_data_cb(uint8_t adv_id, errcode_t status)\r
+{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_set_adv_data_cb:%d",status);\r
+ \r
+}\r
+\r
+static void svr_ble_adv_stop_cb(uint8_t adv_id, adv_status_t status)\r
+{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_adv_stop_cb:%d",status);\r
+}\r
+\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
+ // 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_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_service_add_cb 0x%x\r\n",srv_handle);\r
+ if (status != ERRCODE_BT_SUCCESS)\r
+ {\r
+ return;\r
+ }\r
+ int ret;\r
+ if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t *)uuid->uuid) == 0xe018)) {\r
+ uint16_t id = 0 ;\r
+ gatts_add_chara_info_t character;\r
+ uint16_t value = 0;\r
+ gatts_add_character_result_t result = {0};\r
+\r
+ id = BLE_CHARACTERISTIC_SNED_OTA_ID;//ota特征值\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.permissions = GATT_ATTRIBUTE_PERMISSION_READ;\r
+ character.properties = BLE_CHARACTERISTIC_SNED_OTA_ID_PROPERTIES;\r
+ character.value_len = BLE_CHARACTERISTIC_MAX_LENGTH;\r
+ character.value = g_ble_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
+ id = BLE_CHARACTERISTIC_SNED_ANDRIOD_ID;//andriod特征值\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.permissions = GATT_ATTRIBUTE_PERMISSION_READ;\r
+ character.properties = BLE_CHARACTERISTIC_SNED_ANDRIOD_ID_PROPERTIES;\r
+ character.value_len = BLE_CHARACTERISTIC_MAX_LENGTH;\r
+ character.value = g_ble_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
+ id = BLE_CHARACTERISTIC_READ_BATTERY_ID;//读取电量特征值\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.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+ character.properties = BLE_CHARACTERISTIC_READ_BATTERY_ID_PROPERTIES;\r
+ character.value_len = BLE_CHARACTERISTIC_MAX_LENGTH;\r
+ character.value = g_ble_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
+ id = BLE_CHARACTERISTIC_SNED_SHORT_ID;\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.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+ character.properties = BLE_CHARACTERISTIC_SNED_SHORT_ID_PROPERTIES;\r
+ character.value_len = BLE_CHARACTERISTIC_MAX_LENGTH;\r
+ character.value = g_ble_character_buf;\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
+ id = BLE_CHARACTERISTIC_SNED_LONG_ID;\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.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+ character.properties = BLE_CHARACTERISTIC_SNED_LONG_ID_PROPERTIES;\r
+ character.value_len = BLE_CHARACTERISTIC_MAX_LENGTH;\r
+ character.value = g_ble_character_buf;\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
+ id = BLE_CHARACTERISTIC_RECV_ID;\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.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+ character.properties = BLE_CHARACTERISTIC_RECV_ID_PROPERTIES;\r
+ character.value_len = BLE_CHARACTERISTIC_MAX_LENGTH;\r
+ character.value = g_ble_character_buf;\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
+ }\r
+}\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 0x%x 0x%x 0x%x\r\n",srv_handle,result->handle,result->value_handle);\r
+ // ALIPAY_PRINT_DEBUG(0, "BtGattsCharacteristicAddCallback 0x%x 0x%x 0x%x 0x%x 0x%x", status, server_id, srv_handle,\r
+ // result->handle, result->value_handle);\r
+\r
+ g_ble_server_handle = result->value_handle;\r
+ int ret = 0;\r
+ unsigned char byte1 = uuid->uuid[0]; // 第一个字节\r
+ unsigned char byte2 = uuid->uuid[1]; // 第二个字节\r
+ int tmpValue = (byte2 << 8) | byte1;\r
+ uint8_t bas_ccc_val=0;\r
+ bt_uuid_t ccc_uuid = {0};\r
+ gatts_add_desc_info_t descriptor;\r
+ \r
+ if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t *)uuid->uuid) == BLE_CHARACTERISTIC_SNED_OTA_ID)) {\r
+ memset(&descriptor,0,sizeof(gatts_add_desc_info_t));\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "mergedValue uuis1");\r
+ bts_data_to_uuid_len2(0x2902, &ccc_uuid);\r
+ descriptor.desc_uuid = ccc_uuid;\r
+ descriptor.permissions = 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
+ memset(&descriptor,0,sizeof(gatts_add_desc_info_t));\r
+ bts_data_to_uuid_len2(0x2901, &ccc_uuid);\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
+ uint16_t handle;\r
+ ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
+ if (ret != ERRCODE_SUCC) {\r
+ // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor second fail, ret:%u.\r\n", ret);\r
+ }\r
+ ret = gatts_start_service(server_id, srv_handle);\r
+ if (ret != ERRCODE_SUCC) {\r
+ // ALIPAY_PRINT_ERR(0, "gatts_start_service fail, ret:%u.\r\n", ret);\r
+ }\r
+ }\r
+ else if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t *)uuid->uuid) == BLE_CHARACTERISTIC_SNED_ANDRIOD_ID)) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "mergedValue uuid2");\r
+ gatts_add_desc_info_t descriptor_and;\r
+ uint8_t and_ccc_val=1;\r
+ memset(&descriptor_and,0,sizeof(gatts_add_desc_info_t));\r
+ bts_data_to_uuid_len2(0x2901, &ccc_uuid);\r
+ descriptor_and.desc_uuid = ccc_uuid;\r
+ descriptor_and.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+ descriptor_and.value_len = (uint16_t)sizeof(and_ccc_val);\r
+ descriptor_and.value = &and_ccc_val;\r
+ uint16_t handle;\r
+ ret = gatts_add_descriptor(server_id, srv_handle, &descriptor_and);\r
+ if (ret != ERRCODE_SUCC) {\r
+ // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+ }\r
+ \r
+ }\r
+ else if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t *)uuid->uuid) == BLE_CHARACTERISTIC_READ_BATTERY_ID)) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "mergedValue uuid3");\r
+ gatts_add_desc_info_t descriptor_bat;\r
+ uint8_t read_ccc_val=2;\r
+ memset(&descriptor_bat,0,sizeof(gatts_add_desc_info_t));\r
+ bts_data_to_uuid_len2(0x2901, &ccc_uuid);\r
+ descriptor_bat.desc_uuid = ccc_uuid;\r
+ descriptor_bat.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+ descriptor_bat.value_len = (uint16_t)sizeof(read_ccc_val);\r
+ descriptor_bat.value = &read_ccc_val;\r
+ uint16_t handle;\r
+ // ret = gatts_add_descriptor(server_id, srv_handle, &descriptor_recv);\r
+ ret = gatts_add_descriptor(server_id, srv_handle, &descriptor_bat);\r
+ // ret = gatts_add_descriptor(server_id, srv_handle, &descriptor_bat);\r
+ if (ret != ERRCODE_SUCC) {\r
+ // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+ }\r
+ }\r
+\r
+ else if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t *)uuid->uuid) == BLE_CHARACTERISTIC_SNED_SHORT_ID)) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "mergedValue uuid4");\r
+ gatts_add_desc_info_t descriptor_short;\r
+ uint8_t short_ccc_val=3;\r
+ memset(&descriptor_short,0,sizeof(gatts_add_desc_info_t));\r
+ bts_data_to_uuid_len2(0x2901, &ccc_uuid);\r
+ descriptor_short.desc_uuid = ccc_uuid;\r
+ descriptor_short.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+ descriptor_short.value_len = (uint16_t)sizeof(short_ccc_val);\r
+ descriptor_short.value = &short_ccc_val;\r
+ ret = gatts_add_descriptor(server_id, srv_handle, &descriptor_short);\r
+ if (ret != ERRCODE_SUCC) {\r
+ // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+ }\r
+ \r
+ }\r
+ else if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t *)uuid->uuid) == BLE_CHARACTERISTIC_SNED_LONG_ID)) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "mergedValue uuid5");\r
+ gatts_add_desc_info_t descriptor_long;\r
+ uint8_t long_ccc_val=4;\r
+ memset(&descriptor_long,0,sizeof(gatts_add_desc_info_t));\r
+ bts_data_to_uuid_len2(0x2901, &ccc_uuid);\r
+ descriptor_long.desc_uuid = ccc_uuid;\r
+ descriptor_long.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+ descriptor_long.value_len = (uint16_t)sizeof(long_ccc_val);\r
+ descriptor_long.value = &long_ccc_val;\r
+ ret = gatts_add_descriptor(server_id, srv_handle, &descriptor_long);\r
+ if (ret != ERRCODE_SUCC) {\r
+ // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+ }\r
+ }\r
+ else if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t *)uuid->uuid) == BLE_CHARACTERISTIC_RECV_ID)) {\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "mergedValue uuid6");\r
+ gatts_add_desc_info_t descriptor_recv;\r
+ uint8_t recv_ccc_val=5;\r
+ memset(&descriptor_recv,0,sizeof(gatts_add_desc_info_t));\r
+ bts_data_to_uuid_len2(0x2901, &ccc_uuid);\r
+ descriptor_recv.desc_uuid = ccc_uuid;\r
+ descriptor_recv.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE; \r
+ descriptor_recv.value_len = (uint16_t)sizeof(recv_ccc_val);\r
+ descriptor_recv.value = &recv_ccc_val;\r
+ ret = gatts_add_descriptor(server_id, srv_handle, &descriptor_recv);\r
+ if (ret != ERRCODE_SUCC) {\r
+ // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+ }\r
+ \r
+ }\r
+}\r
+\r
+static void svr_ble_bt_gatts_descriptor_add_cb(uint8_t server_id, bt_uuid_t *uuid, uint16_t srv_handle,\r
+ uint16_t desc_handle, errcode_t status)\r
+{\r
+ \r
+}\r
+\r
+static void svr_ble_bt_gatts_service_start_cb(uint8_t server_id, uint16_t srv_handle, errcode_t status)\r
+{\r
+ // ALIPAY_PRINT_DEBUG(0, "BtGattsServiceStartCallback 0x%x 0x%x 0x%x", status, server_id, srv_handle);\r
+}\r
+\r
+static void svr_ble_bt_gatts_service_stop_cb(uint8_t server_id, uint16_t srv_handle, errcode_t status)\r
+{\r
+ // ALIPAY_PRINT_DEBUG(0, "BtGattsServiceStopCallback 0x%x 0x%x 0x%x", status, server_id, srv_handle);\r
+}\r
+\r
+static void svr_ble_bt_gatts_service_del_cb(uint8_t server_id, errcode_t status)\r
+{\r
+ // ALIPAY_PRINT_DEBUG(0, "BtGattsServiceDeleteCallback 0x%x 0x%x", status, server_id);\r
+}\r
+static void 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
+ errcode_t ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &data_info);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.", ret, g_ble_server_id,\r
+ g_ble_conn_id, g_ble_server_handle);\r
+ \r
+ \r
+}\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
+ closeBle();\r
+ return;\r
+ //读取手表信息返回给手机app端\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_value[0] = power;//电量90\r
+ uint16_t dial = 1;\r
+ battery_value[1] = 0;//当前表盘几\r
+ battery_value[2] = 1;\r
+\r
+ battery_value[3] = 0;//固件版本号\r
+ battery_value[4] = 0;\r
+ battery_value[5] = 1;\r
+\r
+ bd_addr_t addr_info;\r
+ int32_t ret= 0;\r
+ ret = gap_ble_get_local_addr(&addr_info);\r
+ battery_value[6] = addr_info.addr[5];\r
+ battery_value[7] = addr_info.addr[4];\r
+ battery_value[8] = addr_info.addr[3];\r
+ battery_value[9] = addr_info.addr[2];\r
+ battery_value[10] = addr_info.addr[1];\r
+ battery_value[11] = addr_info.addr[0];\r
+\r
+ battery_value[12] = 0;//消息推送开关 默认是关闭 0\r
+ battery_value[13] = 0;//多媒体开关\r
+ battery_value[14] = 5;//客户编号\r
+ battery_value[15] = 5;//产品编号\r
+\r
+ battery_value[16] = 0;//硬件版本号\r
+ battery_value[17] = 1;\r
+\r
+ battery_value[18] = 0;//ble版本号\r
+ battery_value[19] = 1;\r
+\r
+ svr_ble_bt_gatts_noyify(battery_value,20);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_req_read_cb ret:is_long:%d",read_cb_para->is_long);\r
+ // ALIPAY_PRINT_DEBUG(0, "BtGattsRequestReadCallback");\r
+}\r
+\r
+static bool Check_CRC(uint8_t *crcnum,uint8_t len)//计算20byte的的校验位\r
+{\r
+ uint8_t crcbuf = 0;\r
+ for(int i = 0; i < len-1; i++)\r
+ {\r
+ crcbuf += crcnum[i]; \r
+ }\r
+ crcbuf = crcbuf&0xFF;\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC ret:0x%x\r\n",crcbuf);\r
+ if(crcbuf == crcnum[len-1])\r
+ return true;\r
+ else\r
+ return false;\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_LOGE(WEARABLE_LOG_MODULE_APP, "server_id:%d write_cb_para %d %x %x\r\n",server_id,write_cb_para->length,write_cb_para->value[0],write_cb_para->value[1]);\r
+ uint8_t value[20];\r
+ memset(value,0,20);\r
+ value[0] = 0x72;\r
+ value[1] = 0x05;\r
+ value[2] = 0x11;\r
+ uint8_t tmp = 1;\r
+ memcpy(value+3,&tmp,4);\r
+ memcpy(value+7,&tmp,4);\r
+ memcpy(value+11,&tmp,4);\r
+ memcpy(value+15,&tmp,2);\r
+ value[18] = 0x01;\r
+ value[19] = 0x8d;\r
+ if(Check_CRC(value,20))\r
+ { \r
+ // memcpy(write_cb_para->value,value,20);\r
+ // write_cb_para->length = 20;\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gatts_req_write_cb");\r
+ svr_ble_bt_gatts_noyify(value,20);\r
+ }\r
+ \r
+ \r
+ \r
+}\r
+static void svr_gap_ble_connect_param_update_callback(uint16_t conn_id, errcode_t status,const gap_ble_conn_param_update_t *param)\r
+{\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gap_ble_connect_param_update_callback %d %d %d\r\n",param->interval,param->latency,param->timeout);\r
+}\r
+// 回调: gap_read_remote_rssi_value 接口的数据上报\r
+static void svr_gap_ble_ReadRemoteRssiEventCallback(const bd_addr_t *bdAddr, int rssi, int status)\r
+{\r
+ UNUSED(status);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapReadRemoteRssiEventCallback addr: %02x%02x%02x%02x%02x%02x",\r
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */\r
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt BtGapReadRemoteRssiEventCallback SetSortCaseRssi: %d status: %d", rssi, status);\r
+}\r
+\r
+// 回调:发现状态变化上报/扫描结束\r
+static void svr_gap_ble_DiscoveryStateChangedCallback(int status)\r
+{\r
+ UNUSED(status);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt BtGapDiscoveryStateChangedCallback %d", status);\r
+}\r
+\r
+\r
+static void svr_gap_ble_PairStatusChangedCallback(const bd_addr_t *bdAddr, int status)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapPairStatusChangedCallback addr: ****%02x%02x%02x%02x status: %d\n",\r
+ bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], status); /* addr下标 0 1 2 3 */\r
+ if (status == GAP_PAIR_PAIRED) {\r
+ \r
+ }\r
+}\r
+\r
+static void svr_gap_ble_RequestedCallback(const bd_addr_t *bdAddr)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapPairRequestedCallback addr: ****%02x%02x%02x%02x\n",\r
+ bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* addr下标 0 1 2 3 */\r
+}\r
+\r
+static void svr_gap_ble_ConfirmedCallback(const bd_addr_t *bdAddr, int req_type, int number)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapPairConfirmedCallback addr: ****%02x%02x%02x%02x req_type: %d number: %d\n",\r
+ bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], /* addr下标 0 1 2 3 */\r
+ req_type, number);\r
+}\r
+\r
+// 回调:扫描结果处理/发现结果上报\r
+static void svr_gap_ble_DiscoveryResultCallback(const bd_addr_t *bdAddr)\r
+{\r
+ // if ((gap_get_device_class(bdAddr) & 0x200) != 0) {\r
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapDiscoveryResultCallback: Mobile Phone Device");\r
+ // return;\r
+ // }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtGapDiscoveryResultCallback");\r
+ if (bdAddr == NULL) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "addr nullptr");\r
+ return;\r
+ }\r
+}\r
+\r
+// 回调:ACL连接状态上报\r
+static void svr_gap_ble_AclStateChangedCallback(const bd_addr_t *bdAddr, gap_acl_state_t state, unsigned int reason)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "bt GapAclStateChangedCallback state %d, reason %x succ or err", state, reason);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "addr: %02x%02x%02x%02x%02x%02x",\r
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */\r
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */\r
+ if ((gap_get_device_class(bdAddr) & 0x200) != 0) {\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "GapAclStateChangedCallback: Mobile Phone Device");\r
+ return;\r
+ }\r
+}\r
+// 回调:远端设备名称变化\r
+static void svr_gap_ble_RemoteNameChangedCallback(const bd_addr_t *bdAddr, const unsigned char *deviceName, unsigned char length)\r
+{\r
+ // if ((gap_get_device_class(bdAddr) & 0x200) != 0) {\r
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtRemoteNameChangedCallback: Mobile Phone Device");\r
+ // return;\r
+ // }\r
+ if (bdAddr == NULL) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BtRemoteNameChangedCallback addr nullptr");\r
+ return;\r
+ }\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtRemoteNameChangedCallback addr: %02x%02x%02x%02x%02x%02x",\r
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* mac下标 0 1 2 3 4 5 */\r
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* mac下标 0 1 2 3 4 5 */\r
+\r
+}\r
+\r
+static void svr_gap_ble_IsAcceptConnOnSafeModeCallback(const bd_addr_t *bdAddr, bool *res)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "BtIsAcceptConnOnSafeModeCallback addr: %02x%02x%02x%02x%02x%02x set *res true",\r
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* addr下标 3 4 5 */\r
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* addr下标 0 1 2 */\r
+ *res = true;\r
+}\r
+\r
+static void A2dp_SrcConnectstateChanged(bd_addr_t *bdAddr, int connState)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connectStateChangedCallback addr: %02x%02x%02x%02x%02x%02x connState: %x",\r
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */\r
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], connState); /* 2 1 0 idx */\r
+ // if ((gap_get_device_class(bdAddr) & 0x200) != 0) {\r
+ // WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connectstateChangedCb: Mobile Phone Device");\r
+ // return;\r
+ // }\r
+ if (connState == PROFILE_STATE_CONNECTED) {\r
+ avrcp_ct_connect(bdAddr);\r
+ // PhoneAudioManagerSetDeviceConnState(OUT_BLUETOOTH_A2DP, AUDIO_DEVICE_CONNECTED);\r
+ }\r
+\r
+ if (connState == PROFILE_STATE_DISCONNECTED) {\r
+ // PhoneAudioManagerSetDeviceConnState(OUT_BLUETOOTH_A2DP, AUDIO_DEVICE_DISCONNECTED);\r
+ }\r
+}\r
+\r
+static void A2dp_SrcPlayingStateChanged(bd_addr_t *bdAddr, int playState)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "A2dpSrcPlayingStateChangedCallback addr: %02x%02x%02x%02x%02x%02x playState: %x",\r
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */\r
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], playState); /* 2 1 0 idx */\r
+}\r
+\r
+static void A2dp_SrcConfigureChanged(bd_addr_t *bdAddr, a2dp_codec_info_t *info)\r
+{\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "A2dpSrcConfigurationChangedCallback addr: %02x%02x%02x%02x%02x%02x ",\r
+ bdAddr->addr[5], bdAddr->addr[4], bdAddr->addr[3], /* 5 4 3 idx */\r
+ bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0]); /* 2 1 0 idx */\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "codec_priority: %04x codec_type: %04x sample_rate: %02x bits_per_sample: %02x channel_mode: %02x ",\r
+ info->codec_priority, info->codec_type, info->sample_rate, info->bits_per_sample, info->channel_mode);\r
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "codec_specific1: %04x codec_specific2: %04x codec_specific3: %04x codec_specific4: %04x",\r
+ info->codec_specific1, info->codec_specific2, info->codec_specific3, info->codec_specific4);\r
+}\r
+\r
+\r
+static void svr_ble_btcallback_reg(void)//ble基础通讯服务注册回调函数\r
+{\r
+ gap_ble_sec_params_t sec_params = { 0 };\r
+ sec_params.bondable = 0x01;\r
+ sec_params.io_capability = GAP_BLE_IO_CAPABILITY_NOINPUTNOOUTPUT;//最好选择没有输入输出IO能力\r
+ sec_params.sc_enable = 0x00;\r
+ sec_params.sc_mode = GAP_BLE_GAP_SECURITY_MODE1_LEVEL2;\r
+ errcode_t ret = gap_ble_set_sec_param(&sec_params);//设置配对参数 发起配对弹窗\r
+\r
+ g_btGapCallBacks.discovery_result_callback = svr_gap_ble_DiscoveryResultCallback;\r
+ g_btGapCallBacks.discovery_state_changed_callback = svr_gap_ble_DiscoveryStateChangedCallback;\r
+ g_btGapCallBacks.acl_state_changed_callbak = svr_gap_ble_AclStateChangedCallback;\r
+ g_btGapCallBacks.read_remote_rssi_event_callback = svr_gap_ble_ReadRemoteRssiEventCallback;\r
+ g_btGapCallBacks.remote_name_changed_callback = svr_gap_ble_RemoteNameChangedCallback;\r
+ g_btGapCallBacks.is_accept_conn_on_safe_mode_callback = svr_gap_ble_IsAcceptConnOnSafeModeCallback;\r
+ g_btGapCallBacks.pair_status_changed_callback = svr_gap_ble_PairStatusChangedCallback;\r
+ g_btGapCallBacks.pair_requested_callback = svr_gap_ble_RequestedCallback;\r
+ g_btGapCallBacks.pair_confiremed_callback = svr_gap_ble_ConfirmedCallback; \r
+ \r
+ gap_register_callbacks(&g_btGapCallBacks);\r
+\r
+ g_a2dpSrcCallbacks.connectstate_changed_cb = A2dp_SrcConnectstateChanged;\r
+ g_a2dpSrcCallbacks.configuration_changed_cb = A2dp_SrcConfigureChanged;\r
+ g_a2dpSrcCallbacks.playing_state_changed_cb = A2dp_SrcPlayingStateChanged;\r
+ a2dp_src_register_callbacks(&g_a2dpSrcCallbacks);\r
+\r
+\r
+ g_ble_gapble_cbs.conn_state_change_cb = svr_ble_connstate_change_cb;\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.set_adv_data_cb = svr_ble_set_adv_data_cb;\r
+ g_ble_gapble_cbs.pair_result_cb = svr_pair_result_cbt_cb;\r
+ g_ble_gapble_cbs.conn_param_update_cb = svr_gap_ble_connect_param_update_callback;\r
+\r
+ gap_ble_register_callbacks(&g_ble_gapble_cbs);\r
+\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
+ g_ble_gatts_cbs.add_descriptor_cb = svr_ble_bt_gatts_descriptor_add_cb;\r
+ g_ble_gatts_cbs.start_service_cb = svr_ble_bt_gatts_service_start_cb;\r
+ g_ble_gatts_cbs.stop_service_cb = svr_ble_bt_gatts_service_stop_cb;\r
+ g_ble_gatts_cbs.delete_service_cb = svr_ble_bt_gatts_service_del_cb;\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 = NULL;\r
+ gatts_register_callbacks(&g_ble_gatts_cbs);\r
+}\r
+\r
+static void svr_ble_bt_init_gatts(void)\r
+{\r
+ uint16_t id = 0xe018;\r
+ uint16_t ser_id = 0x1fff;\r
+ uint8_t serverId = 0;\r
+ bt_uuid_t uuid;\r
+ int ret;\r
+ // static char server_app_uuid_for_test[] = {0x00,0x00,0xFE,0xE7,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0x80,0x5F,0x9B,0x34,0xFB};//{0xfb,0x34,0x9b,0x5f,0x80,0x00,0x00,0x80,0x00,0x10,0x00,0x00,0xe7,0xfe,0x00,0x00};\r
+ uuid.uuid_len = (uint8_t)sizeof(ser_id);\r
+ memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&ser_id, sizeof(ser_id));\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
+ g_ble_server_id = serverId;\r
+ \r
+ uuid.uuid_len = sizeof(id);\r
+ memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&id, sizeof(id));\r
+ ret = gatts_add_service(serverId, &uuid, true);\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_service ret: 0x%x", ret);\r
+ return;\r
+}\r
+\r
+\r
+\r
+\r
+void svr_bluetooth_init(void)\r
+{\r
+ // WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "svr_bluetooth_init!!!!!!!!!!!!!!\r\n");\r
+ bool ret = enable_bt_stack();\r
+ if (ret != ERRCODE_SUCC) {\r
+ // WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "svr_bluetooth_init enable_bt_stack ret:%u.\r\n", ret);\r
+ }\r
+ if (g_ble_init_flag == true) {\r
+ return;\r
+ }\r
+\r
+ svr_ble_btcallback_reg();\r
+ svr_ble_adv_start();\r
+ svr_ble_bt_init_gatts();\r
+ \r
+ g_ble_init_flag = true;\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "svr_bluetooth_init22222222222\r\n");\r
+ return;\r
+}\r
+//关闭蓝牙\r
+void closeBle(void)\r
+{\r
+ if(AdverFlag == false)//没有连接的状态下关闭蓝牙#只能手动开启蓝牙\r
+ {\r
+ AdverFlag = true;\r
+ g_ble_init_flag = false;\r
+ bd_addr_t bd_addr;\r
+ unsigned char addr[BLE_MAC_MAX_LEN] = {0};\r
+ bluetooth_get_local_addr(&addr[0],BD_ADDR_LEN);\r
+ memcpy(bd_addr.addr,addr,BLE_MAC_MAX_LEN);\r
+ errcode_t ret = 0;\r
+ if(Bleconnect == GAP_BLE_STATE_CONNECTED){//设备连接需要断开\r
+ ret = gap_ble_disconnect_remote_device((const bd_addr_t *)&bd_addr);//与固定的mac设置地址进行断开连接\r
+ }\r
+ svr_ble_ble_adv_stop();//停止广播 不发送广播数据 就是app搜索不到该设备了\r
+ ret = disable_ble();//关闭ble 直接断开和当前连接的手机app\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "closeBle ret%d 0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\r\n",ret,bd_addr.addr[0],bd_addr.addr[1],bd_addr.addr[2],bd_addr.addr[3],bd_addr.addr[4],bd_addr.addr[5]);\r
+ }\r
+}\r
+//开启蓝牙\r
+void openBle(void)\r
+{\r
+ if(AdverFlag == true)//在连接的状态下不需要\r
+ {\r
+ AdverFlag = false;\r
+ bool ret = enable_ble();//开启ble 直接断开和当前连接的手机app\r
+ svr_bluetooth_init();\r
+ }\r
+}
\ No newline at end of file