BtGattsRequestWriteCallback
authordxy <1731678236@qq.com>
Wed, 28 Feb 2024 03:19:08 +0000 (11:19 +0800)
committerdxy <1731678236@qq.com>
Wed, 28 Feb 2024 03:19:08 +0000 (11:19 +0800)
17 files changed:
code/sdk/application/brandy/brandy_standard/thread_pri_init.c
code/sdk/application/wearable/alipay/service/alipay_bluetooth.c
code/sdk/application/wearable/fd230app/nativeui/bluetooth/src/BluetoothModel.cpp
code/sdk/application/wearable/fd230app/nativeui/system/include/SystemView.h
code/sdk/application/wearable/fd230app/nativeui/system/src/SystemView.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/BluetoothModel.cpp
code/sdk/application/wearable/service/CMakeLists.txt
code/sdk/application/wearable/service/ble_service/CMakeLists.txt [new file with mode: 0644]
code/sdk/application/wearable/service/ble_service/bleService.c [new file with mode: 0644]
code/sdk/application/wearable/service/ble_service/bleService.h [new file with mode: 0644]
code/sdk/application/wstp/at_service/bt/bt_manager_at_process.c
code/sdk/build/config/target_config/brandy/config.py
code/sdk/protocol/bt/host/bt/bts/bt_sample/ble_profile/profiles/include/ble_bas_client.h
code/sdk/protocol/bt/host/bt/bts/bt_sample/ble_profile/profiles/include/ble_hid_take_photo_server.h
code/sdk/protocol/bt/host/bt/bts/bt_sample/ble_profile/profiles/src/dis_profile_server.c
code/sdk/protocol/bt/host/bt/bts/bt_sample/bt_core/sample_bts_gatt.c
code/sdk/protocol/bt/host/bt/bts/bt_sample/bt_srv_shell.c

index 2958163..673f354 100755 (executable)
@@ -9,6 +9,7 @@
 #include "common_def.h"\r
 #include "pm.h"\r
 #include "watchdog.h"\r
+#include "bleService.h"\r
 /* after reboot system emmc need write exc info to the file system from sector */\r
 #if defined(SAVE_EXC_INFO) && defined(CFG_DRIVERS_MMC)\r
 #include "exception.h"\r
@@ -329,6 +330,9 @@ static void thread_main(const void *unused)
 #ifdef SUPPORT_ALIPAY_SEC\r
     uapi_alipay_svr_init();\r
 #endif\r
+\r
+    svr_bluetooth_init();\r
+\r
     set_startup_finish_flag();\r
 }\r
 \r
index 685e0e8..e44664c 100644 (file)
@@ -14,7 +14,7 @@
 #include "osal_task.h"\r
 #include "alipay_feature.h"\r
 #include "securec.h"\r
-\r
+#include "wearable_log.h"\r
 /* Gatt service UUID */\r
 #define ALIPAYY_SERVICE_ID 0x0238\r
 /* Gatt Characteristic UUID */\r
@@ -307,11 +307,11 @@ void svr_alipay_bt_gatts_noyify(uint8_t *data, uint16_t data_len)
 \r
 static void svr_alipay_btcallback_reg(void)\r
 {\r
-    g_alipay_gapble_cbs.conn_state_change_cb = svr_alipay_ble_connstate_change_cb;\r
-    g_alipay_gapble_cbs.start_adv_cb = svr_alipay_ble_adv_start_cb;\r
-    g_alipay_gapble_cbs.stop_adv_cb = svr_alipay_ble_adv_stop_cb;\r
-    g_alipay_gapble_cbs.set_adv_data_cb = svr_alipay_ble_set_adv_data_cb;\r
-    gap_ble_register_callbacks(&g_alipay_gapble_cbs);\r
+    // g_alipay_gapble_cbs.conn_state_change_cb = svr_alipay_ble_connstate_change_cb;\r
+    // g_alipay_gapble_cbs.start_adv_cb = svr_alipay_ble_adv_start_cb;\r
+    // g_alipay_gapble_cbs.stop_adv_cb = svr_alipay_ble_adv_stop_cb;\r
+    // g_alipay_gapble_cbs.set_adv_data_cb = svr_alipay_ble_set_adv_data_cb;\r
+    // gap_ble_register_callbacks(&g_alipay_gapble_cbs);\r
 \r
     g_alipay_gatts_cbs.add_service_cb = svr_alipay_bt_gatts_service_add_cb;\r
     g_alipay_gatts_cbs.add_characteristic_cb = svr_alipay_bt_gatts_characteristic_add_cb;\r
index 381aaf7..e0e7f72 100644 (file)
@@ -59,8 +59,8 @@ void BluetoothModel::Init()
     bool ret = enable_bt_stack();
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bt enable_bt_stack ret = %d", ret);
 
-    BtInitCallBacks();
-    BtInitGatts();
+    // BtInitCallBacks();
+    // BtInitGatts();
     BtInitSpp();
 
     SetUpListCase();
@@ -567,6 +567,8 @@ void BtGapDiscoveryResultCallback(const bd_addr_t *bdAddr)
                                                               BluetoothModel::GetInstance(), *bdAddr));
 }
 
+
+
 void HandleBeforeChangeView()
 {
     int curView = BluetoothModel::GetInstance()->GetCurView();
@@ -944,7 +946,7 @@ static void BtGattsRequestReadCallback(uint8_t serverId, uint16_t connId, gatts_
 
 static void BtGattsRequestWriteCallback(uint8_t serverId, uint16_t connId, gatts_req_write_cb_t *writeCbPara,  errcode_t status)
 {
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsRequestWriteCallback");
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsRequestWriteCallback333 %s %d",writeCbPara->value,writeCbPara->length);
 }
 
 // 注册回调函数
@@ -954,41 +956,43 @@ static gap_ble_callbacks_t g_gapBleCallbacks{};
 static gatts_callbacks_t g_btGattsCallbacks{};
 void BtInitCallBacks()
 {
-    g_btGapCallBacks.discovery_result_callback = BtGapDiscoveryResultCallback;
-    g_btGapCallBacks.discovery_state_changed_callback = BtGapDiscoveryStateChangedCallback;
-    g_btGapCallBacks.acl_state_changed_callbak = GapAclStateChangedCallback;
-    g_btGapCallBacks.read_remote_rssi_event_callback = BtGapReadRemoteRssiEventCallback;
-    g_btGapCallBacks.remote_name_changed_callback = BtRemoteNameChangedCallback;
-    g_btGapCallBacks.is_accept_conn_on_safe_mode_callback = BtIsAcceptConnOnSafeModeCallback;
-    g_btGapCallBacks.pair_status_changed_callback = BtGapPairStatusChangedCallback;
-    g_btGapCallBacks.pair_requested_callback = BtGapPairRequestedCallback;
-    g_btGapCallBacks.pair_confiremed_callback = BtGapPairConfirmedCallback;
-    gap_register_callbacks(&g_btGapCallBacks);
-
-    g_a2dpSrcCallbacks.connectstate_changed_cb = A2dpSrcConnectstateChanged;
-    g_a2dpSrcCallbacks.configuration_changed_cb = A2dpSrcConfigureChanged;
-    g_a2dpSrcCallbacks.playing_state_changed_cb = A2dpSrcPlayingStateChanged;
-    a2dp_src_register_callbacks(&g_a2dpSrcCallbacks);
-
-    g_gapBleCallbacks.conn_state_change_cb = BleConnStateChangeCallback;
-    g_gapBleCallbacks.start_adv_cb = BleAdvStartCallback;
-    g_gapBleCallbacks.stop_adv_cb = BleAdvStopCallback;
-    gap_ble_register_callbacks(&g_gapBleCallbacks);
-
-    g_btGattsCallbacks.add_service_cb = BtGattsServiceAddCallback;
-    g_btGattsCallbacks.add_characteristic_cb = BtGattsCharacteristicAddCallback;
-    g_btGattsCallbacks.add_descriptor_cb = BtGattsDescriptorAddCallback;
-    g_btGattsCallbacks.start_service_cb = BtGattsServiceStartCallback;
-    g_btGattsCallbacks.stop_service_cb = BtGattsServiceStopCallback;
-    g_btGattsCallbacks.delete_service_cb = BtGattsServiceDeleteCallback;
-    g_btGattsCallbacks.read_request_cb = BtGattsRequestReadCallback;
-    g_btGattsCallbacks.write_request_cb = BtGattsRequestWriteCallback;
-    g_btGattsCallbacks.mtu_changed_cb = NULL;
-    gatts_register_callbacks(&g_btGattsCallbacks);
+    // g_btGapCallBacks.discovery_result_callback = BtGapDiscoveryResultCallback;
+    // g_btGapCallBacks.discovery_state_changed_callback = BtGapDiscoveryStateChangedCallback;
+    // g_btGapCallBacks.acl_state_changed_callbak = GapAclStateChangedCallback;
+    // g_btGapCallBacks.read_remote_rssi_event_callback = BtGapReadRemoteRssiEventCallback;
+    // g_btGapCallBacks.remote_name_changed_callback = BtRemoteNameChangedCallback;
+    // g_btGapCallBacks.is_accept_conn_on_safe_mode_callback = BtIsAcceptConnOnSafeModeCallback;
+    // g_btGapCallBacks.pair_status_changed_callback = BtGapPairStatusChangedCallback;
+    // g_btGapCallBacks.pair_requested_callback = BtGapPairRequestedCallback;
+    // g_btGapCallBacks.pair_confiremed_callback = BtGapPairConfirmedCallback; 
+    
+    // gap_register_callbacks(&g_btGapCallBacks);
+
+    // g_a2dpSrcCallbacks.connectstate_changed_cb = A2dpSrcConnectstateChanged;
+    // g_a2dpSrcCallbacks.configuration_changed_cb = A2dpSrcConfigureChanged;
+    // g_a2dpSrcCallbacks.playing_state_changed_cb = A2dpSrcPlayingStateChanged;
+    // a2dp_src_register_callbacks(&g_a2dpSrcCallbacks);
+
+    // g_gapBleCallbacks.conn_state_change_cb = BleConnStateChangeCallback;
+    // g_gapBleCallbacks.start_adv_cb = BleAdvStartCallback;
+    // g_gapBleCallbacks.stop_adv_cb = BleAdvStopCallback;
+    // gap_ble_register_callbacks(&g_gapBleCallbacks);
+
+    // g_btGattsCallbacks.add_service_cb = BtGattsServiceAddCallback;
+    // g_btGattsCallbacks.add_characteristic_cb = BtGattsCharacteristicAddCallback;
+    // g_btGattsCallbacks.add_descriptor_cb = BtGattsDescriptorAddCallback;
+    // g_btGattsCallbacks.start_service_cb = BtGattsServiceStartCallback;
+    // g_btGattsCallbacks.stop_service_cb = BtGattsServiceStopCallback;
+    // g_btGattsCallbacks.delete_service_cb = BtGattsServiceDeleteCallback;
+    // g_btGattsCallbacks.read_request_cb = BtGattsRequestReadCallback;
+    // g_btGattsCallbacks.write_request_cb = BtGattsRequestWriteCallback;
+    // g_btGattsCallbacks.mtu_changed_cb = NULL;
+    // gatts_register_callbacks(&g_btGattsCallbacks);
 }
 
 void BtInitGatts(void)
 {
+    return;
     uint16_t id = 0x1FF0;
     uint16_t ser_id = 0x1FFF;
     uint8_t serverId = 0;
index f027780..998905f 100644 (file)
@@ -13,6 +13,8 @@
 #include "system/include/SystemSuperviseView.h"\r
 #include "system/include/SystemLanguageView.h"\r
 #include "system/include/SystemFactoryResetView.h"\r
+\r
+\r
 namespace OHOS\r
 {\r
     static const char *ABOUT_THE_WATCH = "AboutTheWatchButton";  // 关于手表\r
index 85dc04c..49f96d9 100644 (file)
@@ -1,6 +1,10 @@
 #include "system/include/SystemView.h"\r
 #include "system/include/SystemPresenter.h"\r
 #include "wearable_log.h"\r
+#include "bleService.h"\r
+#include "battery_hal.h"\r
+extern uint8_t battery_get_voltage(float *voltage);\r
+extern void openBle(void);\r
 namespace OHOS\r
 {\r
 \r
@@ -206,6 +210,7 @@ namespace OHOS
     {\r
         if (SystemScrollView[thisView] == nullptr)\r
         {\r
+            openBle();\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "SystemView::ChangeSystemAboutView");\r
             p_SystemAboutTheWatchView = new SystemAboutTheWatchView();\r
             if (p_SystemAboutTheWatchView == nullptr)\r
index f7eeb07..af7cbbf 100755 (executable)
@@ -23,6 +23,9 @@
 #include "bts_gatt_server.h"\r
 #include "bts_le_gap.h"\r
 #include "bts_spp.h"\r
+\r
+// #include "bleService.h"\r
+\r
 #include "osal_task.h"\r
 #ifdef SUPPORT_ALIPAY_SEC\r
 #include "alipay_feature.h"\r
 #include "bts_avrcp_target.h"\r
 \r
 namespace OHOS {\r
+#define BLE_SERVICE_UUID 0x18E0\r
+#define BLE_RX_UUID 0x2ae3\r
+#define BLE_TX_UUID 0x2ae5\r
+#define BLE_BAE_UUID  {0xfb,0x34,0x9b,0x5f,0x80,0x00,0x00,0x80,0x00,0x10,0x00,0x00,0xE3,0x2A,0x00,0x00}\r
 \r
 #define BT_SPP_TASK_STACK_SIZE 2048\r
 #define BT_SPP_TASK_PRI        20\r
@@ -76,10 +83,12 @@ void BluetoothModel::Init()
     BtInitCallBacks();\r
 #ifdef SUPPORT_ALIPAY_SEC\r
     svr_alipay_bluetooth_init();\r
-#else\r
+#endif\r
+\r
+    // svr_bluetooth_init();\r
     BtInitCallBacksEx();\r
     BtInitGatts();\r
-#endif\r
+\r
     BtInitSpp();\r
 \r
     SetUpListCase();\r
@@ -932,8 +941,8 @@ static void BtGattsServiceAddCallback(uint8_t serverId, bt_uuid_t *uuid, uint16_
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsServiceAddCallback 0x%x 0x%x 0x%x",\r
         status, serverId, srvcHandle);\r
 \r
-    if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t*)uuid->uuid) == 0x1FF0)) {\r
-        uint16_t id = 0x1FF1;\r
+    if ((uuid->uuid_len == sizeof(uint16_t)) && (*((uint16_t*)uuid->uuid) == BLE_SERVICE_UUID)) {\r
+        uint16_t id = BLE_RX_UUID;\r
         gatts_add_chara_info_t character;\r
         uint16_t value = 0;\r
 \r
@@ -941,12 +950,27 @@ static void BtGattsServiceAddCallback(uint8_t serverId, bt_uuid_t *uuid, uint16_
         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 = GATT_CHARACTER_PROPERTY_BIT_WRITE;\r
+        character.properties = GATT_CHARACTER_PROPERTY_BIT_WRITE | GATT_CHARACTER_PROPERTY_BIT_READ |GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP|GATT_CHARACTER_PROPERTY_BIT_NOTIFY;\r
         character.value_len = (uint16_t)sizeof(value);\r
         character.value = (uint8_t *)(&value);\r
 \r
         ret = gatts_add_characteristic(serverId, srvcHandle, &character);\r
         WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_characteristic ret 0x%x", ret);\r
+\r
+        uint16_t tx_uuid[16] = BLE_BAE_UUID;\r
+        gatts_add_chara_info_t txcharacter;\r
+        uint16_t txvalue = 0;\r
+\r
+        memset_s(&txcharacter, sizeof(gatts_add_chara_info_t), 0, sizeof(gatts_add_chara_info_t));\r
+        txcharacter.chara_uuid.uuid_len = sizeof(tx_uuid);\r
+        memcpy_s(txcharacter.chara_uuid.uuid, sizeof(txcharacter.chara_uuid.uuid), (char *)&tx_uuid, sizeof(tx_uuid));\r
+        txcharacter.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+        txcharacter.properties = GATT_CHARACTER_PROPERTY_BIT_WRITE | GATT_CHARACTER_PROPERTY_BIT_READ |GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP|GATT_CHARACTER_PROPERTY_BIT_NOTIFY;\r
+        txcharacter.value_len = (uint16_t)sizeof(txvalue);\r
+        txcharacter.value = (uint8_t *)(&txvalue);\r
+\r
+        ret = gatts_add_characteristic(serverId, srvcHandle, &txcharacter);\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_characteristic ret 0x%x", ret);\r
     }\r
 }\r
 \r
@@ -989,7 +1013,7 @@ static void BtGattsRequestReadCallback(uint8_t serverId, uint16_t connId, gatts_
 \r
 static void BtGattsRequestWriteCallback(uint8_t serverId, uint16_t connId, gatts_req_write_cb_t *writeCbPara,  errcode_t status)\r
 {\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsRequestWriteCallback");\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsRequestWriteCallback2 %s length:%d",writeCbPara->value,writeCbPara->length);\r
 }\r
 \r
 static void BtA2dpSnkAcceptTimerStop(void)\r
@@ -1181,7 +1205,7 @@ void BtInitCallBacksEx()
 \r
 void BtInitGatts(void)\r
 {\r
-    uint16_t id = 0x1FF0;\r
+    uint16_t id = BLE_SERVICE_UUID;\r
     uint16_t ser_id = 0x1FFF;\r
     uint8_t serverId = 0;\r
     bt_uuid_t uuid;\r
index dab7be7..eec10d4 100755 (executable)
@@ -9,3 +9,4 @@ if("CONFIG_SEA_PHS_SUPPORT" IN_LIST DEFINES)
 endif()
 add_subdirectory_if_exist(power_manager)
 add_subdirectory_if_exist(timeservice)
+add_subdirectory_if_exist(ble_service)
diff --git a/code/sdk/application/wearable/service/ble_service/CMakeLists.txt b/code/sdk/application/wearable/service/ble_service/CMakeLists.txt
new file mode 100644 (file)
index 0000000..e6b612b
--- /dev/null
@@ -0,0 +1,34 @@
+set(COMPONENT_NAME "ble_service")
+set(PUBLIC_HEADER
+    ${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+
+set(PRIVATE_HEADER
+
+)
+set(SOURCES
+    ${CMAKE_CURRENT_SOURCE_DIR}/bleService.c
+)
+
+set(COMPONENT_PUBLIC_CCFLAGS
+)
+
+set(COMPONENT_CCFLAGS
+)
+
+set(WHOLE_LINK
+    true
+)
+
+set(MAIN_COMPONENT
+    false
+)
+
+set(PUBLIC_DEFINES
+)
+
+set(PRIVATE_DEFINES
+)
+
+build_component()
diff --git a/code/sdk/application/wearable/service/ble_service/bleService.c b/code/sdk/application/wearable/service/ble_service/bleService.c
new file mode 100644 (file)
index 0000000..33aa72e
--- /dev/null
@@ -0,0 +1,862 @@
+/**\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(&params);\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
diff --git a/code/sdk/application/wearable/service/ble_service/bleService.h b/code/sdk/application/wearable/service/ble_service/bleService.h
new file mode 100644 (file)
index 0000000..77cf6dc
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef BLESERVICE_H
+#define BLESERVICE_H
+#include <stdint.h>
+#include <stdio.h>
+#include "stdbool.h"
+
+void svr_bluetooth_init(void);//蓝牙服务初始化
+void closeBle(void);//主动关闭蓝牙
+void openBle(void);//主动开启蓝牙
+void svr_ble_adv_start(void);//开始蓝牙广播
+#endif
+
index b7600d0..4071d4a 100755 (executable)
@@ -27,7 +27,6 @@
 #include "bt_manager_tx_process.h"\r
 #include "bts_br_gap.h"\r
 #include "bt_manager_at_process.h"\r
-\r
 #define BSP_MEM_ALLOC(y) osal_kmalloc((y), OSAL_GFP_KERNEL)\r
 #define BSP_MEM_FREE(y) osal_kfree(y)\r
 #define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0]))\r
@@ -1023,7 +1022,7 @@ uint32_t btsrv_wstp_at_enable_bt(const bt_manager_commu_inter_info_t *at_para)
 #if defined(SW_UART_DEBUG) || defined(SW_RTT_DEBUG)\r
     btsrv_set_log_type_level(BTSRV_LOG_UART_INFO);\r
 #endif\r
-    btsrv_at_cmd_gap_register_callbacks();\r
+    // btsrv_at_cmd_gap_register_callbacks();\r
 #ifdef SUPPORT_BREDR\r
     wstp_a2dp_src_register_callbacks();\r
     wstp_a2dp_snk_register_callbacks();\r
index 7e5b01a..1c2e22b 100755 (executable)
@@ -128,7 +128,7 @@ target = {
                     'ENABLE_SHAPING',
                     'TPTYPE_FT6X46',
                     'SUPPORT_CHARGER_PLUG_DETECTION_NOTIFICATION', 
-                    'SUPPORT_ALIPAY_SEC'
+                    # 'SUPPORT_ALIPAY_SEC'
                     ],
         'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", 'dfx_nv', "osal", "arch_port", "-:testsuite",
                           "liteos_port", 'lcd', 'qspi_display', 'dfx_file_operation',
@@ -155,7 +155,8 @@ target = {
                           "rotary_encoder",
                           #"nativelauncher",
                            "fd230launcher",
-                          "batterry_service"
+                          "batterry_service",
+                          "ble_service"
                                                  ],
         'ram_component_set': ['bgh', 'media', 'gpu', 'graphic_uikit', 'bgh_audio', 'dfx_set', 'ohos_set', 'wearable_set', 'alipay_set'],
         'dsp_version': 'max',
index f35a0b7..09a488b 100755 (executable)
@@ -18,7 +18,7 @@ extern "C" {
 #endif
 
 /* Human Interface Device UUID */
-#define BLE_UUID_HUMAN_INTERFACE_DEVICE 0x1812
+#define BLE_UUID_HUMAN_INTERFACE_DEVICE 0x18e2
 /* HID Information UUID */
 #define BLE_UUID_HID_INFORMATION 0x2A4A
 /* Report Map UUID */
index bbbbd56..0d445f7 100755 (executable)
@@ -144,7 +144,7 @@ static void ble_pro_dis_add_character_system_id(uint8_t server_id, uint16_t srvc
 {
     size_t len = 0;
     if (g_ble_pro_dis_data.system_id == NULL) {
-        bts_error("dis server system id is not support!\r\n");
+        bts_error("dis server system id is not cd!\r\n");
         return;
     }
     len = strlen(g_ble_pro_dis_data.system_id) + 1;
index f1c4921..33b445b 100755 (executable)
@@ -1298,6 +1298,7 @@ static void sample_gatt_cmd_ble_set_local_name(const char **params, int32_t para
 
     const uint8_t *name = (const uint8_t *)params[0];
     uint8_t len = (uint8_t)atoi(params[1]);
+    bts_sample_log("gap ble set local name name: %s %d\n", name,len);
     errcode_t ret = gap_ble_set_local_name(name, len);
     bts_sample_log("gap ble set local name ret(errcode_t): %x\n", ret);
 }
index 5304e5b..cb15dc7 100755 (executable)
@@ -61,6 +61,7 @@ typedef enum {
 #if (BTH_LE_ONLY == YES) || (BTH_BREDR_LE_DOUBLE == YES)
 static void ble_service_sample_cmd(int32_t module_id, int32_t cmd_id, char **params, int32_t params_num)
 {
+    
     if (params == NULL) {
         return;
     }