蓝牙协议
authordxy <1731678236@qq.com>
Tue, 19 Mar 2024 11:12:35 +0000 (19:12 +0800)
committerdxy <1731678236@qq.com>
Tue, 19 Mar 2024 11:12:35 +0000 (19:12 +0800)
31 files changed:
autobuild.sh [changed mode: 0644->0755]
code/sdk/application/brandy/brandy_standard/thread_pri_init.c
code/sdk/application/wearable/alipay/service/alipay_bluetooth.c
code/sdk/application/wearable/alipay/service/alipay_bluetooth.h [new file with mode: 0644]
code/sdk/application/wearable/alipay/service/alipay_feature.c
code/sdk/application/wearable/alipay/service/alipay_feature.h
code/sdk/application/wearable/fd230app/CMakeLists.txt
code/sdk/application/wearable/fd230app/nativelauncher/src/NativeLauncher.cpp
code/sdk/application/wearable/fd230app/nativeui/bluetooth/include/BluetoothModel.h
code/sdk/application/wearable/fd230app/nativeui/bluetooth/src/BluetoothCaseListAdapter.cpp
code/sdk/application/wearable/fd230app/nativeui/bluetooth/src/BluetoothModel.cpp
code/sdk/application/wearable/fd230app/nativeui/bluetooth/src/BluetoothPresenter.cpp
code/sdk/application/wearable/fd230app/nativeui/classicbluetooth/src/ClassicBlueToothPresenter.cpp
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
code/sdk/application/wearable/service/ble_service/bleEvent.c [new file with mode: 0644]
code/sdk/application/wearable/service/ble_service/bleEvent.h [new file with mode: 0644]
code/sdk/application/wearable/service/ble_service/bleService.c
code/sdk/application/wearable/service/ble_service/bleService.h
code/sdk/application/wearable/service/hid_service/CMakeLists.txt [new file with mode: 0644]
code/sdk/application/wearable/service/hid_service/hidService.c [new file with mode: 0644]
code/sdk/application/wearable/service/hid_service/hidService.h [new file with mode: 0644]
code/sdk/application/wstp/at_service/app/app_common_api.c
code/sdk/build/config/target_config/brandy/config.py
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/include/ble_pro_dis.h
code/sdk/protocol/bt/host/bt/bts/bt_sample/ble_profile/profiles/src/ble_gatts_callbacks.c
code/sdk/protocol/bt/host/bt/bts/bt_sample/ble_profile/profiles/src/ble_hid_take_photo_server.c [changed mode: 0755->0644]
code/sdk/protocol/bt/host/bt/bts/bt_sample/bt_core/sample_bts_gap.c

old mode 100644 (file)
new mode 100755 (executable)
index 4c9e936..f3796c9 100755 (executable)
@@ -10,6 +10,8 @@
 #include "pm.h"\r
 #include "watchdog.h"\r
 #include "bleService.h"\r
+// #include "hidService.h"\r
+// #include "ble_hid_take_photo_server.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
@@ -335,11 +337,7 @@ static void thread_main(const void *unused)
 #ifdef ACC_LIS2DOC\r
     uapi_acc_service_init();\r
 #endif\r
-#ifdef SUPPORT_ALIPAY_SEC\r
-    uapi_alipay_svr_init();\r
-#endif\r
 \r
-    svr_bluetooth_init();\r
 \r
 #ifdef SUPPORT_PPG_SERVICE\r
     uapi_ppg_service_init();\r
@@ -351,7 +349,18 @@ static void thread_main(const void *unused)
 #ifdef SUPPORT_CAT1_SERVICE\r
     cat1_server_init();\r
 #endif\r
+\r
+#ifdef SUPPORT_BLE_SERVICE\r
+    svr_bluetooth_init();\r
+#endif \r
+\r
+#ifdef SUPPORT_ALIPAY_SEC\r
+    uapi_alipay_svr_init();\r
+#endif\r
+    // ble_hid_server_init();\r
     set_startup_finish_flag();\r
+\r
+    \r
 }\r
 \r
 void thread_pri_init(void)\r
index e44664c..e035034 100644 (file)
 #include "alipay_feature.h"\r
 #include "securec.h"\r
 #include "wearable_log.h"\r
-/* Gatt service UUID */\r
-#define ALIPAYY_SERVICE_ID 0x0238\r
-/* Gatt Characteristic UUID */\r
-#define ALIPAYY_CHARACTERISTIC_ID 0x024A\r
-/* Client Characteristic Configuration UUID */\r
-#define ALIPAYY_BLE_UUID_CLIENT_CHARACTERISTIC_CONF 0x2902\r
-/* Gatt Characteristic max length */\r
-#define ALIPAY_CHARACTERISTIC_MAX_LENGTH 256\r
-#define ALIPAY_BLE_ADV_ID 1\r
-#define ALIPAY_BLE_ADV_DATA_MAX_LENGTH 31\r
-#define ALIPAY_BLE_ADV_BLE_NAME_MAX_LENGTH 13 // 31-4-2-3-9 = 13\r
-#define ALIPAY_BLE_NAME_LENGTH 20\r
-#define ALIPAY_BLE_ADV_MAC_HEAD_LENTH 4\r
-#define ALIPAY_BLE_ADV_MAC_LENTH 10\r
-#define ALIPAY_BLE_ADV_TYPE_LENTH 3\r
-#define ALIPAY_BLE_ADV_UUID_LENTH 4\r
-#define ALIPAY_BLE_DEFAULT_NAME  "WatchDemo"\r
-#define ALIPAY_BLE_DEFAULT_NAME_LEN 9 \r
+#include "bleService.h"\r
+#include "alipay_bluetooth.h"\r
 \r
 // Alipay 蓝牙模块全局变量\r
 static gap_ble_callbacks_t g_alipay_gapble_cbs;\r
@@ -72,19 +56,29 @@ static void svr_alipay_ble_adv_data_set(int adv_id)
     uint8_t adv_mac_head[ALIPAY_BLE_ADV_MAC_LENTH] = {0x9, 0x16, 0x02, 0x38};\r
     gap_ble_config_adv_data_t adv_data_info;\r
     memset_s(&adv_data_info, sizeof(gap_ble_config_adv_data_t), 0, sizeof(gap_ble_config_adv_data_t));\r
-\r
-    int32_t ret = gap_ble_get_local_name(ble_name, &ble_name_len);\r
+    bd_addr_t addr_info;\r
+    int32_t ret= 0;\r
+    unsigned int len = ALIPAY_BLE_MAC_MAX_LEN;\r
+    unsigned char addr[ALIPAY_BLE_MAC_MAX_LEN] = {0};\r
+    bluetooth_get_local_addr(&addr[0],len);\r
+\r
+    char watchName[32];\r
+    memset_s(watchName, sizeof(watchName), 0, sizeof(watchName));\r
+    (void)sprintf_s(watchName, sizeof(watchName), "%s %x%x",ALIPAY_BLE_DEFAULT_NAME,addr[1],addr[0]);\r
+\r
+    ret = bluetooth_set_local_name((unsigned char*)watchName, strlen((char*)watchName) + 1);\r
+    if (ret == false) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ConnectPhonePresenter: bt SetLocalName ret = 0x%x", ret);\r
+    }\r
+    ret = bluetooth_get_local_name(ble_name, &ble_name_len);\r
     if (ret != 0) {\r
-        ALIPAY_PRINT_ERR(0, "gap_ble_get_local_name fail, name:%s,len:%u,ret:%u.", ble_name, ble_name_len, ret);\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, ALIPAY_BLE_NAME_LENGTH, 0, ALIPAY_BLE_NAME_LENGTH);\r
-        memcpy_s(ble_name, ALIPAY_BLE_NAME_LENGTH, ALIPAY_BLE_DEFAULT_NAME, ALIPAY_BLE_DEFAULT_NAME_LEN);\r
-        ble_name_len = ALIPAY_BLE_DEFAULT_NAME_LEN + 1;        \r
+        memcpy_s(ble_name, ALIPAY_BLE_NAME_LENGTH,ALIPAY_BLE_DEFAULT_NAME, ALIPAY_BLE_NAME_LENGTH);\r
+        ble_name_len = ALIPAY_BLE_NAME_LENGTH + 1;        \r
     }\r
-    ALIPAY_PRINT_DEBUG(0, "gap_ble_get_local_name name:%s,len:%u,ret:%u.", ble_name, ble_name_len, ret);\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
-    bd_addr_t addr_info;\r
-    ret = gap_ble_get_local_addr(&addr_info);\r
-    ALIPAY_PRINT_DEBUG(0, "gap_ble_get_local_addr, ret:%u.", ret);\r
     memcpy_s(adv_data, sizeof(alipay_adv_type), alipay_adv_type, sizeof(alipay_adv_type));\r
     adv_data_len = sizeof(alipay_adv_type);\r
 \r
@@ -102,7 +96,7 @@ static void svr_alipay_ble_adv_data_set(int adv_id)
     adv_data_len = adv_data_len + sizeof(alipay_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_info.addr[i];\r
+        ble_data_mac_switch[--k] = addr[i];\r
     }\r
     ALIPAY_PRINT_DEBUG(0, "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
@@ -203,7 +197,66 @@ static void svr_alipay_bt_gatts_service_add_cb(uint8_t server_id, bt_uuid_t *uui
         }\r
     }\r
 }\r
+void alipay_add_chart_decr_cb(uint8_t server_id,uint16_t srv_handle)\r
+{\r
+    errcode_t ret = 0;\r
+    // uint16_t id = ALIPAYY_CHARACTERISTIC_ID;\r
+    gatts_add_chara_info_t character;\r
+    uint16_t value = 0;\r
+    bt_uuid_t alipay_service_uuid = {0};\r
+    bts_data_to_uuid_len2(ALIPAYY_CHARACTERISTIC_ID, &alipay_service_uuid);\r
+    memset_s(&character, sizeof(gatts_add_chara_info_t), 0, sizeof(gatts_add_chara_info_t));\r
+    // character.chara_uuid.uuid_len = sizeof(id);\r
+    // memcpy_s(character.chara_uuid.uuid, sizeof(character.chara_uuid.uuid), (char *)&id, sizeof(id));\r
+    character.chara_uuid = alipay_service_uuid;\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+    character.properties =\r
+        GATT_CHARACTER_PROPERTY_BIT_READ | GATT_CHARACTER_PROPERTY_BIT_WRITE | GATT_CHARACTER_PROPERTY_BIT_NOTIFY;\r
+    character.value_len = ALIPAY_CHARACTERISTIC_MAX_LENGTH;\r
+    character.value = g_alipay_character_buf;\r
+\r
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
+    if (ret != ERRCODE_SUCC) {\r
+        ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
+    }\r
+\r
+    uint8_t bas_ccc_val[] = {\r
+            0x01,\r
+            0x00\r
+        };\r
+    bt_uuid_t ccc_uuid = { 0 };\r
+    bts_data_to_uuid_len2(ALIPAYY_BLE_UUID_CLIENT_CHARACTERISTIC_CONF, &ccc_uuid);\r
+    // bts_data_to_uuid_len2(0x2902, &ccc_uuid);\r
+    gatts_add_desc_info_t descriptor;\r
+    descriptor.desc_uuid = ccc_uuid;\r
+    descriptor.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+    descriptor.value_len = (uint16_t)sizeof(bas_ccc_val);\r
+    descriptor.value = bas_ccc_val;\r
+    \r
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
+    if (ret != ERRCODE_SUCC) {\r
+        ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+    }\r
+    bd_addr_t addr_info;\r
+    gatts_add_desc_info_t descriptor_ap;\r
+    gap_ble_get_local_addr(&addr_info);\r
+    bts_data_to_uuid_len2(0x4b02, &ccc_uuid);\r
+    descriptor_ap.desc_uuid = ccc_uuid;\r
+    descriptor_ap.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+    descriptor_ap.value_len = BD_ADDR_LEN;\r
+    uint8_t ble_data_mac_switch[BD_ADDR_LEN] = {0};\r
+    int k = BD_ADDR_LEN;\r
+    for (int i = 0; i < BD_ADDR_LEN; i++) {\r
+        ble_data_mac_switch[--k] = addr_info.addr[i];\r
+    }\r
+    descriptor_ap.value = ble_data_mac_switch;\r
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor_ap);\r
+    if (ret != ERRCODE_SUCC) {\r
+        ALIPAY_PRINT_ERR(0, "gatts_add_descriptor second fail, ret:%u.\r\n", ret);\r
+    }\r
+\r
 \r
+}\r
 static void svr_alipay_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
@@ -301,7 +354,7 @@ void svr_alipay_bt_gatts_noyify(uint8_t *data, uint16_t data_len)
     data_info.value_len = data_len;\r
 \r
     errcode_t ret = gatts_notify_indicate(g_alipay_server_id, g_alipay_conn_id, &data_info);\r
-    ALIPAY_PRINT_DEBUG(0, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.", ret, g_alipay_server_id,\r
+    ALIPAY_PRINT_DEBUG(0, "gatts_notify_indicate ret1:0x%x. serverid:%u,conn_id:%u,handle:%u.", ret, g_alipay_server_id,\r
         g_alipay_conn_id, g_alipay_server_handle);\r
 }\r
 \r
@@ -348,18 +401,25 @@ static void svr_alipay_bt_init_gatts(void)
     }\r
     return;\r
 }\r
-\r
+void ble_alipay_add_characters_input_report_cbk(uint16_t srvc_handle)\r
+{\r
+   \r
+}\r
+static uint8_t g_server_id = 0;\r
 void svr_alipay_bluetooth_init(void)\r
 {\r
-    bool ret = enable_bt_stack();\r
-    if (ret != ERRCODE_SUCC) {\r
-        ALIPAY_PRINT_ERR(0, "enable_bt_stack ret:%u.\r\n", ret);\r
-    }\r
+    // bool ret = enable_bt_stack();\r
+    // if (ret != ERRCODE_SUCC) {\r
+    //     ALIPAY_PRINT_ERR(0, "enable_bt_stack ret:%u.\r\n", ret);\r
+    // }\r
     if (g_alipay_ble_init_flag == true) {\r
         return;\r
     }\r
-    svr_alipay_btcallback_reg();\r
-    svr_alipay_bt_init_gatts();\r
+    // gatts_register_server(&app_uuid, &g_server_id); /* 注册gatt server */\r
+    bt_uuid_t alipay_service_uuid = {0};\r
+    bts_data_to_uuid_len2(ALIPAYY_SERVICE_ID, &alipay_service_uuid);\r
+    gatts_add_service(1, &alipay_service_uuid, true);\r
+\r
     g_alipay_ble_init_flag = true;\r
     return;\r
 }\r
diff --git a/code/sdk/application/wearable/alipay/service/alipay_bluetooth.h b/code/sdk/application/wearable/alipay/service/alipay_bluetooth.h
new file mode 100644 (file)
index 0000000..07bbd8f
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef _ALPAY_BLUETOOTH_H
+#define _ALPAY_BLUETOOTH_H
+#include <stdint.h>
+#include <stdio.h>
+#include "stdbool.h"
+
+
+/* Gatt service UUID */
+#define ALIPAYY_SERVICE_ID 0x3802
+/* Gatt Characteristic UUID */
+#define ALIPAYY_CHARACTERISTIC_ID 0x4a02
+/* Client Characteristic Configuration UUID */
+#define ALIPAYY_BLE_UUID_CLIENT_CHARACTERISTIC_CONF 0x2902
+/* Gatt Characteristic max length */
+#define ALIPAY_CHARACTERISTIC_MAX_LENGTH 256
+#define ALIPAY_BLE_ADV_ID 1
+#define ALIPAY_BLE_ADV_DATA_MAX_LENGTH 31
+#define ALIPAY_BLE_ADV_BLE_NAME_MAX_LENGTH 15 // 31-4-2-3-9 = 13
+#define ALIPAY_BLE_NAME_LENGTH 20
+#define ALIPAY_BLE_ADV_MAC_HEAD_LENTH 4
+#define ALIPAY_BLE_ADV_MAC_LENTH 10
+#define ALIPAY_BLE_ADV_TYPE_LENTH 3
+#define ALIPAY_BLE_ADV_UUID_LENTH 4
+#define ALIPAY_BLE_DEFAULT_NAME  "WatchDemo"
+#define ALIPAY_BLE_DEFAULT_NAME_LEN 9 
+
+#define ALIPAY_BLE_MAC_MAX_LEN 6
+void ble_alipay_add_characters_input_report_cbk(uint16_t srvc_handle);
+#endif
+
index 11d8f4c..51aafb2 100755 (executable)
@@ -603,7 +603,7 @@ errcode_t uapi_alipay_svr_init(void)
     uapi_gpio_set_dir(ALIPAY_SEC_GPIO, GPIO_DIRECTION_OUTPUT);
     uapi_gpio_set_val(ALIPAY_SEC_GPIO, GPIO_LEVEL_HIGH);
     osDelay(30);
-    svr_alipay_bluetooth_init();
+    
     HS_IIC_Init();
     alipay_pre_init();
     svr_alipay_enter_lpm();
index 12a7aec..750cd50 100755 (executable)
@@ -52,6 +52,7 @@ extern "C" {
 #define ALIPAY_TRANS_CARD_MAX_LENGTH 20
 #define ALIPAY_TRANS_CARD_MIN_VALID_NUM 3
 
+
 typedef enum {
     PAYMENT_UNSUPPORTED = 1,  /* NOT support payment */
     PAYMENT_UNBIND,           /* support but not bind */
@@ -391,6 +392,7 @@ mc_alipay_trans_context_t * svr_alipay_get_trans_context(void);
  */
 uint32_t svr_alipay_register_cb(alipay_msgf_event_callback_func callback);
 
+
 #ifdef __cplusplus
 #if __cplusplus
 }
index 472bdbe..69c5d36 100644 (file)
@@ -100,6 +100,7 @@ set(PRIVATE_HEADER
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/main/include/dial
     ${ROOT_DIR}/middleware/services/media/foundation/sample/wrapper
     ${ROOT_DIR}/application/wearable/service/msg_center/include
+    ${ROOT_DIR}/application/wearable/service/ble_service
     ${ROOT_DIR}/application/wearable/nativeabilityfwk/include
     ${CMAKE_CURRENT_SOURCE_DIR}/nativeui/main/src/dial/parser
     ${ROOT_DIR}/open_source/openharmony/foundation/multimedia/audio_player/interfaces/kits
index ad5a1c7..6fc401f 100644 (file)
@@ -213,6 +213,7 @@ namespace OHOS
 
     void NativeLauncher::InitNativeLauncher()
     {
+        
         // 初始化语言
         GraphicStartUp::InitFontEngine(MEM_POOL_UI_FONT, MEM_POOL_UI_FONT_SIZE, OHOS::VECTOR_FONT_DIR, DEFAULT_VECTOR_FONT_FILENAME);
         WEARABLE_LOGI(WEARABLE_LOG_MODULE_LAUNCHER_FWK, "NativeLauncher::InitNativeLauncher");
index 25c7d41..4a45677 100644 (file)
@@ -5,8 +5,8 @@
  * Create: 2021-10-13\r
  */\r
 \r
-#ifndef BLUETOOTH_MODEL_H\r
-#define BLUETOOTH_MODEL_H\r
+#ifndef BLUETOOTH_MODEL_H_\r
+#define BLUETOOTH_MODEL_H_\r
 \r
 #include <list>\r
 #include "stdio.h"\r
index ac24bf1..2d8781d 100644 (file)
@@ -11,7 +11,7 @@
 #include "PlayersPresenter.h"
 #include "wearable_log.h"
 #include "UiConfig.h"
-#include "BluetoothModel.h"
+#include "bluetooth/include/BluetoothModel.h"
 
 namespace OHOS {
 BluetoothCaseListAdapter::~BluetoothCaseListAdapter()
@@ -89,7 +89,7 @@ public:
             errcode_t retVal = gap_disconnect_remote_device(lastAddr);
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "Disconnect LastDevice retVal =  %d", retVal);
         } else {
-            errcode_t retVal = BluetoothModel::GetInstance()->ConnectRemoteDevice(&addr);
+            //errcode_t retVal = BluetoothModel::GetInstance()->ConnectRemoteDevice(&addr);
             WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ConnectRemoteDevice ret =  %d", retVal);
         }
         // 跳转可选页
index 085b2ab..4b88e20 100644 (file)
 #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
+#endif\r
+#include "bts_a2dp_sink.h"\r
+#include "bt_audio_hal_interface.h"\r
+#include "audio_manager_c_wrapper.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
@@ -33,6 +47,13 @@ namespace OHOS {
 \r
 constexpr uint16_t BLUETOOTH_MAX_NUM = 20;\r
 \r
+#define MEDIA_A2DP_SNK_INTERFACE 1\r
+osal_timer g_a2dp_stream_accept_timer = {NULL, NULL, 0, 0};\r
+#define A2DP_STREAM_ACCEPT_TIMER_PERIOD 500\r
+AudioFormatConfig g_audio_format_config = {AUDIO_DEFAULT, 0, 0};\r
+BtAvrcpTgInftrerface g_avrcp_srv_infterface;\r
+\r
+\r
 void BluetoothModel::SetBluetoothCalleridStatus(int16_t value)\r
 {\r
     callerid = value;\r
@@ -59,8 +80,12 @@ void BluetoothModel::Init()
     bool ret = enable_bt_stack();\r
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bt enable_bt_stack ret = %d", ret);\r
 \r
-    // BtInitCallBacks();\r
-    // BtInitGatts();\r
+    BtInitCallBacks();\r
+\r
+    // svr_bluetooth_init();\r
+    BtInitCallBacksEx();\r
+    BtInitGatts();\r
+\r
     BtInitSpp();\r
 \r
     SetUpListCase();\r
@@ -234,8 +259,8 @@ bool BluetoothModel::GetAclConnected(void)
 void BluetoothModel::SetTempMacValue(BluetoothCaseInfo *caseInfo)\r
 {\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetTempMacValue: %02x%02x%02x%02x%02x%02x",\r
-                caseInfo->addr[5], caseInfo->addr[4], caseInfo->addr[3], /* macϱê 0 1 2 3 4 5 */\r
-                caseInfo->addr[2], caseInfo->addr[1], caseInfo->addr[0]); /* macϱê 0 1 2 3 4 5 */\r
+                  caseInfo->addr[5], caseInfo->addr[4], caseInfo->addr[3], /* macϱê 0 1 2 3 4 5 */\r
+                  caseInfo->addr[2], caseInfo->addr[1], caseInfo->addr[0]); /* macϱê 0 1 2 3 4 5 */\r
     (void)memcpy_s(tempMacValue.addr, BD_ADDR_LEN,\r
                    caseInfo->addr, BD_ADDR_LEN);\r
     (void)memcpy_s(tempMacValue.deviceName, BD_NAME_LEN,\r
@@ -250,8 +275,8 @@ BluetoothCaseInfo *BluetoothModel::GetTempMacValue(void)
 void BluetoothModel::SetLastConnedAddr(const bd_addr_t *addr)\r
 {\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SetLastConnedAddr: %02x%02x%02x%02x%02x%02x",\r
-                addr->addr[5], addr->addr[4], addr->addr[3], /* macϱê 0 1 2 3 4 5 */\r
-                addr->addr[2], addr->addr[1], addr->addr[0]); /* macϱê 0 1 2 3 4 5 */\r
+                  addr->addr[5], addr->addr[4], addr->addr[3], /* macϱê 0 1 2 3 4 5 */\r
+                  addr->addr[2], addr->addr[1], addr->addr[0]); /* macϱê 0 1 2 3 4 5 */\r
     (void)memcpy_s(lastConnedAddr.addr, BD_ADDR_LEN, addr->addr, BD_ADDR_LEN);\r
 }\r
 \r
@@ -427,6 +452,27 @@ void BluetoothModel::SetAdvStartState(bool state)
     advStartState = state;\r
 }\r
 \r
+int BluetoothModel::ConnectRemoteDevice(const bd_addr_t *addr)\r
+{\r
+    errcode_t retVal = gap_connect_remote_device(addr);\r
+    (void)memcpy_s(&remoteConnectAddr, sizeof(bd_addr_t), addr, sizeof(bd_addr_t));\r
+    return retVal;\r
+}\r
+\r
+bool BluetoothModel::ConnectRemoteCheck(const bd_addr_t *addr)\r
+{\r
+    bool ret;\r
+    if ((remoteConnectAddr.addr[0] == addr->addr[0]) && (remoteConnectAddr.addr[1] == addr->addr[1]) &&\r
+        (remoteConnectAddr.addr[2] == addr->addr[2]) && (remoteConnectAddr.addr[3] == addr->addr[3]) &&\r
+        (remoteConnectAddr.addr[4] == addr->addr[4]) && (remoteConnectAddr.addr[5] == addr->addr[5])) {\r
+        ret = true;\r
+        (void)memset_s(&remoteConnectAddr, sizeof(bd_addr_t), 0, sizeof(bd_addr_t));\r
+    } else {\r
+        ret = false;\r
+    }\r
+    return ret;\r
+}\r
+\r
 #ifdef __cplusplus\r
 extern "C" {\r
 #endif\r
@@ -488,7 +534,7 @@ void BluetoothModel::BtGapDiscoveryResultCallbakHandle(const bd_addr_t &bdAddr)
     unsigned char nameLen = BD_NAME_LEN;\r
     bool getNameRet = gap_get_device_name(&bdAddr, caseInfo.deviceName, &nameLen);\r
     WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_discovery_result_callback getNameRet(bool): %d nameLen: %d name:%s",\r
-                getNameRet, nameLen, caseInfo.deviceName);\r
+                  getNameRet, nameLen, caseInfo.deviceName);\r
 \r
     if (nameLen == 0) { // 过滤未扫描到名字的设备\r
         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "nameLen == 0 return");\r
@@ -507,7 +553,7 @@ void BluetoothModel::BtGapDiscoveryResultCallbakHandle(const bd_addr_t &bdAddr)
         return;\r
     }\r
     tag = bluetoothEarPhoneView->getScanStatus();\r
-    if (tag == true) { // 跳转\r
+    if (tag) { // 跳转\r
         ChangeScanView();\r
     } else {\r
         BluetoothEarListView *bluetoothEarListView = BluetoothEarListView::GetInstance();\r
@@ -567,8 +613,6 @@ void BtGapDiscoveryResultCallback(const bd_addr_t *bdAddr)
                                                               BluetoothModel::GetInstance(), *bdAddr));\r
 }\r
 \r
-\r
-\r
 void HandleBeforeChangeView()\r
 {\r
     int curView = BluetoothModel::GetInstance()->GetCurView();\r
@@ -747,10 +791,9 @@ void BluetoothModel::BtGapAclStateChangedHandle(gap_acl_state_t state, unsigned
     } else if (reason == 0x16) { // 主动断开连接\r
         DisconnectedHandle();\r
         BluetoothCaseInfo *onClickBtCaseInfo = BluetoothModel::GetInstance()->GetTempMacValue();\r
-        bool ret = BluetoothModel::GetInstance()->IsTagConnectNew();\r
-        if (ret == true) {\r
-            ret = gap_connect_remote_device((const bd_addr_t *)&onClickBtCaseInfo->addr);\r
-            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "gap_connect_remote_device ret =  %d", ret);\r
+        if (BluetoothModel::GetInstance()->IsTagConnectNew()) {\r
+            errcode_t retVal = ConnectRemoteDevice((const bd_addr_t *)&onClickBtCaseInfo->addr);\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ConnectRemoteDevice retVal =  %d", retVal);\r
         }\r
     } else if ((reason == 0xb) || (reason > 0x45)) { // 0xb:重复点击连接按钮 0x45:acl状态最大参数\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "reason is false.");\r
@@ -767,11 +810,18 @@ void BluetoothModel::BtGapAclStateChangedHandle(gap_acl_state_t state, unsigned
             AddConnedDevicesCase(*onClickBtCaseInfo);\r
         }\r
         ACLConnectionSuss(bdAddr);\r
-        bool retA2dp = a2dp_src_connect(&bdAddr);\r
-        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connect result %d", retA2dp);\r
     } else {\r
         ACLConnectionFail(bdAddr);\r
     }\r
+\r
+    if ((state == GAP_ACL_STATE_CONNECTED) || (state == GAP_ACL_STATE_LE_CONNECTED)) {\r
+        if (BluetoothModel::GetInstance()->ConnectRemoteCheck(&bdAddr)) {\r
+            bool retA2dp = a2dp_src_connect(&bdAddr);\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "a2dp_src_connect result %d", retA2dp);\r
+        } else {\r
+            WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ingore a2dp_src_connect");\r
+        }\r
+    }\r
 }\r
 \r
 // 回调:ACL连接状态上报\r
@@ -786,7 +836,7 @@ void GapAclStateChangedCallback(const bd_addr_t *bdAddr, gap_acl_state_t state,
         return;\r
     }\r
     GraphicService::GetInstance()->PostGraphicEvent(std::bind(&BluetoothModel::BtGapAclStateChangedHandle,\r
-                                                                    BluetoothModel::GetInstance(), state, reason, *bdAddr));\r
+                                                    BluetoothModel::GetInstance(), state, reason, *bdAddr));\r
 }\r
 \r
 // 回调:远端设备名称变化\r
@@ -802,8 +852,8 @@ void BtRemoteNameChangedCallback(const bd_addr_t *bdAddr, const unsigned char *d
         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
+                  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
     (void)memcpy_s(caseInfo.addr, BD_ADDR_LEN, bdAddr->addr, BD_ADDR_LEN);\r
     int ret = memcpy_s(caseInfo.deviceName, BD_NAME_LEN, deviceName, length);\r
@@ -860,11 +910,11 @@ static void A2dpSrcConfigureChanged(bd_addr_t *bdAddr, a2dp_codec_info_t *info)
 }\r
 \r
 static void BleConnStateChangeCallback(unsigned short connId, bd_addr_t *addr, gap_ble_conn_state_t connState,\r
-                                          gap_ble_pair_state_t pairState, gap_ble_disc_reason_t discReason)\r
+                                       gap_ble_pair_state_t pairState, gap_ble_disc_reason_t discReason)\r
 {\r
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleConnStateChangeCallback connId 0x%x, connState 0x%x, pairState 0x%x",\r
-                connId, connState, pairState);\r
-    if (GAP_BLE_STATE_DISCONNECTED == connState) { // restart ble adv when disconnected \r
+                  connId, connState, pairState);\r
+    if (GAP_BLE_STATE_DISCONNECTED == connState) { // restart ble adv when disconnected\r
         BleAdvStart();\r
     } else {\r
         BluetoothModel::GetInstance()->SetAdvStartState(false);\r
@@ -888,8 +938,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
@@ -897,14 +947,28 @@ 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
 \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
 static void BtGattsCharacteristicAddCallback(uint8_t serverId, bt_uuid_t *uuid, uint16_t srvcHandle, gatts_add_character_result_t *result, errcode_t status)\r
@@ -946,7 +1010,142 @@ 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, "BtGattsRequestWriteCallback333 %s %d",writeCbPara->value,writeCbPara->length);\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtGattsRequestWriteCallback2 %s length:%d",writeCbPara->value,writeCbPara->length);\r
+}\r
+\r
+static void BtA2dpSnkAcceptTimerStop(void)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "stop timer\n");\r
+    if (g_a2dp_stream_accept_timer.timer != NULL) {\r
+        (void)osal_timer_stop(&g_a2dp_stream_accept_timer);\r
+        (void)osal_timer_destroy(&g_a2dp_stream_accept_timer);\r
+        g_a2dp_stream_accept_timer.timer = NULL;\r
+    }\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "stop timer success!\n");\r
+}\r
+\r
+static void BtA2dpSnStartAcceptHandler(unsigned long data)\r
+{\r
+    UNUSED(data);\r
+    bd_addr_t active_bd_addr = a2dp_snk_get_active_device();\r
+    a2dp_snk_start_accept(&active_bd_addr);\r
+    BtA2dpSnkAcceptTimerStop();\r
+}\r
+\r
+static errcode_t BtA2dpSnkStartAcceptTimer(void)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "start timer\n");\r
+    if (g_a2dp_stream_accept_timer.timer != NULL) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "timer is running");\r
+        return ERRCODE_SUCC;\r
+    }\r
+\r
+    g_a2dp_stream_accept_timer.handler = BtA2dpSnStartAcceptHandler;\r
+    g_a2dp_stream_accept_timer.interval = A2DP_STREAM_ACCEPT_TIMER_PERIOD;\r
+\r
+    int32_t timer_ret = osal_timer_init(&g_a2dp_stream_accept_timer);\r
+    if (timer_ret != EOK) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "create timer error! ret: %x\n", timer_ret);\r
+        BtA2dpSnkAcceptTimerStop();\r
+        return ERRCODE_FAIL;\r
+    }\r
+    timer_ret = osal_timer_start(&g_a2dp_stream_accept_timer);\r
+    if (timer_ret != EOK) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "start timer error! ret: %x\n", timer_ret);\r
+        BtA2dpSnkAcceptTimerStop();\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+static int32_t BtA2dpSnkAudioCreate()\r
+{\r
+#if MEDIA_A2DP_SNK_INTERFACE\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "audioFormat %d channelCount %d sampleRate %d \n",\r
+        g_audio_format_config.audioFormat, g_audio_format_config.channelCount, g_audio_format_config.sampleRate);\r
+\r
+    int32_t ret = AudioManagerA2dpSinkSetParam(g_audio_format_config);\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "AudioManagerA2dpSinkSetParam ret %x\n", ret);\r
+    ret = AudioManagerA2dpSinkCreate();\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "AudioManagerA2dpSinkCreate ret %x\n", ret);\r
+#endif\r
+    /* 起定时器接受音乐开始请求 */\r
+    (void)BtA2dpSnkStartAcceptTimer();\r
+    return 0;\r
+}\r
+\r
+static int32_t BtA2dpSnkAudioDestroy()\r
+{\r
+#if MEDIA_A2DP_SNK_INTERFACE\r
+    int32_t ret = AudioManagerA2dpSinkDestroy();\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "AudioManagerA2dpSinkDestroy ret %x\n", ret);\r
+#endif\r
+    return 0;\r
+}\r
+\r
+\r
+\r
+static void BtA2dpSnkConnectStateChangedCb(bd_addr_t *bd_addr, int conn_state)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr22222: ****%02x%02x%02x%02x conn_state: %x\n",\r
+        bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], conn_state); /* 3 2 1 0 idx */\r
+}\r
+\r
+static void BtA2dpSnkStartStreamReqCb(bd_addr_t *bd_addr)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x \n",\r
+        bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0]); /* 3 2 1 0 idx */\r
+    BtA2dpSnkAudioCreate();\r
+}\r
+\r
+static void BtA2dpSnkPlayingStateChangedCb(bd_addr_t *bd_addr, int playing_state)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x playing_state: %x\n",\r
+        bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], playing_state); /* 3 2 1 0 idx */\r
+    if (playing_state == A2DP_NOT_PLAYING) {\r
+        BtA2dpSnkAudioDestroy();\r
+    }\r
+}\r
+\r
+static void BtA2dpSnkConfigChangedCb(bd_addr_t *bd_addr, a2dp_snk_codec_info_t *info)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x ",\r
+        bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0]); /* 3 2 1 0 idx */\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP,\r
+        "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_LOGI(WEARABLE_LOG_MODULE_APP,\r
+        "codec_specific1: %04x codec_specific2: %04x codec_specific3: %04x codec_specific4: %04x\n",\r
+        (unsigned int)info->codec_specific1,\r
+        (unsigned int)info->codec_specific2,\r
+        (unsigned int)info->codec_specific3,\r
+        (unsigned int)info->codec_specific4);\r
+#if MEDIA_A2DP_SNK_INTERFACE\r
+    if (info->codec_type == A2DP_SNK_CODEC_TYPE_AAC) {\r
+        g_audio_format_config.audioFormat = AAC_LC;\r
+    } else {\r
+        g_audio_format_config.audioFormat = SBC;\r
+    }\r
+    /* channel count 1 or 2 */\r
+    g_audio_format_config.channelCount = (info->channel_mode == A2DP_SNK_CODEC_CHANNEL_MODE_NONE ? 1 : 2);\r
+\r
+    switch (info->sample_rate) {\r
+        case A2DP_SNK_CODEC_SAMPLE_RATE_48000:\r
+            g_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE48000;\r
+            break;\r
+        case A2DP_SNK_CODEC_SAMPLE_RATE_88200:\r
+            g_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE88200;\r
+            break;\r
+        case A2DP_SNK_CODEC_SAMPLE_RATE_96000:\r
+            g_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE96000;\r
+            break;\r
+        default:\r
+            g_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE44100;\r
+            break;\r
+    }\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "audioFormat %d channelCount %d sampleRate %d \n",\r
+        g_audio_format_config.audioFormat, g_audio_format_config.channelCount, g_audio_format_config.sampleRate);\r
+#endif\r
 }\r
 \r
 // 注册回调函数\r
@@ -954,46 +1153,63 @@ static gap_call_backs_t g_btGapCallBacks{};
 static a2dp_src_callbacks_t g_a2dpSrcCallbacks{};\r
 static gap_ble_callbacks_t g_gapBleCallbacks{};\r
 static gatts_callbacks_t g_btGattsCallbacks{};\r
+\r
+static a2dp_snk_callbacks_t g_a2dp_snk_callbacks = {\r
+    BtA2dpSnkConnectStateChangedCb,\r
+    BtA2dpSnkStartStreamReqCb,\r
+    BtA2dpSnkPlayingStateChangedCb,\r
+    BtA2dpSnkConfigChangedCb\r
+};\r
+\r
 void BtInitCallBacks()\r
 {\r
-    // g_btGapCallBacks.discovery_result_callback = BtGapDiscoveryResultCallback;\r
-    // g_btGapCallBacks.discovery_state_changed_callback = BtGapDiscoveryStateChangedCallback;\r
-    // g_btGapCallBacks.acl_state_changed_callbak = GapAclStateChangedCallback;\r
-    // g_btGapCallBacks.read_remote_rssi_event_callback = BtGapReadRemoteRssiEventCallback;\r
-    // g_btGapCallBacks.remote_name_changed_callback = BtRemoteNameChangedCallback;\r
-    // g_btGapCallBacks.is_accept_conn_on_safe_mode_callback = BtIsAcceptConnOnSafeModeCallback;\r
-    // g_btGapCallBacks.pair_status_changed_callback = BtGapPairStatusChangedCallback;\r
-    // g_btGapCallBacks.pair_requested_callback = BtGapPairRequestedCallback;\r
-    // g_btGapCallBacks.pair_confiremed_callback = BtGapPairConfirmedCallback; \r
-    \r
-    // gap_register_callbacks(&g_btGapCallBacks);\r
-\r
-    // g_a2dpSrcCallbacks.connectstate_changed_cb = A2dpSrcConnectstateChanged;\r
-    // g_a2dpSrcCallbacks.configuration_changed_cb = A2dpSrcConfigureChanged;\r
-    // g_a2dpSrcCallbacks.playing_state_changed_cb = A2dpSrcPlayingStateChanged;\r
-    // a2dp_src_register_callbacks(&g_a2dpSrcCallbacks);\r
-\r
-    // g_gapBleCallbacks.conn_state_change_cb = BleConnStateChangeCallback;\r
-    // g_gapBleCallbacks.start_adv_cb = BleAdvStartCallback;\r
-    // g_gapBleCallbacks.stop_adv_cb = BleAdvStopCallback;\r
-    // gap_ble_register_callbacks(&g_gapBleCallbacks);\r
-\r
-    // g_btGattsCallbacks.add_service_cb = BtGattsServiceAddCallback;\r
-    // g_btGattsCallbacks.add_characteristic_cb = BtGattsCharacteristicAddCallback;\r
-    // g_btGattsCallbacks.add_descriptor_cb = BtGattsDescriptorAddCallback;\r
-    // g_btGattsCallbacks.start_service_cb = BtGattsServiceStartCallback;\r
-    // g_btGattsCallbacks.stop_service_cb = BtGattsServiceStopCallback;\r
-    // g_btGattsCallbacks.delete_service_cb = BtGattsServiceDeleteCallback;\r
-    // g_btGattsCallbacks.read_request_cb = BtGattsRequestReadCallback;\r
-    // g_btGattsCallbacks.write_request_cb = BtGattsRequestWriteCallback;\r
-    // g_btGattsCallbacks.mtu_changed_cb = NULL;\r
-    // gatts_register_callbacks(&g_btGattsCallbacks);\r
+    #if 0\r
+    g_btGapCallBacks.discovery_result_callback = BtGapDiscoveryResultCallback;\r
+    g_btGapCallBacks.discovery_state_changed_callback = BtGapDiscoveryStateChangedCallback;\r
+    g_btGapCallBacks.acl_state_changed_callbak = GapAclStateChangedCallback;\r
+    g_btGapCallBacks.read_remote_rssi_event_callback = BtGapReadRemoteRssiEventCallback;\r
+    g_btGapCallBacks.remote_name_changed_callback = BtRemoteNameChangedCallback;\r
+    g_btGapCallBacks.is_accept_conn_on_safe_mode_callback = BtIsAcceptConnOnSafeModeCallback;\r
+    g_btGapCallBacks.pair_status_changed_callback = BtGapPairStatusChangedCallback;\r
+    g_btGapCallBacks.pair_requested_callback = BtGapPairRequestedCallback;\r
+    g_btGapCallBacks.pair_confiremed_callback = BtGapPairConfirmedCallback;\r
+    gap_register_callbacks(&g_btGapCallBacks);\r
+\r
+    g_a2dpSrcCallbacks.connectstate_changed_cb = A2dpSrcConnectstateChanged;\r
+    g_a2dpSrcCallbacks.configuration_changed_cb = A2dpSrcConfigureChanged;\r
+    g_a2dpSrcCallbacks.playing_state_changed_cb = A2dpSrcPlayingStateChanged;\r
+    a2dp_src_register_callbacks(&g_a2dpSrcCallbacks);\r
+    #endif\r
+\r
+    /* a2dp sink */\r
+    // a2dp_snk_register_callbacks(&g_a2dp_snk_callbacks);\r
+}\r
+\r
+void BtInitCallBacksEx()\r
+{\r
+    #if 0\r
+    g_gapBleCallbacks.conn_state_change_cb = BleConnStateChangeCallback;\r
+    g_gapBleCallbacks.start_adv_cb = BleAdvStartCallback;\r
+    g_gapBleCallbacks.stop_adv_cb = BleAdvStopCallback;\r
+    gap_ble_register_callbacks(&g_gapBleCallbacks);\r
+\r
+    g_btGattsCallbacks.add_service_cb = BtGattsServiceAddCallback;\r
+    g_btGattsCallbacks.add_characteristic_cb = BtGattsCharacteristicAddCallback;\r
+    g_btGattsCallbacks.add_descriptor_cb = BtGattsDescriptorAddCallback;\r
+    g_btGattsCallbacks.start_service_cb = BtGattsServiceStartCallback;\r
+    g_btGattsCallbacks.stop_service_cb = BtGattsServiceStopCallback;\r
+    g_btGattsCallbacks.delete_service_cb = BtGattsServiceDeleteCallback;\r
+    g_btGattsCallbacks.read_request_cb = BtGattsRequestReadCallback;\r
+    g_btGattsCallbacks.write_request_cb = BtGattsRequestWriteCallback;\r
+    g_btGattsCallbacks.mtu_changed_cb = NULL;\r
+    gatts_register_callbacks(&g_btGattsCallbacks);\r
+    #endif\r
 }\r
 \r
 void BtInitGatts(void)\r
 {\r
-    return;\r
-    uint16_t id = 0x1FF0;\r
+    #if 0\r
+    uint16_t id = BLE_SERVICE_UUID;\r
     uint16_t ser_id = 0x1FFF;\r
     uint8_t serverId = 0;\r
     bt_uuid_t uuid;\r
@@ -1008,6 +1224,7 @@ void BtInitGatts(void)
     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
+    #endif\r
 }\r
 \r
 static uint8_t Char2Num(int8_t c)\r
@@ -1112,6 +1329,7 @@ void BtInitSpp(void)
 \r
 void BleAdvStart(void)\r
 {\r
+    return;\r
     int advId = 1;\r
     if (BluetoothModel::GetInstance()->GetAdvStartState()) {\r
         WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleAdvStart already started");\r
@@ -1127,10 +1345,7 @@ void BleAdvStart(void)
     adv_para.duration = 0;\r
     gap_ble_set_adv_param(advId, &adv_para);\r
     gap_ble_set_local_appearance(GAP_BLE_APPEARANCE_TYPE_GENERIC_WATCH);\r
-    bool ret = gap_ble_start_adv(advId);\r
-    if (ret) {\r
-        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BleAdvStart bt gap_ble_start_adv  ret = 0x%x", ret);\r
-    }\r
+    errcode_t ret = gap_ble_start_adv(advId);\r
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleAdvStart bt gap_ble_start_adv  ret = 0x%x", ret);\r
 }\r
 \r
index 89aa78d..036eecd 100644 (file)
@@ -11,7 +11,7 @@
 #include "BluetoothReconnectView.h"\r
 #include "MainBluetoothView.h"\r
 #include "UiConfig.h"\r
-#include "BluetoothModel.h"\r
+#include "bluetooth/include/BluetoothModel.h"\r
 \r
 namespace OHOS {\r
 static BluetoothPresenter *g_pBluetoothPresenter = nullptr;\r
index 4833642..adf360d 100644 (file)
@@ -105,17 +105,24 @@ namespace OHOS
         return true;\r
     }\r
 \r
+    extern "C"\r
+    {\r
+        void closeBle(void);//主动关闭蓝牙\r
+        void openBle(void);//主动开启蓝牙\r
+        bool get_ble_status(void);//获取蓝牙是否关闭还是开启 1就是开启 0关闭 一开机默认是开启蓝牙\r
+        void getDeviceState(void);\r
+    }\r
     bool ClassicBlueToothPresenter::OnChange(UICheckBox::UICheckBoxState state)\r
     {\r
         switch (state)\r
         {\r
         case UICheckBox::SELECTED:\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BlueTooth Capability Is Enabled");\r
-\r
+            openBle();//主动开启蓝牙\r
             break;\r
         case UICheckBox::UNSELECTED:\r
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BlueTooth Capability Is Disabled");\r
-\r
+            closeBle();\r
             break;\r
         default:\r
             break;\r
index 49f96d9..b9d7f98 100644 (file)
@@ -210,7 +210,6 @@ 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 af7cbbf..ecbb067 100755 (executable)
@@ -81,9 +81,7 @@ void BluetoothModel::Init()
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bt enable_bt_stack ret = %d", ret);\r
 \r
     BtInitCallBacks();\r
-#ifdef SUPPORT_ALIPAY_SEC\r
-    svr_alipay_bluetooth_init();\r
-#endif\r
+\r
 \r
     // svr_bluetooth_init();\r
     BtInitCallBacksEx();\r
@@ -1088,8 +1086,8 @@ static int32_t BtA2dpSnkAudioDestroy()
 \r
 static void BtA2dpSnkConnectStateChangedCb(bd_addr_t *bd_addr, int conn_state)\r
 {\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x conn_state: %x\n",\r
-        bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], conn_state); /* 3 2 1 0 idx */\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr1111: ****%02x%02x%02x%02x%02x%02x conn_state: %x\n",\r
+        bd_addr->addr[5],bd_addr->addr[4],bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], conn_state); /* 3 2 1 0 idx */\r
 }\r
 \r
 static void BtA2dpSnkStartStreamReqCb(bd_addr_t *bd_addr)\r
@@ -1164,6 +1162,7 @@ static a2dp_snk_callbacks_t g_a2dp_snk_callbacks = {
 \r
 void BtInitCallBacks()\r
 {\r
+    return;\r
     g_btGapCallBacks.discovery_result_callback = BtGapDiscoveryResultCallback;\r
     g_btGapCallBacks.discovery_state_changed_callback = BtGapDiscoveryStateChangedCallback;\r
     g_btGapCallBacks.acl_state_changed_callbak = GapAclStateChangedCallback;\r
@@ -1186,6 +1185,7 @@ void BtInitCallBacks()
 \r
 void BtInitCallBacksEx()\r
 {\r
+    return;\r
     g_gapBleCallbacks.conn_state_change_cb = BleConnStateChangeCallback;\r
     g_gapBleCallbacks.start_adv_cb = BleAdvStartCallback;\r
     g_gapBleCallbacks.stop_adv_cb = BleAdvStopCallback;\r
@@ -1205,6 +1205,7 @@ void BtInitCallBacksEx()
 \r
 void BtInitGatts(void)\r
 {\r
+    return;\r
     uint16_t id = BLE_SERVICE_UUID;\r
     uint16_t ser_id = 0x1FFF;\r
     uint8_t serverId = 0;\r
@@ -1324,6 +1325,7 @@ void BtInitSpp(void)
 \r
 void BleAdvStart(void)\r
 {\r
+    return;\r
     int advId = 1;\r
     if (BluetoothModel::GetInstance()->GetAdvStartState()) {\r
         WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BleAdvStart already started");\r
index eec10d4..f31ae54 100755 (executable)
@@ -10,3 +10,4 @@ endif()
 add_subdirectory_if_exist(power_manager)
 add_subdirectory_if_exist(timeservice)
 add_subdirectory_if_exist(ble_service)
+add_subdirectory_if_exist(hid_service)
\ No newline at end of file
index e6b612b..c578369 100644 (file)
@@ -9,6 +9,7 @@ set(PRIVATE_HEADER
 )
 set(SOURCES
     ${CMAKE_CURRENT_SOURCE_DIR}/bleService.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/bleEvent.c
 )
 
 set(COMPONENT_PUBLIC_CCFLAGS
diff --git a/code/sdk/application/wearable/service/ble_service/bleEvent.c b/code/sdk/application/wearable/service/ble_service/bleEvent.c
new file mode 100644 (file)
index 0000000..3db715c
--- /dev/null
@@ -0,0 +1,2898 @@
+/**\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
+#include "bts_br_gap.h"\r
+#include "battery_hal.h"\r
+#include "bleService.h"\r
+#include "alipay_feature.h"\r
+#include "alipay_bluetooth.h"\r
+#include "bts_a2dp_sink.h"\r
+#include "osal_timer.h"\r
+#include "bleEvent.h"\r
+#include "app_common_api.h"\r
+#include "../../../../../open_source/openharmony/third_party/cJSON/cJSON.h"\r
+#include "errcode.h"\r
+\r
+ble_recv_data_info_t ble_recv_data;\r
+ble_recv_msg_callback_t g_recv_msg_toUI = NULL;\r
+\r
+\r
+// typedef void (*hx3695_msg_callback_t)(uint8_t msg_type, uint8_t *msg_data, int32_t msg_datalen);\r
+uint32_t ble_recv_register_msg_callback(ble_recv_msg_callback_t func)\r
+{\r
+    g_recv_msg_toUI = func;\r
+    return 0;\r
+}\r
+\r
+ble_recv_msg_callback_t ble_recv_get_send_msg_callback_func(void)\r
+{\r
+    return g_recv_msg_toUI;\r
+}\r
+\r
+int ble_recv_msg_callback(uint8_t writ_read,uint16_t msg_typeID, uint8_t *msg_data, uint16_t msg_datalen)\r
+{\r
+    int ret = 1;\r
+    return ret;\r
+}\r
+bool bigDataBufState=false;//大数据传输状态\r
+static bool Check_CRC(uint8_t *crcnum,uint16_t len)//计算20byte的的校验位\r
+{\r
+       uint8_t crcbuf  = 0;\r
+    uint8_t lrcValue = 0x00;\r
+       for(uint16_t i = 0; i < len-1; i++)\r
+       {\r
+               lrcValue =lrcValue+ crcnum[i];\r
+        printf("%x ",crcnum[i]);\r
+    }\r
+    crcbuf = lrcValue%256;\r
+    crcbuf = 256-crcbuf;\r
+       crcbuf = crcbuf%256;\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC ret:0x%x\r\n",crcbuf);\r
+       if(crcbuf == crcnum[len-1])\r
+    {\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC true:\r\n");\r
+           return true;\r
+    }\r
+       else{\r
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC false:\r\n");\r
+               return false;\r
+    }\r
+        \r
+}\r
+static uint8_t Calculate_CRC(uint8_t *crcnum,uint16_t len)//计算20byte\r
+{\r
+    uint8_t crcbuf  = 0;\r
+    uint8_t lrcValue = 0x00;\r
+       for(uint16_t i = 17; i < len; i++)\r
+       {\r
+               lrcValue =lrcValue+ crcnum[i];\r
+    }\r
+    crcbuf = lrcValue%256;\r
+    crcbuf = 256-crcbuf;\r
+       crcbuf = crcbuf%256;\r
+    //  uint8_t crcbuf  = 0x00;\r
+    // // uint8_t lrcValue = 0x00;\r
+       // for(uint16_t i = 0; i < len; i++)\r
+       // {\r
+       //      crcbuf ^= crcnum[i];\r
+    // }\r
+    return crcbuf;\r
+}\r
+static uint8_t cal_sum(uint8_t *crcnum,uint16_t len)//计算20byte\r
+{\r
+    uint8_t lrcValue = 0x00;\r
+       for(uint16_t i = 0; i < len; i++)\r
+       {\r
+               lrcValue =lrcValue+ crcnum[i];\r
+        printf("%02x ",crcnum[i]);\r
+    }\r
+    printf("cal_sum\r\n");\r
+    return lrcValue;\r
+}\r
+static uint8_t Calculate_CRC_Big(uint8_t *crcnum,uint16_t len)//计算20byte\r
+{\r
+    uint8_t crcbuf  = 0;\r
+    uint8_t lrcValue = 0x00;\r
+       for(uint16_t i = 0; i < len; i++)\r
+       {\r
+               lrcValue =lrcValue+ crcnum[i];\r
+    }\r
+    crcbuf = lrcValue%256;\r
+    crcbuf = 256-crcbuf;\r
+       crcbuf = crcbuf%256;\r
+    return crcbuf;\r
+}\r
+static cJSON *cjson_json_tmp = NULL;\r
+//发送ble数据\r
+errcode_t sendBleData(uint8_t *buf,uint16_t len)\r
+{\r
+    errcode_t ret = ERRCODE_FAIL;\r
+    if(bigDataBufState == true)return ERRCODE_FAIL;\r
+    for(uint16_t i = 0;i<len;i++)\r
+    {   \r
+       WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "%02x ",buf[i]);\r
+    }\r
+    if(Bleconnect == true )\r
+    {\r
+        ret = svr_ble_bt_gatts_noyify(buf,len);\r
+    }\r
+    return ret;\r
+    \r
+}\r
+void sendDataNow(uint8_t *buf,uint16_t len)\r
+{\r
+    for(uint16_t i = 0;i<len;i++)\r
+    {   \r
+       printf("%02x ",buf[i]);\r
+    }\r
+    if(Bleconnect == true )\r
+    {\r
+        svr_ble_bt_gatts_noyify(buf,len);\r
+    }\r
+}\r
+//发送ble数据\r
+void sendBleDataNow(uint8_t *buf,uint16_t len)\r
+{\r
+    if(bigDataBufState == true)return;\r
+    for(uint16_t i = 0;i<len;i++)\r
+    {   \r
+       WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "%02x ",buf[i]);\r
+    }\r
+    if(Bleconnect == true )\r
+    {\r
+        svr_ble_bt_gatts_noyify(buf,len);\r
+    }\r
+}\r
+uint8_t phone_mac[6];//手机下发的mac地址 第一次连接为空 只要mac地址不为空就认为和该手机绑定过不要走连接流程只要走回连即可\r
+uint8_t parie_mac[6];//配对完成之后的的mac地址\r
+uint8_t phoneDataFlag = 0;\r
+//发送配对指令\r
+void sendConfirmParieSucess(void)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    value[0] = 0x72;\r
+    value[1] = 0x05;\r
+    value[2] = 0x11;\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    value[17] = 0x01;\r
+    value[18] = Calculate_CRC(value,1+18);\r
+    if(Check_CRC(value,2+17))\r
+    {\r
+        sendBleData(value,19);\r
+    }\r
+    \r
+}\r
+\r
+static void jsonCheck_phoneinfor(uint8_t *buf,uint8_t *mac_data)//解析手机信息json\r
+{\r
+    uint8_t mac_tmp[6];\r
+    memset(mac_tmp,0,6);\r
+    uint8_t count1 = 0;\r
+    uint8_t count2 = 0;\r
+    uint8_t *json;\r
+    json = buf;\r
+    cJSON* root = cJSON_Parse((const char *)json);\r
+    if (root == NULL) {\r
+        printf("JSON解析错误\n");\r
+        return;\r
+    }\r
+\r
+    cJSON* pn = cJSON_GetObjectItem(root, "pn");\r
+    if (cJSON_IsString(pn)) {\r
+        printf("产品名称: %s\n", pn->valuestring);\r
+    }\r
+\r
+    cJSON* tp = cJSON_GetObjectItem(root, "tp");\r
+    if (cJSON_IsNumber(tp)) {\r
+        printf("类型: %d\n", tp->valueint);\r
+    }\r
+\r
+    cJSON* mac = cJSON_GetObjectItem(root, "mac");\r
+    if (cJSON_IsArray(mac)) {\r
+        printf("MAC地址: ");\r
+        cJSON* macElement = NULL;\r
+        cJSON_ArrayForEach(macElement, mac) {\r
+            if (cJSON_IsNumber(macElement)) {\r
+                printf("%d", macElement->valueint);\r
+                if (macElement->next != NULL) {\r
+                    phone_mac[count1++] = macElement->valueint;\r
+                    mac_tmp[count2++] = macElement->valueint;\r
+                    printf(", ");\r
+                }\r
+            }\r
+        }\r
+        printf("\n");\r
+    }\r
+    if(sizeof(mac_tmp) != 0)\r
+    {\r
+        printf("MAC地址: len %d",sizeof(mac_tmp));\r
+        memcpy(mac_data,mac_tmp,6);\r
+    }\r
+    cJSON_Delete(root);\r
+}\r
+errcode_t bondSucessCmd(void)//发送解绑指令,解绑界面调用这个函数 如果点了✓调用这个函数 返回成功后延迟10s再重启设备  \r
+{\r
+    errcode_t sendok = ERRCODE_FAIL;\r
+    uint32_t tmp = 1;\r
+    uint8_t value[19];\r
+    uint8_t crcvalue = 0;\r
+    memset(value,0,19);\r
+    memset(value,0,19);\r
+    value[0] =0x72;\r
+    value[1] =0x05;\r
+    value[2] =0x12;\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[17] = 1;\r
+    value[18] = Calculate_CRC(value+17,1);\r
+    sendok =  sendBleData(value,19);\r
+    bool ret = bt_is_acl_connected(&phone_addr);\r
+    bool  remove = 0;\r
+    if(ret == true)\r
+    {\r
+        errcode_t ret = gap_ble_remove_all_pairs(); \r
+        remove =  gap_remove_all_pairs();\r
+        printf("remove11111!!!!!!:%d",remove);\r
+    }else{\r
+        errcode_t ret = gap_ble_remove_all_pairs(); \r
+        remove =  gap_remove_all_pairs();\r
+        printf("remove2222!!!!!!:%d",remove);\r
+    }\r
+    closeBle();\r
+    return sendok;\r
+}\r
+void getDeviceState(void)\r
+{\r
+    bool ret = bt_is_acl_connected(&phone_addr);\r
+    printf("remove11111!!!!!!:%d",ret);\r
+}\r
+\r
+void clearPaireFlag(uint8_t flag)\r
+{\r
+    uint8_t value[19];\r
+    uint8_t crcvalue = 0;\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    value[0] =0x72;\r
+    value[1] =0x01;\r
+    value[2] =0x10;\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[17] = flag;\r
+    value[18] = Calculate_CRC(value+17,1);\r
+    sendBleData(value,19);\r
+}\r
+void clearPaireCmd(uint8_t *crcnum,uint16_t len)//发送清除配对指令\r
+{\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        //弹出清除配对界面不弹出是则发送0x02操作失败 1操作成功 0校验失败\r
+        clearPaireFlag(1);\r
+    }\r
+    else\r
+    {\r
+        clearPaireFlag(0);\r
+    }\r
+}\r
+//确认配对指令\r
+void comfirmPaire(uint8_t flag)\r
+{\r
+    uint8_t value[19];\r
+    uint8_t crcvalue = 0;\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    value[0] =0x72;\r
+    value[1] =0x05;\r
+    value[2] =0x11;\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[17] = flag;\r
+    value[18] = Calculate_CRC(value,1+17);\r
+    sendBleData(value,19);\r
+}\r
+// l连接手表之后-app通过特征值2AE4读手表信息->手表会把相应的信息给app->app通过73 02 10下发手机信息给设备(第一次连接mac为空)->设备返回73 02 10状态1才能和手机app第一次连接->设备会回发配对指令72 05 11给app,同时设备会对手机发起配对->手机点了配对后,配对成功手表会发配对成功指令72 05 10,这条指令包含手机的mac地址也会传给app->app校验解析成功之后->app下发时间指令72 02 02给设备->设备回复解析成功->完成连接\r
+void alarmData(void)\r
+{\r
+\r
+}\r
+\r
+uint8_t bond_phone = 0;//是否和手机app绑定过已经绑定就不需要配对指令给app,直接发起配对\r
+void getPhoneInfo(uint8_t *buf,uint16_t len)//获取手机信息\r
+{\r
+   \r
+    uint8_t value[20];\r
+    uint8_t crcvalue = 0;\r
+    memset(value,0,20);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_fen= 1;\r
+    value[0] =0x72;\r
+    value[1] =0x02;\r
+    value[2] =0x10;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_fen,2);\r
+    phoneDataFlag = 1;\r
+    \r
+    if(Check_CRC(buf,len))\r
+    {\r
+        ble_recv_msg_callback_t func =  ble_recv_get_send_msg_callback_func();\r
+        if(func != NULL)\r
+        {\r
+            func(0x01,0x011a,value,19);\r
+            // func(HX3695_MSG_TYPE_HRS_UPDATE,&hrsresult,sizeof(FT_CUSTOM_RESULTS_t));\r
+        }\r
+        uint8_t *tmp_data;\r
+        tmp_data = buf;\r
+        uint8_t copare_mac[6];\r
+        memset(copare_mac,0,6);\r
+        jsonCheck_phoneinfor(tmp_data,&copare_mac);\r
+        gap_ble_pair_state_t status;\r
+        gap_ble_get_pair_state(&phone_addr,&status);//获取配对状态\r
+        uint8_t bond = 1;//未与任何手机绑定过\r
+        if(strlen((char *)copare_mac) != 0  && strlen((char *)parie_mac)) //两个都不为空才进行比较\r
+        {\r
+            int result = memcmp(copare_mac,parie_mac,6);//两个不一致说明和其他手机绑定了\r
+            if(result == 0)//相等则手机与改手机绑定过\r
+            {\r
+                bond = 2;//和该手机绑定过\r
+            }\r
+            else{\r
+                bond = 3;//和其他手机绑定过\r
+            }\r
+            printf("gap_ble_pair_remote_device result %d\r\n",result);\r
+        }\r
+        errcode_t ret = 0;\r
+        // errcode_t ret = gap_ble_remove_all_pairs(); \r
+        // bool  remove =  gap_remove_all_pairs();\r
+        printf("gap_ble_pair_remote_device status %d ret:%d\r\n",status,ret);\r
+        bond_phone = 0;\r
+        if(strlen((char *)copare_mac) == 0)\r
+        {\r
+            bond = 0x01;//手表未和任何手机绑定过\r
+           \r
+        }else\r
+        {\r
+            bond_phone = 1;\r
+            bond = 0x02;//手表与该手机绑定过\r
+        }\r
+        value[17] = bond;//\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+        if(1)\r
+        {\r
+            uint16_t number;\r
+            errcode_t ret = gap_ble_get_paired_devices_num(&number);\r
+            int gap_ret = gap_get_pair_state(&phone_addr);\r
+            gap_ble_pair_state_t status;\r
+            gap_ble_get_pair_state(&phone_addr,&status);//获取配对状态\r
+            if(strlen((char *)copare_mac) == 0)//只要app没有下发mac就开启弹窗\r
+            {\r
+                comfirmPaire(1);\r
+                gap_ble_pair_remote_device(&phone_addr);\r
+            }else{\r
+                ret = gap_ble_pair_remote_device(&phone_addr);\r
+            }\r
+            printf("gap_ble_pair_remote_device ret:%d number %d phone_mac_data 0x%x-0x%x-0x%x-0x%x-0x%x-0x%x phone_addr->TYPE:%d\n",ret,number,phone_addr.addr[0],phone_addr.addr[1],phone_addr.addr[2],phone_addr.addr[3],phone_addr.addr[4],\r
+            phone_addr.addr[5],phone_addr.type);\r
+        }\r
+    }else{\r
+        value[17] = 0x00;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+    \r
+    \r
+}\r
+\r
+\r
+void sendParieSuccess(uint8_t flag,uint8_t *mac)//发送配对成功指令to app\r
+{\r
+    if(bond_phone != 1 && phoneDataFlag == 1){//和该手机绑定过并且是连接app之后下发的数据 正常系统配对是不需要保存的\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:0x%x-0x%x-0x%x-0x%x-0x%x-0x%x\r\n",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]);\r
+        uint8_t value[25];\r
+        uint8_t length = 0;\r
+        memset(value,0,25);\r
+        value[0] = 0x72;\r
+        value[1] = 0x05;\r
+        value[2] = 0x10;\r
+        uint32_t tmp = 1;\r
+        uint16_t tmp_data = 1;\r
+        memcpy(value+3,&tmp,4);\r
+        memcpy(value+7,&tmp,4);\r
+        memcpy(value+11,&tmp,4);\r
+        memcpy(value+15,&tmp_data,2);\r
+        value[17] = flag;//1 配对成功 0 配对失败 \r
+        if(flag == 1)//配对成功\r
+        {\r
+            memcpy(value+18,mac,6);\r
+            memcpy(parie_mac,mac,6);\r
+            length = 18+6;\r
+            uint8_t crcvalue = Calculate_CRC(value,length);\r
+            value[length] = crcvalue;\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:%d length:%d crcvalue:%d",sizeof(value),length,crcvalue );\r
+            sendBleData(value,length+1);\r
+        }else{\r
+            length = 18;\r
+            uint8_t crcvalue = Calculate_CRC(value,length);\r
+            value[length] = crcvalue;\r
+            length = length+1;\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "sendParieSuccess:%d length:%d crcvalue:%d",sizeof(value),length,crcvalue );\r
+            sendBleData(value,length);\r
+        }\r
+        phoneDataFlag = 0;\r
+    }\r
+    \r
+}\r
+\r
+\r
+//02类型的指令数据\r
+\r
+void checkCrcSend(uint8_t type,uint8_t typeID,uint8_t crcflag)//获取时间\r
+{\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    uint8_t sendBuf[19];\r
+    memset(sendBuf,0,19);\r
+    sendBuf[0] = 0x72;\r
+    sendBuf[1] = type;\r
+    sendBuf[2] = typeID;\r
+    memcpy(sendBuf+3,&tmp,4);\r
+    memcpy(sendBuf+7,&tmp,4);\r
+    memcpy(sendBuf+11,&tmp,4);\r
+    memcpy(sendBuf+15,&tmp_data,2);\r
+    sendBuf[17] = crcflag;\r
+    sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+    sendBleData(sendBuf,19);\r
+\r
+}\r
+static void jsonCheck_time(uint8_t *buf,char *set_time)//json 格式解析\r
+{\r
+    uint8_t time_data[24];\r
+    memset(time_data,0,24);\r
+    uint8_t *json;\r
+    json = buf;\r
+    cJSON* root = cJSON_Parse((const char *)json);\r
+    if (root == NULL) {\r
+        printf("时间 JSON解析错误\n");\r
+        return;\r
+    }\r
+\r
+    cJSON* pn = cJSON_GetObjectItem(root, "time");\r
+    if (cJSON_IsNumber(pn)) {\r
+        printf("time: %d\n", pn->valueint);\r
+        \r
+    }\r
+    cJSON* week = cJSON_GetObjectItem(root, "week");\r
+    if (cJSON_IsNumber(week)) {\r
+        printf("week: %d\n", week->valueint);\r
+    }\r
+    cJSON* year = cJSON_GetObjectItem(root, "year");\r
+    if (cJSON_IsNumber(week)) {\r
+        printf("year: %d\n", year->valueint);\r
+    }\r
+    cJSON* month = cJSON_GetObjectItem(root, "month");\r
+    if (cJSON_IsNumber(month)) {\r
+        printf("month: %d\n", month->valueint);\r
+    }\r
+    cJSON* day = cJSON_GetObjectItem(root, "day");\r
+    if (cJSON_IsNumber(day)) {\r
+        printf("day: %d\n", day->valueint);\r
+    }\r
+    cJSON* hour = cJSON_GetObjectItem(root, "hour");\r
+    if (cJSON_IsNumber(hour)) {\r
+        printf("hour: %d\n", hour->valueint);\r
+    }\r
+    cJSON* minute = cJSON_GetObjectItem(root, "minute");\r
+    if (cJSON_IsNumber(minute)) {\r
+        printf("minute: %d\n", minute->valueint);\r
+    }\r
+    cJSON* second = cJSON_GetObjectItem(root, "second");\r
+    if (cJSON_IsNumber(second)) {\r
+        printf("second: %d\n", second->valueint);\r
+    }\r
+    cJSON* location = cJSON_GetObjectItem(root, "location");\r
+    if (cJSON_IsString(location)) {\r
+        printf("location: %s\n", location->valuestring);\r
+    }\r
+    sprintf((char *)time_data,"%d-%d-%d %d:%d:%d",year->valueint+2000,month->valueint,day->valueint,hour->valueint,minute->valueint,second->valueint);\r
+    memcpy(set_time,time_data,strlen((char *)time_data));\r
+    cJSON_Delete(root);\r
+}\r
+\r
+\r
+\r
+\r
+void GetUTCtime(uint8_t *crcnum,uint16_t len)//获取时间\r
+{\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    uint8_t sendBuf[19];\r
+    memset(sendBuf,0,19);\r
+    sendBuf[0] = 0x72;\r
+    sendBuf[1] = 0x02;\r
+    sendBuf[2] = 0x02;\r
+    memcpy(sendBuf+3,&tmp,4);\r
+    memcpy(sendBuf+7,&tmp,4);\r
+    memcpy(sendBuf+11,&tmp,4);\r
+    memcpy(sendBuf+15,&tmp_data,2);\r
+    \r
+       if(Check_CRC(crcnum,len))\r
+       {\r
+        sendBuf[17] = 1;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+        char set_time[24];\r
+        memset((uint8_t *)set_time,0,24);\r
+        uint8_t *data;\r
+        data = crcnum;\r
+        jsonCheck_time(data,&set_time);\r
+        if(strlen(set_time) != 0)\r
+        {\r
+            set_system_time(set_time);\r
+        }\r
+    }\r
+       else\r
+       {\r
+               sendBuf[17] = 0;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+    }\r
+    \r
+}\r
+static void jsonCheck_weather(uint8_t *buf)//json 格式解析 天气数据\r
+{\r
+    uint8_t *json;\r
+    json = buf;\r
+    cJSON* root = cJSON_Parse((const char *)json);\r
+    if (root == NULL) {\r
+        printf("天气 JSON解析错误\n");\r
+        return;\r
+    }\r
+    cJSON *address_cjson = cJSON_GetObjectItem(root, "address");\r
+    cJSON *city_cjson = cJSON_GetObjectItem(address_cjson, "city");\r
+    \r
+    if (cJSON_IsString(city_cjson)) {\r
+        printf("city: %s\n", city_cjson->valuestring);\r
+    }\r
+    cJSON_Delete(root);\r
+    printf("weather data!!!!!!!!!!end\r\n");\r
+}\r
+\r
+\r
+void GetWeatherCmd(uint8_t *crcnum,uint16_t len)//获取天气数据\r
+{\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    uint8_t sendBuf[19];\r
+    memset(sendBuf,0,19);\r
+    sendBuf[0] = 0x72;\r
+    sendBuf[1] = 0x02;\r
+    sendBuf[2] = 0x20;\r
+    memcpy(sendBuf+3,&tmp,4);\r
+    memcpy(sendBuf+7,&tmp,4);\r
+    memcpy(sendBuf+11,&tmp,4);\r
+    memcpy(sendBuf+15,&tmp_data,2);\r
+\r
+       if(Check_CRC(crcnum,len))\r
+       {\r
+        sendBuf[17] = 1;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+        jsonCheck_weather(crcnum);\r
+    }\r
+       else\r
+       {\r
+               sendBuf[17] = 0;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+    }\r
+    \r
+}\r
+//获取用户数据 app下发的\r
+void getUserInfo(uint8_t *crcnum,uint16_t len)//\r
+{\r
+    uint8_t value[19];\r
+    uint8_t crcvalue = 0;\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    value[0] =0x72;\r
+    value[1] =0x02;\r
+    value[2] =0x01;\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
+    \r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t age = crcnum[0];\r
+        uint8_t gender = crcnum[1];\r
+        uint8_t height = crcnum[2];\r
+        uint8_t weight = crcnum[3];\r
+\r
+        uint32_t targetStep = 0;\r
+        memcpy(&targetStep,&crcnum[4],4);\r
+        uint16_t targetFatTime = 0;\r
+        memcpy(&targetFatTime,&crcnum[8],2);\r
+        \r
+        uint8_t targetStand = crcnum[10];\r
+        uint8_t Time = crcnum[11];\r
+\r
+        value[17] = 0x01;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else{\r
+        value[17] = 0x00;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+//02 类型\r
+void typeHexTwoData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen)\r
+{\r
+    uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];\r
+    switch (typeID) //ID\r
+    {\r
+        case USER_INFOR_CMD://获取用户信息\r
+            getUserInfo(data,datalen);\r
+            break;\r
+        case GET_PHONE_INFOR_CMD://手机下发的手机信息\r
+            getPhoneInfo(data,datalen);\r
+            break;\r
+        case CURR_TIME_CMD:\r
+            GetUTCtime(data,datalen);//获取时间app下发的时间进行解析\r
+            break;\r
+        case SET_BLE_NAME_CMD:\r
+            getPhoneInfo_test();\r
+            break;\r
+        case SET_TRAIN_TARGET_CMD:\r
+            break;\r
+        case GET_ALARM_DATA_CMD:\r
+            break;\r
+        case DELETE_FILE_CMD:\r
+            break;\r
+        case SYN_BASIC_REAL_HEATR_CMD:\r
+            break;\r
+        case SYN_TODAY_BASIC_TRAIN_TXT_CMD:\r
+            break;\r
+        case GET_WEATHER_DATA_CMD://天气数据\r
+            GetWeatherCmd(data,datalen);\r
+            break;\r
+        default:\r
+            break;\r
+    }\r
+}\r
+\r
+//切换表盘\r
+static void switchDialCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x02;\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    \r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint16_t daila_type = 0;\r
+        memcpy(&daila_type,&crcnum[17],2);\r
+        value[17] = 1;//校验成功\r
+        value[18] = Calculate_CRC(value+17,18-1);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;//校验失败\r
+        value[18] = Calculate_CRC(value+17,18-1);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+//关于本机内容\r
+static void aboutDeviceCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    cJSON *dataJSON = cJSON_CreateObject();\r
+    cJSON_AddNumberToObject(dataJSON,"code",1);\r
+    cJSON_AddNumberToObject(dataJSON,"major",0);\r
+    cJSON_AddNumberToObject(dataJSON,"mid",3);\r
+    cJSON_AddNumberToObject(dataJSON,"minor",2);\r
+    unsigned char addr[6];\r
+    bluetooth_get_local_addr(&addr[0],6);\r
+    char mac_data[24];\r
+    memset(mac_data,0,24);\r
+    sprintf(mac_data,"%x:%x:%x:%x:%x:%x",addr[5],addr[4],addr[3],addr[2],addr[1],addr[0]);\r
+    cJSON_AddStringToObject(dataJSON, "macAddress",mac_data);\r
+\r
+    char *json_format = cJSON_PrintUnformatted(dataJSON);\r
+    cJSON_Delete(dataJSON);\r
+    uint32_t data_len = strlen(json_format);\r
+    uint8_t value[data_len+18];\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x03;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        memcpy(value+17,(uint8_t *)json_format,data_len);\r
+        unsigned char  lrc = Calculate_CRC(value+17,data_len);\r
+        printf("lrc:%d",lrc);\r
+        value[data_len+18] = lrc;\r
+        sendBleData(value,data_len+18);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        unsigned char  lrc = Calculate_CRC(value+17,18-1);\r
+        value[18] = lrc;\r
+        sendBleData(value,19);\r
+    }\r
+    \r
+}\r
+//查找手表 01 04\r
+//设置查找手表的状态,1 校验成 2手表已找到,停止查找手表\r
+void setFindWatchFlag(uint8_t flag)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x04;\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    value[17] = flag;//校验标志\r
+    value[18] = Calculate_CRC(value+17,18-1);\r
+    sendBleData(value,19);\r
+}\r
+static void findWatchCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+   \r
+    uint8_t findFlag = crcnum[17];\r
+    if(Check_CRC(crcnum+17,len-17))\r
+    {\r
+        //弹窗界面\r
+        if(findFlag)//查找手表弹窗界面\r
+        {\r
+\r
+        }else//停止查找手表 如果在查找手表界面就要停止回到上一级界面\r
+        {\r
+\r
+        }\r
+    }else\r
+    {\r
+        setFindWatchFlag(0);\r
+    } \r
+}\r
+//获取sd卡剩余空间\r
+static void GetSDSpaceCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[27];\r
+    memset(value,0,27);\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x05;\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum+17,len-17))\r
+    {\r
+        uint8_t sdFlag = 0;\r
+        if(sdFlag == 1)// 1获取失败 2 获取成功 \r
+        {\r
+            value[17] = 1;//校验标志\r
+            value[18] = Calculate_CRC(value+17,18-1);\r
+            sendBleData(value,27);\r
+        }else{\r
+            value[17] = 2;//校验标志\r
+            value[18] = Calculate_CRC(value+17,18-1); \r
+            sendBleData(value,19);\r
+        }\r
+    }else\r
+    {\r
+        value[17] = 0;//校验标志\r
+        value[18] = Calculate_CRC(value+17,18-1);\r
+        sendBleData(value,19);\r
+    } \r
+}\r
+//获取当前数据\r
+static void GetCurDataCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    cJSON *dataJSON = cJSON_CreateObject();\r
+    const char *string_value[8]={"hr","spo2","stress","steps","duration","standup","calories","distance"};\r
+    for(uint8_t i = 0;i<8;i++)\r
+    {\r
+        cJSON* data_arryJSON = cJSON_CreateObject();\r
+        \r
+        cJSON_AddNumberToObject(data_arryJSON,"value",80);\r
+        cJSON_AddNumberToObject(data_arryJSON,"time",1633686477);\r
+        cJSON_AddItemToObject(dataJSON,string_value[i],data_arryJSON);\r
+    } \r
+\r
+    char *json_format = cJSON_PrintUnformatted(dataJSON);\r
+       printf("%d\n",strlen(json_format));\r
+    cJSON_Delete(dataJSON);\r
+    printf("%s\n",json_format);\r
+    uint32_t data_len = strlen(json_format);\r
+    uint8_t value[data_len+18];\r
+    memset(value,0,data_len+18);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = data_len;\r
+    uint32_t dataLen = data_len;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x06;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&dataLen,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    \r
+    // uint8_t buf[22] = {0x7b,0x22,0x74,0x70,0x22,0x3a,0x31,0x2c,0x22,0x70,0x6e,0x22,0x3a,0x22,0x69,0x50,0x68,0x6f,0x6e,0x65,0x22,0x7d};\r
+    \r
+    if(Check_CRC(crcnum+17,len-17))\r
+    {\r
+        memcpy(value+17,(uint8_t *)json_format,data_len);\r
+        uint8_t lrc = Calculate_CRC(value+17,dataLen);\r
+        printf("lrc:%d",lrc);\r
+        value[data_len+18] = lrc;\r
+        sendBleData(value,data_len+18);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        uint8_t lrc = Calculate_CRC(value+17,18-1);\r
+        value[18] = lrc;\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//获取当手表电池电量\r
+static void GetBatteryLevelCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x07;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum+17,len-17))\r
+    {\r
+        float voltage = 0.0F;\r
+        uint8_t power = 0;\r
+        power = battery_get_voltage(&voltage);\r
+        value[17] = power;\r
+        value[18] = Calculate_CRC(value+17,18-1);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value+17,18-1);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//获取开关消息推送功能\r
+static void GetSwitchMessCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x08;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum+17,len-17))\r
+    {\r
+        uint8_t switch_on = crcnum[17];//0 关闭 1 开启\r
+\r
+        value[17] = 1;\r
+        value[18] = Calculate_CRC(value+17,18-1);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value+17,18-1);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//撤销当前文件传输 1 OTA 2MP3 3表盘 3天气 5闹钟\r
+static void RemoveFileCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x20;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum+17,len-17))\r
+    {\r
+        uint8_t switch_on = crcnum[17];//0 关闭 1 开启\r
+\r
+        value[17] = 1; //1 操作成功 2 操作失败\r
+        value[18] = Calculate_CRC(value+17,18-1);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value+17,18-1);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+//获取指定类型文件目录\r
+static void GetFileTypeCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x21;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t fileType = crcnum[17];//2 mp3 3 表盘\r
+\r
+        value[17] = 1; //1 操作成功 2 操作失败\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//删除指定类型所有的文件\r
+static void DeleteFileTypeCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x22;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        value[17] = 1; //1 操作成功 2 操作失败\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//开启指定运动模式\r
+static void OpenSportModeCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x0A;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t sportMode = crcnum[17];//运动类型 0 健走 1跑步 2骑行 3\r
+\r
+        value[17] = 1; //1 操作成功 2 操作失败\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//结束运动模式\r
+static void StopSportModeCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x0B;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        value[17] = 1; //1 操作成功 2 操作失败\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//设置语言\r
+static void SetLanguageCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x0E;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t language = crcnum[17];\r
+\r
+        value[17] = 1; //1 操作成功 2 操作失败\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//开启/关闭获取实时训练数据\r
+static void SetRealTimeDataCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x11;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t autoSportData = crcnum[17];//开关 1开启 0关闭\r
+\r
+        value[17] = 1; //1 操作成功 2 操作失败\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//设置训练试试数据采集频率\r
+static void SetRTDataFreCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x14;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t Frequence = crcnum[17];//频率单位是s\r
+\r
+        value[17] = 1; //1 操作成功 2 操作失败\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//获取实时训练数据\r
+void getSportData(char *buf)\r
+{\r
+    cJSON *dataJSON = cJSON_CreateObject();\r
+    cJSON_AddNumberToObject(dataJSON,"st",1637825067);\r
+    cJSON_AddNumberToObject(dataJSON,"hr",120);\r
+    cJSON_AddNumberToObject(dataJSON,"ca",3657);\r
+    cJSON_AddNumberToObject(dataJSON,"di",5274);\r
+    cJSON_AddNumberToObject(dataJSON,"stp",1234);\r
+    cJSON_AddNumberToObject(dataJSON,"ti",3);\r
+    char *json_format = cJSON_PrintUnformatted(dataJSON);\r
+    printf("%s",json_format);\r
+    cJSON_Delete(dataJSON);\r
+    int dataLen = strlen(json_format);\r
+    memcpy(buf,json_format,dataLen);\r
+    return;\r
+\r
+}\r
+void sendRealTimeDataToAPP(uint8_t flag)\r
+{\r
+    uint8_t value[128];\r
+    memset(value,0,128);\r
+    \r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x0f;\r
+    char buf[128];\r
+    memset(buf,0,128);\r
+    getSportData(&buf);\r
+    uint32_t tmp = 1;\r
+    uint32_t datalen = 1;\r
+    uint16_t tmp_data = 1;\r
+    datalen = strlen(buf);\r
+    tmp_data = datalen;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&datalen,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(flag != 0)//校验失败\r
+    {\r
+        memcpy(&value[17],buf,strlen(buf));\r
+        value[strlen(buf)+17] = Calculate_CRC(value,17+strlen(buf));\r
+        sendBleData(value,strlen(buf)+17+1);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+    \r
+}\r
+//获取实时训练数据\r
+static void GetRealTimeDataCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    \r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        sendRealTimeDataToAPP(1);\r
+    }else\r
+    {\r
+        sendRealTimeDataToAPP(0);\r
+    }\r
+}\r
+//设置最高心率提醒\r
+static void SetMaxHrRemindCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x15;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))//\r
+    {\r
+        uint8_t maxHr = crcnum[17];\r
+        if(maxHr > 250)maxHr = 250;\r
+        else if(maxHr <= 0) maxHr = 0;\r
+\r
+        //255 关闭\r
+        value[17] = 1;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+    \r
+}\r
+//训练暂停/恢复\r
+static void GetSportPasueResetCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x16;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))//\r
+    {\r
+        uint8_t PauseStop = crcnum[17];//0 暂停 1恢复\r
+        value[17] = 1;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+    \r
+}\r
+//发送当前表盘到app\r
+static void SendDialToAppCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[20];\r
+    memset(value,0,20);\r
+    uint32_t tmp = 1;\r
+    uint32_t datalen = 2;\r
+    uint16_t tmp_data = 2;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x17;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&datalen,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))//\r
+    {\r
+        uint16_t dialNum = 450;//0 暂停 1恢复\r
+        memcpy(&value[17],&dialNum,2);\r
+        value[19] = Calculate_CRC(value,19);\r
+        sendBleData(value,20);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+    \r
+}\r
+//获取手表当前状态\r
+static void GetWatchStatusCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[20];\r
+    memset(value,0,20);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x19;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+\r
+    //0空闲状态 9 usb状态 10 运动训练状态\r
+    uint8_t watchStatus = 0;\r
+    value[17] = 0;\r
+    value[18] = Calculate_CRC(value,18);\r
+    sendBleData(value,19);\r
+}\r
+//获取手表屏幕参数\r
+static void GetScreenParamCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[21];\r
+    memset(value,0,21);\r
+    uint32_t tmp = 1;\r
+    uint32_t datalen = 3;\r
+    uint16_t tmp_data = 3;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x1a;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&datalen,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+\r
+    //0空闲状态 9 usb状态 10 运动训练状态\r
+    uint8_t Brightness = 5;//亮度调节 \r
+    uint8_t screenTime = 1;//亮屏时长 0 5S 1 10s 2 15s 3 30s 4 1分钟 5 5分钟\r
+    uint8_t wristOn = 0;//抬婉亮屏\r
+\r
+    value[17] = Brightness;\r
+    value[18] = screenTime;\r
+    value[19] = wristOn;\r
+    value[20] = Calculate_CRC(value,20);\r
+    sendBleData(value,21);\r
+}\r
+\r
+//App删除表盘 (仅W4手表)\r
+static void DeleteDialUidCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[20];\r
+    memset(value,0,20);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x1b;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint16_t deleteDial = 0;//删除的表盘UID \r
+        deleteDial=crcnum[17]+crcnum[18]*256;\r
+        value[17] = 1;// 1删除成功 2 没有改资源 0指令校验失败\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+      \r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+    \r
+    \r
+}\r
+\r
+//获取手表声音与振动参数 Sound and Vibration\r
+static void GetSoundVibrationCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[23];\r
+    memset(value,0,23);\r
+    uint32_t tmp = 1;\r
+    uint32_t datalen = 5;\r
+    uint16_t tmp_data = 5;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x1b;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&datalen,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t sysSoundLevel = 0;//系统音量调节\r
+        uint8_t sysRing = 0;//铃声音量调节\r
+        uint8_t sysMedia = 0;//媒体音量调节\r
+        uint8_t RingSwitch = 0;//铃声开关\r
+        uint8_t VibiationSwitch = 0;//振动开关\r
+        value[17] = sysSoundLevel;// \r
+        value[18] = sysRing;// \r
+        value[19] = sysMedia;// \r
+        value[20] = RingSwitch;//\r
+        value[21] = VibiationSwitch;// \r
+        value[22] = Calculate_CRC(value,22);\r
+        sendBleData(value,23);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+    \r
+    \r
+}\r
+\r
+//APP获取手表辅助功能参数Auxiliary functions\r
+static void GetWatchAuxFuncCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[23];\r
+    memset(value,0,23);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x1d;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t paramCmt = 0;//辅助功能 0\r
+        \r
+        value[17] = paramCmt;// \r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+    \r
+    \r
+}\r
+//APP获取手表心率设置\r
+static void GetHrSetParamCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[22];\r
+    memset(value,0,22);\r
+    uint32_t tmp = 1;\r
+    uint32_t datalen = 4;\r
+    uint16_t tmp_data = 4;\r
+\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x1e;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&datalen,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t hrfreq = 0;//监测频率\r
+        uint8_t hrSwitch = 0;//心率提醒开关\r
+        uint8_t hrMaxMin = 0;//高于或低于\r
+        uint8_t hrValue = 0;//阈值\r
+        value[17] = hrfreq;//\r
+        value[18] = hrSwitch;//\r
+        value[19] = hrMaxMin;//\r
+        value[20] = hrValue;// \r
+        value[21] = Calculate_CRC(value,21);\r
+        sendBleData(value,22);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+    \r
+    \r
+}\r
+//APP获取手表血氧设置\r
+static void GetSpo2SetParamCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[21];\r
+    memset(value,0,21);\r
+    uint32_t tmp = 1;\r
+    uint32_t datalen = 3;\r
+    uint16_t tmp_data = 3;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x1f;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&datalen,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t spo2freq = 0;//监测频率\r
+        uint8_t spo2Switch = 0;//心率提醒开关\r
+        uint8_t spo2MaxMin = 0;//高于或低于\r
+        value[17] = spo2freq;//\r
+        value[18] = spo2Switch;//\r
+        value[19] = spo2MaxMin;// \r
+        value[20] = Calculate_CRC(value,20);\r
+        sendBleData(value,21);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+    \r
+    \r
+}\r
+\r
+//手势拍照协议\r
+static void carmeraCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x23;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t carmera = crcnum[17];\r
+        value[17] = 1;// \r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+//APP获取手表喝水提醒设置\r
+static void GetDrinkParamCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x24;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t drinkOn = 0;\r
+        value[17] = drinkOn;// \r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+//APP发送恢复出厂设置\r
+static void GetFactoryCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x25;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        \r
+        value[17] = 1;// \r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//APP发送重新启动\r
+static void GetResetCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x26;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        \r
+        value[17] = 1;// \r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//APP发送关机\r
+static void GetPowerOffCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x27;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        \r
+        value[17] = 1;// \r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+\r
+\r
+\r
+\r
+//app发送公英制单位\r
+static void GetMetricCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x28;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t kmileter = crcnum[17];//公英制单位 0 是公英制 1英制单位\r
+        value[17] = 1;// \r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+//app获取睡眠设置\r
+static void GetSleepParamCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[24];\r
+    memset(value,0,24);\r
+    uint32_t tmp = 1;\r
+    uint32_t datalen = 6;\r
+    uint16_t tmp_data =6;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x29;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&datalen,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t sleepTime = 0;//作息时间设定 0关闭 1开启\r
+        uint8_t bedTimeHour = 0;//就寝时间\r
+        uint8_t bedTimeMin = 0;//就寝时间\r
+        uint8_t wakeTimeHour = 0;//起床时间\r
+        uint8_t wakeTimeMin = 0;//起床时间\r
+        uint8_t bedTimeOn = 0;//就寝前20分钟提醒时间\r
+        value[17] = sleepTime;\r
+        value[18] = bedTimeHour;\r
+        value[19] = bedTimeMin;\r
+        value[20] = wakeTimeHour;\r
+        value[21] = wakeTimeMin;\r
+        value[22] = bedTimeOn;\r
+        value[23] = Calculate_CRC(value,23);\r
+        sendBleData(value,24);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+//app获取所有表盘UID\r
+static void GetAllDialUidCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[24];\r
+    memset(value,0,24);\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x2a;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t sleepTime = 0;//作息时间设定 0关闭 1开启\r
+        uint8_t bedTimeHour = 0;//就寝时间\r
+        uint8_t bedTimeMin = 0;//就寝时间\r
+        uint8_t wakeTimeHour = 0;//起床时间\r
+        uint8_t wakeTimeMin = 0;//起床时间\r
+        uint8_t bedTimeOn = 0;//就寝前20分钟提醒时间\r
+        value[17] = sleepTime;\r
+        value[18] = bedTimeHour;\r
+        value[19] = bedTimeMin;\r
+        value[20] = wakeTimeHour;\r
+        value[21] = wakeTimeMin;\r
+        value[22] = bedTimeOn;\r
+        value[23] = Calculate_CRC(value,23);\r
+        sendBleData(value,24);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//app获取目标步数设置\r
+static void GetTargetStepCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[25];\r
+    memset(value,0,25);\r
+    uint32_t tmp = 1;\r
+    uint32_t datalen = 7;\r
+    uint16_t tmp_data = 7;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x2b;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&datalen,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint32_t targetStep = 10000;//目标步数 4字节\r
+        uint8_t ringOn = 0;//铃声提醒\r
+        uint8_t vibration = 0;//振动提醒\r
+        uint8_t notify = 0;//通知提醒\r
+        memcpy(&value[17],&targetStep,4);//目标步数\r
+        value[21] = ringOn;//铃声提醒\r
+        value[22] = vibration;//振动提醒\r
+        value[23] = notify;//通知提醒\r
+        value[24] = Calculate_CRC(value,24);\r
+        sendBleData(value,25);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+//app其他目标设置\r
+static void GetTargetOtherCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[26];\r
+    memset(value,0,26);\r
+    uint32_t tmp = 1;\r
+    uint32_t datalen = 8;\r
+    uint16_t tmp_data = 8;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x2c;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&datalen,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint16_t targetKcal = 4556;//目标卡路里\r
+        uint8_t targetKm = 0;//目标里程\r
+        uint8_t targetstand = 0;//目标站立\r
+        uint8_t targetfat = 0;//目标燃脂时间\r
+        uint8_t ringTime = 0;//铃声提醒\r
+        uint8_t vibration = 0;//振动提醒\r
+        uint8_t notify = 0;//通知提醒\r
+        memcpy(&value[17],&targetKcal,2);//目标卡路里\r
+        value[19] = targetKm;//\r
+        value[20] = targetstand;//\r
+        value[21] = targetfat;//\r
+        value[22] = ringTime;//\r
+        value[23] = vibration;//\r
+        value[24] = notify;//通知提醒\r
+        value[25] = Calculate_CRC(value,25);\r
+        sendBleData(value,26);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+//app发送解除配对消息\r
+static void UnpairMessCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint32_t datalen = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x2d;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&datalen,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        \r
+        value[17] = 1;//\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//app发送同步数据结束消息\r
+static void GetSynDataEndCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[19];\r
+    memset(value,0,19);\r
+    uint32_t tmp = 1;\r
+    uint32_t datalen = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x2e;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&datalen,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        value[17] = 1;//\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//同步历史步数\r
+static void stepDataCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[58];\r
+    memset(value,0,58);\r
+    uint32_t tmp = 1;\r
+    uint32_t tmpToall = 40;\r
+    uint16_t tmp_data = 40;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x43;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmpToall,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t data_buf[40]; //\r
+        uint8_t data_len = 0;\r
+        uint32_t time = 1704090976;\r
+        uint32_t step = 0;\r
+        uint64_t timeMs = 0;\r
+        int ret = uapi_get_timestampe_ms(&timeMs);\r
+        if(ret==0){\r
+            timeMs = timeMs/1000;\r
+            time = timeMs;\r
+        }\r
+        for(uint16_t i = 0;i<5;i++)\r
+        {\r
+            time = time+i*3600;\r
+            memcpy(data_buf+data_len,&time,4);\r
+            data_len=data_len+4;\r
+            step = i*100;\r
+            memcpy(data_buf+data_len,&step,4);//1 3 5 7 9 \r
+            data_len = data_len+4;\r
+            \r
+        }\r
+        memcpy(&value[17],data_buf,40);\r
+        // value[17] = 1;// \r
+        value[17+40] = Calculate_CRC(value,57);\r
+        sendBleData(value,58);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//同步卡路里历史数据\r
+static void kcalDataCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[58];\r
+    memset(value,0,58);\r
+    uint32_t tmp = 1;\r
+    uint32_t tmpToall = 40;\r
+    uint16_t tmp_data = 40;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x46;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmpToall,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t data_buf[40]; //\r
+        uint8_t data_len = 4;\r
+        for(uint16_t i = 0;i<10;i++)\r
+        {\r
+            if( i % 2 == 0){\r
+                uint32_t time = 1710484844+i*3600;\r
+                memcpy(&data_buf[4*i],&time,data_len); //0 2 4 6 8\r
+            }else{\r
+                float kcal = 189+i*20;\r
+                memcpy(&data_buf[4*i],&kcal,data_len);//1 3 5 7 9 \r
+            }\r
+            \r
+        }\r
+        memcpy(&value[17],data_buf,40);\r
+        // value[17] = 1;// \r
+        value[17+40] = Calculate_CRC(value,57);\r
+        sendBleData(value,58);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//同步距离历史数据\r
+static void disDataCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[58];\r
+    memset(value,0,58);\r
+    uint32_t tmp = 1;\r
+    uint32_t tmpToall = 40;\r
+    uint16_t tmp_data = 40;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x47;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmpToall,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t data_buf[40]; //\r
+        uint8_t data_len = 4;\r
+        for(uint16_t i = 0;i<10;i++)\r
+        {\r
+            if( i % 2 == 0){\r
+                uint32_t time = 1710484844+i*3600;\r
+                memcpy(&data_buf[4*i],&time,data_len); //0 2 4 6 8\r
+            }else{\r
+                float kcal = 189+i*20;\r
+                memcpy(&data_buf[4*i],&kcal,data_len);//1 3 5 7 9 \r
+            }\r
+            \r
+        }\r
+        memcpy(&value[17],data_buf,40);\r
+        // value[17] = 1;// \r
+        value[17+40] = Calculate_CRC(value,57);\r
+        sendBleData(value,58);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//同步基础训练历史数据 training history data\r
+static void trainiHistoryDataCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    \r
+    cJSON *dataJSON = cJSON_CreateObject();\r
+    cJSON* data_arryJSON = cJSON_CreateArray();\r
+    \r
+    for(uint8_t i =0;i<2;i++)\r
+    {\r
+        cJSON* itemJSON = cJSON_CreateObject();\r
+        \r
+        cJSON_AddNumberToObject(itemJSON,"src",i);\r
+        cJSON_AddNumberToObject(itemJSON,"ty",2+20*i);\r
+        cJSON_AddNumberToObject(itemJSON,"st",30+i*0);\r
+        cJSON_AddNumberToObject(itemJSON,"sp",1);\r
+        cJSON_AddNumberToObject(itemJSON,"tgt",1);\r
+        cJSON_AddNumberToObject(itemJSON,"tg",1);\r
+        cJSON_AddNumberToObject(itemJSON,"pg",1);\r
+        cJSON_AddNumberToObject(itemJSON,"du",1);\r
+        cJSON_AddNumberToObject(itemJSON,"ca",1);\r
+        cJSON_AddNumberToObject(itemJSON,"di",1);\r
+        cJSON_AddNumberToObject(itemJSON,"hr",1);\r
+        cJSON_AddNumberToObject(itemJSON,"stp",1);\r
+        cJSON_AddItemReferenceToArray(data_arryJSON,itemJSON);\r
+    }\r
+    cJSON_AddItemToObject(dataJSON,"recs",data_arryJSON);\r
+\r
+    char *json_format = cJSON_PrintUnformatted(dataJSON);\r
+    int pSize = cJSON_GetArraySize(dataJSON);\r
+\r
+       printf("%d pSize:%d\n",strlen(json_format),pSize);\r
+    cJSON_Delete(dataJSON);\r
+    printf("%s\n",json_format);\r
+    uint32_t data_len = strlen(json_format);\r
+\r
+    uint8_t value[18+data_len];\r
+    memset(value,0,18+data_len);\r
+    uint32_t tmp = 1;\r
+    uint32_t tmpToall = 40;\r
+    uint16_t tmp_data = 40;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x49;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmpToall,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        \r
+        memcpy(value+17,json_format,data_len);\r
+        // value[17] = 1;// \r
+        value[17+data_len] = Calculate_CRC(value,data_len+17);\r
+        sendBleData(value,data_len+17+1);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//同步睡眠数据\r
+static void sleepDataCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[18+1];\r
+    memset(value,0,18+1);\r
+    uint32_t tmp = 1;\r
+    uint32_t tmpToall = 0;\r
+    uint16_t tmp_data = 0;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x4b;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmpToall,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        value[17] = 0;\r
+        value[18] = 0xff;\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//同步数据结束完成\r
+static void synEndDataCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[18+1];\r
+    memset(value,0,18+1);\r
+    uint32_t tmp = 1;\r
+    uint32_t tmpToall = 0;\r
+    uint16_t tmp_data = 0;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x2e;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmpToall,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        value[17] = 1;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//同步站立历史数据\r
+static void standDataCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[58];\r
+    memset(value,0,58);\r
+    uint32_t tmp = 1;\r
+    uint32_t tmpToall = 40;\r
+    uint16_t tmp_data = 40;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x45;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmpToall,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t data_buf[40]; //\r
+        uint8_t data_len = 4;\r
+        for(uint16_t i = 0;i<10;i++)\r
+        {\r
+            if( i % 2 == 0){\r
+                uint32_t time = 1710484844+i*3600;\r
+                memcpy(&data_buf[4*i],&time,data_len); //0 2 4 6 8\r
+            }else{\r
+                float kcal = 189+i*20;\r
+                memcpy(&data_buf[4*i],&kcal,data_len);//1 3 5 7 9 \r
+            }\r
+            \r
+        }\r
+        memcpy(&value[17],data_buf,40);\r
+        // value[17] = 1;// \r
+        value[17+40] = Calculate_CRC(value,57);\r
+        sendBleData(value,58);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+//同步燃脂时间数据\r
+static void burntimeDataCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[48];\r
+    memset(value,0,48);\r
+    uint32_t tmp = 1;\r
+    uint32_t tmpToall = 30;\r
+    uint16_t tmp_data = 30;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x44;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmpToall,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint8_t data_buf[30]; //\r
+        uint32_t data_len = 0;\r
+        for(uint16_t i = 0;i<5;i++)\r
+        {\r
+            uint32_t time = 1710484844+i*3600;\r
+            uint16_t fatTime = 189+i*20;//1 \r
+            memcpy(value+17+data_len,&time,4);\r
+            data_len=data_len+4;//4 6\r
+            memcpy(value+17+data_len,&fatTime,2);//1 3 5 7 9\r
+            data_len=data_len+2;//6 \r
+        }\r
+        printf("data_len:%d",data_len);\r
+        // memcpy(&value[17],data_buf,30);\r
+        // value[17] = 1;// \r
+        value[17+data_len] = Calculate_CRC(value,data_len+17);\r
+        sendBleData(value,data_len+17+1);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+//同步心率历史数据\r
+static void heartDataCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[43];\r
+    memset(value,0,43);\r
+    uint32_t tmp = 1;\r
+    uint32_t tmpToall = 25;\r
+    uint16_t tmp_data = 25;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x40;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmpToall,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint32_t data_len = 0;\r
+        for(uint16_t i = 0;i<5;i++)\r
+        {\r
+            uint32_t time = 1710484844+i*3600;\r
+            uint8_t hr = 70+i*5;//1 \r
+            memcpy(value+17+data_len,&time,4);\r
+            data_len=data_len+4;//4 6\r
+            memcpy(value+17+data_len,&hr,1);//1 3 5 7 9\r
+            data_len=data_len+1;//6 \r
+        }\r
+        printf("data_len:%d",data_len);\r
+        // memcpy(&value[17],data_buf,30);\r
+        // value[17] = 1;// \r
+        value[17+data_len] = Calculate_CRC(value,data_len+17);\r
+        sendBleData(value,data_len+17+1);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+//同步血氧历史数据\r
+static void spo2DataCmd(uint8_t *crcnum,uint16_t len)\r
+{\r
+    uint8_t value[43];\r
+    memset(value,0,43);\r
+    uint32_t tmp = 1;\r
+    uint32_t tmpToall = 25;\r
+    uint16_t tmp_data = 25;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x41;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmpToall,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    if(Check_CRC(crcnum,len))\r
+    {\r
+        uint32_t data_len = 0;\r
+        for(uint16_t i = 0;i<5;i++)\r
+        {\r
+            uint32_t time = 1710484844+i*3600;\r
+            uint8_t spo2 = 90+i;//1 \r
+            memcpy(value+17+data_len,&time,4);\r
+            data_len=data_len+4;//4 6\r
+            memcpy(value+17+data_len,&spo2,1);//1 3 5 7 9\r
+            data_len=data_len+1;//6 \r
+        }\r
+        value[17+data_len] = Calculate_CRC(value,data_len+17);\r
+        sendBleData(value,data_len+17+1);\r
+    }else\r
+    {\r
+        value[17] = 0;\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+\r
+//05 类型\r
+void typeHexFiveData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen)\r
+{\r
+    uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];\r
+    switch (typeID) //ID\r
+    {\r
+        case FIND_PHONE_CMD://获取用户信息\r
+            // (data,datalen);\r
+            break;\r
+        case GET_CURR_TIME_CMD://手机下发的手机信息\r
+            // getPhoneInfo(data,datalen);\r
+            break;\r
+        case SEND_PARI_SUCESS_CMD:\r
+            // GetUTCtime(data,datalen);//获取时间app下发的时间进行解析\r
+            break;\r
+        case GET_TRANS_END_CMD:\r
+            // getPhoneInfo_test();\r
+            break;\r
+        case SEND_FACTORY_RECORD_CMD:\r
+            break;\r
+        case REQUEST_EPO_FILE_CMD:\r
+            break;\r
+        case SEND_TRAIN_STATUS_CMD:\r
+            break;\r
+        default:\r
+            break;\r
+    }\r
+}\r
+\r
+\r
+#define STEP_DATA_LEN 8\r
+#define KCAL_DATA_LEN 8\r
+#define DIS_DATA_LEN 8\r
+#define STAND_DATA_LEN 8\r
+#define FATTIME_DATA_LEN 6\r
+#define HEART_DATA_LEN 5\r
+#define SPO2_DATA_LEN 5\r
+uint8_t bleSendTypeID=0;      //发送的数据类型\r
+//发送读出来的设备数据to APP\r
+uint16_t max_mtu_szie_data_len = 200;\r
+\r
+void sendReadData(void)\r
+{\r
+    static uint8_t packCount = 0;\r
+    uint8_t buf[517];\r
+    memset(buf,0,517);\r
+    uint32_t dataLen = 0;\r
+    uint32_t sendDataLen = 0;\r
+    uint32_t totalLen = 0;\r
+    dataLen = 640; \r
+    uint32_t dataPack = 1;\r
+    uint16_t dataPackLen = 640;\r
+    uint32_t time = 0;\r
+    uint32_t step = 0;\r
+    packCount = 0;\r
+    \r
+    uint16_t startDataLen = 17;\r
+    uint8_t crc = 0x00;\r
+    uint8_t crcvalue = 0x00;\r
+    uint16_t totalEnd = 0;\r
+    buf[0] = 0x72;\r
+    buf[1] = 0x01;\r
+    buf[2] = bleSendTypeID;\r
+    memcpy(buf+3,&dataPack,4);\r
+    memcpy(buf+7,&dataLen,4);\r
+    memcpy(buf+11,&dataPack,4);\r
+    memcpy(buf+15,&dataPackLen,2);\r
+    if(dataLen > ble_nus_max_data_len)//300-192=108 \r
+    {\r
+        startDataLen = 19;\r
+    }\r
+    while (1)\r
+    {\r
+        time = 1710833119+3600*packCount;\r
+        memcpy(buf+startDataLen,&time,4);//21 \r
+        startDataLen=startDataLen+4;\r
+        step = 1000+packCount*1000;\r
+        memcpy(buf+startDataLen,&step,4);//25  \r
+        startDataLen=startDataLen+4;//时间 步数 时间 步数 时间 步数 每八个字节一个数据\r
+        \r
+        //498\r
+        // printf("startDataLen:%d totalEnd:%d ble_nus_max_data_len %d\r\n",startDataLen,totalEnd,ble_nus_max_data_len);\r
+        if( startDataLen+STEP_DATA_LEN > ble_nus_max_data_len-3){\r
+            // printf("startDataLen111111111111:%d totalEnd:%d crcvalue:%d\r\n",startDataLen,totalEnd,crcvalue);\r
+            totalEnd = totalEnd+startDataLen;//240 300-240 \r
+\r
+            \r
+            // printf("startDataLen22222222222:%d totalEnd:%d crcvalue:%x\r\n",startDataLen,totalEnd,crcvalue);\r
+            if((totalEnd-17) >= dataLen && totalEnd > 17)\r
+            {\r
+                if(packCount == 0)\r
+                {\r
+                    memcpy(buf+15,&startDataLen,2);\r
+                    crcvalue = Calculate_CRC(buf,startDataLen);//17+数据+校验和\r
+                    printf("end crcvalue1:%x\r\n",crcvalue);\r
+                    buf[startDataLen] = crcvalue;\r
+                    sendDataNow(buf,startDataLen+1);\r
+                    packCount = 0;\r
+                }else{//17+MTU-17-校验和+数据+校验和\r
+                    memcpy(buf+15,&startDataLen,2);\r
+                    crcvalue = Calculate_CRC_Big(buf+18,startDataLen+18);\r
+                    uint16_t pack_data = max_mtu_szie_data_len-17-crcvalue;\r
+                    memcpy(&buf[17],&pack_data,2);\r
+                    printf("end crcvalue2:%x\r\n",crcvalue);\r
+                    buf[startDataLen] = crcvalue;\r
+                    sendDataNow(buf,startDataLen+1);\r
+                    packCount = 0;\r
+                }\r
+                break;\r
+            }else{\r
+                memcpy(buf+15,&startDataLen,2);\r
+                crcvalue = Calculate_CRC_Big(buf+18,startDataLen+18);\r
+                uint16_t pack_data = max_mtu_szie_data_len-17-crcvalue;\r
+                memcpy(&buf[17],&pack_data,2);\r
+                printf("end crcvalue3:%x\r\n",crcvalue);\r
+                buf[startDataLen] = crcvalue;//\r
+                sendDataNow(buf,startDataLen+1);\r
+                packCount+=1;\r
+                if(dataLen - totalEnd > ble_nus_max_data_len)//总的减去已发送的数据,如果还是大于最大mtu的大小还是还是按照分包来计算\r
+                {\r
+                    startDataLen = 19;\r
+                }\r
+                else{\r
+                    startDataLen = 17;\r
+                }\r
+            }\r
+            // printf("startDataLen2222222222:%d totalEnd:%d\r\n",startDataLen,totalEnd);\r
+        }\r
+        else{\r
+            if(packCount > 0)\r
+            {\r
+                totalEnd = totalEnd+STEP_DATA_LEN;//第二包开始只加每个数据类型的总的字节数据大小 比如步数 数据类型 时间 步数 总共是8个就加8\r
+                // printf("pack1 startDataLen22222222222:%d totalEnd:%d crcvalue:%x\r\n",startDataLen,totalEnd,crcvalue);\r
+                if((totalEnd-17) >= dataLen && totalEnd > 17)\r
+                {\r
+                    memcpy(buf+15,&startDataLen,2);\r
+                    crcvalue = Calculate_CRC(buf,startDataLen+1);\r
+                    buf[startDataLen] = crcvalue;\r
+                    sendDataNow(buf,startDataLen+1);\r
+                    startDataLen = 0;\r
+                    packCount = 0;\r
+                    break;\r
+                }\r
+            }else{\r
+                if(dataPackLen < max_mtu_szie_data_len) //只有总的包数小于最大的mtu的大小\r
+                {\r
+                    totalEnd = startDataLen-17;//不包含前17个字节的数据,前17个不是数据类型\r
+                    // printf("pack0 startDataLen22222222222:%d totalEnd:%d crcvalue:%x\r\n",startDataLen,totalEnd,crcvalue);\r
+                    if(totalEnd >= dataLen && totalEnd > 0)\r
+                    {\r
+                        memcpy(buf+15,&startDataLen,2);\r
+                        crcvalue = Calculate_CRC(buf,startDataLen);\r
+                        printf("total end crcvalue2:%x\r\n",crcvalue);\r
+                        buf[startDataLen] = crcvalue;//校验和的值 最后一个校验和也要发给app\r
+                        sendDataNow(buf,startDataLen+1);\r
+                        startDataLen = 17;\r
+                        packCount = 0;\r
+                        break;\r
+                    }\r
+                }\r
+            }\r
+        }\r
+    }\r
+}\r
+//手机app下发读设备数据指令\r
+void readDevDataBle(uint8_t *crcnum,uint16_t len)\r
+{\r
+    if(Check_CRC(crcnum+17,len-17))\r
+    {\r
+        bleSendTypeID=crcnum[2];\r
+\r
+        sendReadData();\r
+        // switch (crcnum[2])\r
+        // {\r
+        //     case 0x40://同步心率历史数据\r
+        //         heartDataCmd(crcnum,len);\r
+        //         break;\r
+        //     case 0x41://同步血氧历史数据\r
+        //         spo2DataCmd(crcnum,len);\r
+        //         break;\r
+        //     case 0x43: //同步步数历史数据\r
+        //         stepDataCmd(crcnum,len);\r
+        //         break;\r
+        //     case 0x44://同步燃脂时间数据\r
+        //         burntimeDataCmd(crcnum,len);\r
+        //         break;\r
+        //     case 0x45://同步站立历史数据\r
+        //         standDataCmd(crcnum,len);\r
+        //         break;\r
+        //     case 0x46://同步卡路里历史数据\r
+        //         kcalDataCmd(crcnum,len);\r
+        //         break;\r
+        //     case 0x47://同步距离历史数据\r
+        //         disDataCmd(crcnum,len);\r
+        //         break;\r
+        //     case 0x49://同步基础训练历史数据\r
+        //         trainiHistoryDataCmd(crcnum,len);\r
+        //         break;\r
+        //     case 0x4b://睡眠历史数据\r
+        //         sleepDataCmd(crcnum,len);\r
+        //         break;\r
+        //     default:\r
+        //         break;\r
+        // }\r
+        \r
+\r
+    }else{\r
+        crcnum[0] = 0x72;\r
+        crcnum[len-1] = 0;\r
+        crcnum[len] = 0;\r
+        sendBleData(crcnum,len);\r
+    }\r
+}\r
+\r
+\r
+//01类型\r
+void typeHexOneData(uint8_t *buf,uint16_t len,uint8_t *cmd_buf,uint8_t *totaldata)\r
+{\r
+    uint16_t typeID = cmd_buf[1]*256+cmd_buf[2];\r
+    printf("typeHexOneData:0x%x\r\n",typeID);\r
+    // uint8_t typeID = cmd_buf[2];\r
+    switch (typeID)\r
+    {\r
+        case SEND_UPPAIR_CMD://清除配对指令\r
+            clearPaireCmd(buf,len);\r
+            break;\r
+        case SWITCH_DIAL_CMD://表盘切换\r
+            switchDialCmd(buf,len);\r
+            break;\r
+        case ABOUT_DEV_CMD://关于本机内容\r
+            aboutDeviceCmd(buf,len);\r
+            break;\r
+        case FIND_WATCH_CMD://查找手表\r
+            findWatchCmd(buf,len);\r
+            break;\r
+        case GET_SD_SPACE_CMD://获取sdk的剩余空间\r
+            GetSDSpaceCmd(buf,len);\r
+            break;\r
+        case GET_CURR_DATA_CMD://获取当前数据 卡路里 \r
+            GetCurDataCmd(buf,len);\r
+            break;\r
+        case GET_BATTERY_LEVEL_CMD://获取手表电池电量 \r
+            GetBatteryLevelCmd(buf,len);\r
+            break;\r
+        case SWITCH_MESS_CMD://开关消息推送功能 \r
+            GetSwitchMessCmd(buf,len);\r
+            break;\r
+        case REVOKE_CURR_FILE_TRANS_CMD://撤销文件传输\r
+            RemoveFileCmd(buf,len);\r
+            break;\r
+        case GET_SPECIF_TYPE_FILE_CMD://获取指定类型文件目录 \r
+            RemoveFileCmd(buf,len);\r
+            break;\r
+        case DELETE_SPECIF_TYPE_FILE_CMD://删除指定类型的所有文件\r
+            DeleteFileTypeCmd(buf,len);\r
+            break;\r
+        case SWITCH_SPORT_MODE_CMD://开启指定运动模式\r
+            OpenSportModeCmd(buf,len);\r
+            break;\r
+        case STOP_SPORT_MODE_CMD://结束运动模式\r
+            StopSportModeCmd(buf,len);\r
+            break;\r
+        case SET_LANGUGAE_CMD://设置语言\r
+            SetLanguageCmd(buf,len);\r
+            break;\r
+        case GET_REAL_HEART_CMD://获取实时训练数据\r
+            GetRealTimeDataCmd(buf,len);\r
+            break;\r
+        case SWITCH_GET_REAL_HEART_CMD://开启/关闭自动获取实时训练数据\r
+            SetRealTimeDataCmd(buf,len);\r
+            break;\r
+        case SET_REAL_DATA_FREQ_CMD://设置训练实时数据采集频率\r
+            SetRTDataFreCmd(buf,len);\r
+            break;\r
+\r
+        case SET_MAX_HR_REMID_CMD://设置最高心疼提醒 255关闭\r
+            SetMaxHrRemindCmd(buf,len);\r
+            break;\r
+        case SPORT_PAUSE_RESET_CMD://训练暂停/恢复\r
+            GetSportPasueResetCmd(buf,len);\r
+            break;\r
+        case SEND_CURR_DIAL_TOAPP_CMD://发送当前表盘\r
+            SendDialToAppCmd(buf,len);\r
+            break;\r
+        case SEND_CURR_STATUS_CMD: //获取手表当前状态\r
+            GetWatchStatusCmd(buf,len);\r
+            break;\r
+        case GET_WATCH_LCD_PARAM_CMD: //获取手表屏幕参数\r
+            GetScreenParamCmd(buf,len);\r
+            break;\r
+        case DELETE_DIAL_CMD://删除表盘UID\r
+            DeleteDialUidCmd(buf,len);\r
+            break;\r
+        case GET_WATCH_VOICE_VIBRATE_CMD://获取手表声音与振动参数\r
+            GetSoundVibrationCmd(buf,len);\r
+            break;\r
+        case GET_WATCH_AUXIL_FUN_PARAM_CMD://获取手表辅助功能参数                                                                                                     \r
+            GetWatchAuxFuncCmd(buf,len);\r
+            break;\r
+        case GET_WATCH_HR_SET_PARAM_CMD://获取手表心率设置\r
+            GetHrSetParamCmd(buf,len);\r
+            break;\r
+        case GET_WATCH_SPO2_SET_PARAM_CMD://获取手表血氧设置\r
+            GetSpo2SetParamCmd(buf,len);\r
+            break;\r
+        case GET_GESTURE_CARMERA_CMD://获取手势拍照\r
+            carmeraCmd(buf,len);\r
+            break;\r
+        case GET_DRINK_SWITCH_CMD://获取喝水提醒设置\r
+            GetDrinkParamCmd(buf,len);\r
+            break;\r
+        case FACTORY_SET_CMD://app发送恢复出厂设置\r
+            GetFactoryCmd(buf,len);\r
+            break;\r
+        case RESET_WATCH_CMD://app发送重启指令\r
+            GetResetCmd(buf,len);\r
+            break;\r
+        case POWER_OFF_CMD://app发送关机\r
+            GetPowerOffCmd(buf,len);\r
+            break;\r
+        case KM_MILE_CMD://app设置手表公英制单位\r
+            GetMetricCmd(buf,len);\r
+            break;\r
+        case SLEEP_SET_CMD://app获取睡眠设置\r
+            GetSleepParamCmd(buf,len);\r
+            break;\r
+        case DELETE_ALL_DILA_CMD://app所有表盘UID\r
+            GetAllDialUidCmd(buf,len);\r
+            break;\r
+        case GET_TARGET_STEP_CMD://app获取目标步数设置\r
+            GetTargetStepCmd(buf,len);\r
+            break;\r
+        case GET_OTHER_TARGET_CMD://app获取其他目标\r
+            GetTargetOtherCmd(buf,len);\r
+            break;\r
+        case GET_UNPAIR_CMD://发送解除配对消息\r
+            UnpairMessCmd(buf,len);\r
+            break;\r
+        case SYN_DATA_END_CMD: //app发送同步数据结束消息\r
+            GetSynDataEndCmd(buf,len);\r
+            break;\r
+        case SYN_HEART_HISTORY_DATA_CMD://同步心率历史数据\r
+        case SYN_SPO2_HISTORY_DATA_CMD://同步血氧历史数据\r
+        case SYN_STEP_HISTORY_DATA_CMD: //同步步数历史数据\r
+        case SYN_FAT_BURN_HISTORY_DATA_CMD://同步燃脂时间数据\r
+        case SYN_STAND_HISTORY_DATA_CMD://同步站立历史数据\r
+        case SYN_KCAL_HISTORY_DATA_CMD://同步卡路里历史数据\r
+        case SYN_DIS_HISTORY_DATA_CMD://同步距离历史数据\r
+        case SYN_BASIC_TRANIN_HISTORY_DATA_CMD://同步基础训练历史数据\r
+        case SYN_SLEEP_HISTORY_DATA_CMD://睡眠历史数据\r
+            readDevDataBle(totaldata,len+17);\r
+            break;\r
+        \r
+        default:\r
+            break;\r
+    }\r
+}\r
+void getPhoneInfo_test(void)\r
+{\r
+    /*\r
+    cJSON *dataJSON = cJSON_CreateObject();\r
+    cJSON* data_arryJSON = cJSON_CreateArray();\r
+    cJSON_AddNumberToObject(dataJSON,"code",1);\r
+    \r
+    for(uint8_t i =0;i<3;i++)\r
+    {\r
+        cJSON* itemJSON = cJSON_CreateObject();\r
+        cJSON* arrayJSON = cJSON_CreateArray();\r
+        for(uint8_t id = 0;id<7;id++)\r
+        {\r
+            cJSON_AddNumberToObject(arrayJSON,"id",id);\r
+        }\r
+        \r
+        cJSON_AddNumberToObject(itemJSON,"id",i);\r
+        cJSON_AddItemToObject(itemJSON,"repeat",arrayJSON);\r
+        cJSON_AddNumberToObject(itemJSON,"hour",2+20*i);\r
+        cJSON_AddNumberToObject(itemJSON,"minute",30+i*0);\r
+        cJSON_AddNumberToObject(itemJSON,"enable",1);\r
+        cJSON_AddItemReferenceToArray(data_arryJSON,itemJSON);\r
+    }\r
+    cJSON_AddItemToObject(dataJSON,"alarm",data_arryJSON);\r
+\r
+    char *json_format = cJSON_PrintUnformatted(dataJSON);\r
+       printf("%d\n",strlen(json_format));\r
+    cJSON_Delete(dataJSON);\r
+    printf("%s\n",json_format);\r
+    uint32_t data_len = strlen(json_format);\r
+    uint8_t value[data_len+18];\r
+    uint32_t tmp = 1;\r
+    uint16_t tmp_data = 1;\r
+    value[0] = 0x72;\r
+    value[1] = 0x01;\r
+    value[2] = 0x01;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_data,2);\r
+    memcpy(value+17,(uint8_t *)json_format,data_len);\r
+    unsigned char  lrc = Calculate_CRC(value,data_len+17);\r
+    printf("lrc:%d",lrc);\r
+    value[data_len+18] = lrc;\r
+    sendBleData(value,data_len+18);\r
+    */\r
+\r
+    // uint8_t value[128];\r
+    // memset(value,0,128);\r
+    \r
+    // value[0] = 0x72;\r
+    // value[1] = 0x01;\r
+    // value[2] = 0x0f;\r
+    // char buf[128];\r
+    // memset(buf,0,128);\r
+    // getSportData(&buf);\r
+    // uint32_t tmp = 1;\r
+    // uint32_t datalen = 1;\r
+    // uint16_t tmp_data = 1;\r
+    // datalen = strlen(buf);\r
+    // tmp_data = datalen;\r
+    // memcpy(value+3,&tmp,4);\r
+    // memcpy(value+7,&datalen,4);\r
+    // memcpy(value+11,&tmp,4);\r
+    // memcpy(value+15,&tmp_data,2);\r
+    // memcpy(&value[17],buf,strlen(buf));\r
+\r
+    uint8_t buf[40] = {0x7b,0x22 ,0x70 ,0x6e ,0x22 ,0x3a ,0x22 ,0x46 ,0x72 ,0x61 ,0x6e ,0x6b ,0xe7 ,0x9a ,0x84 ,0x69 ,0x50 ,0x68 ,0x6f ,0x6e ,0x65 ,0x22 ,0x2c ,0x22 ,0x74 ,0x70 ,0x22 ,0x3a ,0x31 ,0x2c ,0x22 ,0x6d ,0x61 ,0x63 ,0x22 ,0x3a ,0x20 ,0x5b ,0x5d ,0x7d};\r
+    uint8_t lrc = Calculate_CRC(buf,40);\r
+    printf("lrc 0x%x",lrc);\r
+    // value[strlen(buf)+17] = Calculate_CRC(value,17+strlen(buf));\r
+    sendBleData(buf,40);\r
+\r
+}\r
+\r
+//长数据解析\r
+void bleLongRecvData(uint8_t *data, uint32_t data_size,uint8_t *buf_cmd)//buf_cmd 指令前17个字节数据\r
+{\r
+    uint8_t type=buf_cmd[1];\r
+    printf("type:%d %d data_size:%d data:%d",buf_cmd[0],type,data_size,data[0]);\r
+    switch(buf_cmd[0])\r
+    {\r
+        case 0x73://传输方向 0x73是app下发的 \r
+            switch (type)\r
+            {\r
+                case 0x02://获取手机信息\r
+                    typeHexTwoData(buf_cmd,data,data_size);\r
+                    break;\r
+                default:\r
+                    break;\r
+            }\r
+            break;\r
+    }\r
+}\r
+uint8_t cmd_data[17];\r
+uint8_t *bigDataBuf = NULL;//大数据buf\r
+uint8_t bigDataBufLen=0;\r
+bool sendbigDataBufState = false;//发送大数据表示不要被其他指令打断\r
+bool recvBigDataBufState = false;//接收大数据标志\r
+static bool muiltFlag = 0;//多包数据flag\r
+static uint16_t data_len = 0;\r
+void longDataRecv(uint8_t *buf, uint16_t event_size,uint16_t handle)\r
+{\r
+    if(sendbigDataBufState == true)\r
+    {\r
+        return;\r
+    }\r
+    \r
+    uint8_t data[514];\r
+    static uint8_t totalpack = 0;\r
+    static uint32_t totalDataLen = 0;\r
+    if(shortCmdChara == handle)//短指令\r
+    {\r
+        if(recvBigDataBufState == true)//在接收大数据时未接收完成时,不能被其他指令打断\r
+        {\r
+            return;\r
+        }\r
+        if(event_size > 17)\r
+        {\r
+            memset(cmd_data,0,17);\r
+            memcpy(cmd_data,buf,17);\r
+            uint8_t type=cmd_data[1];\r
+            \r
+\r
+            printf("short:%d type_id:%x %d %d %d\r\n",shortCmdChara,cmd_data[1],cmd_data[2]);\r
+            switch(buf[0])\r
+            {\r
+                case 0x73://传输方向 0x73是app下发的 \r
+                    switch (type)\r
+                    {\r
+                    case 0x01:\r
+                        typeHexOneData(buf+17,event_size-17,cmd_data,buf);\r
+                        break;\r
+                    default:\r
+                        break;\r
+                    }\r
+                break;\r
+            }\r
+        }\r
+    }else if(longCmdChara == handle)\r
+    {\r
+        while (1)\r
+        {\r
+            printf("longData!!!! muiltFlag%d event_size:%d\r\n",muiltFlag,event_size);\r
+            if(muiltFlag == 0)\r
+            {\r
+                //每包的数据长度 如果当前报数的数据小于总的数据包数时认为就发送完成,没有就还有继续接收\r
+                // data_len = data_len+event_size-18;//  减掉18个数据 0+517 730总的数据长度 517还是小于730 说明还有数据没有接收完成 继续接收\r
+                if(event_size >= 20)\r
+                {\r
+                    data_len = event_size-17;//第一包的数据大小 第二包不走这里\r
+                    memcpy(&totalDataLen,buf+7,4);//总的数据大小\r
+                    printf("totalDataLen;%d data_len:%d",totalDataLen,data_len);\r
+                    if(totalDataLen > data_len)//如果总的数据长度大于每次增加后的\r
+                    {\r
+                        printf("muilt totalDataLen;%d data_len:%d",totalDataLen,data_len);\r
+                        bigDataBuf = malloc(totalDataLen);\r
+                        if(bigDataBuf == NULL)return;\r
+                        muiltFlag = 1;//表示有两包以上的数据\r
+                        memcpy(bigDataBuf,buf+17,data_len);//从第十七个字节开始接收数据data\r
+                        memset(cmd_data,0,17);\r
+                        memcpy(cmd_data,buf,17);\r
+                        totalpack=1;\r
+                        break;\r
+                    }else{//直接发送数据解析\r
+                        printf("muilt totalDataLen11;%d data_len:%d",totalDataLen,data_len);\r
+                        muiltFlag = 0; \r
+                        data_len = event_size-17;\r
+                        memset(cmd_data,0,17);\r
+                        memcpy(cmd_data,buf,17);\r
+                        memset(data,0,514);\r
+                        memcpy(data,buf+17,data_len);\r
+                        bleLongRecvData(&data,data_len,&cmd_data);\r
+                        break;\r
+                    }\r
+                }\r
+                break;\r
+                \r
+            }else//这是接收两包以上的数据\r
+            {\r
+                totalpack+=1;//包数\r
+                printf("muilt 122222;%d data_len:%d",totalDataLen,data_len);\r
+                memcpy(bigDataBuf+data_len,buf,event_size); //先copy再加\r
+                data_len = data_len+event_size;\r
+                printf("muilt 133333;%d data_len:%d",totalDataLen,data_len);\r
+                if((totalDataLen+1) >= data_len)//总的数据包大于等于增加之后说明已经接收完成\r
+                {\r
+                    bleLongRecvData(bigDataBuf,data_len,&cmd_data);\r
+                    totalDataLen = 0;\r
+                    data_len = 0;\r
+                    muiltFlag = 0;\r
+                    totalpack = 0; \r
+                    if(bigDataBuf != NULL){\r
+                        free(bigDataBuf);\r
+                    }\r
+                    break;\r
+                }\r
+            }\r
+            if(Bleconnect == false)//断开蓝牙不接收数据\r
+            {\r
+                totalpack = 0;\r
+                muiltFlag = 0; \r
+                data_len = 0;\r
+                totalDataLen = 0;\r
+                if(bigDataBuf != NULL){\r
+                    free(bigDataBuf);\r
+                }\r
+                break;\r
+            }\r
+        }\r
+    }\r
+}\r
+void revBleOldData(uint8_t *buf, uint16_t event_size,uint16_t handle)//每包的数据大小\r
+{\r
+    printf("handle :%d shortCmdChara:%d longCmdChara:%d buf:%d event_size %d\r\n",handle,shortCmdChara,longCmdChara,buf,event_size);\r
+    longDataRecv(buf,event_size,handle);\r
+}\r
diff --git a/code/sdk/application/wearable/service/ble_service/bleEvent.h b/code/sdk/application/wearable/service/ble_service/bleEvent.h
new file mode 100644 (file)
index 0000000..b367c37
--- /dev/null
@@ -0,0 +1,550 @@
+#ifndef _BLE_EVENT_H
+#define _BLE_EVENT_H
+#include <stdint.h>
+#include <stdio.h>
+#include "stdbool.h"
+#include "errcode.h"
+#define REDA_FLASH_DATA 0x01 //读flash数据
+#define WRITE_FLASH_DATA 0x02 //写flash数据
+typedef struct {
+    uint8_t *data;           /* data    */
+    uint16_t data_len;       /* data_len 数据长度        */
+    uint16_t handle;         /* handle   数据句柄        */
+} ble_recv_data_info_t;
+typedef int (*ble_recv_msg_callback_t)(uint8_t writ_read,uint16_t msg_typeID, uint8_t *msg_data, uint16_t msg_datalen);
+uint32_t ble_recv_register_msg_callback(ble_recv_msg_callback_t func);
+ble_recv_msg_callback_t ble_recv_get_send_msg_callback_func(void);
+//write_read 0x01是从手表中读取数据 0x02 是app将数据传给设备 设备保存
+//msy_typeid 是协议指令类型+ID拼接 去bleEvent.h里面或者协议文档查找对应的协议指令 比如 01 02 会拼接成0x0102两个字节的数据
+//msg_data 是数据内容 如果数据没有就传NULL
+//msg_datalen 数据内容长度 
+//返回值 解析数据成功返回 1 解析失败返回 0 
+// 
+int ble_recv_msg_callback(uint8_t writ_read,uint16_t msg_typeID, uint8_t *msg_data, uint16_t msg_datalen);
+/*********************TYPE+ID***********************************
+ * TYPE:01 
+*/
+#define ALARM_CMD 0x0101//闹钟同步指令
+#define SWITCH_DIAL_CMD 0x0102 //切换表盘
+#define ABOUT_DEV_CMD 0x0103 //关于本机内容
+#define FIND_WATCH_CMD 0x0104 //查找手表
+#define GET_SD_SPACE_CMD 0x0105 //获取sd卡剩余空间
+#define GET_CURR_DATA_CMD 0x0106 //获取当前数据(json格式)
+#define GET_BATTERY_LEVEL_CMD 0x0107 //获取手表电池电量
+#define SWITCH_MESS_CMD 0x0108 //开关消息推送功能
+#define SWITCH_MEDIA_CMD 0x0109 //开关多媒体功能(播放手机音乐 通话等)
+#define SWITCH_SPORT_MODE_CMD 0x010A //开关指定运动模式
+#define STOP_SPORT_MODE_CMD 0x010B //结束运动模式
+#define SET_LANGUGAE_CMD 0x010E //设置语言
+#define GET_REAL_HEART_CMD 0x010F //获取实时心率 Get real-time heart rate
+#define SWITCH_GET_REAL_HEART_CMD 0x0111 //开启/关自动获取实时心率
+#define SET_REAL_DATA_FREQ_CMD 0x0114 //设置训练实时数据采样频率
+#define SET_MAX_HR_REMID_CMD 0x0115 //设置最高心率提醒
+#define SPORT_PAUSE_RESET_CMD 0x0116 //训练暂停/恢复
+#define SEND_CURR_DIAL_TOAPP_CMD 0x0117 //发送当前表盘TOapp
+#define SEND_CURR_STATUS_CMD 0x0119 //获取手表当前状态
+#define SEND_UPPAIR_CMD 0x0110 //发送解除配对消息 Unpairing
+#define GET_WATCH_LCD_PARAM_CMD 0x011A //获取手表屏幕参数
+#define DELETE_DIAL_CMD 0x011B //删除表盘
+#define GET_WATCH_VOICE_VIBRATE_CMD 0x011C //获取手表声音和振动参数
+#define GET_WATCH_AUXIL_FUN_PARAM_CMD 0x011D //获取手表辅助功能参数
+#define GET_WATCH_HR_SET_PARAM_CMD 0x011E //获取手表心率设置
+#define GET_WATCH_SPO2_SET_PARAM_CMD 0x011F //获取手表血氧设置
+#define REVOKE_CURR_FILE_TRANS_CMD 0x0120 //撤销当前文件传输Revoke current file transfer
+#define GET_SPECIF_TYPE_FILE_CMD 0x0121 //获取指定类型文件目录Get the specified type file directory
+#define DELETE_SPECIF_TYPE_FILE_CMD 0x0122 //删除指定类型的所有文件
+#define GET_GESTURE_CARMERA_CMD 0x0123 //获取手势拍照
+#define GET_DRINK_SWITCH_CMD 0x0124 //获取喝水提醒开关
+#define FACTORY_SET_CMD 0x0125 //恢复出厂设置
+#define RESET_WATCH_CMD 0x0126 //重新启动
+#define POWER_OFF_CMD 0x0127 //关机
+#define KM_MILE_CMD 0x0128 //公英制
+#define SLEEP_SET_CMD 0x0129 //app获取睡眠设置
+#define DELETE_ALL_DILA_CMD 0x012A //删除所有表盘
+#define GET_TARGET_STEP_CMD 0x012B //目标步数设置
+#define GET_OTHER_TARGET_CMD 0x012C //其他目标设置
+#define GET_UNPAIR_CMD 0x012D //发送解除配对消息
+#define SYN_DATA_END_CMD 0x012E //app发送同步数据结束消息
+#define ENTER_FACTORY_TEST_CMD 0x0130 //进入工厂测试模式
+#define SYN_HEART_HISTORY_DATA_CMD 0x0140 //同步心率历史数据
+#define SYN_SPO2_HISTORY_DATA_CMD 0x0141 //同步血氧历史数据
+#define SYN_STRESS_HISTORY_DATA_CMD 0x0142 //同步压力历史数据
+#define SYN_STEP_HISTORY_DATA_CMD 0x0143 //同步历史步数
+#define SYN_FAT_BURN_HISTORY_DATA_CMD 0x0144 //同步燃脂时间历史数据
+#define SYN_STAND_HISTORY_DATA_CMD 0x0145 //同步站立历史数据
+#define SYN_KCAL_HISTORY_DATA_CMD 0x0146 //同步卡路里历史数据
+#define SYN_DIS_HISTORY_DATA_CMD 0x0147 //同步距离历史数据
+#define SYN_BASIC_TRANIN_HISTORY_DATA_CMD 0x0149 //同步基础训练历史数据basic training
+#define SYN_SLEEP_HISTORY_DATA_CMD 0x014B //同步睡眠历史数据
+
+
+/*******************data structure*************************/
+#pragma pack(1)
+typedef struct
+{
+    uint16_t dial_id;//表盘ID
+}msg_dial_info_t;
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    uint8_t sd_ok;//1 获取成功 2 获取失败(返回空的数据)
+    uint8_t sd_data[8];//SD卡剩余的空间数据 8字节
+}msg_sdcard_info_t;
+#pragma pack()
+
+
+#pragma pack(1)
+typedef struct
+{
+    uint8_t battery_level;//手表电池电量
+}msg_dev_battery_info_t;
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    uint8_t switch_message;//开关消息
+}msg_switch_message_info_t;
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    uint8_t switch_media;//多媒体开关
+}msg_switch_media_info_t;
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    uint8_t file_type;//文件类型 1 OTA 2 MP3 3表盘信息 4 天气 5 闹钟
+}msg_revoke_current_file_info_t;//撤销当前文件传输
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    uint8_t file_type;//文件类型 2 MP3 3表盘信息
+}msg_getspecified_file_info_t;//获取指定类型文件目录
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+
+    uint8_t file_type;//文件类型 2 MP3 3表盘信息
+}msg_deletespecified_file_info_t;//删除指定类型文件目录
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    uint32_t timestamp;////时间戳
+    uint8_t hr_value;//心率值
+}msg_syn_hr_history_info_t;//同步心率历史数据
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+
+    uint32_t timestamp;////时间戳
+    uint8_t spo2_value;//血氧值
+}msg_syn_spo2_history_info_t;//同步血氧历史数据
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+   
+    uint32_t timestamp;////时间戳
+    uint8_t stress_value;//压力值
+}msg_syn_stress_history_info_t;//同步压力历史数据
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    uint32_t timestamp;////时间戳
+    uint32_t step_value;//步数值
+}msg_syn_step_history_info_t;//同步步数历史数据
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    uint32_t timestamp;////时间戳
+    uint16_t fat_value;//燃脂时间
+}msg_syn_fat_burn_history_info_t;//同步燃脂实际历史数据
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    uint32_t timestamp;////时间戳
+    uint32_t stand_value;//站立时间
+}msg_syn_stand_history_info_t;//同步站立历史数据
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+
+    uint32_t timestamp;////时间戳
+    float kcal_value;//卡路里
+}msg_syn_kcal_history_info_t;//同步卡路里历史数据
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+
+    uint32_t timestamp;////时间戳
+    float dis_value;//距离
+}msg_syn_dis_history_info_t;//同步卡路里历史数据
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    uint8_t sport_mode;////0 健走 1跑步 2骑行
+}msg_switch_sport_mode_info_t;//开启指定运动模式 SWITCH_SPORT_MODE
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+   
+    
+}msg_stop_sport_mode_info_t;//开启指定运动模式 SWITCH_SPORT_MODE
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    uint8_t language;//语言 0中文 1英语 2日语 3汉语 其他看协议指令
+}msg_set_language_info_t;//设置语言
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+}msg_switch_get_realhr_info_t;//开启/关闭自动获取实时训练数据SWITCH_GET_REAL_HEART_CMD
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    uint8_t freq; //采集频率 单位s默认是10s
+
+}msg_set_train_data_freq_info_t;// SET_REAL_DATA_FREQ_CM设置训练实时数据采样频率
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    
+}msg_get_train_data_info_t;// SET_REAL_DATA_FREQ_CM获取实时训练数据
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint8_t max_hr;//最高心率 最高心率不超过250
+
+}msg_set_max_hr_remind_info_t;// 设置最高心率提醒
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint8_t pause;//0暂停 1 恢复
+
+}msg_get_sport_pause_reset_info_t;// 训练暂停恢复
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint16_t curr_dial;//手表当前表盘id
+
+}msg_send_curr_dial_info_t;// 手表当前表盘
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint16_t watch_status;//手表当前状态 0空闲 9 usb存储状态 10运动训练状态
+
+}msg_watch_status_info_t;// 手表当前状态
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint8_t brigntess;//l亮度调节
+    uint8_t screen_time;//亮屏时长
+    uint8_t wrist_on;//抬婉亮屏开关
+
+}msg_watch_lcd_param_info_t;// 手表屏幕参数
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint16_t delete_dial;//删除表盘uid
+
+}msg_app_delete_dial_info_t;// 手表屏幕参数
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint16_t delete_dial;//删除表盘uid
+
+}msg_delete_dial_info_t;// app删除表盘(仅W4)
+#pragma pack()
+
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint8_t sys_volume;//系统音量调节 0-100
+    uint8_t ring_volume;//铃声音量调节 0-100
+    uint8_t media_volume;//媒体音量调节0-100
+    uint8_t bell_volume;//铃声开关0关闭 1开启
+    uint8_t vibrate_volume;//振动开关0关闭 1开启
+
+}msg_get_voice_vibration_info_t;// 获取手表声音和振动参数
+#pragma pack()
+
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint8_t func_param;//0运动 1心率 2 血氧检测 3 训练 4训练记录 5指南针 6 天气其他看协议0x011d
+
+}msg_get_auxiliary_func_param_info_t;// 获取手表辅助功能参数 Watch auxiliary function parameters
+#pragma pack()
+
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint8_t frequence;//检测频率 0关闭 1 1分 2 五分钟 3 10分钟
+    uint8_t remind_on;//心率提醒 0关闭 1开启
+    uint8_t max_min;//高于或者低于 0低于 1高于
+    uint8_t heart;//心率区间阈值30-200
+
+}msg_get_heart_set_param_info_t;// 获取手表心率设置参数
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint8_t frequence;//检测频率 0关闭 1 1分 2 五分钟 3 10分钟
+    uint8_t remind_on;//血压提醒 0关闭 1开启
+    uint8_t heart;//血压区间阈值90-99
+
+}msg_get_spo2_set_param_info_t;// 获取手表血氧设置参数
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint8_t carmera_type;//0 退出手势拍照 1进入手势拍照
+
+}msg_caramer_info_t;// 获取手表血氧设置参数
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint8_t drink_on;//0 关闭 1 开启
+}msg_drink_param_info_t;// 获取手表喝水提醒设置开关
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+}msg_factory_param_info_t;//app发送恢复出厂设置
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+}msg_reset_param_info_t;//app发送重新启动
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+}msg_poweroff_param_info_t;//app关机
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint8_t km_mile;//0公制 1英制
+}msg_km_mile_info_t;//手表公英值
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint8_t schedule;//Schedule setting 作息时间设定
+
+    uint8_t bedtime_hour;///就寝时间小时0-23
+    uint8_t bedtime_min;//就寝时间分钟0-59
+
+    uint8_t waketime_hour;//起床时间小时0-23
+    uint8_t waketime_min;//起床时间分钟0-59
+
+    uint8_t bedtime_alarm;//就寝前20分钟提醒开关 0关闭 1开启
+}msg_get_sleep_param_info_t;//app获取睡眠设置
+#pragma pack()
+
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint8_t dial_count;//表盘个数0-35 为0后面无需发送
+    uint16_t dial_uid;//表盘uid
+}msg_get_all_dial_info_t;//获取所有表盘
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint32_t target_step;//目标步数
+    uint8_t ring_alarm;//铃声提醒 01关闭 1开启
+    uint8_t vibrate_alarm;//振动提醒 01关闭 1开启
+    uint8_t notify_alarm;//通知提醒 01关闭 1开启
+
+}msg_get_target_step_info_t;//获取目标步数设置 0122B
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint16_t target_kcal;//目标卡路里 单位千卡 
+    uint8_t target_mile;//目标里程单位 公里
+    uint8_t target_stand;//目标站立 单位次 
+    uint8_t target_fat;//目标燃脂单位分钟
+    uint8_t ring_alarm;//铃声提醒0关闭 1开启 
+    uint8_t vibrate_alarm;//振动提醒0关闭 1开启 
+    uint8_t notify_alarm;//通知提醒0关闭 1开启
+
+}msg_get_other_target_info_t;//获取其他目标设置
+#pragma pack()
+
+/***********************长指令>20字节****************************************/
+/*******************TYPE+ID**********************/
+/*
+TYPE:02
+*/
+#define USER_INFOR_CMD 0x0201//用户数据
+#define CURR_TIME_CMD 0x0202 //发送当前时间app->watch
+#define SET_BLE_NAME_CMD 0x0203 //修改蓝牙名称
+#define SET_TRAIN_TARGET_CMD 0x0204 //设置训练目标
+#define GET_PHONE_INFOR_CMD 0x0210 //app发送手机信息
+#define GET_WEATHER_DATA_CMD 0x0220 //发送天气数据
+#define GET_ALARM_DATA_CMD 0x0221 //发送闹钟数据
+#define DELETE_FILE_CMD 0x0222 //删除指定文件
+#define SYN_BASIC_REAL_HEATR_CMD 0x024B //同步基础训练试试心率记录
+#define SYN_TODAY_BASIC_TRAIN_TXT_CMD 0x024D //同步当天任意时间之后的基础训练记录
+
+/******************************************
+ * 
+*/
+/*******************TYPE+ID**********************/
+/*
+TYPE:05
+*/
+#define FIND_PHONE_CMD 0x0501//查找手机
+#define GET_CURR_TIME_CMD 0x0502 //手表获取系统时间
+#define SEND_PARI_SUCESS_CMD 0x0510 //发送配对成功消息
+#define GET_TRANS_END_CMD 0x0520 //app发送文件传输已完成消息
+#define SEND_FACTORY_RECORD_CMD 0x0530 //发送厂测结果
+#define REQUEST_EPO_FILE_CMD 0x0540 //请求epo文件发送
+#define SEND_TRAIN_STATUS_CMD 0x0550 //发送训练状态
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint8_t find_on;//0停止 1开始
+    
+}msg_find_phone_info_t;//查找手机
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    
+}msg_get_sys_time_info_t;//获取系统时间
+#pragma pack()
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint8_t button_ok;//按键测试结果0失败 1成功
+    uint8_t lcd_backlight;//背光测试0失败 1成功
+    uint8_t usb_ok;//usb 0失败 1成功
+    uint8_t horn_ok;//喇叭 0失败 1成功
+    uint8_t aging_test;//老化测试 0失败 1成功
+    uint8_t power_ok;//关机测试 0失败 1成功
+}msg_factory_text_result_info_t;//厂测结果
+#pragma pack()
+
+
+#pragma pack(1)
+typedef struct
+{
+    //对应数据的指令类型
+    uint8_t status;//0结束 1开始 2暂停 3恢复
+    uint16_t time;//单位s 
+    
+}msg_send_train_status_info_t;//发送训练状态
+#pragma pack()
+
+
+
+void revBleOldData(uint8_t *buf, uint16_t event_size,uint16_t handle);//协议接收client下发的数据接口
+//02类型的指令数据
+void typeHexTwoData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen);
+void typeHexOneData(uint8_t *buf,uint16_t len,uint8_t *cmd_buf,uint8_t *totaldata);//对不同指令ID进行区分
+errcode_t sendBleData(uint8_t *buf,uint16_t len);
+void sendParieSuccess(uint8_t flag,uint8_t *mac);//发送配对成功指令to app mac手机端的地址
+void getPhoneInfo_test(void);
+void setFindWatchFlag(uint8_t flag);//查找手表标识
+errcode_t bondSucessCmd(void);//发送解绑指令,解绑界面调用这个函数 如果点了✓调用这个函数 返回成功后延迟10s再重启设备  
+void getDeviceState(void);
+#endif
+
index 33aa72e..5ee24a2 100644 (file)
 #include <stdint.h>\r
 #include <stdio.h>\r
 #include "stdbool.h"\r
-/* Gatt service UUID */\r
+\r
 #include "bts_br_gap.h"\r
 #include "battery_hal.h"\r
 #include "bleService.h"\r
-\r
+#include "alipay_feature.h"\r
+#include "alipay_bluetooth.h"\r
+#include "bts_a2dp_sink.h"\r
+#include "osal_timer.h"\r
+#include "bleEvent.h"\r
+#include "hidService.h"\r
+\r
+// #include "ble_hid_take_photo_server.h"\r
+/* Gatt service UUID */\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
+#define BLE_CHARACTERISTIC_RECV_ID 0x2ae5\r
+#define BLE_CHARACTERISTIC_SNED_SHORT_ID 0x2ae3\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
+#define BLE_CHARACTERISTIC_SNED_LONG_ID 0x2ae4\r
+#define BLE_CHARACTERISTIC_SNED_OTA_ID 0x2ae0\r
+#define BLE_CHARACTERISTIC_SNED_ANDRIOD_ID 0x2ae1\r
+#define BLE_CHARACTERISTIC_READ_BATTERY_ID 0x2ae2\r
 /* Client Characteristic Configuration UUID */\r
 #define BLE_UUID_CLIENT_CHARACTERISTIC_CONF 0x2902\r
+/*user Characteristic Configuration UUID*/\r
+#define BLE_UUID_USER_CHARACTERISTIC_CONF 0x2901\r
 /* Gatt Characteristic max length */\r
 #define BLE_CHARACTERISTIC_MAX_LENGTH 256\r
 #define BLE_ADV_ID 1\r
@@ -56,14 +66,35 @@ static a2dp_src_callbacks_t g_a2dpSrcCallbacks;
 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_read_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 const uint8_t ble_adv_tx[3] = {0x02,0x0a,0x00};\r
+static bool AdverFlag = true;\r
+\r
 static uint8_t scan_data[BLE_SCAN_MAC_LENTH] = {0};\r
+\r
+uint8_t phone_mac_data[6]={0};\r
+bd_addr_t phone_addr;\r
+uint8_t Bleconnect = 0;//蓝牙默认是断开 0 1 为连接\r
+\r
+uint8_t bond_flag = 0;//绑定标识\r
+uint16_t ble_nus_max_data_len = SDK_BLE_MTU_MIN - 3; \r
+#define A2DP_STREAM_ACCEPT_TIMER_PERIOD 500\r
+static osal_timer g_a2dp_stream_accept_timer = {NULL, NULL, 0, 0};\r
+\r
+uint8_t shortCmdChara = 0;//2ae3短指令特征值\r
+uint8_t longCmdChara = 0;\r
+\r
+\r
+static void set_phone_info(bd_addr_t *addr)//保存手机信息 包含手机mac地址\r
+{\r
+    memcpy(&phone_addr,addr,sizeof(bd_addr_t));\r
+}\r
+\r
 enum{\r
     BLE_CHARACTERISTIC_RECV_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_NOTIFY|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP|GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_READ,\r
     BLE_CHARACTERISTIC_SNED_SHORT_ID_PROPERTIES =  GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,\r
@@ -77,10 +108,15 @@ static void svr_ble_ble_adv_stop(void)
 {\r
     gap_ble_stop_adv(BLE_ADV_ID);\r
 }\r
-static void svr_ble_ble_adv_start(void)\r
+void svr_ble_ble_adv_start(void)\r
 {\r
     gap_ble_start_adv(BLE_ADV_ID);\r
 }\r
+bool get_ble_status(void)\r
+{\r
+    return AdverFlag;\r
+}\r
+#if 0\r
 /* adapt ios adv data. *///设置广播和扫描数据\r
 static void svr_ble_adv_data_set(int adv_id)\r
 {\r
@@ -91,27 +127,26 @@ static void svr_ble_adv_data_set(int adv_id)
     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
+    uint8_t adv_mac_head[BLE_ADV_MAC_LENTH] = {0x9, 0x16, 0x12, 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
+    unsigned char set_mac[6] = {0x61,0x22,0x33,0x44,0x09,0x11};\r
+    bluetooth_set_local_addr(set_mac,6);\r
     bd_addr_t addr_info;\r
     int32_t ret= 0;\r
     unsigned int len = BLE_MAC_MAX_LEN;\r
+\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
+    char watchName[32];\r
+    memset_s(watchName, sizeof(watchName), 0, sizeof(watchName));\r
+    (void)sprintf_s(watchName, sizeof(watchName), "%s %x%x",BLE_DEFAULT_NAME,addr[1],addr[0]);\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
+    // ret = bluetooth_set_local_name((unsigned char*)watchName, strlen((char*)watchName) + 1);\r
+    if (ret == false) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bt SetLocalName ret = 0x%x", ret);\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
@@ -140,25 +175,32 @@ static void svr_ble_adv_data_set(int adv_id)
     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
+    memcpy_s(adv_data + adv_data_len, sizeof(ble_adv_tx), ble_adv_tx, sizeof(ble_adv_tx));//这是tx power\r
+    adv_data_len = adv_data_len + sizeof(ble_adv_tx);\r
+\r
     int k = BD_ADDR_LEN;\r
     for (int i = 0; i < BD_ADDR_LEN; i++) {\r
         ble_data_mac_switch[--k] = addr[i];\r
     }\r
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "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
+    // 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
+    // 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[4] = bond_flag;//是否绑定\r
+    scan_data[5] = ble_data_mac_switch[0];\r
+    scan_data[6] = ble_data_mac_switch[1];\r
+    scan_data[7] = ble_data_mac_switch[2];\r
+    scan_data[8] = ble_data_mac_switch[3];\r
+    scan_data[9] = ble_data_mac_switch[4];\r
+    scan_data[10] = ble_data_mac_switch[5];\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
@@ -177,8 +219,8 @@ static void svr_ble_adv_data_set(int adv_id)
     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.interval_min = 0x30;\r
+    params.interval_max = 0x60;\r
     params.conn_handle = 1;\r
     params.slave_latency = 0;\r
     params.timeout_multiplier = 4000;\r
@@ -187,11 +229,120 @@ static void svr_ble_adv_data_set(int adv_id)
 \r
     return;\r
 }\r
+#endif\r
+\r
+#if 1\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
+    unsigned char set_mac[6] = {0x61,0x22,0x33,0x44,0x09,0x12};\r
+    bluetooth_set_local_addr(set_mac,6);\r
+    bd_addr_t addr_info;\r
+    int32_t ret= 0;\r
+    unsigned int len = BLE_MAC_MAX_LEN;\r
+\r
+    unsigned char addr[BLE_MAC_MAX_LEN] = {0};\r
+    bluetooth_get_local_addr(&addr[0],len);\r
+    char watchName[32];\r
+    memset_s(watchName, sizeof(watchName), 0, sizeof(watchName));\r
+    (void)sprintf_s(watchName, sizeof(watchName), "%s %x%x",BLE_DEFAULT_NAME,addr[1],addr[0]);\r
+\r
+    ret = bluetooth_set_local_name((unsigned char*)watchName, strlen((char*)watchName) + 1);\r
+    if (ret == false) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bt SetLocalName ret = 0x%x", ret);\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_tx), ble_adv_tx, sizeof(ble_adv_tx));//这是tx power\r
+    adv_data_len = adv_data_len + sizeof(ble_adv_tx);\r
+\r
+    int k = BD_ADDR_LEN;\r
+    for (int i = 0; i < BD_ADDR_LEN; i++) {\r
+        ble_data_mac_switch[--k] = addr[i];\r
+    }\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "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] = bond_flag;//是否绑定\r
+    scan_data[5] = ble_data_mac_switch[5];\r
+    scan_data[6] = ble_data_mac_switch[4];\r
+    scan_data[7] = ble_data_mac_switch[3];\r
+    scan_data[8] = ble_data_mac_switch[2];\r
+    scan_data[9] = ble_data_mac_switch[1];\r
+    scan_data[10] = ble_data_mac_switch[0];\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_ble_set_adv_data(adv_id, &adv_data_info);\r
+\r
+    return;\r
+}\r
+#endif\r
+\r
+\r
 \r
 void svr_ble_adv_start(void)\r
 {\r
     int adv_id = BLE_ADV_ID;\r
-    if (AdverFlag) { //已经开始广播了,不需要重复开启广播\r
+    if (AdverFlag == false) { //已经开始广播了,不需要重复开启广播\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "BleAdvStart already started1");\r
         return;\r
     }\r
@@ -199,8 +350,8 @@ void svr_ble_adv_start(void)
     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.min_interval = 0x30;\r
+    adv_para.max_interval = 0x60;\r
     adv_para.adv_type = GAP_BLE_ADV_CONN_SCAN_UNDIR;\r
     adv_para.channel_map = 0x7;\r
     adv_para.duration = 0;\r
@@ -217,27 +368,38 @@ void svr_ble_adv_start(void)
 \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
+    uint16_t number;\r
+    errcode_t ret = gap_ble_get_paired_devices_num(&number);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "number :%d addr!!! 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\r\n",number,addr->addr[0],addr->addr[1],addr->addr[2],addr->addr[3],\r
+    addr->addr[4],addr->addr[5]);\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
+        \r
         Bleconnect = GAP_BLE_STATE_DISCONNECTED;//蓝牙已断开\r
-        if(AdverFlag != true){\r
-            svr_ble_adv_start();\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "GAP_BLE_STATE_DISCONNECTED!!! 0x%x ret:%d\r\n",pair_state,AdverFlag);\r
+        if(AdverFlag == true){\r
             svr_ble_ble_adv_start();\r
         }    \r
     } else {\r
+        set_phone_info(addr);\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
+\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
+    bond_flag = 1;\r
+    uint16_t number;\r
+    errcode_t ret = gap_ble_get_paired_devices_num(&number);\r
+    gap_ble_pair_state_t paire_status;\r
+    gap_ble_get_pair_state(addr,&paire_status);//获取配对状态\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_pair_result_cbt_cb status %d number:%d\r\n",paire_status,number);\r
+    \r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_pair_result_cbt_cb!!! addr 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x status:0x%x\r\n",addr->addr[0],addr->addr[1],\r
+    addr->addr[2],addr->addr[3],addr->addr[4],addr->addr[5],status);\r
 }\r
 static void svr_ble_adv_start_cb(uint8_t adv_id, adv_status_t status)\r
 {\r
@@ -255,7 +417,221 @@ static void svr_ble_adv_stop_cb(uint8_t adv_id, adv_status_t status)
 {\r
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_adv_stop_cb:%d",status);\r
 }\r
+//添加ota特征值\r
+static void srv_ble_add_chart_decr_ota(uint8_t server_id,uint16_t srv_handle)\r
+{   \r
+    errcode_t ret = 0;\r
+    static uint8_t ota_point_val[] = {0x00, 0x00};\r
+    gatts_add_chara_info_t character;\r
+    gatts_add_desc_info_t descriptor;\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_OTA_ID, &character.chara_uuid);\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;\r
+    character.properties = BLE_CHARACTERISTIC_SNED_OTA_ID_PROPERTIES;\r
+    character.value_len = (uint16_t)sizeof(ota_point_val);\r
+    character.value = ota_point_val;\r
+\r
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
+    }\r
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;\r
+    descriptor.value_len = (uint16_t)sizeof(ota_point_val);\r
+    descriptor.value = ota_point_val;\r
+    \r
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+    }\r
+}\r
+//用于adnriod发送消息添加特征值和描述符\r
+static void srv_ble_add_chart_decr_andriod(uint8_t server_id,uint16_t srv_handle)\r
+{   \r
+    errcode_t ret = 0;\r
+    static uint8_t andriod_point_val[] = {0x00, 0x00};\r
+    gatts_add_chara_info_t character;\r
+    gatts_add_desc_info_t descriptor;\r
+\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_ANDRIOD_ID, &character.chara_uuid);\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;\r
+    character.properties = BLE_CHARACTERISTIC_SNED_ANDRIOD_ID_PROPERTIES;\r
+    character.value_len = (uint16_t)sizeof(andriod_point_val);\r
+    character.value = andriod_point_val;\r
+\r
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
+    }\r
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;\r
+    descriptor.value_len = (uint16_t)sizeof(andriod_point_val);\r
+    descriptor.value = andriod_point_val;\r
+    \r
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+    }\r
+}\r
+//添加battery特征值和描述符\r
+static void srv_ble_add_chart_decr_battery(uint8_t server_id,uint16_t srv_handle)\r
+{\r
+    errcode_t ret = 0;\r
+    static uint8_t battery_point_val[20] = {0};\r
+    uint8_t battery_value[20];\r
+    memset(battery_value,0,20);\r
+    // 获取电池电压值\r
+    float voltage = 0.0F;\r
+    uint8_t power = 0;\r
+    power = battery_get_voltage(&voltage);\r
+    battery_point_val[0] = power;//电量90\r
+    uint16_t dial = 1;\r
+    battery_point_val[1] = 0;//当前表盘几\r
+    battery_point_val[2] = 1;\r
+\r
+    battery_point_val[3] = 0;//固件版本号\r
+    battery_point_val[4] = 0;\r
+    battery_point_val[5] = 1;\r
+\r
+    bd_addr_t addr_info;\r
+    ret = gap_ble_get_local_addr(&addr_info);\r
+    battery_point_val[6] = addr_info.addr[5];\r
+    battery_point_val[7] = addr_info.addr[4];\r
+    battery_point_val[8] = addr_info.addr[3];\r
+    battery_point_val[9] = addr_info.addr[2];\r
+    battery_point_val[10] = addr_info.addr[1];\r
+    battery_point_val[11] = addr_info.addr[0];\r
+\r
+    battery_point_val[12] = 0;//消息推送开关 默认是关闭 0\r
+    battery_point_val[13] = 0;//多媒体开关\r
+    battery_point_val[14] = 5;//客户编号\r
+    battery_point_val[15] = 5;//产品编号\r
+\r
+    battery_point_val[16] = 0;//硬件版本号\r
+    battery_point_val[17] = 1;\r
+\r
+    battery_point_val[18] = 0;//ble版本号\r
+    battery_point_val[19] = 1;\r
+    gatts_add_chara_info_t character;\r
+    gatts_add_desc_info_t descriptor;\r
+\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_READ_BATTERY_ID, &character.chara_uuid);\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+    character.properties = BLE_CHARACTERISTIC_READ_BATTERY_ID_PROPERTIES;\r
+    character.value_len = (uint16_t)sizeof(battery_point_val);\r
+    character.value = battery_point_val;\r
+\r
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
+    }\r
+    static uint8_t report_reference_val_output[] = {0x01, 0x00};\r
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;\r
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
+    descriptor.value = battery_point_val;\r
+    \r
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+    }\r
 \r
+}\r
+//添加短指令特征值和描述符 20个字节\r
+static void srv_ble_add_chart_decr_short_cmd(uint8_t server_id,uint16_t srv_handle)\r
+{\r
+    errcode_t ret = 0;\r
+    static uint8_t battery_point_val[] = {0x00, 0x00};\r
+    gatts_add_chara_info_t character;\r
+    gatts_add_desc_info_t descriptor;\r
+\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_SHORT_ID, &character.chara_uuid);\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+    character.properties = BLE_CHARACTERISTIC_SNED_SHORT_ID_PROPERTIES;\r
+    character.value_len = (uint16_t)sizeof(battery_point_val);\r
+    character.value = battery_point_val;\r
+\r
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
+    }\r
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;\r
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
+    descriptor.value = battery_point_val;\r
+    \r
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+    }\r
+}\r
+//添加长指令特征值和描述符 大于20个字节\r
+static void srv_ble_add_chart_decr_long_cmd(uint8_t server_id,uint16_t srv_handle)\r
+{\r
+    errcode_t ret = 0;\r
+    static uint8_t battery_point_val[] = {0x00, 0x00};\r
+    gatts_add_chara_info_t character;\r
+    gatts_add_desc_info_t descriptor;\r
+\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_LONG_ID, &character.chara_uuid);\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+    character.properties = BLE_CHARACTERISTIC_SNED_LONG_ID_PROPERTIES;\r
+    character.value_len = (uint16_t)sizeof(battery_point_val);\r
+    character.value = battery_point_val;\r
+\r
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
+    }\r
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE|GATT_ATTRIBUTE_PERMISSION_READ;\r
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
+    descriptor.value = battery_point_val;\r
+    \r
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+    }\r
+}\r
+//添加客户端接收特征值和描述符 \r
+static void srv_ble_add_chart_decr_recv_cmd(uint8_t server_id,uint16_t srv_handle)\r
+{\r
+    errcode_t ret = 0;\r
+    static uint8_t battery_point_val[] = {0x00, 0x00};\r
+    gatts_add_chara_info_t character;\r
+    gatts_add_desc_info_t descriptor;\r
+\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_RECV_ID, &character.chara_uuid);\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+    character.properties = BLE_CHARACTERISTIC_RECV_ID_PROPERTIES;\r
+    character.value_len = (uint16_t)sizeof(battery_point_val);\r
+    character.value = battery_point_val;\r
+\r
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
+    }\r
+    bts_data_to_uuid_len2(BLE_UUID_CLIENT_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
+    descriptor.value = battery_point_val;\r
+    \r
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+    }\r
+\r
+    bts_data_to_uuid_len2(BLE_UUID_USER_CHARACTERISTIC_CONF, &descriptor.desc_uuid);\r
+    descriptor.permissions =  GATT_ATTRIBUTE_PERMISSION_WRITE | GATT_ATTRIBUTE_PERMISSION_READ;;\r
+    descriptor.value_len = (uint16_t)sizeof(battery_point_val);\r
+    descriptor.value = battery_point_val;\r
+    \r
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
+    if (ret != ERRCODE_SUCC) {\r
+        // ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+    }\r
+}\r
+extern void alipay_add_chart_decr_cb(uint8_t server_id,uint16_t srv_handle);\r
+//这个回调函数添加新的服务UUID\r
 static void svr_ble_bt_gatts_service_add_cb(uint8_t server_id, bt_uuid_t *uuid, uint16_t srv_handle,\r
     errcode_t status)\r
 {\r
@@ -266,224 +642,109 @@ static void svr_ble_bt_gatts_service_add_cb(uint8_t server_id, bt_uuid_t *uuid,
     {\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
+    bt_uuid_t ble_service_uuid = {0};\r
+    bts_data_to_uuid_len2(BLE_SERVICE_UUID, &ble_service_uuid);\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
+    bt_uuid_t hid_service_uuid = {0};\r
+    bts_data_to_uuid_len2(BLE_UUID_HUMAN_INTERFACE_DEVICE, &hid_service_uuid);\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
+    bt_uuid_t alpay_service_uuid = {0};\r
+    bts_data_to_uuid_len2(ALIPAYY_SERVICE_ID, &alpay_service_uuid);\r
+    \r
+    errcode_t ret = 0;\r
+    if (ble_gatts_cmp_uuid(uuid, &ble_service_uuid) == true) {//通过传入的uuid进行比较\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_service_add_cb ble_service_uuid\r\n");\r
+        srv_ble_add_chart_decr_ota(server_id,srv_handle);//ota特征值\r
+        srv_ble_add_chart_decr_andriod(server_id,srv_handle);//对18e0这个服务进行添加andiod特征值和描述符\r
+        srv_ble_add_chart_decr_battery(server_id,srv_handle);//电池电量特征值\r
+        srv_ble_add_chart_decr_short_cmd(server_id,srv_handle);\r
+        srv_ble_add_chart_decr_long_cmd(server_id,srv_handle);\r
+        srv_ble_add_chart_decr_recv_cmd(server_id,srv_handle);\r
+        gatts_start_service(server_id, srv_handle);\r
+    }\r
+    if (ble_gatts_cmp_uuid(uuid, &hid_service_uuid) == true){\r
+        ble_hid_add_characters_and_descriptors(server_id, srv_handle);\r
+        ret = gatts_start_service(server_id, srv_handle);\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_service_add_cb ret:%d\r\n",ret);\r
+    }\r
+    if (ble_gatts_cmp_uuid(uuid, &alpay_service_uuid) == true){\r
+        alipay_add_chart_decr_cb(server_id,srv_handle);\r
+        \r
+        ret = gatts_start_service(server_id, srv_handle);\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "alipay_add_chart_decr_cb ret:%d\r\n",ret);\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
+    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
+    bt_uuid_t chara_uuid_data4 = {0};\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_OTA_ID, &chara_uuid_data4);\r
+\r
+    bt_uuid_t chara_uuid_data5 = {0};\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_ANDRIOD_ID, &chara_uuid_data5);\r
+\r
+    bt_uuid_t chara_uuid_data1 = {0};\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_RECV_ID, &chara_uuid_data1);\r
+    bt_uuid_t chara_uuid_data2 = {0};\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_SHORT_ID, &chara_uuid_data2);\r
+    bt_uuid_t chara_uuid_data3 = {0};\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_SNED_LONG_ID, &chara_uuid_data3);\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
+    bt_uuid_t chara_uuid_data6 = {0};\r
+    bts_data_to_uuid_len2(BLE_CHARACTERISTIC_READ_BATTERY_ID, &chara_uuid_data6);\r
+\r
+    bt_uuid_t hid_report_uuid = {0};\r
+    bts_data_to_uuid_len2(BLE_UUID_REPORT, &hid_report_uuid);\r
+\r
+    bt_uuid_t alipay_uuid = {0};\r
+    bts_data_to_uuid_len2(ALIPAYY_CHARACTERISTIC_ID, &alipay_uuid);\r
+\r
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data1))\r
+    {\r
+        g_ble_server_handle = result->value_handle;\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->value_handle1  %d\r\n",result->value_handle);\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
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data2))\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->value_handle2  %d\r\n",result->value_handle);\r
+        shortCmdChara = result->value_handle;\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
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data4))\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->value_handle4  %d\r\n",result->value_handle);\r
+        // shortCmdChara = result->value_handle;\r
     }\r
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data5))\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
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->value_handle5  %d\r\n",result->value_handle);\r
+        // shortCmdChara = result->value_handle;\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
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data6))\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->value_handle6  %d\r\n",result->value_handle);\r
+        // shortCmdChara = result->value_handle;\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
+    if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data3))\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->value_handle3  %d\r\n",result->value_handle);\r
+        longCmdChara = result->value_handle;\r
     }\r
+    if (ble_gatts_cmp_uuid(uuid, &hid_report_uuid) == true) {\r
+        ble_hid_add_characters_input_report_cbk(srv_handle);\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->hid_report_uuid  %d\r\n",result->value_handle);\r
+    }\r
+    if (ble_gatts_cmp_uuid(uuid, &alipay_uuid) == true) {\r
+        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ble_alipay_add_characters_input_report_cbk \r\n");\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "result->alipay_uuid  %d\r\n",result->value_handle);\r
+        ble_alipay_add_characters_input_report_cbk(srv_handle);\r
+    }\r
+    return;\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
@@ -506,110 +767,57 @@ static void svr_ble_bt_gatts_service_del_cb(uint8_t server_id, errcode_t status)
 {\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
+errcode_t svr_ble_bt_gatts_noyify(uint8_t *data, uint16_t data_len)//这里是设备数据上报给app手机端\r
 {\r
     gatts_ntf_ind_t data_info;\r
     data_info.attr_handle = g_ble_server_handle;\r
     data_info.value = data;\r
     data_info.value_len = data_len;\r
     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
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_notify_indicate ret:0x%x. serverid:%u,conn_id:%u,handle:%u.data_len:%d", ret, g_ble_server_id,\r
+        g_ble_conn_id, g_ble_server_handle,data_len);\r
     \r
+    return ret;\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
+\r
+static uint8_t falg = 0;\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
+     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_ble_server_handle %d conn_id :%d write_cb_para->length:%d write_cb_para->handle %d write_cb_para->request_id:%d",g_ble_server_handle,conn_id,write_cb_para->length,\r
+     write_cb_para->handle,write_cb_para->request_id);\r
+    for(uint16_t i = 0;i<write_cb_para->length;i++)\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
+        printf("%x ",write_cb_para->value[i]);\r
+       \r
     }\r
+    revBleOldData(write_cb_para->value,write_cb_para->length,write_cb_para->handle);\r
     \r
-   \r
-   \r
 }\r
+static void svr_ble_mtu_exchange(uint8_t server_id, uint16_t conn_id, uint16_t mtu_size, errcode_t status)\r
+{\r
+    ble_nus_max_data_len = mtu_size-3;\r
+    // ble_nus_max_data_len = 100;\r
+    // gatts_set_mtu_size(server_id,ble_nus_max_data_len);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_mtu_exchange %d %d %d\r\n",server_id,conn_id,mtu_size);\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
+static void svr_gap_ble_auth_complete_callback(uint16_t conn_id, const bd_addr_t *addr, errcode_t status,ble_auth_info_evt_t* evt)\r
+{\r
+    sendParieSuccess(1,phone_addr.addr);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_gap_ble_auth_complete_callback %x %x %x %x %x %x\r\n",addr->addr[0],addr->addr[1],addr->addr[2],addr->addr[3],addr->addr[4],addr->addr[5]);\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
@@ -653,10 +861,10 @@ static void svr_gap_ble_ConfirmedCallback(const bd_addr_t *bdAddr, int req_type,
 // 回调:扫描结果处理/发现结果上报\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
+    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
@@ -665,24 +873,29 @@ static void svr_gap_ble_DiscoveryResultCallback(const bd_addr_t *bdAddr)
 }\r
 \r
 // 回调:ACL连接状态上报\r
-static void svr_gap_ble_AclStateChangedCallback(const bd_addr_t *bdAddr, gap_acl_state_t state, unsigned int reason)\r
+static void svr_gap_br_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
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "bt GapAclStateChangedCallback state %d, reason %x succ or err", state, reason);\r
+    WEARABLE_LOGE(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
+    if(state == GAP_ACL_STATE_DISCONNECTED || state == GAP_ACL_STATE_LE_DISCONNECTED)\r
+    {\r
+        gap_remove_all_pairs();\r
+    }\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 ((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
@@ -706,10 +919,10 @@ static void A2dp_SrcConnectstateChanged(bd_addr_t *bdAddr, int connState)
     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 ((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
@@ -720,6 +933,7 @@ static void A2dp_SrcConnectstateChanged(bd_addr_t *bdAddr, int connState)
     }\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
@@ -737,20 +951,167 @@ static void A2dp_SrcConfigureChanged(bd_addr_t *bdAddr, a2dp_codec_info_t *info)
     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
+static void BtA2dpSnkAcceptTimerStop(void)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "stop timer\n");\r
+    if (g_a2dp_stream_accept_timer.timer != NULL) {\r
+        (void)osal_timer_stop(&g_a2dp_stream_accept_timer);\r
+        (void)osal_timer_destroy(&g_a2dp_stream_accept_timer);\r
+        g_a2dp_stream_accept_timer.timer = NULL;\r
+    }\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "stop timer success!\n");\r
+}\r
 \r
+static void BtA2dpSnStartAcceptHandler(unsigned long data)\r
+{\r
+    UNUSED(data);\r
+    bd_addr_t active_bd_addr = a2dp_snk_get_active_device();\r
+    a2dp_snk_start_accept(&active_bd_addr);\r
+    BtA2dpSnkAcceptTimerStop();\r
+}\r
 \r
-static void svr_ble_btcallback_reg(void)//ble基础通讯服务注册回调函数\r
+static errcode_t BtA2dpSnkStartAcceptTimer(void)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "start timer\n");\r
+    if (g_a2dp_stream_accept_timer.timer != NULL) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "timer is running");\r
+        return ERRCODE_SUCC;\r
+    }\r
+\r
+    g_a2dp_stream_accept_timer.handler = BtA2dpSnStartAcceptHandler;\r
+    g_a2dp_stream_accept_timer.interval = A2DP_STREAM_ACCEPT_TIMER_PERIOD;\r
+\r
+    int32_t timer_ret = osal_timer_init(&g_a2dp_stream_accept_timer);\r
+    if (timer_ret != EOK) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "create timer error! ret: %x\n", timer_ret);\r
+        BtA2dpSnkAcceptTimerStop();\r
+        return ERRCODE_FAIL;\r
+    }\r
+    timer_ret = osal_timer_start(&g_a2dp_stream_accept_timer);\r
+    if (timer_ret != EOK) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "start timer error! ret: %x\n", timer_ret);\r
+        BtA2dpSnkAcceptTimerStop();\r
+        return ERRCODE_FAIL;\r
+    }\r
+    return ERRCODE_SUCC;\r
+}\r
+\r
+static int32_t BtA2dpSnkAudioCreate()\r
+{\r
+#if MEDIA_A2DP_SNK_INTERFACE\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "audioFormat %d channelCount %d sampleRate %d \n",\r
+        g_audio_format_config.audioFormat, g_audio_format_config.channelCount, g_audio_format_config.sampleRate);\r
+\r
+    int32_t ret = AudioManagerA2dpSinkSetParam(g_audio_format_config);\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "AudioManagerA2dpSinkSetParam ret %x\n", ret);\r
+    ret = AudioManagerA2dpSinkCreate();\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "AudioManagerA2dpSinkCreate ret %x\n", ret);\r
+#endif\r
+    /* 起定时器接受音乐开始请求 */\r
+    (void)BtA2dpSnkStartAcceptTimer();\r
+    return 0;\r
+}\r
+\r
+static int32_t BtA2dpSnkAudioDestroy()\r
+{\r
+#if MEDIA_A2DP_SNK_INTERFACE\r
+    int32_t ret = AudioManagerA2dpSinkDestroy();\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "AudioManagerA2dpSinkDestroy ret %x\n", ret);\r
+#endif\r
+    return 0;\r
+}\r
+\r
+\r
+\r
+static void BtA2dpSnkConnectStateChangedCb(bd_addr_t *bd_addr, int conn_state)\r
+{\r
+    if(conn_state == 4)//取消配对\r
+    {\r
+\r
+    }else if(conn_state == 2)//配对成功 发送配对成功的指令 手机mac地址\r
+    {\r
+        // sendParieSuccess();\r
+    }\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "BtA2dpSnkConnectStateChangedCb addr: ****%02x%02x%02x%02x%02x%02x conn_state: %x\n",\r
+        bd_addr->addr[5],bd_addr->addr[4],bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], conn_state); /* 3 2 1 0 idx */\r
+}\r
+\r
+static void BtA2dpSnkStartStreamReqCb(bd_addr_t *bd_addr)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x \n",\r
+        bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0]); /* 3 2 1 0 idx */\r
+    BtA2dpSnkAudioCreate();\r
+}\r
+\r
+static void BtA2dpSnkPlayingStateChangedCb(bd_addr_t *bd_addr, int playing_state)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x playing_state: %x\n",\r
+        bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0], playing_state); /* 3 2 1 0 idx */\r
+    if (playing_state == A2DP_NOT_PLAYING) {\r
+        BtA2dpSnkAudioDestroy();\r
+    }\r
+}\r
+\r
+static void BtA2dpSnkConfigChangedCb(bd_addr_t *bd_addr, a2dp_snk_codec_info_t *info)\r
+{\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x ",\r
+        bd_addr->addr[3], bd_addr->addr[2], bd_addr->addr[1], bd_addr->addr[0]); /* 3 2 1 0 idx */\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP,\r
+        "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_LOGI(WEARABLE_LOG_MODULE_APP,\r
+        "codec_specific1: %04x codec_specific2: %04x codec_specific3: %04x codec_specific4: %04x\n",\r
+        (unsigned int)info->codec_specific1,\r
+        (unsigned int)info->codec_specific2,\r
+        (unsigned int)info->codec_specific3,\r
+        (unsigned int)info->codec_specific4);\r
+#if MEDIA_A2DP_SNK_INTERFACE\r
+    if (info->codec_type == A2DP_SNK_CODEC_TYPE_AAC) {\r
+        g_audio_format_config.audioFormat = AAC_LC;\r
+    } else {\r
+        g_audio_format_config.audioFormat = SBC;\r
+    }\r
+    /* channel count 1 or 2 */\r
+    g_audio_format_config.channelCount = (info->channel_mode == A2DP_SNK_CODEC_CHANNEL_MODE_NONE ? 1 : 2);\r
+\r
+    switch (info->sample_rate) {\r
+        case A2DP_SNK_CODEC_SAMPLE_RATE_48000:\r
+            g_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE48000;\r
+            break;\r
+        case A2DP_SNK_CODEC_SAMPLE_RATE_88200:\r
+            g_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE88200;\r
+            break;\r
+        case A2DP_SNK_CODEC_SAMPLE_RATE_96000:\r
+            g_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE96000;\r
+            break;\r
+        default:\r
+            g_audio_format_config.sampleRate = BT_AUDIO_A2DP_SMAPLE_RATE44100;\r
+            break;\r
+    }\r
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "audioFormat %d channelCount %d sampleRate %d \n",\r
+        g_audio_format_config.audioFormat, g_audio_format_config.channelCount, g_audio_format_config.sampleRate);\r
+#endif\r
+}\r
+\r
+static a2dp_snk_callbacks_t g_a2dp_snk_callbacks = {\r
+    BtA2dpSnkConnectStateChangedCb,\r
+    BtA2dpSnkStartStreamReqCb,\r
+    BtA2dpSnkPlayingStateChangedCb,\r
+    BtA2dpSnkConfigChangedCb\r
+};\r
+\r
+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_enable = 0x01;\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.acl_state_changed_callbak = svr_gap_br_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
@@ -765,6 +1126,7 @@ static void svr_ble_btcallback_reg(void)//ble基础通讯服务注册回调函
     g_a2dpSrcCallbacks.playing_state_changed_cb = A2dp_SrcPlayingStateChanged;\r
     a2dp_src_register_callbacks(&g_a2dpSrcCallbacks);\r
 \r
+    a2dp_snk_register_callbacks(&g_a2dp_snk_callbacks);\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
@@ -772,9 +1134,14 @@ static void svr_ble_btcallback_reg(void)//ble基础通讯服务注册回调函
     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
+    g_ble_gapble_cbs.auth_complete_cb = svr_gap_ble_auth_complete_callback;\r
     gap_ble_register_callbacks(&g_ble_gapble_cbs);\r
 \r
+    srv_ble_server_register_gatt_callbacks();\r
+}\r
+void srv_ble_server_register_gatt_callbacks(void)\r
+{\r
+    errcode_t ret = ERRCODE_BT_SUCCESS;\r
     g_ble_gatts_cbs.add_service_cb = svr_ble_bt_gatts_service_add_cb;\r
     g_ble_gatts_cbs.add_characteristic_cb = svr_ble_bt_gatts_characteristic_add_cb;\r
     g_ble_gatts_cbs.add_descriptor_cb = svr_ble_bt_gatts_descriptor_add_cb;\r
@@ -783,37 +1150,56 @@ static void svr_ble_btcallback_reg(void)//ble基础通讯服务注册回调函
     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
+    g_ble_gatts_cbs.mtu_changed_cb = svr_ble_mtu_exchange;\r
     gatts_register_callbacks(&g_ble_gatts_cbs);\r
+    return;\r
 }\r
-\r
+static uint8_t g_server_id = 0;\r
 static void svr_ble_bt_init_gatts(void)\r
 {\r
-    uint16_t id = 0xe018;\r
+    uint16_t id = BLE_SERVICE_UUID;\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
+    errcode_t ret = 0;\r
     uuid.uuid_len = (uint8_t)sizeof(ser_id);\r
     memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&ser_id, sizeof(ser_id));\r
     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
+\r
+    bt_uuid_t ble_service_uuid = {0};\r
+    bts_data_to_uuid_len2(id, &ble_service_uuid);\r
+    ret = gatts_add_service(1, &ble_service_uuid, true);\r
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_service ret: 0x%x", ret);\r
+\r
+    \r
     return;\r
 }\r
-\r
+bool ble_gatts_cmp_uuid(const bt_uuid_t *tgt_uuid, const bt_uuid_t *src_uuid)//比较源uuid和给定的uuid是否匹配\r
+{\r
+    uint8_t *tgt = (uint8_t *)bts_init_128bit_uuid(tgt_uuid);\r
+    bool result = false;\r
+    if (tgt == NULL) {\r
+        return false;\r
+    }\r
+    uint8_t *src = (uint8_t *)bts_init_128bit_uuid(src_uuid);\r
+    if (src == NULL) {\r
+        bt_os_free(tgt);\r
+        return false;\r
+    }\r
+    if (memcmp(tgt, src, BT_UUID_MAX_LEN) == 0) {\r
+        result = true;\r
+    }\r
+    bt_os_free(src);\r
+    bt_os_free(tgt);\r
+    return result;\r
+}\r
 \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
@@ -821,21 +1207,28 @@ void svr_bluetooth_init(void)
     if (g_ble_init_flag == true) {\r
         return;\r
     }\r
-\r
+    \r
     svr_ble_btcallback_reg();\r
-    svr_ble_adv_start();\r
     svr_ble_bt_init_gatts();\r
-    \r
+#ifdef SUPPORT_ALIPAY_SEC\r
+    // uapi_alipay_svr_init();\r
+    svr_alipay_bluetooth_init();\r
+#endif\r
+    ble_hid_server_init();\r
+    svr_ble_adv_start();\r
+    ble_nus_max_data_len = 100;\r
     g_ble_init_flag = true;\r
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "svr_bluetooth_init22222222222\r\n");\r
+    ble_recv_register_msg_callback(ble_recv_msg_callback);//注册驱动回调\r
     return;\r
 }\r
 //关闭蓝牙\r
 void closeBle(void)\r
 {\r
-    if(AdverFlag == false)//没有连接的状态下关闭蓝牙#只能手动开启蓝牙\r
+    // printf("%d %s\n",__LINE__,__FUNCTION__);\r
+    if(AdverFlag == true)//没有连接的状态下关闭蓝牙#只能手动开启蓝牙\r
     {\r
-        AdverFlag = true;\r
+        AdverFlag = false;\r
         g_ble_init_flag = false;\r
         bd_addr_t bd_addr;\r
         unsigned char addr[BLE_MAC_MAX_LEN] = {0};\r
@@ -845,18 +1238,20 @@ void closeBle(void)
         if(Bleconnect == GAP_BLE_STATE_CONNECTED){//设备连接需要断开\r
             ret = gap_ble_disconnect_remote_device((const bd_addr_t *)&bd_addr);//与固定的mac设置地址进行断开连接\r
         }\r
+        ret = gap_ble_remove_all_pairs();//删除和所有配对的手机app\r
+        gap_remove_all_pairs();\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
+        ret = disable_bt_stack();//关闭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
+    printf("%d %s\n",__LINE__,__FUNCTION__);\r
+    if(AdverFlag == false)//在连接的状态下不需要\r
     {\r
-        AdverFlag = false;\r
-        bool ret = enable_ble();//开启ble 直接断开和当前连接的手机app\r
+        AdverFlag = true;\r
         svr_bluetooth_init();\r
     }\r
 }
\ No newline at end of file
index 77cf6dc..bf07df4 100644 (file)
@@ -1,12 +1,26 @@
-#ifndef BLESERVICE_H
-#define BLESERVICE_H
+#ifndef __BLESERVICE_H
+#define __BLESERVICE_H
 #include <stdint.h>
 #include <stdio.h>
 #include "stdbool.h"
-
+#include "bts_def.h"
+#include "errcode.h"
+extern bd_addr_t phone_addr;
+extern uint8_t bond_flag;
+extern uint8_t phone_mac_data[6];
+extern uint8_t Bleconnect;//蓝牙默认是断开 0 1 为连接
+extern uint8_t shortCmdChara;//2ae3短指令特征值
+extern uint8_t longCmdChara;//长指令特征值 大于20个字节的数据app下发的
+extern uint16_t ble_nus_max_data_len;
 void svr_bluetooth_init(void);//蓝牙服务初始化
 void closeBle(void);//主动关闭蓝牙
 void openBle(void);//主动开启蓝牙
 void svr_ble_adv_start(void);//开始蓝牙广播
+bool get_ble_status(void);//默认是开启一开机
+void svr_ble_btcallback_reg(void);
+bool ble_gatts_cmp_uuid(const bt_uuid_t *tgt_uuid, const bt_uuid_t *src_uuid);
+void srv_ble_server_register_gatt_callbacks(void);
+errcode_t svr_ble_bt_gatts_noyify(uint8_t *data, uint16_t data_len);
+void svr_ble_ble_adv_start(void);
 #endif
 
diff --git a/code/sdk/application/wearable/service/hid_service/CMakeLists.txt b/code/sdk/application/wearable/service/hid_service/CMakeLists.txt
new file mode 100644 (file)
index 0000000..e301a9b
--- /dev/null
@@ -0,0 +1,34 @@
+set(COMPONENT_NAME "hid_service")
+set(PUBLIC_HEADER
+    ${CMAKE_CURRENT_SOURCE_DIR}
+)
+
+
+set(PRIVATE_HEADER
+
+)
+set(SOURCES
+    ${CMAKE_CURRENT_SOURCE_DIR}/hidService.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/hid_service/hidService.c b/code/sdk/application/wearable/service/hid_service/hidService.c
new file mode 100644 (file)
index 0000000..e1c8826
--- /dev/null
@@ -0,0 +1,320 @@
+/*\r
+ * Copyright (c) @CompanyNameMagicTag 2022. All rights reserved.\r
+ * Description: BT HID Service Server Module.\r
+ */\r
+#include "hidService.h"\r
+#include "bleService.h"\r
+#include "bts_gatt_stru.h"\r
+#include "bts_a2dp_source.h"\r
+#include "bts_gatt_server.h"\r
+#include "securec.h"\r
+#include "wearable_log.h"\r
+\r
+#if 1\r
+/* HID information flag remote wakeup */\r
+#define BLE_HID_INFO_FLAG_REMOTE_WAKE_UP_MSK 0x01\r
+/* HID information flag normally connectable */\r
+#define BLE_HID_INFO_FLAG_NORMALLY_CONNECTABLE_MSK 0x02\r
+/* HID information country code */\r
+#define BLE_HID_INFO_COUNTRY_CODE 0x00\r
+/* HID spec version 1.11 */\r
+#define BLE_HID_VERSION  0x0101\r
+/* HID input report id */\r
+#define BLE_HID_REPORT_ID 1\r
+/* HID input report type */\r
+#define BLE_REPORT_REFERENCE_REPORT_TYPE_INPUT_REPORT 1\r
+/* HID output report type */\r
+#define BLE_REPORT_REFERENCE_REPORT_TYPE_OUTPUT_REPORT 2\r
+/* HID gatt server id */\r
+#define BLE_HID_SERVER_ID 1\r
+/* HID ble connect id */\r
+#define BLE_SINGLE_LINK_CONNECT_ID 1\r
+/* HID gatt attribute num */\r
+#define BLE_HID_ATTRIBUTE_NUM 10\r
+/* HID gatt notification flag, do not need confirm */\r
+#define GATT_NOTIFICATION_FLAG 0\r
+/* HID gatt indication flag, need confirm */\r
+#define GATT_INDICATION_FLAG 1\r
+#define INVALID_SERVER_ID 0\r
+\r
+/* gatt server ID */\r
+static uint8_t g_server_id = INVALID_SERVER_ID;\r
+\r
+enum {\r
+    /* HID information characteristic properties */\r
+    HID_INFORMATION_PROPERTIES   = GATT_CHARACTER_PROPERTY_BIT_READ,\r
+    /* HID protocol mode characteristic properties */\r
+    HID_PROTOCOL_MODE_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_READ | GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,\r
+    /* HID report map characteristic properties */\r
+    HID_REPORT_MAP_PROPERTIES    = GATT_CHARACTER_PROPERTY_BIT_READ,\r
+    /* HID input report characteristic properties */\r
+    HID_INPUT_REPORT_PROPERTIES  = GATT_CHARACTER_PROPERTY_BIT_READ | GATT_CHARACTER_PROPERTY_BIT_NOTIFY |\r
+                                   GATT_CHARACTER_PROPERTY_BIT_WRITE,\r
+    /* HID output report characteristic properties */\r
+    HID_OUTPUT_REPORT_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_READ | GATT_CHARACTER_PROPERTY_BIT_WRITE |\r
+                                   GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,\r
+    /* HID control point characteristic properties */\r
+    HID_CONTROL_POINT_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,\r
+};\r
+\r
+#define uint16_to_byte(n) ((uint8_t)(n)), ((uint8_t)((n) >> 8))\r
+\r
+/* hid input report att handle */\r
+uint32_t g_hid_input_report_att_hdl = 0;\r
+\r
+uint32_t g_hid_service_handle = 0;\r
+\r
+__attribute__((unused)) static errcode_t ble_hid_server_register_gatt_callbacks(void);\r
+\r
+#if defined(CHIP_BRANDY)\r
+/* Hid Report Map (Descriptor) */\r
+uint8_t g_srv_hid_report_map[] = {\r
+    0x05, 0x0C, /* Usage Page (Consumer) */\r
+    0x09, 0x01, /* Usage (Consumer Control) */\r
+    0xA1, 0x01, /* Collection (Application) */\r
+    0x85, 0x01, /* Report ID (1) */\r
+    0x09, 0xE9, /* Usage (Volume Increment) */\r
+    0x09, 0xEA, /* Usage (Volume Decrement) */\r
+    0x09, 0xE2, /* Usage (Mute) */\r
+    0x09, 0x30, /* Usage (Power) */\r
+    0x15, 0x01, /* Logical minimum (1) */\r
+    0x25, 0x0C, /* Logical maximum (12) */\r
+    0x75, 0x10, /* Report Size (16) */\r
+    0x95, 0x01, /* Report Count (1) */\r
+    0x81, 0x00, /* INPUT (Data,Array,Absolute,Bit Field) */\r
+    0xC0,       /* End Collection */\r
+};\r
+#else\r
+/* Hid Report Map (Descriptor) */\r
+uint8_t g_srv_hid_report_map[] = {\r
+    0x05, 0x01,       /* Usage Page (Generic Desktop) */\r
+    0x09, 0x06,       /* Usage (Keyboard) */\r
+    0xA1, 0x01,       /* Collection (Application) */\r
+    0x85, 0x01,       /* Report Id (1) */\r
+    0x05, 0x07,       /* Usage Page (Keyboard) */\r
+    0x19, 0xE0,       /* Usage Minimum (Keyboard Left Control) */\r
+    0x29, 0xE7,       /* Usage Maximum (Keyboard Right GUI) */\r
+    0x15, 0x00,       /* Logical minimum (0) */\r
+    0x25, 0x01,       /* Logical maximum (1) */\r
+    0x75, 0x01,       /* Report Size (1) */\r
+    0x95, 0x08,       /* Report Count (8) */\r
+    0x81, 0x02,       /* Input (data,Value,Absolute,Bit Field) */\r
+    0x95, 0x05,       /* Report Count (5) */\r
+    0x05, 0x08,       /* Usage Page (LEDs) */\r
+    0x19, 0x01,       /* Usage Minimum (Num Lock) */\r
+    0x29, 0x05,       /* Usage Maximum (Kana) */\r
+    0x91, 0x02,       /* Output (data,Value,Absolute,Non-volatile,Bit Field) */\r
+    0x95, 0x01,       /* Report Count (1) */\r
+    0x75, 0x03,       /* Report Size (3) */\r
+    0x91, 0x01,       /* Output (Constant,Array,Absolute,Non-volatile,Bit Field) */\r
+    0x95, 0x06,       /* Report Count (6) */\r
+    0x75, 0x08,       /* Report Size (8) */\r
+    0x15, 0x00,       /* Logical minimum (0) */\r
+    0x26, 0xA4, 0x00, /* Logical maximum (164) */\r
+    0x05, 0x07,       /* Usage Page (Keyboard) */\r
+    0x19, 0x00,       /* Usage Minimum (No event indicated) */\r
+    0x2A, 0xA4, 0x00, /* Usage Maximum (Keyboard ExSel) */\r
+    0x81, 0x00,       /* Input (data,Array,Absolute,Bit Field) */\r
+    0xC0,             /* End Collection */\r
+};\r
+#endif\r
+/* 创建服务 */\r
+static void ble_hid_add_service(void)\r
+{\r
+    bt_uuid_t hid_service_uuid = {0};\r
+    bts_data_to_uuid_len2(BLE_UUID_HUMAN_INTERFACE_DEVICE, &hid_service_uuid);\r
+    gatts_add_service(BLE_HID_SERVER_ID, &hid_service_uuid, true);\r
+}\r
+\r
+/* 添加特征:HID information */\r
+static void ble_hid_add_character_hid_information(uint8_t server_id, uint16_t srvc_handle)\r
+{\r
+    /* HID information value for test */\r
+    static uint8_t hid_information_val[] = {uint16_to_byte(BLE_HID_VERSION),\r
+        BLE_HID_INFO_COUNTRY_CODE,\r
+        BLE_HID_INFO_FLAG_REMOTE_WAKE_UP_MSK | BLE_HID_INFO_FLAG_NORMALLY_CONNECTABLE_MSK};\r
+    gatts_add_chara_info_t character;\r
+    bts_data_to_uuid_len2(BLE_UUID_HID_INFORMATION, &character.chara_uuid);\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;\r
+    character.properties = HID_INFORMATION_PROPERTIES;\r
+    character.value_len = (uint16_t)sizeof(hid_information_val);\r
+    character.value = hid_information_val;\r
+    gatts_add_characteristic(server_id, srvc_handle, &character);\r
+}\r
+\r
+/* 添加特征:HID report map */\r
+static void ble_hid_add_character_report_map(uint8_t server_id, uint16_t srvc_handle)\r
+{\r
+    gatts_add_chara_info_t character;\r
+    bts_data_to_uuid_len2(BLE_UUID_REPORT_MAP, &character.chara_uuid);\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_AUTHENTICATION_NEED;\r
+    character.properties = HID_REPORT_MAP_PROPERTIES;\r
+    character.value_len = (uint16_t)sizeof(g_srv_hid_report_map);\r
+    character.value = g_srv_hid_report_map;\r
+    gatts_add_characteristic(server_id, srvc_handle, &character);\r
+}\r
+\r
+/* 添加特征:HID control point */\r
+static void ble_hid_add_character_hid_control_point(uint8_t server_id, uint16_t srvc_handle)\r
+{\r
+    /* HID control point value for test */\r
+    static uint8_t control_point_val[] = {0x00, 0x00};\r
+    gatts_add_chara_info_t character;\r
+    bts_data_to_uuid_len2(BLE_UUID_HID_CONTROL_POINT, &character.chara_uuid);\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;\r
+    character.properties = HID_CONTROL_POINT_PROPERTIES;\r
+    character.value_len = (uint16_t)sizeof(control_point_val);\r
+    character.value = control_point_val;\r
+    gatts_add_characteristic(server_id, srvc_handle, &character);\r
+}\r
+\r
+/* 添加描述符:客户端特性配置 */\r
+static void ble_hid_add_descriptor_ccc(uint8_t server_id, uint16_t srvc_handle)\r
+{\r
+    /* HID client characteristic configuration value for test */\r
+    static uint8_t ccc_val[] = {0x00, 0x00};\r
+    gatts_add_desc_info_t descriptor;\r
+    bts_data_to_uuid_len2(BLE_UUID_CLIENT_CHARACTERISTIC_CONFIGURATION, &descriptor.desc_uuid);\r
+    descriptor.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+    descriptor.value_len = (uint16_t)sizeof(ccc_val);\r
+    descriptor.value = ccc_val;\r
+    gatts_add_descriptor(server_id, srvc_handle, &descriptor);\r
+}\r
+\r
+/* 添加描述符:HID report reference */\r
+static void ble_hid_add_descriptor_report_reference(uint8_t server_id, uint16_t srvc_handle, bool is_input_flag)\r
+{\r
+    /* HID output report reference value for test [report id 1, output] */\r
+    static uint8_t report_reference_val_output[] = {BLE_HID_REPORT_ID, BLE_REPORT_REFERENCE_REPORT_TYPE_OUTPUT_REPORT};\r
+    /* HID input report reference value for test  [report id 1, input] */\r
+    static uint8_t report_reference_val_input[] = {BLE_HID_REPORT_ID, BLE_REPORT_REFERENCE_REPORT_TYPE_INPUT_REPORT};\r
+    gatts_add_desc_info_t descriptor;\r
+    bts_data_to_uuid_len2(BLE_UUID_REPORT_REFERENCE, &descriptor.desc_uuid);\r
+    descriptor.permissions = GATT_ATTRIBUTE_PERMISSION_READ;\r
+    if (is_input_flag) {\r
+        descriptor.value = report_reference_val_input;\r
+        descriptor.value_len = (uint16_t)sizeof(report_reference_val_input);\r
+    } else {\r
+        descriptor.value = report_reference_val_output;\r
+        descriptor.value_len = (uint16_t)sizeof(report_reference_val_output);\r
+    }\r
+    gatts_add_descriptor(server_id, srvc_handle, &descriptor);\r
+}\r
+\r
+/* 添加特征:HID input report(device to host) */\r
+static void ble_hid_add_character_input_report(uint8_t server_id, uint16_t srvc_handle)\r
+{\r
+    /* HID input report value  for test\r
+    * input report format:\r
+    * data0 | data1 | data2 | data3 | data4 | data5 | data6\r
+    * E0~E7 | key   | key   | key   | key   | key   | key\r
+    */\r
+    static uint8_t input_report_value[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};\r
+    gatts_add_chara_info_t character;\r
+    bts_data_to_uuid_len2(BLE_UUID_REPORT, &character.chara_uuid);\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;\r
+    character.properties = HID_INPUT_REPORT_PROPERTIES;\r
+    character.value_len = (uint16_t)sizeof(input_report_value);\r
+    character.value = input_report_value;\r
+    gatts_add_characteristic(server_id, srvc_handle, &character);\r
+\r
+    ble_hid_add_descriptor_ccc(server_id, srvc_handle);\r
+    ble_hid_add_descriptor_report_reference(server_id, srvc_handle, true);\r
+}\r
+\r
+/* 添加特征:HID output report(host to device) */\r
+static void ble_hid_add_character_output_report(uint8_t server_id, uint16_t srvc_handle)\r
+{\r
+    /* HID output report value for test */\r
+    static uint8_t output_report_value[] = {0x00};\r
+    gatts_add_chara_info_t character;\r
+    bts_data_to_uuid_len2(BLE_UUID_REPORT, &character.chara_uuid);\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;\r
+    character.properties = HID_OUTPUT_REPORT_PROPERTIES;\r
+    character.value_len = (uint16_t)sizeof(output_report_value);\r
+    character.value = output_report_value;\r
+    gatts_add_characteristic(server_id, srvc_handle, &character);\r
+\r
+    ble_hid_add_descriptor_report_reference(server_id, srvc_handle, false);\r
+}\r
+\r
+/* 添加特征:HID protocol mode */\r
+static void ble_hid_add_character_protocol_mode(uint8_t server_id, uint16_t srvc_handle)\r
+{\r
+    /* HID protocol mode value for test */\r
+    static uint8_t protocol_mode_val[] = {0x00, 0x00};\r
+    gatts_add_chara_info_t character;\r
+    bts_data_to_uuid_len2(BLE_UUID_PROTOCOL_MODE, &character.chara_uuid);\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ;\r
+    character.properties = HID_PROTOCOL_MODE_PROPERTIES;\r
+    character.value_len = (uint16_t)sizeof(protocol_mode_val);\r
+    character.value = protocol_mode_val;\r
+    gatts_add_characteristic(server_id, srvc_handle, &character);\r
+}\r
+\r
+/* 添加HID服务的所有特征和描述符 */\r
+void ble_hid_add_characters_and_descriptors(uint8_t server_id, uint16_t srvc_handle)\r
+{\r
+    g_hid_service_handle = srvc_handle;\r
+    /* HID Information */\r
+    ble_hid_add_character_hid_information(server_id, srvc_handle);\r
+    /* Report Map */\r
+    ble_hid_add_character_report_map(server_id, srvc_handle);\r
+    /* Protocol Mode */\r
+    ble_hid_add_character_protocol_mode(server_id, srvc_handle);\r
+    /* Input Report */\r
+    ble_hid_add_character_input_report(server_id, srvc_handle);\r
+    /* Output Report */\r
+    ble_hid_add_character_output_report(server_id, srvc_handle);\r
+    /* HID Control Point */\r
+    ble_hid_add_character_hid_control_point(server_id, srvc_handle);\r
+}\r
+#include "bleService.h"\r
+/* 初始化HID device */\r
+void ble_hid_server_init(void)\r
+{\r
+    /* HID server app uuid for test */\r
+    static char server_app_uuid_for_test[] = {0x00, 0x00};\r
+    // ble_server_register_gatt_callbacks();\r
+    // srv_ble_server_register_gatt_callbacks();\r
+    // bt_uuid_t app_uuid = {0};\r
+    // app_uuid.uuid_len = (uint8_t)sizeof(server_app_uuid_for_test);\r
+    // if (memcpy_s(app_uuid.uuid, BT_UUID_MAX_LEN,\r
+    //     server_app_uuid_for_test, sizeof(server_app_uuid_for_test)) != EOK) {\r
+    //     return;\r
+    // }\r
+    // gatts_register_server(&app_uuid, &g_server_id); /* 注册gatt server */\r
+    ble_hid_add_service(); /* 添加HID服务 */\r
+}\r
+\r
+/* device向host发送数据:input report */\r
+errcode_t ble_hid_server_send_input_report(const uint8_t *data, uint8_t len)\r
+{\r
+    gatts_ntf_ind_t param = {0};\r
+    param.attr_handle = (uint16_t)g_hid_input_report_att_hdl;\r
+    param.value_len = len;\r
+    param.value = bt_os_new(len);\r
+    if (param.value == NULL) {\r
+        // bt_acore_log0(LOG_ACORE_DRV_BT, LOG_LEVEL_ERROR, "[hid][ERROR]send input report new fail\r\n");\r
+        return ERRCODE_BT_MALLOC_FAIL;\r
+    }\r
+    if (memcpy_s(param.value, param.value_len, data, len) != EOK) {\r
+        // bt_acore_log0(LOG_ACORE_DRV_BT, LOG_LEVEL_ERROR, "[hid][ERROR]send input report memcpy fail\r\n");\r
+        bt_os_free(param.value);\r
+        return ERRCODE_BT_FAIL;\r
+    }\r
+    gatts_notify_indicate(g_server_id, BLE_SINGLE_LINK_CONNECT_ID, &param);\r
+    bt_os_free(param.value);\r
+    return ERRCODE_BT_SUCCESS;\r
+}\r
+\r
+void ble_hid_add_characters_input_report_cbk(uint16_t srvc_handle)\r
+{\r
+    if ((srvc_handle == 0) || (g_hid_service_handle != srvc_handle)) {\r
+        // bt_acore_log1(LOG_ACORE_DRV_BT, LOG_LEVEL_ERROR,\r
+            // "[hid][ERROR]add report error, service_handle:%d\r\n", srvc_handle);\r
+        return;\r
+    }\r
+    g_hid_input_report_att_hdl = srvc_handle + BLE_HID_CHARACTER_INPUT_REPORT_VALUE_HANDLE_OFFSET;\r
+}\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/application/wearable/service/hid_service/hidService.h b/code/sdk/application/wearable/service/hid_service/hidService.h
new file mode 100644 (file)
index 0000000..bf17cee
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) @CompanyNameMagicTag 2022. All rights reserved.
+ * Description: BT HID Service Server module.
+ */
+
+/**
+ * @defgroup bluetooth_bts_hid_server HID SERVER API
+ * @ingroup  bluetooth
+ * @{
+ */
+#ifndef BLE_HID_SERVER_H
+#define BLE_HID_SERVER_H
+
+#include "errcode.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Human Interface Device UUID */
+#define BLE_UUID_HUMAN_INTERFACE_DEVICE 0x1812
+/* HID Information UUID */
+#define BLE_UUID_HID_INFORMATION 0x2A4A
+/* Report Map UUID */
+#define BLE_UUID_REPORT_MAP 0x2A4B
+/* HID Control Point UUID */
+#define BLE_UUID_HID_CONTROL_POINT 0x2A4C
+/* Boot Keyboard Input Report UUID */
+#define BLE_UUID_BOOT_KEYBOARD_INPUT_REPORT 0x2A22
+/* Boot Keyboard Output Report UUID */
+#define BLE_UUID_BOOT_KEYBOARD_OUTPUT_REPORT 0x2A32
+/* Report UUID */
+#define BLE_UUID_REPORT 0x2A4D
+/* Protocol Mode UUID */
+#define BLE_UUID_PROTOCOL_MODE 0x2A4E
+/* Client Characteristic Configuration UUID */
+#define BLE_UUID_CLIENT_CHARACTERISTIC_CONFIGURATION 0x2902
+/* External Report Reference UUID */
+#define BLE_UUID_EXTERNAL_REPORT_REFERENCE 0x2907
+/* Report Reference UUID */
+#define BLE_UUID_REPORT_REFERENCE 0x2908
+/* HID character value handle offset */
+#define BLE_HID_CHARACTER_INPUT_REPORT_VALUE_HANDLE_OFFSET 8
+#if  1
+/**
+ * @if Eng
+ * @brief  Use this funtion to register callback function of framework.
+ * @par Description:Use this funtion to register callback function of framework.
+ * @attention  NULL
+ * @param  NULL
+ * @retval NULL
+ * @par Dependency:
+ * @li ble_hid_server.h
+ * @else
+ * @brief  注册上层应用的回调。
+ * @par 说明:注册上层应用的回调。
+ * @attention  NULL
+ * @param  NULL
+ * @retval NULL
+ * @par 依赖:
+ * @li ble_hid_server.h
+ * @endif
+ */
+void ble_hid_server_register_callbacks(void);
+
+/**
+ * @if Eng
+ * @brief  Use this funtion to init HID service.
+ * @par Description:add HID service, character and character descriptor, then start service.
+ * @attention  NULL
+ * @param  NULL
+ * @retval NULL
+ * @par Dependency:
+ * @li ble_hid_server.h
+ * @else
+ * @brief  初始化HID服务。
+ * @par 说明:添加HID服务,特征,特征描述符,然后启动服务。
+ * @attention  NULL
+ * @param  NULL
+ * @retval NULL
+ * @par 依赖:
+ * @li ble_hid_server.h
+ * @endif
+ */
+void ble_hid_server_init(void);
+
+/**
+ * @if Eng
+ * @brief  Notify remote device the press button value.
+ * @par Description:Notify remote device the press button value..
+ * @attention  NULL
+ * @param  [in]  value  Press button value.
+ * @param  [in]  len    Length of press button value。
+ * @retval ERRCODE_BT_SUCCESS    Excute successfully
+ * @retval ERRCODE_BT_FAIL       Execute fail
+ * @par Dependency:
+ * @li ble_hid_server.h
+ * @else
+ * @brief  通知对端按键变化。
+ * @par 说明:通知对端按键变化。
+ * @attention  NULL
+ * @param  [in]  data   按键值。
+ * @param  [in]  len    按键值数据长度。
+ * @retval ERRCODE_BT_SUCCESS    执行成功
+ * @retval ERRCODE_BT_FAIL       执行失败
+ * @par 依赖:
+ * @li ble_hid_server.h
+ * @endif
+ */
+errcode_t ble_hid_server_send_input_report(const uint8_t *data, uint8_t len);
+
+/**
+ * @if Eng
+ * @brief  Hid add characters and descriptors.
+ * @par Description:Hid add characters and descriptors.
+ * @attention  NULL
+ * @param  [in]  server_id  server id.
+ * @param  [in]  srvc_handle    service handle.
+ * @retval NULL
+ * @par Dependency:
+ * @li ble_hid_server.h
+ * @else
+ * @brief  HID 服务添加特征和描述符。
+ * @par 说明:HID 服务添加特征和描述符。
+ * @attention  NULL
+ * @param  [in]  server_id   服务id。
+ * @param  [in]  srvc_handle    服务handle。
+ * @retval NULL
+ * @par 依赖:
+ * @li ble_hid_server.h
+ * @endif
+ */
+void ble_hid_add_characters_and_descriptors(uint8_t server_id, uint16_t srvc_handle);
+
+void ble_hid_add_characters_input_report_cbk(uint16_t srvc_handle);
+/**
+ * @}
+ */
+#ifdef __cplusplus
+}
+#endif
+#endif
+#endif
index 26a28df..c45989b 100755 (executable)
@@ -109,15 +109,16 @@ uint32_t get_sec_time(char* time)
     struct tm tm = { 0 };
     char* ptr = time;
     char* tmp;
-
+    wstp_print("time! %s",time);
     // 年
     tmp = strchr(ptr, '-');
     if (tmp == NULL) { return 0; }
     *tmp = '\0';
     // 年的计算需要减去1900
-    tm.tm_year = strtol(ptr, NULL, DECIMAL) - 1900;
+    tm.tm_year = strtol(ptr, NULL, DECIMAL)-1900;
+    wstp_print("tm.tm_year! %d",tm.tm_year);
     if (tm.tm_year < TIME_YEAR_OFFSET) {
-        wstp_print("ERR!year num must bigger than 1970!");
+        wstp_print("ERR!year num must bigger than 1970! %d",tm.tm_year);
         return 0;
     }
     ptr = tmp + 1;
index 1ce9ce1..590632c 100755 (executable)
@@ -132,7 +132,8 @@ target = {
                     'TPTYPE_FT6X46',
                     'SUPPORT_CHARGER_PLUG_DETECTION_NOTIFICATION',
                     'SUPPORT_AT_CUSTOMUTILS',
-                    'SUPPORT_ALIPAY_SEC'
+                    'SUPPORT_ALIPAY_SEC',
+                    'SUPPORT_BLE_SERVICE'
                     ],
         'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", 'dfx_nv', "osal", "arch_port", "-:testsuite",
                           "liteos_port", 'lcd', 'qspi_display', 'dfx_file_operation',
@@ -159,16 +160,17 @@ target = {
                           "audio_manager",
                           "custom_utils",
                           "rotary_encoder",
-                          #"nativelauncher",
-                           "fd230launcher",
-                           "ppg_service",
-                          "batterry_service"
-                          "ble_service"
+                        #   "nativelauncher",
+                          "fd230launcher",
+                          "ppg_service",
+                          "batterry_service",
+                          "ble_service",
+                          "hid_service"
                                                  ],
         'ram_component_set': ['bgh', 'media', 'gpu', 'graphic_uikit', 'bgh_audio', 'dfx_set', 'ohos_set', 'wearable_set', 'alipay_set'],
         'dsp_version': 'max',
         'packet': True,
-        #'fs_image_path':'evb4',
+        # 'fs_image_path':'evb4',
          'fs_image_path':'fd230',
         'fs_image': True
     },
index 09a488b..a0a158f 100755 (executable)
@@ -10,6 +10,7 @@
  */
 #ifndef BLE_HID_SERVER_H
 #define BLE_HID_SERVER_H
+#define HID_TEST (0)
 
 #include "errcode.h"
 
@@ -18,7 +19,7 @@ extern "C" {
 #endif
 
 /* Human Interface Device UUID */
-#define BLE_UUID_HUMAN_INTERFACE_DEVICE 0x18e2
+#define BLE_UUID_HUMAN_INTERFACE_DEVICE 0x1812
 /* HID Information UUID */
 #define BLE_UUID_HID_INFORMATION 0x2A4A
 /* Report Map UUID */
@@ -41,7 +42,7 @@ extern "C" {
 #define BLE_UUID_REPORT_REFERENCE 0x2908
 /* HID character value handle offset */
 #define BLE_HID_CHARACTER_INPUT_REPORT_VALUE_HANDLE_OFFSET 8
-
+#if  HID_TEST
 /**
  * @if Eng
  * @brief  Use this funtion to register callback function of framework.
@@ -140,3 +141,4 @@ void ble_hid_add_characters_input_report_cbk(uint16_t srvc_handle);
 }
 #endif
 #endif
+#endif
index 6d2463a..9c7c079 100755 (executable)
@@ -10,7 +10,7 @@
 extern "C" {
 #endif
 
-#define BLE_PRO_DIS_SERVICE_UUID16 0x180A
+#define BLE_PRO_DIS_SERVICE_UUID16 0x18e0
 #define BLE_PRO_DIS_SYSTEM_ID_UUID16 0x2A23
 #define BLE_PRO_DIS_MODEL_NUMBER_UUID16 0x2A24
 #define BLE_PRO_DIS_SERIAL_NUMBER_UUID16 0x2A25
index 839b34d..6bfd8e4 100755 (executable)
@@ -52,6 +52,12 @@ static void ble_server_service_add_cbk(uint8_t server_id, bt_uuid_t *uuid, uint1
     bt_uuid_t fmp_service_uuid = {0};
     bts_data_to_uuid_len2(FMP_IMMEDIATE_ALERT_SERVICE_UUID, &fmp_service_uuid);
 
+    bt_uuid_t alpay_service_uuid = {0};
+    bts_data_to_uuid_len2(0x3802, &alpay_service_uuid);
+
+    bt_uuid_t ble_service_uuid = {0};
+    bts_data_to_uuid_len2(0x18e0, &ble_service_uuid);
+
     if (bt_gatts_cmp_uuid(uuid, &hid_service_uuid) == true) {
         ble_hid_add_characters_and_descriptors(server_id, handle);
         gatts_start_service(server_id, handle);
@@ -61,8 +67,12 @@ static void ble_server_service_add_cbk(uint8_t server_id, bt_uuid_t *uuid, uint1
     } else if (bt_gatts_cmp_uuid(uuid, &fmp_service_uuid) == true) {
         fmp_target_add_alc_characteristic(server_id, handle);
         gatts_start_service(server_id, handle);
-    } else {
-        bts_error("[BLE] server add service cbk, service uuid is not matched.\n");
+    } else if (bt_gatts_cmp_uuid(uuid, &alpay_service_uuid) == true) {
+        ble_hid_add_characters_and_descriptors(server_id, handle);
+        gatts_start_service(server_id, handle);
+    }else if (bt_gatts_cmp_uuid(uuid, &ble_service_uuid) == true) {
+        ble_hid_add_characters_and_descriptors(server_id, handle);
+        gatts_start_service(server_id, handle);
     }
 }
 
@@ -117,10 +127,11 @@ static void ble_server_req_read_cbk(uint8_t server_id, uint16_t conn_id, gatts_r
     bts_info("[BLE]server read req server: %u status: %u conn_id:%hu handle: %hu \n",
         server_id, status, conn_id, cb_para->handle);
 }
-
+#include "wearable_log.h"
 static void ble_server_req_write_cbk(uint8_t server_id, uint16_t conn_id, gatts_req_write_cb_t *cb_para,
     errcode_t status)
 {
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "ble_server_req_write_cbk!!!!!!!!!\r\n");
     bts_info("[BLE]server write req server: %u status: %u conn_id:%hu handle: %hu \n",
         server_id, status, conn_id, cb_para->handle);
     if (status != ERRCODE_BT_SUCCESS) {
old mode 100755 (executable)
new mode 100644 (file)
index c8d40a0..93dc929
@@ -10,6 +10,7 @@
 #include "bts_uuid.h"
 #include "ble_hid_take_photo_server.h"
 
+#if HID_TEST
 /* HID information flag remote wakeup */
 #define BLE_HID_INFO_FLAG_REMOTE_WAKE_UP_MSK 0x01
 /* HID information flag normally connectable */
@@ -268,13 +269,14 @@ void ble_hid_add_characters_and_descriptors(uint8_t server_id, uint16_t srvc_han
     /* HID Control Point */
     ble_hid_add_character_hid_control_point(server_id, srvc_handle);
 }
-
+#include "bleService.h"
 /* 初始化HID device */
 void ble_hid_server_init(void)
 {
     /* HID server app uuid for test */
     static char server_app_uuid_for_test[] = {0x00, 0x00};
     ble_server_register_gatt_callbacks();
+    // srv_ble_server_register_gatt_callbacks();
     bt_uuid_t app_uuid = {0};
     app_uuid.uuid_len = (uint8_t)sizeof(server_app_uuid_for_test);
     if (memcpy_s(app_uuid.uuid, BT_UUID_MAX_LEN,
@@ -318,4 +320,5 @@ void ble_hid_add_characters_input_report_cbk(uint16_t srvc_handle)
         return;
     }
     g_hid_input_report_att_hdl = srvc_handle + BLE_HID_CHARACTER_INPUT_REPORT_VALUE_HANDLE_OFFSET;
-}
\ No newline at end of file
+}
+#endif
\ No newline at end of file
index b3fd574..fa5c044 100755 (executable)
@@ -255,7 +255,7 @@ static void btsrv_sample_cmd_enable_bt(const char **params, int32_t params_cnt)
 {
     bts_unused(params);
     bts_unused(params_cnt);
-
+    
     errcode_t ret = enable_bt_stack();
     bts_sample_log("enable_bt_stack ret(errcode_t): %x\n", ret);
 }