优化蓝牙协议框架
authordxy <1731678236@qq.com>
Tue, 26 Mar 2024 11:34:27 +0000 (19:34 +0800)
committerdxy <1731678236@qq.com>
Tue, 26 Mar 2024 11:34:27 +0000 (19:34 +0800)
code/sdk/application/wearable/alipay/service/alipay_bluetooth.c
code/sdk/application/wearable/alipay/service/alipay_bluetooth.h
code/sdk/application/wearable/alipay/service/alipay_feature.c
code/sdk/application/wearable/fd230app/nativeui/bluetooth/src/BluetoothModel.cpp
code/sdk/application/wearable/nativeapp/nativeui/bluetooth/src/BluetoothModel.cpp
code/sdk/application/wearable/service/ble_service/bleEvent.c
code/sdk/application/wearable/service/ble_service/bleEvent.h
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/hidService.c

index e035034..8335686 100644 (file)
 #include "osal_task.h"\r
 #include "alipay_feature.h"\r
 #include "securec.h"\r
-#include "wearable_log.h"\r
-#include "bleService.h"\r
-#include "alipay_bluetooth.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  "KUMIU6"\r
+#define ALIPAY_BLE_DEFAULT_NAME_LEN 9 \r
 \r
 // Alipay 蓝牙模块全局变量\r
 static gap_ble_callbacks_t g_alipay_gapble_cbs;\r
@@ -56,29 +71,19 @@ 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
-    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
+\r
+    int32_t ret = gap_ble_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
+        ALIPAY_PRINT_ERR(0, "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_NAME_LENGTH);\r
-        ble_name_len = ALIPAY_BLE_NAME_LENGTH + 1;        \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
     }\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
+    ALIPAY_PRINT_DEBUG(0, "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
@@ -96,20 +101,25 @@ 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[i];\r
+        ble_data_mac_switch[--k] = addr_info.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
+    ALIPAY_PRINT_ERR(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
     memcpy_s(adv_mac_head + ALIPAY_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
+    uint8_t scan_data[20];\r
+    memset(scan_data,0,20);\r
+    adv_data_info.scan_rsp_data = scan_data;\r
+    adv_data_info.scan_rsp_length = 0;\r
     adv_data_info.adv_data = adv_data;\r
     adv_data_info.adv_length = adv_data_len;\r
-    ALIPAY_PRINT_DEBUG(0, "adv_data_info.adv_length:%u.", adv_data_len);\r
+    ALIPAY_PRINT_ERR(0, "adv_data_info.adv_length:%u.", adv_data_len);\r
 \r
-    gap_ble_set_adv_data(adv_id, &adv_data_info);\r
+    errcode_t gap_ret = gap_ble_set_adv_data(adv_id, &adv_data_info);\r
+    ALIPAY_PRINT_ERR(0, "adv_data_info.adv_length: gap_ret %d.", gap_ret);\r
     return;\r
 }\r
 \r
@@ -134,22 +144,24 @@ void svr_alipay_ble_adv_start(void)
     gap_ble_set_adv_param(adv_id, &adv_para);\r
     gap_ble_set_local_appearance(GAP_BLE_APPEARANCE_TYPE_GENERIC_WATCH);\r
     svr_alipay_ble_adv_data_set(adv_id);\r
-    bool ret = gap_ble_start_adv(adv_id);\r
+    errcode_t ret = gap_ble_start_adv(adv_id);\r
     if (ret) {\r
-        ALIPAY_PRINT_ERR(0, "svr_alipay_ble_adv_start bt gap_ble_start_adv  ret = 0x%x", ret);\r
+        ALIPAY_PRINT_ERR(0, "svr_alipay_ble_adv_start bt gap_ble_start_adv errror  ret = 0x%x", ret);\r
     }\r
-    ALIPAY_PRINT_DEBUG(0, "svr_alipay_ble_adv_start bt gap_ble_start_adv  ret = 0x%x", ret);\r
+    ALIPAY_PRINT_ERR(0, "svr_alipay_ble_adv_start bt gap_ble_start_adv  ret = 0x%x", ret);\r
 }\r
-\r
+extern void svr_alipay_reset_init(void);\r
 static void svr_alipay_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
+    ALIPAY_PRINT_ERR(0, "BleConnStateChangeCallback conn_id 0x%x, conn_state 0x%x, pair_state 0x%x", conn_id,\r
         conn_state, pair_state);\r
     g_alipay_conn_id = conn_id;\r
     if (GAP_BLE_STATE_DISCONNECTED == conn_state) { // restart ble adv when disconnected\r
-        svr_alipay_ble_adv_start();\r
+        // svr_alipay_ble_adv_start();\r
+        svr_alipay_reset_init();\r
+        // gap_ble_start_adv(ALIPAY_BLE_ADV_ID);\r
     } else {\r
         svr_alipay_set_adv_start_state(false);\r
     }\r
@@ -170,10 +182,11 @@ static void svr_alipay_ble_adv_stop_cb(uint8_t adv_id, adv_status_t status)
 {\r
     ALIPAY_PRINT_DEBUG(0, "BleAdvStopCallback adv_id: %d, status:%d\n", adv_id, status);\r
 }\r
-\r
+static uint16_t alipay_server_handle = 0;\r
 static void svr_alipay_bt_gatts_service_add_cb(uint8_t server_id, bt_uuid_t *uuid, uint16_t srv_handle,\r
     errcode_t status)\r
 {\r
+    alipay_server_handle = srv_handle;\r
     ALIPAY_PRINT_DEBUG(0, "BtGattsServiceAddCallback 0x%x 0x%x 0x%x 0x%x", status, server_id, srv_handle,\r
         *((uint16_t *)uuid->uuid));\r
     int ret;\r
@@ -197,66 +210,7 @@ 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
@@ -337,7 +291,7 @@ static void svr_alipay_bt_gatts_req_read_cb(uint8_t server_id, uint16_t conn_id,
 static void svr_alipay_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
-    ALIPAY_PRINT_DEBUG(0, "write callback,str:%s len:%u", write_cb_para->value, write_cb_para->length);\r
+    ALIPAY_PRINT_ERR(0, "write callback,str:%s len:%u", write_cb_para->value, write_cb_para->length);\r
     uint8_t *msg_data = write_cb_para->value;\r
     errcode_t ret = svr_alipay_msg_write(ALIPAY_MSG_BT, msg_data, write_cb_para->length, false);\r
     if (ret != ERRCODE_SUCC) {\r
@@ -354,17 +308,17 @@ 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 ret1:0x%x. serverid:%u,conn_id:%u,handle:%u.", ret, g_alipay_server_id,\r
+    ALIPAY_PRINT_ERR(0, "gatts_notify_indicate ret: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
+extern void srv_ble_gap_register_cb(void);\r
 static void svr_alipay_btcallback_reg(void)\r
 {\r
-    // g_alipay_gapble_cbs.conn_state_change_cb = svr_alipay_ble_connstate_change_cb;\r
-    // g_alipay_gapble_cbs.start_adv_cb = svr_alipay_ble_adv_start_cb;\r
-    // g_alipay_gapble_cbs.stop_adv_cb = svr_alipay_ble_adv_stop_cb;\r
-    // g_alipay_gapble_cbs.set_adv_data_cb = svr_alipay_ble_set_adv_data_cb;\r
-    // gap_ble_register_callbacks(&g_alipay_gapble_cbs);\r
+    g_alipay_gapble_cbs.conn_state_change_cb = svr_alipay_ble_connstate_change_cb;\r
+    g_alipay_gapble_cbs.start_adv_cb = svr_alipay_ble_adv_start_cb;\r
+    g_alipay_gapble_cbs.stop_adv_cb = svr_alipay_ble_adv_stop_cb;\r
+    g_alipay_gapble_cbs.set_adv_data_cb = svr_alipay_ble_set_adv_data_cb;\r
+    gap_ble_register_callbacks(&g_alipay_gapble_cbs);\r
 \r
     g_alipay_gatts_cbs.add_service_cb = svr_alipay_bt_gatts_service_add_cb;\r
     g_alipay_gatts_cbs.add_characteristic_cb = svr_alipay_bt_gatts_characteristic_add_cb;\r
@@ -377,6 +331,7 @@ static void svr_alipay_btcallback_reg(void)
     g_alipay_gatts_cbs.mtu_changed_cb = NULL;\r
     gatts_register_callbacks(&g_alipay_gatts_cbs);\r
 }\r
+//gatts_unregister_server\r
 \r
 static void svr_alipay_bt_init_gatts(void)\r
 {\r
@@ -389,37 +344,51 @@ static void svr_alipay_bt_init_gatts(void)
     memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&service_id, sizeof(service_id));\r
     ret = gatts_register_server(&uuid, &server_id); /* 注册gatt server */\r
     if (ret != ERRCODE_SUCC) {\r
-        ALIPAY_PRINT_ERR(0, "gatts_register_server ret:%u.\r\n", ret);\r
+        // ALIPAY_PRINT_ERR(0, "gatts_register_server err ret:%u.\r\n", ret);\r
     }\r
-    ALIPAY_PRINT_DEBUG(0, "gatts_register_server ret: 0x%x server_id = 0x%x", ret, server_id);\r
+    ALIPAY_PRINT_ERR(0, "gatts_register_server ret: 0x%x server_id = 0x%x", ret, server_id);\r
     g_alipay_server_id = server_id;\r
     uuid.uuid_len = sizeof(service_id);\r
     memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&service_id, sizeof(service_id));\r
     ret = gatts_add_service(server_id, &uuid, true);\r
     if (ret != ERRCODE_SUCC) {\r
-        ALIPAY_PRINT_ERR(0, "gatts_add_service ret:%u.\r\n", ret);\r
+        \r
     }\r
+    ALIPAY_PRINT_ERR(0, "gatts_add_service ret:%u.\r\n", ret);\r
     return;\r
 }\r
-void ble_alipay_add_characters_input_report_cbk(uint16_t srvc_handle)\r
+void alipay_unregist_server(void)\r
 {\r
-   \r
+    gatts_delete_all_services(g_alipay_server_id);\r
+    gatts_unregister_server(g_alipay_server_id);\r
+    svr_alipay_ble_adv_stop();\r
 }\r
-static uint8_t g_server_id = 0;\r
+extern void ble_unregist_server(void);\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
-    if (g_alipay_ble_init_flag == true) {\r
-        return;\r
+    ble_unregist_server();\r
+    disable_bt_stack();\r
+    svr_alipay_ble_adv_stop();\r
+    osDelay(100);\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
-    // 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
+    // if (g_alipay_ble_init_flag == true) {\r
+    //     return;\r
+    // }\r
+    svr_alipay_btcallback_reg();\r
+    svr_alipay_bt_init_gatts();\r
+    svr_alipay_ble_adv_start();\r
     g_alipay_ble_init_flag = true;\r
     return;\r
 }\r
+void svr_alipay_reset_init(void)//重新启动alipa的服务\r
+{\r
+    ble_unregist_server();\r
+    osDelay(100);\r
+    svr_alipay_btcallback_reg();\r
+    svr_alipay_bt_init_gatts();\r
+    svr_alipay_ble_adv_start();\r
+    return;\r
+}
\ No newline at end of file
index 07bbd8f..47f080e 100644 (file)
@@ -26,5 +26,6 @@
 
 #define ALIPAY_BLE_MAC_MAX_LEN 6
 void ble_alipay_add_characters_input_report_cbk(uint16_t srvc_handle);
+void alipay_add_chart_decr_cb(uint8_t server_id,uint16_t srv_handle);
 #endif
 
index 51aafb2..df31aa8 100755 (executable)
@@ -22,6 +22,7 @@
 #include "osal_msgqueue.h"
 #include "thread_init.h"
 #include "alipay_transit.h"
+#include "bleService.h"
 #include "vendor_file.h"
 #if defined(__FREERTOS__)
 #include "FreeRTOS.h"
@@ -67,13 +68,16 @@ static mc_payment_state_t svr_alipay_get_paystate(void)
 {
     return PAYMENT_UNSUPPORTED;
 }
-
+extern void svr_alipay_reset_init(void);
 static int32_t svr_alipay_notify_bt(bool value)
 {
     if (value) {
-        svr_alipay_ble_adv_start();
+        printf("svr_alipay_notify_bt true:%d",value);
+        svr_alipay_bluetooth_init();
     } else {
-        svr_alipay_ble_adv_stop();
+        printf("svr_alipay_notify_bt false:%d",value);
+        svr_bluetooth_init();
+        // svr_alipay_ble_adv_stop();
     }
     return 0;
 }
index 4b88e20..0831e6e 100644 (file)
@@ -77,8 +77,8 @@ BluetoothModel *BluetoothModel::GetInstance(void)
 \r
 void BluetoothModel::Init()\r
 {\r
-    bool ret = enable_bt_stack();\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bt enable_bt_stack ret = %d", ret);\r
+    // bool ret = enable_bt_stack();\r
+    // WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bt enable_bt_stack ret = %d", ret);\r
 \r
     BtInitCallBacks();\r
 \r
index ecbb067..a89f5f3 100755 (executable)
@@ -77,8 +77,8 @@ BluetoothModel *BluetoothModel::GetInstance(void)
 \r
 void BluetoothModel::Init()\r
 {\r
-    bool ret = enable_bt_stack();\r
-    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bt enable_bt_stack ret = %d", ret);\r
+    // bool ret = enable_bt_stack();\r
+    // WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "bt enable_bt_stack ret = %d", ret);\r
 \r
     BtInitCallBacks();\r
 \r
index 3db715c..6cda489 100644 (file)
 #include "osal_timer.h"\r
 #include "bleEvent.h"\r
 #include "app_common_api.h"\r
+#include "hidService.h"\r
 #include "../../../../../open_source/openharmony/third_party/cJSON/cJSON.h"\r
 #include "errcode.h"\r
-\r
+#define PHONE_WATCH_CONFIG_PATH "/user/userdata/phone_watch.json"\r
+#define ALARM_DATA_CONFIG_PATH "/user/userdata/alarm_test.json"\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
 ble_recv_data_info_t ble_recv_data;\r
 ble_recv_msg_callback_t g_recv_msg_toUI = NULL;\r
-\r
+#if 1\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
@@ -44,27 +52,123 @@ ble_recv_msg_callback_t ble_recv_get_send_msg_callback_func(void)
 {\r
     return g_recv_msg_toUI;\r
 }\r
-\r
+static msg_get_heart_set_param_info_t hr_param;\r
+static msg_get_spo2_set_param_info_t spo2_param;\r
+static msg_drink_set_param_info_t drink_info;\r
+static msg_drink_param_info_t drink_on_t;//喝水提醒开关\r
+static msg_watch_lcd_param_info_t watch_lcd_param;//手表屏幕参数\r
+static msg_get_voice_vibration_info_t voice_vibration;\r
+static msg_caramer_info_t caramer_info;//拍照手势状态 0退出拍照 1进入拍照\r
+static msg_user_info_t user_info;//用户信息 体重 身高 年龄 性别\r
+//手表TODO 这是一个sample\r
 int ble_recv_msg_callback(uint8_t writ_read,uint16_t msg_typeID, uint8_t *msg_data, uint16_t msg_datalen)\r
 {\r
+    if(writ_read == READ_FLASH_DATA){//读手表数据 WRITE_FLASH_DATA 写手表数据\r
+        switch (msg_typeID)\r
+        {\r
+            case SET_DRINK_PARAM_CMD:\r
+                memset(&drink_info,0,sizeof(msg_drink_set_param_info_t));\r
+                drink_info.drink_on = 1;\r
+                drink_info.alarm_mode = 1;\r
+                drink_info.start_hour = 8;\r
+                drink_info.startt_min = 9;\r
+                drink_info.end_hour = 23;\r
+                drink_info.end_min = 59;\r
+                drink_info.frequenc = 1;\r
+                memcpy(msg_data,&drink_info,sizeof(msg_drink_set_param_info_t));\r
+                \r
+                break;\r
+            case GET_WATCH_HR_SET_PARAM_CMD:\r
+                memset(&hr_param,0,sizeof(msg_get_heart_set_param_info_t));\r
+                hr_param.frequence = 1;\r
+                hr_param.remind_on = 1;\r
+                hr_param.max_min = 1;\r
+                hr_param.heart = 180;\r
+                memcpy(msg_data,&hr_param,sizeof(msg_get_heart_set_param_info_t));\r
+               \r
+                break;\r
+            case GET_DRINK_SWITCH_CMD:\r
+                \r
+                memset(&drink_on_t,0,sizeof(msg_drink_param_info_t));\r
+                drink_on_t.drink_on = 1;\r
+                memcpy(msg_data,&drink_on_t,sizeof(msg_drink_param_info_t));\r
+                break;\r
+            case GET_WATCH_LCD_PARAM_CMD:\r
+                memset(&watch_lcd_param,0,sizeof(msg_watch_lcd_param_info_t));\r
+                watch_lcd_param.brigntess = 10;\r
+                watch_lcd_param.screen_time = 3;\r
+                watch_lcd_param.wrist_on = 0;\r
+                memcpy(msg_data,&watch_lcd_param,sizeof(msg_get_heart_set_param_info_t));\r
+               \r
+                break;\r
+            default:\r
+                break;\r
+        }\r
+        \r
+       \r
+    }else{\r
+        switch (msg_typeID)\r
+        {\r
+            case SET_DRINK_PARAM_CMD:\r
+                \r
+                memset(&drink_info,0,sizeof(msg_drink_set_param_info_t));\r
+                drink_info.drink_on = msg_data[0];\r
+                drink_info.alarm_mode = msg_data[1];\r
+                drink_info.target_drink = msg_data[2]+msg_data[3]*256;\r
+                drink_info.start_hour = msg_data[4];\r
+                drink_info.startt_min = msg_data[5];\r
+                drink_info.end_hour = msg_data[6];\r
+                drink_info.end_min = msg_data[7];\r
+                drink_info.frequenc = msg_data[8];\r
+                printf("drink_info %d %d %d %d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,\r
+                drink_info.target_drink,drink_info.start_hour,drink_info.startt_min,drink_info.end_hour,\r
+                drink_info.end_min,drink_info.frequenc);\r
+                // memcpy(msg_data,&drink_info,sizeof(msg_drink_set_param_info_t));\r
+                break;\r
+            case GET_DRINK_SWITCH_CMD:\r
+                \r
+                memset(&drink_on_t,0,sizeof(msg_drink_param_info_t));\r
+                drink_on_t.drink_on = 1;\r
+                memcpy(msg_data,&drink_on_t,sizeof(msg_drink_param_info_t));\r
+                break;\r
+            \r
+            default:\r
+                break;\r
+        }\r
+    }\r
+    for(uint16_t i = 0;i<msg_datalen;i++)\r
+    {\r
+        printf("%02x ",msg_data[i]);\r
+    }\r
     int ret = 1;\r
     return ret;\r
 }\r
+\r
+void cameram_data(void)//拍照发送数据 调用这个接口即可\r
+{\r
+    uint8_t data[2]={0x01,0x00};\r
+    errcode_t ret = ble_hid_server_send_input_report(&data,2);\r
+    osal_msleep(100); /* wait 100 ms */\r
+    memset(data,0,2);\r
+    (void)ble_hid_server_send_input_report(&data, 2); /* 上报按下按键 把停止发送指令也要发送 防止一直拍照*/\r
+    printf("cameram_send_data:0x%x",ret);\r
+}\r
+\r
 bool bigDataBufState=false;//大数据传输状态\r
-static bool Check_CRC(uint8_t *crcnum,uint16_t len)//计算20byte的的校验位\r
+static bool Check_CRC(uint8_t *crcnum,uint16_t len,uint8_t crcvalue)//计算20byte的的校验位\r
 {\r
        uint8_t crcbuf  = 0;\r
     uint8_t lrcValue = 0x00;\r
-       for(uint16_t i = 0; i < len-1; i++)\r
+       for(uint16_t i = 0; i < len; i++)\r
        {\r
                lrcValue =lrcValue+ crcnum[i];\r
-        printf("%x ",crcnum[i]);\r
+        // printf("%02x ",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
+    WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC ret:0x%x len:%d\r\n",crcbuf,len);\r
+       if(crcbuf == crcvalue)\r
     {\r
         WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "Check_CRC true:\r\n");\r
            return true;\r
@@ -83,15 +187,10 @@ static uint8_t Calculate_CRC(uint8_t *crcnum,uint16_t len)//计算20byte
        {\r
                lrcValue =lrcValue+ crcnum[i];\r
     }\r
+    // printf("Calculate_CRC:%x,len:%d",lrcValue,len);\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
@@ -100,9 +199,7 @@ static uint8_t cal_sum(uint8_t *crcnum,uint16_t len)//计算20byte
        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
@@ -123,11 +220,11 @@ static cJSON *cjson_json_tmp = NULL;
 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(bigDataBufState == true || sendbigDataBufState == true)return ERRCODE_FAIL; //在手表发送分包数据时 手表不允许发指令给app\r
+    // for(uint16_t i = 0;i<len;i++)\r
+    // {   \r
+    //    printf("%02x ",buf[i]);\r
+    // }\r
     if(Bleconnect == true )\r
     {\r
         ret = svr_ble_bt_gatts_noyify(buf,len);\r
@@ -137,29 +234,13 @@ errcode_t sendBleData(uint8_t *buf,uint16_t len)
 }\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 phone_mac[6];//手机下发的mac地址 第一次连接为空 \r
 uint8_t parie_mac[6];//配对完成之后的的mac地址\r
 uint8_t phoneDataFlag = 0;\r
 //发送配对指令\r
@@ -178,17 +259,15 @@ void sendConfirmParieSucess(void)
     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
+    sendBleData(value,19);\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
+    char *devname;//手机设备名称\r
+    uint8_t type = 0;\r
     uint8_t count1 = 0;\r
     uint8_t count2 = 0;\r
     uint8_t *json;\r
@@ -201,12 +280,14 @@ static void jsonCheck_phoneinfor(uint8_t *buf,uint8_t *mac_data)//解析手机
 \r
     cJSON* pn = cJSON_GetObjectItem(root, "pn");\r
     if (cJSON_IsString(pn)) {\r
-        printf("产品名称: %s\n", pn->valuestring);\r
+        printf("设备名称: %s\n", pn->valuestring);\r
+        \r
     }\r
 \r
     cJSON* tp = cJSON_GetObjectItem(root, "tp");\r
     if (cJSON_IsNumber(tp)) {\r
         printf("类型: %d\n", tp->valueint);\r
+        type = tp->valueint;\r
     }\r
 \r
     cJSON* mac = cJSON_GetObjectItem(root, "mac");\r
@@ -216,7 +297,7 @@ static void jsonCheck_phoneinfor(uint8_t *buf,uint8_t *mac_data)//解析手机
         cJSON_ArrayForEach(macElement, mac) {\r
             if (cJSON_IsNumber(macElement)) {\r
                 printf("%d", macElement->valueint);\r
-                if (macElement->next != NULL) {\r
+                if (macElement->prev != NULL) {\r
                     phone_mac[count1++] = macElement->valueint;\r
                     mac_tmp[count2++] = macElement->valueint;\r
                     printf(", ");\r
@@ -225,7 +306,7 @@ static void jsonCheck_phoneinfor(uint8_t *buf,uint8_t *mac_data)//解析手机
         }\r
         printf("\n");\r
     }\r
-    if(sizeof(mac_tmp) != 0)\r
+    if(mac_tmp[0] != 0 && mac_tmp[1] != 0 && mac_tmp[2] != 0 && mac_tmp[3] != 0 && mac_tmp[4] != 0 && mac_tmp[5] != 0)\r
     {\r
         printf("MAC地址: len %d",sizeof(mac_tmp));\r
         memcpy(mac_data,mac_tmp,6);\r
@@ -248,20 +329,11 @@ errcode_t bondSucessCmd(void)//发送解绑指令,解绑界面调用这个函数
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp,2);\r
     value[17] = 1;\r
-    value[18] = Calculate_CRC(value+17,1);\r
+    value[18] = Calculate_CRC(value,18);\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
+    gap_ble_remove_all_pairs(); \r
+    gap_remove_all_pairs();\r
     closeBle();\r
     return sendok;\r
 }\r
@@ -285,12 +357,12 @@ void clearPaireFlag(uint8_t flag)
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp,2);\r
     value[17] = flag;\r
-    value[18] = Calculate_CRC(value+17,1);\r
+    value[18] = Calculate_CRC(value,18);\r
     sendBleData(value,19);\r
 }\r
-void clearPaireCmd(uint8_t *crcnum,uint16_t len)//发送清除配对指令\r
+void clearPaireCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)//发送清除配对指令\r
 {\r
-    if(Check_CRC(crcnum,len))\r
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         //弹出清除配对界面不弹出是则发送0x02操作失败 1操作成功 0校验失败\r
         clearPaireFlag(1);\r
@@ -304,7 +376,6 @@ void clearPaireCmd(uint8_t *crcnum,uint16_t len)//发送清除配对指令
 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
@@ -324,12 +395,12 @@ void alarmData(void)
 \r
 }\r
 \r
-uint8_t bond_phone = 0;//是否和手机app绑定过已经绑定就不需要配对指令给app,直接发起配对\r
-void getPhoneInfo(uint8_t *buf,uint16_t len)//获取手机信息\r
+uint8_t firts_bond = 0;//是否和手机app绑定过已经绑定就不需要配对指令给app,直接发起配对\r
+void getPhoneInfo(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取手机信息\r
 {\r
-   \r
+   //static void * next_tmp;\r
     uint8_t value[20];\r
-    uint8_t crcvalue = 0;\r
+    // uint8_t crcvalue = 0;\r
     memset(value,0,20);\r
     uint32_t tmp = 1;\r
     uint16_t tmp_fen= 1;\r
@@ -342,58 +413,63 @@ void getPhoneInfo(uint8_t *buf,uint16_t len)//获取手机信息
     memcpy(value+15,&tmp_fen,2);\r
     phoneDataFlag = 1;\r
     \r
-    if(Check_CRC(buf,len))\r
+    if(Check_CRC(crcnum,len,crcvalue))\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
+        tmp_data = crcnum;\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
+        errcode_t ret = 0;\r
+        firts_bond = 0;\r
+\r
+        uint8_t save_mac[6];\r
+        uint8_t save_mac_t[6];\r
+        uint8_t count = 0;\r
+        uint8_t count_t = 0;\r
+        FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");\r
+        if (jsfile != NULL) {\r
+            printf("succes opening file\n");\r
+            fseek(jsfile, 0, SEEK_END);\r
+            long fileSize = ftell(jsfile);\r
+            fseek(jsfile, 0, SEEK_SET);\r
+\r
+            char *jsonData = (char *)malloc(fileSize + 1);\r
+            fread(jsonData, 1, fileSize, jsfile);\r
+            jsonData[fileSize] = '\0';\r
+            fclose(jsfile);\r
+\r
+            // 解析JSON数据\r
+            cJSON *root = cJSON_Parse(jsonData);\r
+            free(jsonData);\r
+\r
+            if (root != NULL) {\r
+                cJSON *modifiedJson = cJSON_GetObjectItem(root,"mac");\r
+                if (cJSON_IsArray(modifiedJson)) {\r
+                    printf("MAC地址: ");\r
+                    cJSON* macElement = NULL;\r
+                    cJSON_ArrayForEach(macElement, modifiedJson) {\r
+                        if (cJSON_IsNumber(macElement)) {\r
+                            if ((macElement->prev != NULL)) {\r
+                                save_mac[count] = macElement->valueint;\r
+                                count++;\r
+                            }\r
+                            \r
+                        }\r
+                    }\r
+                    printf("\n");\r
+                }\r
+                // printf("success parsing JSON :save_mac :%d %d %d %d %d %d\n",save_mac[0],save_mac[1],save_mac[2],save_mac[3],save_mac[4],save_mac[5]);\r
             }\r
-            printf("gap_ble_pair_remote_device result %d\r\n",result);\r
+            // 释放资源\r
+            cJSON_Delete(root);\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
+        if(save_mac[0] == 0 && save_mac[1] == 0 && save_mac[2] == 0)//只要手表本地存储没有mac地址就走连接流程重新绑定\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
@@ -401,38 +477,94 @@ void getPhoneInfo(uint8_t *buf,uint16_t len)//获取手机信息
             }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
+            printf("gap_ble_pair_remote_device ret: %d phone_mac_data 0x%x-0x%x-0x%x-0x%x-0x%x-0x%x phone_addr->TYPE:%d\n",ret,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
+        {\r
+            if(copare_mac[0] != 0 && copare_mac[1] != 0 && copare_mac[2] != 0 ) \r
+            {\r
+                printf("success parsing JSON :save_mac :%d %d %d %d %d %d copare_mac %d %d %d %d %d %d;\n",save_mac[0],save_mac[1],save_mac[2],save_mac[3],save_mac[4],save_mac[5],\r
+                copare_mac[0],copare_mac[1],copare_mac[2],copare_mac[3],copare_mac[4],copare_mac[5]);\r
+                int result = memcmp(copare_mac,save_mac,6);\r
+                if(result == 0)\r
+                {\r
+                    firts_bond = 1;\r
+                    bond = 0x02;//手表与该手机绑定过\r
+                }else{\r
+                    bond = 0x03;//手表与其他手机绑定过\r
+                }\r
+            }else{//如果手机有保存mac app下发是空就提示和其他手机绑定过界面不在发起配对\r
+                bond = 0x03;//手表和其他手机绑定过\r
+\r
+            }\r
+        }\r
+        printf("bond flag:%d firts_bond:%d\r\n",bond,firts_bond);\r
+        value[17] = bond;//\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+        if(bond == 0x03)\r
+        {\r
+            //加解绑提示界面是否和旧的手机解绑app 弹窗提示\r
+            return;\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
+    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
+    if(firts_bond != 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
+        uint32_t totalpack= 1;//总的包数\r
+        uint32_t data_len = 7;//数据长度\r
+        uint32_t pack_index= 1;//分包序号Index\r
+        uint16_t pack_dataLen = 7;\r
+        memcpy(value+3,&totalpack,4);\r
+        memcpy(value+7,&data_len,4);\r
+        memcpy(value+11,&pack_index,4);\r
+        memcpy(value+15,&pack_dataLen,2);\r
         value[17] = flag;//1 配对成功 0 配对失败 \r
         if(flag == 1)//配对成功\r
         {\r
+            cJSON *dataJSON = cJSON_CreateObject();\r
+\r
+            cJSON* arrayJSON = cJSON_CreateArray();\r
+            for(uint8_t id = 0;id<6;id++)\r
+            {\r
+                cJSON_AddNumberToObject(arrayJSON,"id",mac[id]);\r
+            }\r
+            \r
+            // cJSON_AddNumberToObject(dataJSON,"id",i);\r
+            cJSON_AddItemToObject(dataJSON,"mac",arrayJSON);\r
+            char *jsonString = cJSON_PrintUnformatted(dataJSON);\r
+            printf("phone %s",jsonString);\r
+            FILE *file = fopen(PHONE_WATCH_CONFIG_PATH, "wb");\r
+            if (file)\r
+            {\r
+                if (fputs(jsonString, file) != EOF) // 将 JSON 字符串写入文件\r
+                {\r
+                    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "WriteJsonData success\n");\r
+                }\r
+                fclose(file);\r
+            }\r
+            free(jsonString);\r
+\r
+\r
+            \r
+            // 读取JSON文件\r
+\r
             memcpy(value+18,mac,6);\r
             memcpy(parie_mac,mac,6);\r
             length = 18+6;\r
@@ -474,10 +606,11 @@ void checkCrcSend(uint8_t type,uint8_t typeID,uint8_t crcflag)//获取时间
     sendBleData(sendBuf,19);\r
 \r
 }\r
-static void jsonCheck_time(uint8_t *buf,char *set_time)//json 格式解析\r
+static void jsonCheck_time(uint8_t *buf)//json 格式解析\r
 {\r
-    uint8_t time_data[24];\r
+    char time_data[24];\r
     memset(time_data,0,24);\r
+    \r
     uint8_t *json;\r
     json = buf;\r
     cJSON* root = cJSON_Parse((const char *)json);\r
@@ -485,53 +618,68 @@ static void jsonCheck_time(uint8_t *buf,char *set_time)//json 格式解析
         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
+    char *locations;\r
+    int year = 1970;\r
+    uint8_t month = 1;\r
+    uint8_t day = 1;\r
+    uint8_t week = 4;\r
+    uint8_t hour = 0;\r
+    uint8_t minute = 0;\r
+    uint8_t second = 0;\r
+    cJSON* time = cJSON_GetObjectItem(root, "time");\r
+    if (cJSON_IsNumber(time)) {\r
+        printf("time: %d\n", time->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
+    cJSON* jsweek = cJSON_GetObjectItem(root, "week");\r
+    if (cJSON_IsNumber(jsweek)) {\r
+        printf("week: %d\n", jsweek->valueint);\r
+        week = jsweek->valueint;\r
+    }\r
+    cJSON* jsyear = cJSON_GetObjectItem(root, "year");\r
+    if (cJSON_IsNumber(jsyear)) {\r
+        printf("year: %d\n", jsyear->valueint);\r
+        year = jsyear->valueint;\r
+    }\r
+    cJSON* jsmonth = cJSON_GetObjectItem(root, "month");\r
+    if (cJSON_IsNumber(jsmonth)) {\r
+        printf("month: %d\n", jsmonth->valueint);\r
+        month = jsmonth->valueint;\r
+    }\r
+    cJSON* jsday = cJSON_GetObjectItem(root, "day");\r
+    if (cJSON_IsNumber(jsday)) {\r
+        printf("day: %d\n", jsday->valueint);\r
+        day = jsday->valueint;\r
+    }\r
+    cJSON* jshour = cJSON_GetObjectItem(root, "hour");\r
+    if (cJSON_IsNumber(jshour)) {\r
+        printf("hour: %d\n", jshour->valueint);\r
+        hour = jshour->valueint;\r
+    }\r
+    cJSON* jsminute = cJSON_GetObjectItem(root, "minute");\r
+    if (cJSON_IsNumber(jsminute)) {\r
+        printf("minute: %d\n", jsminute->valueint);\r
+        minute = jsminute->valueint;\r
+    }\r
+    cJSON* jssecond = cJSON_GetObjectItem(root, "second");\r
+    if (cJSON_IsNumber(jssecond)) {\r
+        printf("second: %d\n", jssecond->valueint);\r
+        second = jssecond->valueint;\r
     }\r
     cJSON* location = cJSON_GetObjectItem(root, "location");\r
     if (cJSON_IsString(location)) {\r
         printf("location: %s\n", location->valuestring);\r
+        locations = 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
+    sprintf((char *)time_data,"%d-%d-%d %d:%d:%d",year+2000,month,day,hour,minute,second);\r
+    set_system_time(time_data);\r
     cJSON_Delete(root);\r
 }\r
 \r
 \r
 \r
 \r
-void GetUTCtime(uint8_t *crcnum,uint16_t len)//获取时间\r
+void GetUTCtime(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取时间\r
 {\r
     uint32_t tmp = 1;\r
     uint16_t tmp_data = 1;\r
@@ -545,20 +693,249 @@ void GetUTCtime(uint8_t *crcnum,uint16_t len)//获取时间
     memcpy(sendBuf+11,&tmp,4);\r
     memcpy(sendBuf+15,&tmp_data,2);\r
     \r
-       if(Check_CRC(crcnum,len))\r
+       if(Check_CRC(crcnum,len,crcvalue))\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
+        jsonCheck_time(data);\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_alarm(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* alarms = cJSON_GetObjectItem(root, "alarms");\r
+    int alarmCount = cJSON_GetArraySize(alarms);\r
+    printf("alarmCount %d\n",alarmCount);\r
+}\r
+void GetAlarmDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数\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] = 0x21;\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,crcvalue))\r
+       {\r
+        jsonCheck_alarm(crcnum);\r
+        \r
+        sendBuf[17] = 1;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+    }\r
+       else\r
+       {\r
+               sendBuf[17] = 0;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+    }\r
+    \r
+}\r
+\r
+\r
+\r
+void GetWatchLcdParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的屏幕参数\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] = 0x0e;\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,crcvalue))\r
+       {\r
+        ble_recv_msg_callback_t func =  ble_recv_get_send_msg_callback_func();\r
+        memset(&watch_lcd_param,0,sizeof(msg_watch_lcd_param_info_t));\r
+        \r
+        // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
+        watch_lcd_param.brigntess = crcnum[0];\r
+        watch_lcd_param.screen_time = crcnum[1];\r
+        watch_lcd_param.wrist_on = crcnum[2];\r
+        if(func != NULL)\r
+        {\r
+            func(WRITE_FLASH_DATA,cmd,&watch_lcd_param,sizeof(msg_watch_lcd_param_info_t));\r
+        }\r
+        \r
+        sendBuf[17] = 1;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+    }\r
+       else\r
+       {\r
+               sendBuf[17] = 0;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+    }\r
+    \r
+}\r
+\r
+\r
+\r
+void GetVoiceVibrateParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数\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] = 0x0f;\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,crcvalue))\r
+       {\r
+        ble_recv_msg_callback_t func =  ble_recv_get_send_msg_callback_func();\r
+        memset(&voice_vibration,0,sizeof(msg_get_voice_vibration_info_t));\r
+        if(func != NULL)\r
+        {\r
+            func(READ_FLASH_DATA,cmd,&voice_vibration,sizeof(msg_get_voice_vibration_info_t));\r
+        }\r
+        // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
+        uint8_t type = crcnum[0];\r
+        if(type == 0)//只改变系统音量参数 其他还是保持不变 按照原来的参数\r
+        {\r
+            voice_vibration.sys_volume = crcnum[1];\r
+        }else if(type == 1)//只改变铃声音量参数 其他还是保持不变 按照原来的参数\r
+        {\r
+            voice_vibration.ring_volume = crcnum[1];\r
+        }else if(type == 2)//只改变铃声和振动开关\r
+        {\r
+            voice_vibration.bell_on = crcnum[1];\r
+            voice_vibration.vibrate_on = crcnum[2];\r
+        }\r
+        if(func != NULL)\r
+        {\r
+            func(WRITE_FLASH_DATA,cmd,&voice_vibration,sizeof(msg_get_voice_vibration_info_t));\r
+        }\r
+        \r
+        sendBuf[17] = 1;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+    }\r
+       else\r
+       {\r
+               sendBuf[17] = 0;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+    }\r
+    \r
+}\r
+\r
+void GetHrSetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数\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] = 0x12;\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,crcvalue))\r
+       {\r
+        ble_recv_msg_callback_t func =  ble_recv_get_send_msg_callback_func();\r
+        memset(&hr_param,0,sizeof(msg_get_heart_set_param_info_t));\r
+        if(func != NULL)\r
+        {\r
+            func(READ_FLASH_DATA,cmd,&hr_param,sizeof(msg_get_heart_set_param_info_t));\r
+        }\r
+        // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
+        hr_param.frequence = crcnum[0];\r
+        hr_param.remind_on = crcnum[1];\r
+        hr_param.max_min = crcnum[2];\r
+        hr_param.heart = crcnum[3];\r
+        if(func != NULL)\r
+        {\r
+            func(WRITE_FLASH_DATA,cmd,&hr_param,sizeof(msg_get_heart_set_param_info_t));\r
+        }\r
+        \r
+        sendBuf[17] = 1;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+    }\r
+       else\r
+       {\r
+               sendBuf[17] = 0;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+    }\r
+    \r
+}\r
+\r
+\r
+void GetSpo2SetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取app下发的声音与振动参数\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] = 0x13;\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,crcvalue))\r
+       {\r
+        ble_recv_msg_callback_t func =  ble_recv_get_send_msg_callback_func();\r
+        memset(&spo2_param,0,sizeof(msg_get_spo2_set_param_info_t));\r
+        if(func != NULL)\r
+        {\r
+            func(READ_FLASH_DATA,cmd,&spo2_param,sizeof(msg_get_spo2_set_param_info_t));\r
+        }\r
+        // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
+        spo2_param.frequence = crcnum[0];\r
+        spo2_param.remind_on = crcnum[1];\r
+        if(spo2_param.remind_on)\r
+        {\r
+            spo2_param.spo2 = crcnum[2];\r
+        }\r
+        \r
+        if(func != NULL)\r
         {\r
-            set_system_time(set_time);\r
+            func(WRITE_FLASH_DATA,cmd,&spo2_param,sizeof(msg_get_spo2_set_param_info_t));\r
         }\r
+        \r
+        sendBuf[17] = 1;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
     }\r
        else\r
        {\r
@@ -568,6 +945,61 @@ void GetUTCtime(uint8_t *crcnum,uint16_t len)//获取时间
     }\r
     \r
 }\r
+\r
+void GetDrinkSetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取喝水提醒s设置\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] = 0x14;\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,crcvalue))\r
+       {\r
+        ble_recv_msg_callback_t func =  ble_recv_get_send_msg_callback_func();\r
+        msg_drink_set_param_info_t drink_info;\r
+        if(func != NULL)\r
+        {\r
+            func(READ_FLASH_DATA,SET_DRINK_PARAM_CMD,&drink_info,sizeof(msg_drink_set_param_info_t));\r
+        }//读设备内存\r
+        printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
+        drink_info.drink_on = crcnum[0];\r
+        if(drink_info.drink_on == 0){\r
+            drink_info.drink_on = 0;\r
+        }else{\r
+            drink_info.drink_on = crcnum[0];\r
+            drink_info.alarm_mode = crcnum[1];\r
+            drink_info.target_drink = crcnum[2]+crcnum[3]*256;\r
+            drink_info.start_hour = crcnum[4];\r
+            drink_info.startt_min = crcnum[5];\r
+            drink_info.end_hour = crcnum[6];\r
+            drink_info.end_min = crcnum[7];\r
+            drink_info.frequenc = crcnum[8];\r
+        }\r
+        if(func != NULL)\r
+        {\r
+            func(WRITE_FLASH_DATA,SET_DRINK_PARAM_CMD,&drink_info,sizeof(msg_drink_set_param_info_t));\r
+        }\r
+        \r
+        sendBuf[17] = 1;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+    }\r
+       else\r
+       {\r
+               sendBuf[17] = 0;\r
+        sendBuf[18] = Calculate_CRC(sendBuf,18);\r
+        sendBleData(sendBuf,19);\r
+    }\r
+    \r
+}\r
+\r
 static void jsonCheck_weather(uint8_t *buf)//json 格式解析 天气数据\r
 {\r
     uint8_t *json;\r
@@ -588,7 +1020,7 @@ static void jsonCheck_weather(uint8_t *buf)//json 格式解析 天气数据
 }\r
 \r
 \r
-void GetWeatherCmd(uint8_t *crcnum,uint16_t len)//获取天气数据\r
+void GetWeatherCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取天气数据\r
 {\r
     uint32_t tmp = 1;\r
     uint16_t tmp_data = 1;\r
@@ -602,11 +1034,12 @@ void GetWeatherCmd(uint8_t *crcnum,uint16_t len)//获取天气数据
     memcpy(sendBuf+11,&tmp,4);\r
     memcpy(sendBuf+15,&tmp_data,2);\r
 \r
-       if(Check_CRC(crcnum,len))\r
+       if(Check_CRC(crcnum,len,crcvalue))\r
        {\r
         sendBuf[17] = 1;\r
         sendBuf[18] = Calculate_CRC(sendBuf,18);\r
         sendBleData(sendBuf,19);\r
+        \r
         jsonCheck_weather(crcnum);\r
     }\r
        else\r
@@ -618,10 +1051,9 @@ void GetWeatherCmd(uint8_t *crcnum,uint16_t len)//获取天气数据
     \r
 }\r
 //获取用户数据 app下发的\r
-void getUserInfo(uint8_t *crcnum,uint16_t len)//\r
+void getUserInfo(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//\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
@@ -632,20 +1064,27 @@ void getUserInfo(uint8_t *crcnum,uint16_t len)//
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp,2);\r
     \r
-    if(Check_CRC(crcnum,len))\r
+    if(Check_CRC(crcnum,len,crcvalue))\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
+        ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
+        memset(&user_info,0,sizeof(msg_user_info_t));\r
+        if(func != NULL)\r
+        {\r
+            func(READ_FLASH_DATA,cmd,&user_info,sizeof(msg_user_info_t));\r
+        }\r
+        user_info.age = crcnum[0];\r
+        user_info.gender = crcnum[1];\r
+        user_info.height  = crcnum[2];\r
+        memcpy(crcnum+3,&user_info.weight,2);\r
+        memcpy(crcnum+5,&user_info.target_step,4);\r
+        memcpy(crcnum+9,&user_info.fat_time,2);\r
+        user_info.target_stand = crcnum[11];\r
+        user_info.timeformat = crcnum[12];\r
+         if(func != NULL)\r
+        {\r
+            func(WRITE_FLASH_DATA,cmd,&user_info,sizeof(msg_user_info_t));\r
+        }\r
 \r
         value[17] = 0x01;\r
         value[18] = Calculate_CRC(value,18);\r
@@ -658,26 +1097,29 @@ void getUserInfo(uint8_t *crcnum,uint16_t len)//
 }\r
 \r
 //02 类型\r
-void typeHexTwoData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen)\r
+void type2AE4Data(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t *totalData,uint8_t crcvalue)\r
 {\r
     uint16_t typeID = buf_cmd[1]*256+buf_cmd[2];\r
+    printf("type2AE4Data typeID:0x%x",typeID);\r
     switch (typeID) //ID\r
     {\r
-        case USER_INFOR_CMD://获取用户信息\r
-            getUserInfo(data,datalen);\r
+        case USER_INFOR_CMD://app下发的获取用户信息\r
+            getUserInfo(typeID,data,datalen,totalData,crcvalue);\r
             break;\r
-        case GET_PHONE_INFOR_CMD://手机下发的手机信息\r
-            getPhoneInfo(data,datalen);\r
+        case SET_PHONE_INFOR_CMD://app下发的下发的手机信息\r
+            getPhoneInfo(typeID,data,datalen,totalData,crcvalue);\r
             break;\r
         case CURR_TIME_CMD:\r
-            GetUTCtime(data,datalen);//获取时间app下发的时间进行解析\r
+            GetUTCtime(typeID,data,datalen,totalData,crcvalue);//获取时间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
+        case SET_ALARM_DATA_CMD:\r
+            GetAlarmDataCmd(typeID,data,datalen,totalData,crcvalue);\r
+            printf("alarm infor !!!!!!!!!!\r\n");\r
             break;\r
         case DELETE_FILE_CMD:\r
             break;\r
@@ -685,8 +1127,23 @@ void typeHexTwoData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen)
             break;\r
         case SYN_TODAY_BASIC_TRAIN_TXT_CMD:\r
             break;\r
-        case GET_WEATHER_DATA_CMD://天气数据\r
-            GetWeatherCmd(data,datalen);\r
+        case SYN_WATCH_LCD_PARAM_CMD://app下发的同步屏幕参数到手表\r
+            GetWatchLcdParamCmd(typeID,data,datalen,totalData,crcvalue);\r
+            break;\r
+        case SYN_VOICE_VIBRATION_PARAM_CMD://app下发声音与振动参数\r
+            GetVoiceVibrateParamCmd(typeID,data,datalen,totalData,crcvalue);\r
+            break;\r
+        case SET_WATCH_HR_SET_PARAM_CMD://app下发设置心率参数\r
+            GetHrSetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
+            break;\r
+        case SET_WATCH_SPO2_SET_PARAM_CMD:\r
+            GetSpo2SetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
+            break;\r
+        case SET_DRINK_PARAM_CMD://app下发的喝水提醒设置\r
+            GetDrinkSetParamCmd(typeID,data,datalen,totalData,crcvalue);\r
+            break;\r
+        case SET_WEATHER_DATA_CMD://app下发的天气数据\r
+            GetWeatherCmd(typeID,data,datalen,totalData,crcvalue);\r
             break;\r
         default:\r
             break;\r
@@ -694,7 +1151,7 @@ void typeHexTwoData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen)
 }\r
 \r
 //切换表盘\r
-static void switchDialCmd(uint8_t *crcnum,uint16_t len)\r
+static void switchDialCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -708,23 +1165,105 @@ static void switchDialCmd(uint8_t *crcnum,uint16_t len)
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_data,2);\r
     \r
-    if(Check_CRC(crcnum,len))\r
+    if(Check_CRC(crcnum,len,crcvalue))\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
+        value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
     }else\r
     {\r
         value[17] = 0;//校验失败\r
-        value[18] = Calculate_CRC(value+17,18-1);\r
+        value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
     }\r
 }\r
 \r
+//获取闹钟数据\r
+static void SetAlarmDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
+{\r
+   \r
+    uint32_t tmp = 1;\r
+    uint32_t data_len = 1;\r
+    uint16_t tmp_data = 1;\r
+    if(Check_CRC(crcnum,len,crcvalue))\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<2;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,"alarms",data_arryJSON);\r
+\r
+        char *json_format = cJSON_PrintUnformatted(dataJSON);\r
+        printf("%d\n",strlen(json_format));\r
+        cJSON_Delete(dataJSON);\r
+        printf("phone %s",json_format);\r
+        char *new_json;\r
+\r
+        uint32_t len = strlen(json_format);\r
+        uint8_t value[len+17+1];\r
+        memset(value,0,len+17+1);\r
+        value[0] = 0x72;\r
+        value[1] = 0x01;\r
+        value[2] = 0x01;\r
+        data_len = len;\r
+        tmp_data = len;\r
+        memcpy(value+3,&tmp,4);\r
+        memcpy(value+7,&data_len,4);\r
+        memcpy(value+11,&tmp,4);\r
+        memcpy(value+15,&tmp_data,2);\r
+        if((data_len+18) > ble_nus_max_data_len && data_len > 0)\r
+        {\r
+\r
+        }else{\r
+            if(data_len != 0){\r
+                memcpy(value+17,json_format,data_len);\r
+            }\r
+            \r
+        }\r
+        value[data_len+17] = Calculate_CRC(value,data_len+17);\r
+        sendBleData(value,data_len+17+1);\r
+    }else\r
+    {\r
+        uint8_t value[19];\r
+        memset(value,0,19);\r
+        value[0] = 0x72;\r
+        value[1] = 0x01;\r
+        value[2] = 0x01;\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] = 0;//校验失败\r
+        value[18] = Calculate_CRC(value,18);\r
+        sendBleData(value,19);\r
+    }\r
+}\r
+\r
+\r
+\r
 //关于本机内容\r
-static void aboutDeviceCmd(uint8_t *crcnum,uint16_t len)\r
+static void aboutDeviceCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     cJSON *dataJSON = cJSON_CreateObject();\r
     cJSON_AddNumberToObject(dataJSON,"code",1);\r
@@ -751,17 +1290,17 @@ static void aboutDeviceCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         memcpy(value+17,(uint8_t *)json_format,data_len);\r
-        unsigned char  lrc = Calculate_CRC(value+17,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
     }else\r
     {\r
         value[17] = 0;\r
-        unsigned char  lrc = Calculate_CRC(value+17,18-1);\r
+        unsigned char  lrc = Calculate_CRC(value,18);\r
         value[18] = lrc;\r
         sendBleData(value,19);\r
     }\r
@@ -783,14 +1322,14 @@ void setFindWatchFlag(uint8_t flag)
     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
+    value[18] = Calculate_CRC(value,18);\r
     sendBleData(value,19);\r
 }\r
-static void findWatchCmd(uint8_t *crcnum,uint16_t len)\r
+static void findWatchCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
    \r
-    uint8_t findFlag = crcnum[17];\r
-    if(Check_CRC(crcnum+17,len-17))\r
+    uint8_t findFlag = crcnum[0];\r
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         //弹窗界面\r
         if(findFlag)//查找手表弹窗界面\r
@@ -806,7 +1345,7 @@ static void findWatchCmd(uint8_t *crcnum,uint16_t len)
     } \r
 }\r
 //获取sd卡剩余空间\r
-static void GetSDSpaceCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetSDSpaceCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[27];\r
     memset(value,0,27);\r
@@ -819,28 +1358,28 @@ static void GetSDSpaceCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\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
+            value[18] = Calculate_CRC(value,18);\r
             sendBleData(value,27);\r
         }else{\r
             value[17] = 2;//校验标志\r
-            value[18] = Calculate_CRC(value+17,18-1); \r
+            value[18] = Calculate_CRC(value,18); \r
             sendBleData(value,19);\r
         }\r
     }else\r
     {\r
         value[17] = 0;//校验标志\r
-        value[18] = Calculate_CRC(value+17,18-1);\r
+        value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
     } \r
 }\r
 //获取当前数据\r
-static void GetCurDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetCurDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     cJSON *dataJSON = cJSON_CreateObject();\r
     const char *string_value[8]={"hr","spo2","stress","steps","duration","standup","calories","distance"};\r
@@ -873,23 +1412,23 @@ static void GetCurDataCmd(uint8_t *crcnum,uint16_t len)
     \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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         memcpy(value+17,(uint8_t *)json_format,data_len);\r
-        uint8_t lrc = Calculate_CRC(value+17,dataLen);\r
+        uint8_t 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
     }else\r
     {\r
         value[17] = 0;\r
-        uint8_t lrc = Calculate_CRC(value+17,18-1);\r
+        uint8_t lrc = Calculate_CRC(value,18);\r
         value[18] = lrc;\r
         sendBleData(value,19);\r
     }\r
 }\r
 //获取当手表电池电量\r
-static void GetBatteryLevelCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetBatteryLevelCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -902,23 +1441,23 @@ static void GetBatteryLevelCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\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
+        value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
     }else\r
     {\r
         value[17] = 0;\r
-        value[18] = Calculate_CRC(value+17,18-1);\r
+        value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
     }\r
 }\r
 //获取开关消息推送功能\r
-static void GetSwitchMessCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetSwitchMessCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -931,22 +1470,22 @@ static void GetSwitchMessCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
-        uint8_t switch_on = crcnum[17];//0 关闭 1 开启\r
+        uint8_t switch_on = crcnum[0];//0 关闭 1 开启\r
 \r
         value[17] = 1;\r
-        value[18] = Calculate_CRC(value+17,18-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+17,18-1);\r
+        value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
     }\r
 }\r
 //撤销当前文件传输 1 OTA 2MP3 3表盘 3天气 5闹钟\r
-static void RemoveFileCmd(uint8_t *crcnum,uint16_t len)\r
+static void RemoveFileCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -959,17 +1498,17 @@ static void RemoveFileCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
-        uint8_t switch_on = crcnum[17];//0 关闭 1 开启\r
+        uint8_t switch_on = crcnum[0];//0 关闭 1 开启\r
 \r
         value[17] = 1; //1 操作成功 2 操作失败\r
-        value[18] = Calculate_CRC(value+17,18-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+17,18-1);\r
+        value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
     }\r
 }\r
@@ -988,7 +1527,7 @@ static void GetFileTypeCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,1))\r
     {\r
         uint8_t fileType = crcnum[17];//2 mp3 3 表盘\r
 \r
@@ -1003,7 +1542,7 @@ static void GetFileTypeCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //删除指定类型所有的文件\r
-static void DeleteFileTypeCmd(uint8_t *crcnum,uint16_t len)\r
+static void DeleteFileTypeCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1016,7 +1555,7 @@ static void DeleteFileTypeCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         value[17] = 1; //1 操作成功 2 操作失败\r
         value[18] = Calculate_CRC(value,18);\r
@@ -1029,7 +1568,7 @@ static void DeleteFileTypeCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //开启指定运动模式\r
-static void OpenSportModeCmd(uint8_t *crcnum,uint16_t len)\r
+static void OpenSportModeCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1042,9 +1581,9 @@ static void OpenSportModeCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
-        uint8_t sportMode = crcnum[17];//运动类型 0 健走 1跑步 2骑行 3\r
+        uint8_t sportMode = crcnum[0];//运动类型 0 健走 1跑步 2骑行 3\r
 \r
         value[17] = 1; //1 操作成功 2 操作失败\r
         value[18] = Calculate_CRC(value,18);\r
@@ -1057,7 +1596,7 @@ static void OpenSportModeCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //结束运动模式\r
-static void StopSportModeCmd(uint8_t *crcnum,uint16_t len)\r
+static void StopSportModeCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1070,7 +1609,7 @@ static void StopSportModeCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         value[17] = 1; //1 操作成功 2 操作失败\r
         value[18] = Calculate_CRC(value,18);\r
@@ -1083,7 +1622,7 @@ static void StopSportModeCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //设置语言\r
-static void SetLanguageCmd(uint8_t *crcnum,uint16_t len)\r
+static void SetLanguageCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1096,9 +1635,9 @@ static void SetLanguageCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
-        uint8_t language = crcnum[17];\r
+        uint8_t language = crcnum[0];\r
 \r
         value[17] = 1; //1 操作成功 2 操作失败\r
         value[18] = Calculate_CRC(value,18);\r
@@ -1111,7 +1650,7 @@ static void SetLanguageCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //开启/关闭获取实时训练数据\r
-static void SetRealTimeDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void SetRealTimeDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1124,9 +1663,9 @@ static void SetRealTimeDataCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
-        uint8_t autoSportData = crcnum[17];//开关 1开启 0关闭\r
+        uint8_t autoSportData = crcnum[0];//开关 1开启 0关闭\r
 \r
         value[17] = 1; //1 操作成功 2 操作失败\r
         value[18] = Calculate_CRC(value,18);\r
@@ -1139,7 +1678,7 @@ static void SetRealTimeDataCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //设置训练试试数据采集频率\r
-static void SetRTDataFreCmd(uint8_t *crcnum,uint16_t len)\r
+static void SetRTDataFreCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1152,9 +1691,9 @@ static void SetRTDataFreCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
-        uint8_t Frequence = crcnum[17];//频率单位是s\r
+        uint8_t Frequence = crcnum[0];//频率单位是s\r
 \r
         value[17] = 1; //1 操作成功 2 操作失败\r
         value[18] = Calculate_CRC(value,18);\r
@@ -1218,10 +1757,10 @@ void sendRealTimeDataToAPP(uint8_t flag)
     \r
 }\r
 //获取实时训练数据\r
-static void GetRealTimeDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetRealTimeDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     \r
-    if(Check_CRC(crcnum,len))\r
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         sendRealTimeDataToAPP(1);\r
     }else\r
@@ -1230,7 +1769,7 @@ static void GetRealTimeDataCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //设置最高心率提醒\r
-static void SetMaxHrRemindCmd(uint8_t *crcnum,uint16_t len)\r
+static void SetMaxHrRemindCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1243,9 +1782,9 @@ static void SetMaxHrRemindCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))//\r
     {\r
-        uint8_t maxHr = crcnum[17];\r
+        uint8_t maxHr = crcnum[0];\r
         if(maxHr > 250)maxHr = 250;\r
         else if(maxHr <= 0) maxHr = 0;\r
 \r
@@ -1262,7 +1801,7 @@ static void SetMaxHrRemindCmd(uint8_t *crcnum,uint16_t len)
     \r
 }\r
 //训练暂停/恢复\r
-static void GetSportPasueResetCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetSportPasueResetCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1275,9 +1814,9 @@ static void GetSportPasueResetCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))//\r
     {\r
-        uint8_t PauseStop = crcnum[17];//0 暂停 1恢复\r
+        uint8_t PauseStop = crcnum[0];//0 暂停 1恢复\r
         value[17] = 1;\r
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
@@ -1290,7 +1829,7 @@ static void GetSportPasueResetCmd(uint8_t *crcnum,uint16_t len)
     \r
 }\r
 //发送当前表盘到app\r
-static void SendDialToAppCmd(uint8_t *crcnum,uint16_t len)\r
+static void SendDialToAppCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[20];\r
     memset(value,0,20);\r
@@ -1304,7 +1843,7 @@ static void SendDialToAppCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))//\r
     {\r
         uint16_t dialNum = 450;//0 暂停 1恢复\r
         memcpy(&value[17],&dialNum,2);\r
@@ -1319,7 +1858,7 @@ static void SendDialToAppCmd(uint8_t *crcnum,uint16_t len)
     \r
 }\r
 //获取手表当前状态\r
-static void GetWatchStatusCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetWatchStatusCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[20];\r
     memset(value,0,20);\r
@@ -1340,7 +1879,7 @@ static void GetWatchStatusCmd(uint8_t *crcnum,uint16_t len)
     sendBleData(value,19);\r
 }\r
 //获取手表屏幕参数\r
-static void GetScreenParamCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetScreenParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[21];\r
     memset(value,0,21);\r
@@ -1355,20 +1894,22 @@ static void GetScreenParamCmd(uint8_t *crcnum,uint16_t len)
     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
+    ble_recv_msg_callback_t func =  ble_recv_get_send_msg_callback_func();\r
+    memset(&watch_lcd_param,0,sizeof(msg_watch_lcd_param_info_t));\r
+    \r
+    if(func != NULL)\r
+    {\r
+        func(READ_FLASH_DATA,cmd,&watch_lcd_param,sizeof(msg_watch_lcd_param_info_t));\r
+    }//读设备内存\r
+    value[17] = watch_lcd_param.brigntess;\r
+    value[18] = watch_lcd_param.screen_time;\r
+    value[19] = watch_lcd_param.wrist_on;\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
+static void DeleteDialUidCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[20];\r
     memset(value,0,20);\r
@@ -1381,10 +1922,10 @@ static void DeleteDialUidCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         uint16_t deleteDial = 0;//删除的表盘UID \r
-        deleteDial=crcnum[17]+crcnum[18]*256;\r
+        deleteDial=crcnum[0]+crcnum[1]*256;\r
         value[17] = 1;// 1删除成功 2 没有改资源 0指令校验失败\r
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
@@ -1400,7 +1941,7 @@ static void DeleteDialUidCmd(uint8_t *crcnum,uint16_t len)
 }\r
 \r
 //获取手表声音与振动参数 Sound and Vibration\r
-static void GetSoundVibrationCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetSoundVibrationCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[23];\r
     memset(value,0,23);\r
@@ -1409,23 +1950,33 @@ static void GetSoundVibrationCmd(uint8_t *crcnum,uint16_t len)
     uint16_t tmp_data = 5;\r
     value[0] = 0x72;\r
     value[1] = 0x01;\r
-    value[2] = 0x1b;\r
+    value[2] = 0x1c;\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
+    if(Check_CRC(crcnum,len,crcvalue))\r
+    {\r
+        memset(&voice_vibration,0,sizeof(msg_get_voice_vibration_info_t));\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
+        ble_recv_msg_callback_t func =  ble_recv_get_send_msg_callback_func();\r
+        memset(&voice_vibration,0,sizeof(msg_get_voice_vibration_info_t));\r
+        \r
+        // printf("drink_info:%d %d %d\r\n",drink_info.drink_on,drink_info.alarm_mode,drink_info.start_hour);\r
+        \r
+        if(func != NULL)\r
+        {\r
+            func(READ_FLASH_DATA,cmd,&voice_vibration,sizeof(msg_get_voice_vibration_info_t));\r
+        }\r
+        value[17] = voice_vibration.sys_volume;// \r
+        value[18] = voice_vibration.ring_volume;// \r
+        value[19] = voice_vibration.media_volume;// \r
+        value[20] = voice_vibration.bell_on;//\r
+        value[21] = voice_vibration.vibrate_on;// \r
         value[22] = Calculate_CRC(value,22);\r
         sendBleData(value,23);\r
     }else\r
@@ -1439,7 +1990,7 @@ static void GetSoundVibrationCmd(uint8_t *crcnum,uint16_t len)
 }\r
 \r
 //APP获取手表辅助功能参数Auxiliary functions\r
-static void GetWatchAuxFuncCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetWatchAuxFuncCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[23];\r
     memset(value,0,23);\r
@@ -1452,7 +2003,7 @@ static void GetWatchAuxFuncCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         uint8_t paramCmt = 0;//辅助功能 0\r
         \r
@@ -1469,7 +2020,7 @@ static void GetWatchAuxFuncCmd(uint8_t *crcnum,uint16_t len)
     \r
 }\r
 //APP获取手表心率设置\r
-static void GetHrSetParamCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetHrGetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[22];\r
     memset(value,0,22);\r
@@ -1484,16 +2035,24 @@ static void GetHrSetParamCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\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
+        msg_get_heart_set_param_info_t heart_param;\r
+        memset(&heart_param,0,sizeof(msg_get_heart_set_param_info_t));\r
+        ble_recv_msg_callback_t func = ble_recv_get_send_msg_callback_func();\r
+        if(func != NULL)\r
+        {\r
+            func(READ_FLASH_DATA,cmd,&heart_param,sizeof(msg_get_heart_set_param_info_t));\r
+        }\r
+\r
+        value[17] = heart_param.frequence;//\r
+        value[18] = heart_param.remind_on;//\r
+        value[19] = heart_param.max_min;//\r
+        value[20] = heart_param.heart;// \r
         value[21] = Calculate_CRC(value,21);\r
         sendBleData(value,22);\r
     }else\r
@@ -1506,7 +2065,7 @@ static void GetHrSetParamCmd(uint8_t *crcnum,uint16_t len)
     \r
 }\r
 //APP获取手表血氧设置\r
-static void GetSpo2SetParamCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetSpo2GetParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[21];\r
     memset(value,0,21);\r
@@ -1520,7 +2079,7 @@ static void GetSpo2SetParamCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         uint8_t spo2freq = 0;//监测频率\r
         uint8_t spo2Switch = 0;//心率提醒开关\r
@@ -1541,7 +2100,7 @@ static void GetSpo2SetParamCmd(uint8_t *crcnum,uint16_t len)
 }\r
 \r
 //手势拍照协议\r
-static void carmeraCmd(uint8_t *crcnum,uint16_t len)\r
+static void carmeraCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1554,9 +2113,16 @@ static void carmeraCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
-        uint8_t carmera = crcnum[17];\r
+        uint8_t carmera_on = crcnum[0]; //0退出拍照界面 1进入拍照界面\r
+        //需要加界面弹窗提示\r
+        if(carmera_on == 1)//进入拍照弹窗界面\r
+        {\r
+\r
+        }else{//退出拍照弹窗界面\r
+\r
+        }\r
         value[17] = 1;// \r
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
@@ -1569,7 +2135,7 @@ static void carmeraCmd(uint8_t *crcnum,uint16_t len)
 }\r
 \r
 //APP获取手表喝水提醒设置\r
-static void GetDrinkParamCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetDrinkParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1582,10 +2148,15 @@ static void GetDrinkParamCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
-        uint8_t drinkOn = 0;\r
-        value[17] = drinkOn;// \r
+        msg_drink_param_info_t drink_on_t;\r
+        memset(&drink_on_t,0,sizeof(msg_drink_param_info_t));\r
+        ble_recv_msg_callback_t func =  ble_recv_get_send_msg_callback_func();\r
+        if(func != NULL){\r
+            func(READ_FLASH_DATA,cmd,&drink_on_t,sizeof(msg_drink_param_info_t));\r
+        }\r
+        value[17] = drink_on_t.drink_on;// \r
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
     }else\r
@@ -1597,7 +2168,7 @@ static void GetDrinkParamCmd(uint8_t *crcnum,uint16_t len)
 }\r
 \r
 //APP发送恢复出厂设置\r
-static void GetFactoryCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetFactoryCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1610,7 +2181,7 @@ static void GetFactoryCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         \r
         value[17] = 1;// \r
@@ -1624,7 +2195,7 @@ static void GetFactoryCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //APP发送重新启动\r
-static void GetResetCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetResetCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1637,7 +2208,7 @@ static void GetResetCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         \r
         value[17] = 1;// \r
@@ -1651,7 +2222,7 @@ static void GetResetCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //APP发送关机\r
-static void GetPowerOffCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetPowerOffCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1664,7 +2235,7 @@ static void GetPowerOffCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         \r
         value[17] = 1;// \r
@@ -1683,7 +2254,7 @@ static void GetPowerOffCmd(uint8_t *crcnum,uint16_t len)
 \r
 \r
 //app发送公英制单位\r
-static void GetMetricCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetMetricCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1696,9 +2267,9 @@ static void GetMetricCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
-        uint8_t kmileter = crcnum[17];//公英制单位 0 是公英制 1英制单位\r
+        uint8_t kmileter = crcnum[0];//公英制单位 0 是公英制 1英制单位\r
         value[17] = 1;// \r
         value[18] = Calculate_CRC(value,18);\r
         sendBleData(value,19);\r
@@ -1711,7 +2282,7 @@ static void GetMetricCmd(uint8_t *crcnum,uint16_t len)
 }\r
 \r
 //app获取睡眠设置\r
-static void GetSleepParamCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetSleepParamCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[24];\r
     memset(value,0,24);\r
@@ -1725,7 +2296,7 @@ static void GetSleepParamCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         uint8_t sleepTime = 0;//作息时间设定 0关闭 1开启\r
         uint8_t bedTimeHour = 0;//就寝时间\r
@@ -1750,7 +2321,7 @@ static void GetSleepParamCmd(uint8_t *crcnum,uint16_t len)
 }\r
 \r
 //app获取所有表盘UID\r
-static void GetAllDialUidCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetAllDialUidCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[24];\r
     memset(value,0,24);\r
@@ -1763,7 +2334,7 @@ static void GetAllDialUidCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         uint8_t sleepTime = 0;//作息时间设定 0关闭 1开启\r
         uint8_t bedTimeHour = 0;//就寝时间\r
@@ -1787,7 +2358,7 @@ static void GetAllDialUidCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //app获取目标步数设置\r
-static void GetTargetStepCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetTargetStepCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[25];\r
     memset(value,0,25);\r
@@ -1801,7 +2372,7 @@ static void GetTargetStepCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         uint32_t targetStep = 10000;//目标步数 4字节\r
         uint8_t ringOn = 0;//铃声提醒\r
@@ -1822,7 +2393,7 @@ static void GetTargetStepCmd(uint8_t *crcnum,uint16_t len)
 }\r
 \r
 //app其他目标设置\r
-static void GetTargetOtherCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetTargetOtherCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[26];\r
     memset(value,0,26);\r
@@ -1836,7 +2407,7 @@ static void GetTargetOtherCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         uint16_t targetKcal = 4556;//目标卡路里\r
         uint8_t targetKm = 0;//目标里程\r
@@ -1863,7 +2434,7 @@ static void GetTargetOtherCmd(uint8_t *crcnum,uint16_t len)
 }\r
 \r
 //app发送解除配对消息\r
-static void UnpairMessCmd(uint8_t *crcnum,uint16_t len)\r
+static void UnpairMessCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1877,7 +2448,7 @@ static void UnpairMessCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         \r
         value[17] = 1;//\r
@@ -1891,7 +2462,7 @@ static void UnpairMessCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //app发送同步数据结束消息\r
-static void GetSynDataEndCmd(uint8_t *crcnum,uint16_t len)\r
+static void GetSynDataEndCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[19];\r
     memset(value,0,19);\r
@@ -1905,7 +2476,7 @@ static void GetSynDataEndCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         value[17] = 1;//\r
         value[18] = Calculate_CRC(value,18);\r
@@ -1918,7 +2489,7 @@ static void GetSynDataEndCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //同步历史步数\r
-static void stepDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void stepDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[58];\r
     memset(value,0,58);\r
@@ -1932,7 +2503,7 @@ static void stepDataCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         uint8_t data_buf[40]; //\r
         uint8_t data_len = 0;\r
@@ -1966,7 +2537,7 @@ static void stepDataCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //同步卡路里历史数据\r
-static void kcalDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void kcalDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[58];\r
     memset(value,0,58);\r
@@ -1980,7 +2551,7 @@ static void kcalDataCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         uint8_t data_buf[40]; //\r
         uint8_t data_len = 4;\r
@@ -2007,7 +2578,7 @@ static void kcalDataCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //同步距离历史数据\r
-static void disDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void disDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[58];\r
     memset(value,0,58);\r
@@ -2021,7 +2592,7 @@ static void disDataCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         uint8_t data_buf[40]; //\r
         uint8_t data_len = 4;\r
@@ -2048,7 +2619,7 @@ static void disDataCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //同步基础训练历史数据 training history data\r
-static void trainiHistoryDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void trainiHistoryDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     \r
     cJSON *dataJSON = cJSON_CreateObject();\r
@@ -2094,7 +2665,7 @@ static void trainiHistoryDataCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         \r
         memcpy(value+17,json_format,data_len);\r
@@ -2109,7 +2680,7 @@ static void trainiHistoryDataCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //同步睡眠数据\r
-static void sleepDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void sleepDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[18+1];\r
     memset(value,0,18+1);\r
@@ -2123,7 +2694,7 @@ static void sleepDataCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         value[17] = 0;\r
         value[18] = 0xff;\r
@@ -2136,7 +2707,7 @@ static void sleepDataCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //同步数据结束完成\r
-static void synEndDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void synEndDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[18+1];\r
     memset(value,0,18+1);\r
@@ -2150,7 +2721,7 @@ static void synEndDataCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         value[17] = 1;\r
         value[18] = Calculate_CRC(value,18);\r
@@ -2163,7 +2734,7 @@ static void synEndDataCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //同步站立历史数据\r
-static void standDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void standDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[58];\r
     memset(value,0,58);\r
@@ -2177,7 +2748,7 @@ static void standDataCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         uint8_t data_buf[40]; //\r
         uint8_t data_len = 4;\r
@@ -2205,7 +2776,7 @@ static void standDataCmd(uint8_t *crcnum,uint16_t len)
 }\r
 \r
 //同步燃脂时间数据\r
-static void burntimeDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void burntimeDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[48];\r
     memset(value,0,48);\r
@@ -2219,7 +2790,7 @@ static void burntimeDataCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         uint8_t data_buf[30]; //\r
         uint32_t data_len = 0;\r
@@ -2246,7 +2817,7 @@ static void burntimeDataCmd(uint8_t *crcnum,uint16_t len)
 }\r
 \r
 //同步心率历史数据\r
-static void heartDataCmd(uint8_t *crcnum,uint16_t len)\r
+static void heartDataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[43];\r
     memset(value,0,43);\r
@@ -2260,7 +2831,7 @@ static void heartDataCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         uint32_t data_len = 0;\r
         for(uint16_t i = 0;i<5;i++)\r
@@ -2285,7 +2856,7 @@ static void heartDataCmd(uint8_t *crcnum,uint16_t len)
     }\r
 }\r
 //同步血氧历史数据\r
-static void spo2DataCmd(uint8_t *crcnum,uint16_t len)\r
+static void spo2DataCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,uint8_t crcvalue)\r
 {\r
     uint8_t value[43];\r
     memset(value,0,43);\r
@@ -2299,7 +2870,7 @@ static void spo2DataCmd(uint8_t *crcnum,uint16_t len)
     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
+    if(Check_CRC(crcnum,len,crcvalue))\r
     {\r
         uint32_t data_len = 0;\r
         for(uint16_t i = 0;i<5;i++)\r
@@ -2322,16 +2893,172 @@ static void spo2DataCmd(uint8_t *crcnum,uint16_t len)
 }\r
 \r
 \r
+//01类型 \r
+/*\r
+cmd: 指令uint16_t 协议01 02 拼接成0x0102 去协议文档对应是切换表盘\r
+*data:数据,不包含前面17个字节的包头和最后一位的校验和\r
+len 就是data的长度\r
+*totaldata:总的数据内容 包含包头和校验预览做接口是用  如果要计算totaldata的长度直接是len+17+1 就是加上包头和校验和\r
+crcvalue;数据的校验和 不包含包头和校验和的计算结果\r
+*/\r
+void type2AE3Data(uint16_t cmd ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue)\r
+{\r
+    // uint16_t typeID = cmd_buf[1]*256+cmd_buf[2];\r
+    printf("typeHexOneData:0x%x\r\n",cmd);\r
+    // uint8_t typeID = cmd_buf[2];\r
+    switch (cmd)\r
+    {\r
+        case SEND_UPPAIR_CMD://清除配对指令\r
+            clearPaireCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case ALARM_CMD:\r
+            SetAlarmDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case SWITCH_DIAL_CMD://表盘切换\r
+            switchDialCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case ABOUT_DEV_CMD://关于本机内容\r
+            aboutDeviceCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case FIND_WATCH_CMD://查找手表\r
+            findWatchCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case GET_SD_SPACE_CMD://获取sdk的剩余空间\r
+            GetSDSpaceCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case GET_CURR_DATA_CMD://获取当前数据 卡路里 \r
+            GetCurDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case GET_BATTERY_LEVEL_CMD://获取手表电池电量 \r
+            GetBatteryLevelCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case SWITCH_MESS_CMD://开关消息推送功能 \r
+            GetSwitchMessCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case REVOKE_CURR_FILE_TRANS_CMD://撤销文件传输\r
+            RemoveFileCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case GET_SPECIF_TYPE_FILE_CMD://获取指定类型文件目录 \r
+            RemoveFileCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case DELETE_SPECIF_TYPE_FILE_CMD://删除指定类型的所有文件\r
+            DeleteFileTypeCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case SWITCH_SPORT_MODE_CMD://开启指定运动模式\r
+            OpenSportModeCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case STOP_SPORT_MODE_CMD://结束运动模式\r
+            StopSportModeCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case SET_LANGUGAE_CMD://设置语言\r
+            SetLanguageCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case GET_REAL_HEART_CMD://获取实时训练数据\r
+            GetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case SWITCH_GET_REAL_HEART_CMD://开启/关闭自动获取实时训练数据\r
+            SetRealTimeDataCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case SET_REAL_DATA_FREQ_CMD://设置训练实时数据采集频率\r
+            SetRTDataFreCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+\r
+        case SET_MAX_HR_REMID_CMD://设置最高心疼提醒 255关闭\r
+            SetMaxHrRemindCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case SPORT_PAUSE_RESET_CMD://训练暂停/恢复\r
+            GetSportPasueResetCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case SEND_CURR_DIAL_TOAPP_CMD://发送当前表盘\r
+            SendDialToAppCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case SEND_CURR_STATUS_CMD: //获取手表当前状态\r
+            GetWatchStatusCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case GET_WATCH_LCD_PARAM_CMD: //获取手表屏幕参数\r
+            GetScreenParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case DELETE_DIAL_CMD://删除表盘UID\r
+            DeleteDialUidCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case GET_WATCH_VOICE_VIBRATE_CMD://获取手表声音与振动参数\r
+            GetSoundVibrationCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case GET_WATCH_AUXIL_FUN_PARAM_CMD://获取手表辅助功能参数                                                                                                     \r
+            GetWatchAuxFuncCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case GET_WATCH_HR_SET_PARAM_CMD://获取手表心率设置\r
+            GetHrGetParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case GET_WATCH_SPO2_SET_PARAM_CMD://获取手表血氧设置\r
+            GetSpo2GetParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case GET_GESTURE_CARMERA_CMD://获取手势拍照\r
+            carmeraCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case GET_DRINK_SWITCH_CMD://获取喝水提醒设置\r
+            GetDrinkParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case FACTORY_SET_CMD://app发送恢复出厂设置\r
+            GetFactoryCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case RESET_WATCH_CMD://app发送重启指令\r
+            GetResetCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case POWER_OFF_CMD://app发送关机\r
+            GetPowerOffCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case KM_MILE_CMD://app设置手表公英制单位\r
+            GetMetricCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case SLEEP_SET_CMD://app获取睡眠设置\r
+            GetSleepParamCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case DELETE_ALL_DILA_CMD://app所有表盘UID\r
+            GetAllDialUidCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case GET_TARGET_STEP_CMD://app获取目标步数设置\r
+            GetTargetStepCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case GET_OTHER_TARGET_CMD://app获取其他目标\r
+            GetTargetOtherCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case GET_UNPAIR_CMD://发送解除配对消息\r
+            UnpairMessCmd(cmd,data,datalen,totaldata,crcvalue);\r
+            break;\r
+        case SYN_DATA_END_CMD: //app发送同步数据结束消息\r
+            GetSynDataEndCmd(cmd,data,datalen,totaldata,crcvalue);\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,datalen+18,crcvalue);\r
+            break;\r
+        \r
+        default:\r
+            break;\r
+    }\r
+\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
+        case FIND_PHONE_CMD://查找手机\r
             // (data,datalen);\r
             break;\r
-        case GET_CURR_TIME_CMD://手机下发的手机信息\r
+        case GET_CURR_TIME_CMD://手表获取系统时间\r
             // getPhoneInfo(data,datalen);\r
             break;\r
         case SEND_PARI_SUCESS_CMD:\r
@@ -2365,7 +3092,8 @@ uint16_t max_mtu_szie_data_len = 200;
 \r
 void sendReadData(void)\r
 {\r
-    static uint8_t packCount = 0;\r
+    sendbigDataBufState = true;//分包同步数据不允许打断\r
+    static uint32_t packCount = 0;\r
     uint8_t buf[517];\r
     memset(buf,0,517);\r
     uint32_t dataLen = 0;\r
@@ -2373,10 +3101,10 @@ void sendReadData(void)
     uint32_t totalLen = 0;\r
     dataLen = 640; \r
     uint32_t dataPack = 1;\r
-    uint16_t dataPackLen = 640;\r
+    uint16_t dataPackLen = 640;//减掉前面17+2个字节的包头总共就是19个数据(多包) 一包就减去17个字节\r
     uint32_t time = 0;\r
     uint32_t step = 0;\r
-    packCount = 0;\r
+    packCount = 1;\r
     \r
     uint16_t startDataLen = 17;\r
     uint8_t crc = 0x00;\r
@@ -2395,7 +3123,7 @@ void sendReadData(void)
     }\r
     while (1)\r
     {\r
-        time = 1710833119+3600*packCount;\r
+        time = 1711348052+3600*packCount;\r
         memcpy(buf+startDataLen,&time,4);//21 \r
         startDataLen=startDataLen+4;\r
         step = 1000+packCount*1000;\r
@@ -2412,31 +3140,25 @@ void sendReadData(void)
             // 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
+                memcpy(buf+11,&packCount,4);\r
+                dataPackLen = startDataLen-17;\r
+                memcpy(buf+15,&dataPackLen,2);\r
+                crcvalue = Calculate_CRC_Big(buf+17,dataPackLen);\r
+                printf("end crcvalue1:%x\r\n",crcvalue);\r
+                buf[startDataLen] = crcvalue;\r
+                sendDataNow(buf,startDataLen+1);\r
+\r
+                packCount = 1;\r
+                sendbigDataBufState  = false;\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
+                memcpy(buf+11,&packCount,4);\r
+                dataPackLen = startDataLen-19;//减掉前面17+2个字节的包头总共就是19个数据\r
+                memcpy(buf+15,&dataPackLen,2);\r
+                crcvalue = Calculate_CRC_Big(buf+19,dataPackLen);\r
+                uint16_t pack_size = ble_nus_max_data_len-17-crcvalue;\r
+                memcpy(buf+17,&pack_size,2);\r
+                printf("end crcvalue3:%x %d %d %d\r\n",crcvalue,ble_nus_max_data_len,pack_size,crcvalue);\r
                 buf[startDataLen] = crcvalue;//\r
                 sendDataNow(buf,startDataLen+1);\r
                 packCount+=1;\r
@@ -2457,28 +3179,30 @@ void sendReadData(void)
                 // 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
+                    memcpy(buf+11,&packCount,4);\r
+                    dataPackLen = startDataLen-17;\r
+                    memcpy(buf+15,&dataPackLen,2);\r
+                    crcvalue = Calculate_CRC_Big(buf+17,dataPackLen);\r
                     buf[startDataLen] = crcvalue;\r
                     sendDataNow(buf,startDataLen+1);\r
-                    startDataLen = 0;\r
-                    packCount = 0;\r
+                    sendbigDataBufState  = false;\r
                     break;\r
                 }\r
             }else{\r
-                if(dataPackLen < max_mtu_szie_data_len) //只有总的包数小于最大的mtu的大小\r
+                if(dataPackLen < ble_nus_max_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
+                        memcpy(buf+11,&packCount,4);\r
+                        dataPackLen = startDataLen-17;\r
+                        memcpy(buf+15,&dataPackLen,2);\r
+                        crcvalue = Calculate_CRC_Big(buf+17,dataPackLen);\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
+                        sendbigDataBufState  = false;\r
                         break;\r
                     }\r
                 }\r
@@ -2487,9 +3211,9 @@ void sendReadData(void)
     }\r
 }\r
 //手机app下发读设备数据指令\r
-void readDevDataBle(uint8_t *crcnum,uint16_t len)\r
+void readDevDataBle(uint8_t *crcnum,uint16_t len,uint8_t crcvalue)\r
 {\r
-    if(Check_CRC(crcnum+17,len-17))\r
+    if(Check_CRC(crcnum+17,len-18,crcvalue))\r
     {\r
         bleSendTypeID=crcnum[2];\r
 \r
@@ -2537,148 +3261,8 @@ void readDevDataBle(uint8_t *crcnum,uint16_t len)
 }\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
+\r
 void getPhoneInfo_test(void)\r
 {\r
     /*\r
@@ -2755,17 +3339,17 @@ void getPhoneInfo_test(void)
 }\r
 \r
 //长数据解析\r
-void bleLongRecvData(uint8_t *data, uint32_t data_size,uint8_t *buf_cmd)//buf_cmd 指令前17个字节数据\r
+void bleLongRecvData(uint8_t *data, uint16_t data_size,uint8_t *buf_cmd,uint8_t *totalData,uint8_t crcvalue)//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
+    printf("type:%d %d data_size:%d data:%d crcvalue:%x",buf_cmd[0],type,data_size,data[0],crcvalue);\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
+                    type2AE4Data(buf_cmd,data,data_size,totalData,crcvalue);\r
                     break;\r
                 default:\r
                     break;\r
@@ -2773,24 +3357,23 @@ void bleLongRecvData(uint8_t *data, uint32_t data_size,uint8_t *buf_cmd)//buf_cm
             break;\r
     }\r
 }\r
+\r
+uint8_t *recvData;\r
+uint32_t packdataLen = 0;\r
+uint32_t totalDataLen = 0;\r
+uint8_t totalpack = 0;\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
+void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)\r
 {\r
-    if(sendbigDataBufState == true)\r
+    if(sendbigDataBufState == true)//正在发送大数据不接收任何app指令下发的数据\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
+    uint8_t crcvalue= 0x00;\r
+\r
+    if(data2ae3Cmd == handle)//短指令\r
     {\r
         if(recvBigDataBufState == true)//在接收大数据时未接收完成时,不能被其他指令打断\r
         {\r
@@ -2798,60 +3381,64 @@ void longDataRecv(uint8_t *buf, uint16_t event_size,uint16_t handle)
         }\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
+            uint16_t cmd = totalData[1]*256+totalData[2];\r
+            crcvalue = totalData[event_size-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
+            memcpy(&packdataLen,&totalData[3],4);\r
+            recvData = malloc(packdataLen);\r
+            memcpy(recvData,totalData+17,packdataLen);\r
+            printf("recv crcvalue:%x packdataLen-1:%d\r\n",crcvalue,packdataLen);\r
+            type2AE3Data(cmd,recvData,packdataLen,totalData,crcvalue);\r
+            if(recvData != NULL)\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
+                free(recvData);\r
             }\r
         }\r
-    }else if(longCmdChara == handle)\r
+    }else if(data2ae4Cmd == 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
+                // packdataLen = packdataLen+event_size-18;//  减掉18个数据 0+517 730总的数据长度 517还是小于730 说明还有数据没有接收完成 继续接收\r
+                if(event_size >= 17)\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
+                    packdataLen = event_size;//第一包的数据大小 第二包不走这里 514-17 = 497\r
+                    memcpy(&totalDataLen,totalData+7,4);//总的数据大小\r
+                    printf("totalDataLen;%d totaldataLen:%d",totalDataLen,packdataLen);\r
+                    if(totalDataLen > event_size-18)//如果514-18 = 496 497 > 496 \r
                     {\r
-                        printf("muilt totalDataLen;%d data_len:%d",totalDataLen,data_len);\r
-                        bigDataBuf = malloc(totalDataLen);\r
-                        if(bigDataBuf == NULL)return;\r
+                        printf("muilt totalDataLen;%d packdataLen:%d",totalDataLen,packdataLen);\r
+\r
+                        recvData = malloc(totalDataLen+18);\r
+                        if(recvData == NULL)return;\r
                         muiltFlag = 1;//表示有两包以上的数据\r
-                        memcpy(bigDataBuf,buf+17,data_len);//从第十七个字节开始接收数据data\r
+                        memcpy(recvData,totalData,event_size);//从第十七个字节开始接收数据data\r
                         memset(cmd_data,0,17);\r
-                        memcpy(cmd_data,buf,17);\r
+                        memcpy(cmd_data,totalData,17);\r
                         totalpack=1;\r
                         break;\r
                     }else{//直接发送数据解析\r
-                        printf("muilt totalDataLen11;%d data_len:%d",totalDataLen,data_len);\r
+                        printf("muilt totalDataLen11;%d packdataLen:%d",totalDataLen,packdataLen);\r
                         muiltFlag = 0; \r
-                        data_len = event_size-17;\r
+                        packdataLen = 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
+                        memcpy(cmd_data,totalData,17);\r
+                        \r
+                        recvData = malloc(packdataLen-1);\r
+                        if(recvData == NULL)return;\r
+                        memcpy(recvData,totalData+17,packdataLen-1);\r
+                        if(totalDataLen == 0){\r
+                            crcvalue = 0x00;\r
+                        }else{\r
+                            crcvalue = totalData[event_size-1];\r
+                        }\r
+                        bleLongRecvData(recvData,packdataLen-1,&cmd_data,totalData,crcvalue);\r
+                        if(recvData != NULL){\r
+                            free(recvData);\r
+                        }\r
+                        packdataLen = 0;\r
                         break;\r
                     }\r
                 }\r
@@ -2860,20 +3447,29 @@ void longDataRecv(uint8_t *buf, uint16_t event_size,uint16_t handle)
             }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
+                printf("muilt 122222;%d packdataLen:%d",totalDataLen,packdataLen);\r
+                memcpy(recvData+packdataLen,totalData,event_size); //先copy再加\r
+                packdataLen = packdataLen+event_size;\r
+                printf("muilt 133333;%d packdataLen:%d",totalDataLen,packdataLen);\r
+                if(totalDataLen >= (packdataLen-18))//总的数据包 packdataLen-18把前面17个字节的包头和一个字节的校验和去掉得到数据部分和校验和部分\r
                 {\r
-                    bleLongRecvData(bigDataBuf,data_len,&cmd_data);\r
+                    bigDataBuf = malloc(totalDataLen);\r
+                    crcvalue = totalData[event_size-1];\r
+                    memcpy(bigDataBuf,recvData+17,totalDataLen);\r
+                    bleLongRecvData(bigDataBuf,totalDataLen,&cmd_data,recvData,crcvalue);\r
                     totalDataLen = 0;\r
-                    data_len = 0;\r
+                    packdataLen = 0;\r
                     muiltFlag = 0;\r
                     totalpack = 0; \r
                     if(bigDataBuf != NULL){\r
                         free(bigDataBuf);\r
                     }\r
+                    if(recvData != NULL){\r
+                        free(recvData);\r
+                    }\r
+                    break;\r
+                }else{\r
+\r
                     break;\r
                 }\r
             }\r
@@ -2881,18 +3477,23 @@ void longDataRecv(uint8_t *buf, uint16_t event_size,uint16_t handle)
             {\r
                 totalpack = 0;\r
                 muiltFlag = 0; \r
-                data_len = 0;\r
+                packdataLen = 0;\r
                 totalDataLen = 0;\r
                 if(bigDataBuf != NULL){\r
                     free(bigDataBuf);\r
                 }\r
+                if(recvData != NULL){\r
+                    free(recvData);\r
+                }\r
                 break;\r
             }\r
         }\r
     }\r
 }\r
+//接收app下发的原始数据 \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
+    printf("handle :%d data2ae3Cmd:%d data2ae4Cmd:%d buf:%d event_size %d\r\n",handle,data2ae3Cmd,data2ae4Cmd,buf,event_size);\r
+    bleDataRecv(buf,event_size,handle);\r
 }\r
+#endif
\ No newline at end of file
index b367c37..933b7a4 100644 (file)
@@ -4,7 +4,7 @@
 #include <stdio.h>
 #include "stdbool.h"
 #include "errcode.h"
-#define REDA_FLASH_DATA 0x01 //读flash数据
+#define READ_FLASH_DATA 0x01 //读flash数据
 #define WRITE_FLASH_DATA 0x02 //写flash数据
 typedef struct {
     uint8_t *data;           /* data    */
@@ -21,6 +21,7 @@ ble_recv_msg_callback_t ble_recv_get_send_msg_callback_func(void);
 //返回值 解析数据成功返回 1 解析失败返回 0 
 // 
 int ble_recv_msg_callback(uint8_t writ_read,uint16_t msg_typeID, uint8_t *msg_data, uint16_t msg_datalen);
+void cameram_send_data(void);
 /*********************TYPE+ID***********************************
  * TYPE:01 
 */
@@ -323,9 +324,8 @@ 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开启
-
+    uint8_t bell_on;//铃声开关0关闭 1开启
+    uint8_t vibrate_on;//振动开关0关闭 1开启
 }msg_get_voice_vibration_info_t;// 获取手表声音和振动参数
 #pragma pack()
 
@@ -358,7 +358,7 @@ typedef struct
     //对应数据的指令类型
     uint8_t frequence;//检测频率 0关闭 1 1分 2 五分钟 3 10分钟
     uint8_t remind_on;//血压提醒 0关闭 1开启
-    uint8_t heart;//血压区间阈值90-99
+    uint8_t spo2;//血压区间阈值90-99
 
 }msg_get_spo2_set_param_info_t;// 获取手表血氧设置参数
 #pragma pack()
@@ -471,12 +471,40 @@ TYPE:02
 #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 SYN_WATCH_LCD_PARAM_CMD 0x020E//同步屏幕参数app-watch
+#define SYN_VOICE_VIBRATION_PARAM_CMD 0x020f //同步参数app-watch
+#define SET_PHONE_INFOR_CMD 0x0210 //app发送手机信息
+#define SET_WATCH_HR_SET_PARAM_CMD 0x0212 //app发送心率设置参数
+#define SET_WATCH_SPO2_SET_PARAM_CMD 0x0213 //app发送血氧设置参数
+#define SET_DRINK_PARAM_CMD 0x0214 //app发送喝水提醒设置
+#define SET_WEATHER_DATA_CMD 0x0220 //发送天气数据
+#define SET_ALARM_DATA_CMD 0x0221 //发送闹钟数据
 #define DELETE_FILE_CMD 0x0222 //删除指定文件
 #define SYN_BASIC_REAL_HEATR_CMD 0x024B //同步基础训练试试心率记录
 #define SYN_TODAY_BASIC_TRAIN_TXT_CMD 0x024D //同步当天任意时间之后的基础训练记录
+#pragma pack(1)
+typedef struct {
+    uint8_t drink_on;//提醒开关 0关闭 1开启
+    uint8_t alarm_mode;//0每天提醒一次 1间隔提醒
+    uint16_t target_drink;//目标饮水量 500-5000ml
+    uint8_t start_hour;//开始小时
+    uint8_t startt_min;//开始分钟
+    uint8_t end_hour;//结束小时
+    uint8_t end_min;//结束分钟
+    uint8_t frequenc;//提醒频率
+}msg_drink_set_param_info_t;
+
+typedef struct
+{
+    uint8_t age;//年龄
+    uint8_t gender;//性别 0男性 1女性
+    uint8_t height;//身高
+    uint16_t weight;//体重
+    uint32_t target_step;//目标步数
+    uint16_t fat_time;//燃脂时间目标
+    uint8_t target_stand;//目标站立
+    uint8_t timeformat;//时间制 0 24小时制 1 12小时制
+}msg_user_info_t;//获取用户信息 身高体重 
 
 /******************************************
  * 
@@ -538,8 +566,8 @@ typedef struct
 
 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进行区分
+void typeHexTwoData(uint8_t *buf_cmd,uint8_t *data,uint16_t datalen,uint8_t crcvalue);
+void type2AE3Data(uint16_t cmd ,uint8_t *data,uint16_t datalen,uint8_t *totaldata,uint8_t crcvalue);//对不同指令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);
index 5ee24a2..445b5fa 100644 (file)
@@ -64,15 +64,16 @@ static gap_call_backs_t g_btGapCallBacks;
 static a2dp_src_callbacks_t g_a2dpSrcCallbacks;\r
 \r
 static bool g_ble_adv_start_state = false;\r
-static uint16_t g_ble_server_id = 1;\r
-static uint16_t g_ble_server_handle = 0;\r
+uint16_t g_ble_server_id = 1;\r
+\r
 static uint16_t g_ble_read_handle = 0;\r
-static uint16_t g_ble_conn_id = 0;\r
+uint16_t g_ble_conn_id = 0;\r
+static uint16_t g_ble_server_handle = 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 const uint8_t ble_adv_tx[3] = {0x02,0x0a,0x00};\r
+static const uint8_t ble_adv_tx[4] = {0x03,0x03,0xe0,0x18};\r
 static bool AdverFlag = true;\r
 \r
 static uint8_t scan_data[BLE_SCAN_MAC_LENTH] = {0};\r
@@ -86,12 +87,18 @@ uint16_t ble_nus_max_data_len = SDK_BLE_MTU_MIN - 3;
 #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
+uint8_t data2ae3Cmd = 0;//2ae3短指令特征值\r
+uint8_t data2ae4Cmd = 0;\r
 \r
 \r
 static void set_phone_info(bd_addr_t *addr)//保存手机信息 包含手机mac地址\r
 {\r
+    phone_addr.addr[0] = addr->addr[5];\r
+    phone_addr.addr[1] = addr->addr[4];\r
+    phone_addr.addr[2] = addr->addr[3];\r
+    phone_addr.addr[3] = addr->addr[2];\r
+    phone_addr.addr[4] = addr->addr[1];\r
+    phone_addr.addr[5] = addr->addr[0];\r
     memcpy(&phone_addr,addr,sizeof(bd_addr_t));\r
 }\r
 \r
@@ -104,11 +111,11 @@ enum{
     BLE_CHARACTERISTIC_READ_BATTERY_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_READ,\r
 };\r
 \r
-static void svr_ble_ble_adv_stop(void)\r
+void svr_ble_adv_stop(void)\r
 {\r
     gap_ble_stop_adv(BLE_ADV_ID);\r
 }\r
-void svr_ble_ble_adv_start(void)\r
+void svr_ble_adv_start(void)\r
 {\r
     gap_ble_start_adv(BLE_ADV_ID);\r
 }\r
@@ -116,121 +123,6 @@ bool get_ble_status(void)
 {\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
-    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, 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
-    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
-    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[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
-    scan_data[scan_data_len++] = 0x05;//未知 app\r
-    scan_data[scan_data_len++] = 0x05;\r
-    scan_data[scan_data_len++] = 0x00;\r
-    scan_data[scan_data_len++] = 0x00;\r
-    scan_data[scan_data_len++] = 0x01;\r
-    \r
-    if (scan_data_len > BLE_SCAN_MAC_LENTH){\r
-        scan_data_len = BLE_SCAN_MAC_LENTH;\r
-    }\r
-    adv_data_info.scan_rsp_data = scan_data;//扫描数据\r
-    adv_data_info.scan_rsp_length = scan_data_len;//扫描长度\r
-    adv_data_info.adv_data = adv_data;//广播数据 \r
-    adv_data_info.adv_length = adv_data_len;//广播长度\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "adv_data_info.adv_length:%u. scan_data_len:%d\r\n", adv_data_len,scan_data_len);\r
-    gap_conn_param_update_t params;//更改连接参数\r
-    params.interval_min = 0x30;\r
-    params.interval_max = 0x60;\r
-    params.conn_handle = 1;\r
-    params.slave_latency = 0;\r
-    params.timeout_multiplier = 4000;\r
-    ret = gap_ble_connect_param_update(&params);\r
-    gap_ble_set_adv_data(adv_id, &adv_data_info);\r
-\r
-    return;\r
-}\r
-#endif\r
-\r
 #if 1\r
 /* adapt ios adv data. *///设置广播和扫描数据\r
 static void svr_ble_adv_data_set(int adv_id)\r
@@ -246,7 +138,7 @@ static void svr_ble_adv_data_set(int adv_id)
     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
+    unsigned char set_mac[6] = {0x61,0x22,0x33,0x44,0x09,0x14};\r
     bluetooth_set_local_addr(set_mac,6);\r
     bd_addr_t addr_info;\r
     int32_t ret= 0;\r
@@ -257,6 +149,7 @@ static void svr_ble_adv_data_set(int adv_id)
     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
+    // (void)sprintf_s(watchName, sizeof(watchName), "%s",BLE_DEFAULT_NAME);\r
 \r
     ret = bluetooth_set_local_name((unsigned char*)watchName, strlen((char*)watchName) + 1);\r
     if (ret == false) {\r
@@ -290,8 +183,8 @@ 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_tx), ble_adv_tx, sizeof(ble_adv_tx));//这是tx power\r
-    adv_data_len = adv_data_len + sizeof(ble_adv_tx);\r
+    memcpy_s(adv_data + adv_data_len, sizeof(ble_adv_uuid), ble_adv_uuid, sizeof(ble_adv_uuid));//这是tx power\r
+    adv_data_len = adv_data_len + sizeof(ble_adv_uuid);\r
 \r
     int k = BD_ADDR_LEN;\r
     for (int i = 0; i < BD_ADDR_LEN; i++) {\r
@@ -299,10 +192,10 @@ static void svr_ble_adv_data_set(int adv_id)
     }\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
@@ -339,7 +232,7 @@ static void svr_ble_adv_data_set(int adv_id)
 \r
 \r
 \r
-void svr_ble_adv_start(void)\r
+void svr_ble_adv_start_param(void)\r
 {\r
     int adv_id = BLE_ADV_ID;\r
     if (AdverFlag == false) { //已经开始广播了,不需要重复开启广播\r
@@ -371,17 +264,17 @@ static void svr_ble_connstate_change_cb(unsigned short conn_id, bd_addr_t *addr,
 {\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
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "number :%d addr!!! 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x addr->type:%d\r\n",number,addr->addr[0],addr->addr[1],addr->addr[2],addr->addr[3],\r
+    addr->addr[4],addr->addr[5],addr->type);\r
     g_ble_conn_id = conn_id;\r
     if (GAP_BLE_STATE_DISCONNECTED == conn_state) { // restart ble adv when disconnected\r
-        \r
         Bleconnect = GAP_BLE_STATE_DISCONNECTED;//蓝牙已断开\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
+            svr_ble_adv_start();\r
         }    \r
     } else {\r
+        \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
@@ -391,13 +284,6 @@ static void svr_ble_connstate_change_cb(unsigned short conn_id, bd_addr_t *addr,
 \r
 static void svr_pair_result_cbt_cb(uint16_t conn_id, const bd_addr_t *addr, errcode_t status)\r
 {\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
@@ -630,11 +516,73 @@ static void srv_ble_add_chart_decr_recv_cmd(uint8_t server_id,uint16_t srv_handl
         // 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
+static uint16_t ble_server_handle = 0;\r
+static uint8_t g_alipay_character_buf[256] = {0};\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(0x4a02, &alipay_service_uuid);\r
+    memset_s(&character, sizeof(gatts_add_chara_info_t), 0, sizeof(gatts_add_chara_info_t));\r
+    // character.chara_uuid.uuid_len = sizeof(id);\r
+    // memcpy_s(character.chara_uuid.uuid, sizeof(character.chara_uuid.uuid), (char *)&id, sizeof(id));\r
+    character.chara_uuid = alipay_service_uuid;\r
+    character.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+    character.properties =\r
+        GATT_CHARACTER_PROPERTY_BIT_READ | GATT_CHARACTER_PROPERTY_BIT_WRITE | GATT_CHARACTER_PROPERTY_BIT_NOTIFY;\r
+    character.value_len = 256;\r
+    character.value = g_alipay_character_buf;\r
+\r
+    ret = gatts_add_characteristic(server_id, srv_handle, &character);\r
+    if (ret != ERRCODE_SUCC) {\r
+        ALIPAY_PRINT_ERR(0, "gatts_add_characteristic fail, ret:%u.\r\n", ret);\r
+    }\r
+\r
+    uint8_t bas_ccc_val[] = {\r
+            0x01,\r
+            0x00\r
+        };\r
+    bt_uuid_t ccc_uuid = { 0 };\r
+    bts_data_to_uuid_len2(0x2902, &ccc_uuid);\r
+    // bts_data_to_uuid_len2(0x2902, &ccc_uuid);\r
+    gatts_add_desc_info_t descriptor;\r
+    descriptor.desc_uuid = ccc_uuid;\r
+    descriptor.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+    descriptor.value_len = (uint16_t)sizeof(bas_ccc_val);\r
+    descriptor.value = bas_ccc_val;\r
+    \r
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor);\r
+    if (ret != ERRCODE_SUCC) {\r
+        ALIPAY_PRINT_ERR(0, "gatts_add_descriptor fail, ret:%u.\r\n", ret);\r
+    }\r
+    bd_addr_t addr_info;\r
+    gatts_add_desc_info_t descriptor_ap;\r
+    gap_ble_get_local_addr(&addr_info);\r
+    bts_data_to_uuid_len2(0x4b02, &ccc_uuid);\r
+    descriptor_ap.desc_uuid = ccc_uuid;\r
+    descriptor_ap.permissions = GATT_ATTRIBUTE_PERMISSION_READ | GATT_ATTRIBUTE_PERMISSION_WRITE;\r
+    descriptor_ap.value_len = BD_ADDR_LEN;\r
+    uint8_t ble_data_mac_switch[BD_ADDR_LEN] = {0};\r
+    int k = BD_ADDR_LEN;\r
+    for (int i = 0; i < BD_ADDR_LEN; i++) {\r
+        ble_data_mac_switch[--k] = addr_info.addr[i];\r
+    }\r
+    descriptor_ap.value = ble_data_mac_switch;\r
+    ret = gatts_add_descriptor(server_id, srv_handle, &descriptor_ap);\r
+    if (ret != ERRCODE_SUCC) {\r
+        ALIPAY_PRINT_ERR(0, "gatts_add_descriptor second fail, ret:%u.\r\n", ret);\r
+    }\r
+\r
+\r
+}\r
 //这个回调函数添加新的服务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
+    ble_server_handle = srv_handle;\r
     // ALIPAY_PRINT_DEBUG(0, "BtGattsServiceAddCallback 0x%x 0x%x 0x%x 0x%x", status, server_id, srv_handle,\r
         // *((uint16_t *)uuid->uuid));\r
     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_ble_bt_gatts_service_add_cb 0x%x\r\n",srv_handle);\r
@@ -648,8 +596,7 @@ static void svr_ble_bt_gatts_service_add_cb(uint8_t server_id, bt_uuid_t *uuid,
     bt_uuid_t hid_service_uuid = {0};\r
     bts_data_to_uuid_len2(BLE_UUID_HUMAN_INTERFACE_DEVICE, &hid_service_uuid);\r
 \r
-    bt_uuid_t alpay_service_uuid = {0};\r
-    bts_data_to_uuid_len2(ALIPAYY_SERVICE_ID, &alpay_service_uuid);\r
+   \r
     \r
     errcode_t ret = 0;\r
     if (ble_gatts_cmp_uuid(uuid, &ble_service_uuid) == true) {//通过传入的uuid进行比较\r
@@ -660,6 +607,7 @@ static void svr_ble_bt_gatts_service_add_cb(uint8_t server_id, bt_uuid_t *uuid,
         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
+        alipay_add_chart_decr_cb(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
@@ -667,14 +615,9 @@ static void svr_ble_bt_gatts_service_add_cb(uint8_t server_id, bt_uuid_t *uuid,
         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
+uint16_t g_alipay_server_handle = 0;\r
+uint16_t g_hid_server_handle = 0;\r
 static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t *uuid, uint16_t srv_handle,\r
     gatts_add_character_result_t *result, errcode_t status)\r
 {\r
@@ -699,8 +642,6 @@ static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t
     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
@@ -711,7 +652,7 @@ static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t
     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
+        data2ae3Cmd = result->value_handle;\r
     }\r
     \r
     if(ble_gatts_cmp_uuid(uuid, &chara_uuid_data4))\r
@@ -733,16 +674,15 @@ static void svr_ble_bt_gatts_characteristic_add_cb(uint8_t server_id, bt_uuid_t
     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
+        data2ae4Cmd = 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
+        if(g_hid_server_handle == 0){\r
+            g_hid_server_handle = result->value_handle;\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "g_hid_server_handle  %d\r\n",g_hid_server_handle);\r
+            ble_hid_add_characters_input_report_cbk(g_hid_server_handle);\r
+        }\r
     }\r
     return;\r
 }\r
@@ -799,6 +739,12 @@ static void svr_ble_bt_gatts_req_write_cb(uint8_t server_id, uint16_t conn_id, g
        \r
     }\r
     revBleOldData(write_cb_para->value,write_cb_para->length,write_cb_para->handle);\r
+    if(write_cb_para->handle == g_alipay_server_handle)\r
+    {\r
+        printf("g_alipay_server_handle:%d",g_alipay_server_handle);\r
+        uint8_t *msg_data = write_cb_para->value;\r
+        svr_alipay_msg_write(ALIPAY_MSG_BT, msg_data, write_cb_para->length, false);\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
@@ -885,7 +831,7 @@ static void svr_gap_br_AclStateChangedCallback(const bd_addr_t *bdAddr, gap_acl_
     }\r
     if(state == GAP_ACL_STATE_DISCONNECTED || state == GAP_ACL_STATE_LE_DISCONNECTED)\r
     {\r
-        gap_remove_all_pairs();\r
+        // gap_remove_all_pairs();\r
     }\r
 \r
 }\r
@@ -1099,13 +1045,13 @@ static a2dp_snk_callbacks_t g_a2dp_snk_callbacks = {
     BtA2dpSnkPlayingStateChangedCb,\r
     BtA2dpSnkConfigChangedCb\r
 };\r
-\r
 void svr_ble_btcallback_reg(void)//ble基础通讯服务注册回调函数\r
 {\r
-    gap_ble_sec_params_t sec_params = { 0 };\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 = 0x01;\r
+    sec_params.sc_enable = 0x00;\r
     sec_params.sc_mode = GAP_BLE_GAP_SECURITY_MODE1_LEVEL2;\r
     errcode_t ret = gap_ble_set_sec_param(&sec_params);//设置配对参数 发起配对弹窗\r
 \r
@@ -1162,15 +1108,15 @@ static void svr_ble_bt_init_gatts(void)
     uint8_t serverId = 0;\r
     bt_uuid_t uuid;\r
     errcode_t ret = 0;\r
-    uuid.uuid_len = (uint8_t)sizeof(ser_id);\r
-    memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&ser_id, sizeof(ser_id));\r
+    uuid.uuid_len = (uint8_t)sizeof(id);\r
+    memcpy_s(uuid.uuid, sizeof(uuid.uuid), (char *)&id, sizeof(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
     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
+    ret = gatts_add_service(serverId, &ble_service_uuid, true);\r
     WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "gatts_add_service ret: 0x%x", ret);\r
 \r
     \r
@@ -1195,29 +1141,35 @@ bool ble_gatts_cmp_uuid(const bt_uuid_t *tgt_uuid, const bt_uuid_t *src_uuid)//
     bt_os_free(tgt);\r
     return result;\r
 }\r
-\r
-\r
+extern void alipay_unregist_server(void);\r
+void ble_unregist_server(void)\r
+{\r
+    gatts_delete_all_services(g_ble_server_id);\r
+    gatts_unregister_server(g_ble_server_id);\r
+    svr_ble_adv_stop();\r
+    \r
+}\r
+void svr_ble_reset_init(void)//重新启ble服务\r
+{\r
+    alipay_unregist_server();\r
+    osDelay(100);\r
+    svr_ble_btcallback_reg();\r
+    svr_ble_bt_init_gatts();\r
+    ble_hid_server_init();\r
+    svr_ble_adv_start_param();\r
+}\r
 \r
 void svr_bluetooth_init(void)\r
 {\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
+        WEARABLE_LOGI(WEARABLE_LOG_MODULE_APP, "svr_bluetooth_init enable_bt_stack ret:%u.\r\n", ret);\r
     }\r
-    if (g_ble_init_flag == true) {\r
-        return;\r
-    }\r
-    \r
+    // osDelay(100);\r
     svr_ble_btcallback_reg();\r
     svr_ble_bt_init_gatts();\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
+    svr_ble_adv_start_param();\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
@@ -1238,11 +1190,11 @@ 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 = gap_ble_remove_all_pairs();//删除和所有配对的手机app\r
+        // gap_remove_all_pairs();\r
+        svr_ble_adv_stop();//停止广播 不发送广播数据 就是app搜索不到该设备了\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
+        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
index bf07df4..f2ae7c7 100644 (file)
@@ -5,22 +5,26 @@
 #include "stdbool.h"
 #include "bts_def.h"
 #include "errcode.h"
+extern uint16_t g_ble_conn_id;
+extern uint16_t g_ble_server_id;
+extern uint16_t g_alipay_server_handle;
 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 uint8_t data2ae3Cmd;//2ae3短指令特征值
+extern uint8_t data2ae4Cmd;//长指令特征值 大于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);//开始蓝牙广播
+void svr_ble_adv_start_param(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);
+void svr_ble_adv_start(void);
+void svr_ble_adv_stop(void);
 #endif
 
index e1c8826..3005e12 100644 (file)
@@ -255,7 +255,7 @@ static void ble_hid_add_character_protocol_mode(uint8_t server_id, uint16_t srvc
 /* 添加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
+    // g_hid_service_handle = srvc_handle;\r
     /* HID Information */\r
     ble_hid_add_character_hid_information(server_id, srvc_handle);\r
     /* Report Map */\r
@@ -275,21 +275,13 @@ void ble_hid_server_init(void)
 {\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
+    // printf("ble_hid_server_send_input_report:%d %d %d",data[0],data[1],len);\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
@@ -303,18 +295,18 @@ errcode_t ble_hid_server_send_input_report(const uint8_t *data, uint8_t len)
         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
+    errcode_t ret = 0;\r
+    ret = gatts_notify_indicate(g_ble_server_id, g_ble_conn_id, &param);\r
+    // printf("ble_hid_server_send_input_report: 0x%x g_ble_conn_id:%d g_hid_input_report_att_hdl:%d\r\n",ret,g_ble_conn_id,g_hid_input_report_att_hdl);\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
+    // printf("ble_hid_add_characters_input_report_cbk:success:%d\r\n",srvc_handle);\r
+    g_hid_input_report_att_hdl = srvc_handle;\r
 }\r
+\r
 #endif
\ No newline at end of file