优化安卓连接流程
authorhcj <1224667075@qq.com>
Wed, 21 Aug 2024 09:03:41 +0000 (17:03 +0800)
committerhcj <1224667075@qq.com>
Wed, 21 Aug 2024 09:03:41 +0000 (17:03 +0800)
code/sdk/application/wearable/fd230app/nativeui/bluetooth/include/BluetoothModel.h
code/sdk/application/wearable/fd230app/nativeui/bluetooth/src/BluetoothModel.cpp
code/sdk/application/wearable/service/ble_service/blemoder/bletest.cpp
code/sdk/application/wearable/service/ble_service/blemoder/bletest.h
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.c
code/sdk/application/wearable/service/ble_service/bleservice/bleEvent.h
code/sdk/application/wearable/service/ble_service/bleservice/bleService.c
code/sdk/application/wearable/service/ble_service/bleservice/bleService.h

index 50e695c..9190e5a 100644 (file)
@@ -14,7 +14,7 @@
 \r
 #include "bts_def.h"\r
 #include "bts_br_gap.h"\r
-\r
+#include <string>\r
 namespace OHOS {\r
 \r
 \r
@@ -34,6 +34,16 @@ typedef struct {
 } BluetoothCaseInfo;\r
 \r
 \r
+typedef struct {\r
+    uint8_t id;\r
+    uint32_t timetamp_begin;\r
+    uint32_t timetamp_end;\r
+    std::string titel;\r
+    std::string content;\r
+}ScheduleInfo;\r
+\r
+\r
+\r
 \r
 class BluetoothItemView;\r
 class BluetoothModel {\r
@@ -145,6 +155,7 @@ void uapi_connect_pbap_pce(void);
 int uapi_reconnect(void);\r
 int uapi_set_acl_connect_A2DP(void);\r
 void uapi_get_br_address(bd_addr_t *bdaddr);\r
+void uapi_set_br_address(bd_addr_t *bdaddr);\r
 \r
 #ifdef __cplusplus\r
 }\r
index 20a2f85..02e9bb0 100644 (file)
@@ -769,10 +769,13 @@ void BtGapPairStatusChangedCallback(const bd_addr_t *bdAddr, int status)
     // }\r
     // uapi_a2dp_snk_connect();\r
     // a2dp_snk_connect(bdAddr);\r
-    if(cm_custom_ble_service_on_flag() && !get_ble_pair())\r
+    if(cm_custom_ble_service_on_flag() && !get_ble_pair()&& (status == GAP_PAIR_PAIRED))\r
     {\r
-        if(cm_get_A2DP_switch() || cm_get_HFP_switch())\r
-        uapi_a2dp_snk_connect();\r
+        send_pair_succ((bd_addr_t*)bdAddr);\r
+    //     if(cm_get_A2DP_switch() || cm_get_HFP_switch())\r
+    //     uapi_a2dp_snk_connect();\r
+        hand_watch_first_time_Paired();\r
+        svr_ble_adv_stop();\r
         //uapi_reconnect();\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "uapi_a2dp_snk_connect");\r
     }\r
@@ -1701,11 +1704,27 @@ void uapi_get_br_address(bd_addr_t *bdaddr)
  \r
     if(BtGapPair_bdAddr.addr[0]==0 && BtGapPair_bdAddr.addr[1]==0 &&\r
     BtGapPair_bdAddr.addr[2]==0 && BtGapPair_bdAddr.addr[3]==0 )\r
-    get_phone_addr(bdaddr);\r
-    else\r
+    {\r
+        uint8_t MacType = 0;\r
+        uint8_t mac_data[6];\r
+        memset(mac_data,0,6);\r
+        GetwatchSaveMac(mac_data,&MacType);\r
+        BtGapPair_bdAddr.addr[0]=mac_data[0];\r
+        BtGapPair_bdAddr.addr[1]=mac_data[1];\r
+        BtGapPair_bdAddr.addr[2]=mac_data[2];\r
+        BtGapPair_bdAddr.addr[3]=mac_data[3];\r
+        BtGapPair_bdAddr.addr[4]=mac_data[4];\r
+        BtGapPair_bdAddr.addr[5]=mac_data[5];\r
+        BtGapPair_bdAddr.type=MacType;\r
+    }\r
     memcpy(bdaddr,&BtGapPair_bdAddr,sizeof(bd_addr_t));\r
+}\r
 \r
+void uapi_set_br_address(bd_addr_t *bdaddr)\r
+{\r
+    memcpy(&BtGapPair_bdAddr,bdaddr,sizeof(bd_addr_t));\r
 }\r
+\r
 static uint8_t br_cmd=0;\r
 int uapi_a2dp_snk_connect()\r
 {\r
index de63b5c..28291ed 100644 (file)
@@ -96,6 +96,28 @@ bool is_first_pair(void)
 }
 
 
+bool Ble_Set_ScheduleInfo(uint8_t id,uint32_t timetamp_begin,uint32_t timetamp_end,char *title,char *data)
+{
+   OHOS::ScheduleInfo info;
+    info.id=id;
+    info.timetamp_begin=timetamp_begin;
+    info.timetamp_end=timetamp_end;
+    info.titel.append(title,strlen(title)+1);
+    info.content.append(data,strlen(data)+1);
+
+    printf("///////////////////日程数据////////////////////\r\n");
+    printf("id:%d\r\n",info.id);
+    printf("timetamp_begin:%d\r\n",info.timetamp_begin);
+    printf("timetamp_end:%d\r\n",info.timetamp_end);
+    printf("titel:%s\r\n",info.titel.c_str());
+    printf("content:%s\r\n",info.content.c_str());
+
+    printf("//////////////////////////////////////////////\r\n");
+    
+}
+
+
+
 //在此处实现,给UI回复消息。
 void ble_app_reply(bool data)
 {
index 5d54a92..1c11521 100644 (file)
@@ -106,6 +106,9 @@ typedef struct
     uint32_t freq;
 }msg_drink_info_t;
 
+
+
+
 void read_message_data(void);//读内存信息数据开机读一次
 struct message_infor_t *get_message_info(void);
 void set_weather_now_data(int humidity, char* windScale, char* textNight,int uvIndex,int temp,int iconNight);
@@ -352,6 +355,8 @@ uint8_t get_br_is_pair(void);
 void set_br_pair(void);
 
 bool get_lcd_state(void);
+//////////////////////////////////////////////////////////////////////////
+bool Ble_Set_ScheduleInfo(uint8_t id,uint32_t timetamp_begin,uint32_t timetamp_end,char *title,char *data);
 
 #ifdef __cplusplus
 #if __cplusplus
index b1a3527..10485db 100644 (file)
@@ -614,12 +614,15 @@ void comfirmPaire(uint8_t flag)
         // printf("gap_ble_pair_remote_device 333333333 %x-%x-%x-%x-%x-%x\r\n",phone_addr.addr[0],phone_addr.addr[1],phone_addr.addr[2],phone_addr.addr[3],phone_addr.addr[4],phone_addr.addr[5]);\r
         // 一键双连使能(依赖安全连接参数配置)\r
         \r
-        \r
-        errcode_t code = gap_ble_pair_remote_device(&phone_addr);\r
-        if(code!=ERRCODE_SUCC)\r
+        if(get_ble_pair())\r
         {\r
-            printf("gap_ble_pair_remote_device fail %X\r\n",code);\r
+            errcode_t code = gap_ble_pair_remote_device(&phone_addr);\r
+            if(code!=ERRCODE_SUCC)\r
+            {\r
+                printf("gap_ble_pair_remote_device fail %X\r\n",code);\r
+            }\r
         }\r
+        \r
     }else{\r
         first_bond = 0;\r
         errcode_t ret = 0;\r
@@ -1070,9 +1073,16 @@ void sendBindInfor(uint8_t *data)
                 printf("phone_addr:%02x-%02x-%02x-%02x-%02x-%02x type:%d ",phone_addr.addr[0],phone_addr.addr[1],phone_addr.addr[2],\r
                 phone_addr.addr[3],phone_addr.addr[4],phone_addr.addr[5],phone_addr.type);\r
 \r
-\r
-                ret = gap_ble_pair_remote_device(&phone_addr);\r
-                printf("gap_ble_pair_remote_device ret:%x \r\n",ret);\r
+                if(get_ble_pair())\r
+                {\r
+                    errcode_t code = gap_ble_pair_remote_device(&phone_addr);\r
+                    if(code!=ERRCODE_SUCC)\r
+                    {\r
+                        printf("gap_ble_pair_remote_device fail %X\r\n",code);\r
+                    }\r
+                }\r
+                // ret = gap_ble_pair_remote_device(&phone_addr);\r
+                // printf("gap_ble_pair_remote_device ret:%x \r\n",ret);\r
                 bond = 0x02;//手表与该手机绑定过\r
                 value[17] = bond;//\r
                 value[18] = Calculate_CRC(value,18);\r
@@ -2142,10 +2152,23 @@ uint8_t parse_jsonCheck_weather(uint8_t *buf,uint8_t *check)//json 格式解析
         set_weather_one_data(tempMin,iconDay,fxDate,tempMax,textDay,i);\r
 \r
     }\r
-    \r
+\r
     if( cm_custom_ble_service_on_flag() && cm_get_HFP_switch())\r
     uapi_pbap_cmd_start_client();\r
 \r
+    bd_addr_t bdaddr={0};\r
+    uapi_get_br_address(&bdaddr);\r
+    if( cm_custom_ble_service_on_flag() && (cm_get_HFP_switch()||cm_get_A2DP_switch()))\r
+    {\r
+        if (false==bt_is_acl_connected(&bdaddr))\r
+        {\r
+            int ret = gap_reconnect_media_device(&bdaddr);\r
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, " gap_reconnect_media_device ret = %u", ret);\r
+        }  \r
+\r
+    }\r
+   \r
+\r
     ble_UpdateMainWeatherData();\r
     cJSON_Delete(root);\r
     *check = 1;\r
@@ -2259,6 +2282,7 @@ uint8_t binCheck_AI(uint8_t *buf,uint8_t *check,uint16_t len)//json 格式解析
             //offset+=1;\r
        }\r
         if(offset>=len)break;\r
+\r
         if(buf[offset]==0)\r
        {\r
             offset++;\r
@@ -2274,7 +2298,7 @@ uint8_t binCheck_AI(uint8_t *buf,uint8_t *check,uint16_t len)//json 格式解析
             memcpy_s(error_buf,256,&buf[offset],txt_len);\r
             printf("binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len);\r
             ble_set_ai_Answer_str(error_buf,0);\r
-\r
+            offset+=txt_len;\r
             printf("AI 解析失败\r\n");\r
 \r
        }\r
@@ -2295,8 +2319,8 @@ uint8_t binCheck_AI(uint8_t *buf,uint8_t *check,uint16_t len)//json 格式解析
             memcpy_s(error_buf,256,&buf[offset],txt_len);\r
             printf("binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len);\r
             ble_set_ai_Answer_str(error_buf,3);\r
-\r
-            printf("AI 解析失败\r\n");\r
+            offset+=txt_len;\r
+            printf("AI 回应错误\r\n");\r
 \r
        }\r
        if(offset>=len)break;\r
@@ -2321,7 +2345,8 @@ uint8_t binCheck_AI(uint8_t *buf,uint8_t *check,uint16_t len)//json 格式解析
             printf("binCheck_AI Question txtbuf:%s %d\r\n",error_buf,txt_len);\r
             ble_set_ai_Answer_str(error_buf,4);\r
 \r
-            printf("AI 解析失败\r\n");\r
+            offset+=txt_len;\r
+            //printf("AI 解析失败\r\n");\r
 \r
        }\r
        if(offset>=len)break;\r
@@ -2455,6 +2480,123 @@ void SaveChatGPTCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,u
     } \r
 }\r
 \r
+\r
+bool bin_Check_schedule(uint8_t *data,uint16_t len)\r
+{\r
+    uint16 offset=0;\r
+    uint16 buf_len=0;\r
+    while (offset<len)\r
+    {\r
+        uint8_t id;\r
+        id=data[offset];\r
+        offset++;\r
+        if(offset>=len)\r
+        break;\r
+\r
+        memcpy_s(&buf_len,2,&data[offset],2);\r
+        offset+=2;\r
+        if(offset>=len)\r
+        break;\r
+\r
+        char *title=(char*)malloc(buf_len+1);\r
+        memset_s(title,512,0,buf_len+1);\r
+        memcpy_s(title,512,&data[offset],buf_len);\r
+\r
+        offset+=buf_len;\r
+        if(offset>=len)\r
+        {\r
+            if(title)\r
+            {\r
+                free(title);\r
+            }\r
+            break;\r
+        }\r
+        uint32_t timetemp_begin=0;\r
+        memcpy_s(&timetemp_begin,4,&data[offset],4);\r
+        offset+=4;\r
+        if(offset>=len)\r
+        break;\r
+        uint32_t timetemp_end=0;\r
+        memcpy_s(&timetemp_end,4,&data[offset],4);\r
+        offset+=4;\r
+        if(offset>=len)\r
+        break;\r
+\r
+        memcpy_s(&buf_len,2,&data[offset],2);\r
+        offset+=2;\r
+        if(offset>=len)\r
+        break;\r
+\r
+        char *data=(char*)malloc(buf_len+1);\r
+        memset_s(data,512,0,buf_len+1);\r
+        memcpy_s(data,512,&data[offset],buf_len);\r
+\r
+        offset+=buf_len;\r
+        if(offset>=len)\r
+        {\r
+            if(title)\r
+            {\r
+                free(title);\r
+            }\r
+            if(data)\r
+            {\r
+                free(data);\r
+            }\r
+            break;\r
+        }\r
+        Ble_Set_ScheduleInfo(id,timetemp_begin,timetemp_end,title,data);\r
+        if(title)\r
+        {\r
+            free(title);\r
+        }\r
+        if(data)\r
+        {\r
+            free(data);\r
+        }\r
+\r
+    }\r
+    return true;\r
+}\r
+void APP_send_schedule_Cmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)\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] = 0x24;\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
+    // printf("GetWeatherCmd:len:%d data:%s\r\n",len,data);\r
+    //"sk-proj-04ogvrZQqyaiv1OWw8OZT3BlbkFJG9Gyr8oFvRdmr3oXQNbX"\r
+       if(Check_CRC(data,len,crcvalue))\r
+       {\r
+        \r
+        \r
+        if(bin_Check_schedule(data,len))\r
+        {\r
+            sendBuf[17] = 1;\r
+        }\r
+        else\r
+        {\r
+            sendBuf[17] = 2;\r
+        }\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 GetGPSCmd(uint16_t cmd,uint8_t *data,uint16_t len,uint8_t *totalData,uint8_t crcvalue)\r
 {\r
    send_big_data(1,NULL,0,0,1,1,0x4f,2);\r
@@ -2746,6 +2888,10 @@ void type2AE4Data(ble_read_data *buffer_handle,uint8_t *buf_cmd,uint8_t *data,ui
         case APP_SEND_AI_KEY_IS_AVAILABLE_CMD:\r
             APP_reply_AI_is_ready(data,datalen);\r
             break;\r
+         case SYN_APP_SCHEDULE_DATA_CMD:\r
+            APP_send_schedule_Cmd(typeID,data,datalen,totalData,crcvalue);\r
+            break;\r
+        \r
 \r
         default:\r
             break;\r
index d229fd9..1f396e3 100644 (file)
@@ -626,6 +626,7 @@ TYPE:02
 #define DELETE_FILE_CMD 0x0222 //删除指定文件
 #define SYN_BASIC_REAL_HEATR_CMD 0x024B //同步基础训练试试心率记录
 #define APP_SEND_CHATGPT_KEY_CMD 0x0223 //APP发送chatGPT key
+#define SYN_APP_SCHEDULE_DATA_CMD 0x0224 //同步schedule信息
 #define SYN_TODAY_BASIC_TRAIN_TXT_CMD 0x024D //同步当天任意时间之后的基础训练记录
 #define APP_SEND_AI_KEY_IS_AVAILABLE_CMD  0x0506 //查询AI是否可用,APP 回复
 
@@ -801,6 +802,7 @@ bool get_ctkd_flag(void);
 
 uint8_t parse_jsonCheck_weather(uint8_t *buf,uint8_t *check);//json 格式解析 天气数据
 uint8_t read_jsonHistory_weather(void);
+void GetwatchSaveMac(uint8_t *mac,uint8_t *mactype);
 ///////////////////////////自定义文件传输协议/////////////////////////////
 #define OTA_FILE_MSG_CMD  0x0601 
 #define OTA_FILE_DATA_CMD 0x0602
index 84872f2..f15e151 100644 (file)
@@ -131,6 +131,7 @@ static void set_phone_info(bd_addr_t *addr)//保存手机信息 包含手机mac
     memcpy(&phone_addr,addr,sizeof(bd_addr_t));\r
     memcpy(&disconect_addr,addr,sizeof(bd_addr_t));\r
 }\r
+\r
 enum{\r
     BLE_CHARACTERISTIC_RECV_ID_PROPERTIES = GATT_CHARACTER_PROPERTY_BIT_NOTIFY|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP|GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_READ,\r
     BLE_CHARACTERISTIC_SNED_SHORT_ID_PROPERTIES =  GATT_CHARACTER_PROPERTY_BIT_WRITE|GATT_CHARACTER_PROPERTY_BIT_WRITE_NO_RSP,\r
@@ -162,7 +163,7 @@ void br_adv_start(uint8_t sec)
 \r
     if(!get_br_is_pair())\r
     { \r
-        gap_br_set_bt_scan_mode(GAP_SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE, sec);    \r
+        //gap_br_set_bt_scan_mode(GAP_SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE, sec);    \r
     }\r
 }\r
 \r
@@ -313,7 +314,10 @@ void svr_ble_connstate_change_cb(unsigned short conn_id, bd_addr_t *addr, gap_bl
     gap_ble_pair_state_t pair_state, gap_ble_disc_reason_t disc_reason)\r
 {\r
     \r
-    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "svr_ble_connstate_change_cb gap_ble_conn_state_t conn_state:%d  pair_state:%d disc_reason:%d\r\n",conn_state,pair_state,disc_reason);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,\r
+     "svr_ble_connstate_change_cb gap_ble_conn_state_t conn_state:%d  pair_state:%d disc_reason:%d\r\n",\r
+     conn_state,pair_state,disc_reason);\r
+\r
     \r
     g_ble_conn_id = conn_id;\r
     if (GAP_BLE_STATE_DISCONNECTED == conn_state) { // restart ble adv when disconnected\r
@@ -342,8 +346,8 @@ void svr_ble_connstate_change_cb(unsigned short conn_id, bd_addr_t *addr, gap_bl
        \r
 \r
         //int ret= a2dp_snk_connect(addr);\r
-        // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x playing_state: %x\n",\r
-        // g_bd_addr.addr[3], g_bd_addr.addr[2], g_bd_addr.addr[1], g_bd_addr.addr[0], g_bd_addr.type); /* 3 2 1 0 idx */\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "addr: ****%02x%02x%02x%02x \n",\r
+         addr->addr[3], addr->addr[2], addr->addr[1], addr->addr[0]); /* 3 2 1 0 idx */\r
 \r
         //WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP,"state(int): %x\n", ret);\r
         \r
@@ -408,8 +412,8 @@ void svr_pair_result_cbt_cb(uint16_t conn_id, const bd_addr_t *addr, errcode_t s
 \r
                 }\r
                \r
-                // int ret = gap_connect_remote_device(addr);\r
-                //  WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gap_connect_remote_device!!! %X\r\n",ret);\r
+                int ret = gap_connect_remote_device(addr);\r
+                 WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gap_connect_remote_device!!! %X\r\n",ret);\r
                 \r
 \r
             }\r
@@ -1278,8 +1282,14 @@ static void svr_ble_mtu_exchange(uint8_t server_id, uint16_t conn_id, uint16_t m
 /*******************  gap_ble  ************************************/\r
 void svr_gap_ble_auth_complete_callback(uint16_t conn_id, const bd_addr_t *addr, errcode_t status,ble_auth_info_evt_t* evt)\r
 {\r
-    sendParieSuccess(1,&phone_addr);\r
-    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_gap_ble_auth_complete_callback %x %x %x %x %x %x\r\n",addr->addr[0],addr->addr[1],addr->addr[2],addr->addr[3],addr->addr[4],addr->addr[5]);\r
+    //sendParieSuccess(1,&phone_addr); //????\r
+    sendParieSuccess(1,addr);\r
+    uapi_set_br_address(addr);\r
+\r
+     WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_gap_ble_auth_complete_callback %x %x %x %x %x %x\r\n",\r
+     phone_addr.addr[0],phone_addr.addr[1],phone_addr.addr[2],phone_addr.addr[3],phone_addr.addr[4],phone_addr.addr[5]);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "svr_gap_ble_auth_complete_callback %x %x %x %x %x %x\r\n",\r
+    addr->addr[0],addr->addr[1],addr->addr[2],addr->addr[3],addr->addr[4],addr->addr[5]);\r
 }\r
 \r
 \r
@@ -1482,8 +1492,8 @@ void custom_ble_service_start(void)
 \r
     AdverFlag = true;\r
     svr_ble_adv_start_param();\r
-   \r
-    gap_br_set_bt_scan_mode(GAP_SCAN_MODE_CONNECTABLE, 0);\r
+    gap_br_set_bt_scan_mode(GAP_SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE, 0); \r
+    //gap_br_set_bt_scan_mode(GAP_SCAN_MODE_CONNECTABLE, 0);\r
    \r
 }\r
 \r
@@ -1689,6 +1699,10 @@ errcode_t uapi_blesrv_service_init(void)
     return ERRCODE_SUCC;\r
 }\r
 \r
+void send_pair_succ(bd_addr_t *addr)\r
+{\r
+    sendParieSuccess(1,addr);\r
+}\r
 \r
 \r
 \r
index a955a2f..8438e04 100644 (file)
@@ -61,6 +61,9 @@ void uapi_ble_disconnect_device(void);
 void br_adv_start(uint8_t sec);
 
 void br_adv_stop(void);
+
+void send_pair_succ(bd_addr_t *addr);
+
 #ifdef __cplusplus
 }
 #endif