蓝牙绑定解绑ui接入
authordxy <1731678236@qq.com>
Fri, 29 Mar 2024 08:02:14 +0000 (16:02 +0800)
committerdxy <1731678236@qq.com>
Fri, 29 Mar 2024 08:02:14 +0000 (16:02 +0800)
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/msg_center/src/notify/pairing_notification.cpp

index d629264..3b3d97a 100644 (file)
@@ -224,10 +224,10 @@ errcode_t sendBleData(uint8_t *buf,uint16_t len)
 {\r
     errcode_t ret = ERRCODE_FAIL;\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
+    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
@@ -265,6 +265,7 @@ void sendConfirmParieSucess(void)
     sendBleData(value,19);\r
 }\r
 \r
+uint8_t phoneType = 0;\r
 static uint8_t  jsonCheck_phoneinfor(uint8_t *buf,uint8_t *mac_data,char *devname)//解析手机信息json\r
 {\r
     uint8_t len = 0;\r
@@ -283,10 +284,12 @@ static uint8_t  jsonCheck_phoneinfor(uint8_t *buf,uint8_t *mac_data,char *devnam
 \r
     cJSON* pn = cJSON_GetObjectItem(root, "pn");\r
     if (cJSON_IsString(pn)) {\r
-        \r
         len = strlen(pn->valuestring)+1;   \r
-        pn->valuestring[len-1]='\0';\r
-        memcpy((uint8_t *)devname,(uint8_t *)pn->valuestring,strlen(pn->valuestring));\r
+        if(len -1 > 0){\r
+            pn->valuestring[len-1]='\0';\r
+            memcpy((uint8_t *)devname,(uint8_t *)pn->valuestring,strlen(pn->valuestring));\r
+        }\r
+        \r
         printf("设备名称: %s\n", pn->valuestring);\r
     }\r
 \r
@@ -294,6 +297,7 @@ static uint8_t  jsonCheck_phoneinfor(uint8_t *buf,uint8_t *mac_data,char *devnam
     if (cJSON_IsNumber(tp)) {\r
         printf("类型: %d\n", tp->valueint);\r
         type = tp->valueint;\r
+        phoneType = type;\r
     }\r
 \r
     cJSON* mac = cJSON_GetObjectItem(root, "mac");\r
@@ -380,7 +384,9 @@ void clearPaireCmd(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totaldata,
         clearPaireFlag(0);\r
     }\r
 }\r
+char *savephonename;\r
 //确认配对指令\r
+uint8_t first_bond = 0;//是否第一次绑定 第一次绑定保存配对mac地址\r
 void comfirmPaire(uint8_t flag)\r
 {\r
     uint8_t value[19];\r
@@ -398,27 +404,42 @@ void comfirmPaire(uint8_t flag)
     sendBleData(value,19);\r
     if(flag == 1)\r
     {\r
+        first_bond = 1;\r
+        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
         gap_ble_pair_remote_device(&phone_addr);\r
     }else{\r
-        if(Bleconnect == GAP_BLE_STATE_CONNECTED){//设备连接需要断开\r
-            gap_ble_disconnect_remote_device(&phone_addr);//与固定的mac设置地址进行断开连接\r
-            gap_ble_remove_pair(&phone_addr);\r
+        first_bond = 0;\r
+        printf("gap_ble_pair_remote_device 444444444\r\n");\r
+        gap_ble_disconnect_remote_device(&disconect_addr);//与固定的mac设置地址进行断开连接\r
+        gap_ble_remove_pair(&disconect_addr);//清除配对信息\r
+        if(savephonename != NULL)\r
+        {\r
+            free(savephonename);\r
         }\r
-        svr_ble_adv_start();\r
-\r
     }\r
 }\r
+\r
 // l连接手表之后-app通过特征值2AE4读手表信息->手表会把相应的信息给app->app通过73 02 10下发手机信息给设备(第一次连接mac为空)->设备返回73 02 10状态1才能和手机app第一次连接->设备会回发配对指令72 05 11给app,同时设备会对手机发起配对->手机点了配对后,配对成功手表会发配对成功指令72 05 10,这条指令包含手机的mac地址也会传给app->app校验解析成功之后->app下发时间指令72 02 02给设备->设备回复解析成功->完成连接\r
 void alarmData(void)\r
 {\r
 \r
 }\r
-void getPhoneMac(uint8_t *phonemac)\r
+//phonemac 手机app下发手机的mac地址 \r
+//name 手机设备名称\r
+//*len 手机设备名称长度\r
+//*mac_type 手机蓝牙mac地址类型 共有还是私有的\r
+static void getRecvPhoneInfo(uint8_t *phonemac,uint8_t *name,uint8_t *len,uint8_t *mac_type)\r
 {\r
+    uint8_t datalen = 0;\r
     uint8_t mac[6];\r
     memset(mac,0,6);\r
     uint8_t count = 0;\r
     FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");\r
+    if(jsfile == NULL)\r
+    {\r
+        return;\r
+    }\r
     if (jsfile != NULL) {\r
         printf("succes opening file\n");\r
         fseek(jsfile, 0, SEEK_END);\r
@@ -450,14 +471,254 @@ void getPhoneMac(uint8_t *phonemac)
                 }\r
                 printf("\n");\r
             }\r
+            if(mac[0] !=0 && mac[1] != 0 && mac[2] != 0 && mac[3] != 0 && mac[4] != 0 && mac[5] != 0)\r
+            {\r
+                memcpy(phonemac,mac,6);\r
+            }\r
+            \r
+            cJSON *pn = cJSON_GetObjectItem(root,"pn");\r
+            if(cJSON_IsString(pn))\r
+            {\r
+                datalen = strlen(pn->valuestring)+1;\r
+                if(datalen-1 > 0){\r
+                    pn->valuestring[datalen-1]='\0';\r
+                    memcpy(name,(uint8_t *)pn->valuestring,strlen(pn->valuestring));\r
+                    datalen = strlen(pn->valuestring);\r
+                    memcpy(&len,&datalen,1);\r
+                }\r
+            }\r
+            cJSON *mactype = cJSON_GetObjectItem(root,"mac_type");\r
+            if(cJSON_IsNumber(mac_type))\r
+            {\r
+                memcpy(&mac_type,&mactype->valueint,1);\r
+            }\r
         }\r
         // 释放资源\r
         cJSON_Delete(root);\r
     }\r
-    memcpy(phonemac,mac,6);\r
+   \r
 }\r
-uint8_t firts_bond = 0;//是否第一次绑定 第一次绑定保存配对mac地址\r
-void getPhoneInfo(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,uint8_t crcvalue)//获取手机信息\r
+\r
+void getPhoneNameLen(uint8_t *crcnum,uint8_t *datalen)//获取手机设备名称长度\r
+{\r
+    uint8_t len = 0;\r
+    uint8_t *json = crcnum;\r
+    cJSON* root = cJSON_Parse((const char *)json);\r
+    \r
+    if(root != NULL)\r
+    {\r
+        cJSON* pn = cJSON_GetObjectItem(root, "pn");\r
+        if (cJSON_IsString(pn)) {\r
+            len = strlen(pn->valuestring)+1;   \r
+            printf("设备名称: %s len:%d\n", pn->valuestring,len);\r
+        }\r
+        memcpy(datalen,&len,1);\r
+        cJSON_Delete(root);\r
+    } \r
+}\r
+\r
+static char *getPhoneName(uint8_t *crcnum)//获取手机设备名称\r
+{\r
+    uint8_t *json = crcnum;\r
+    char *str = NULL; \r
+    cJSON* root = cJSON_Parse((const char *)json);\r
+    if(root != NULL)\r
+    {\r
+        cJSON* pn = cJSON_GetObjectItem(root, "pn");\r
+        if (cJSON_IsString(pn)) {\r
+            uint8_t datalen = strlen(pn->valuestring)+1;   \r
+            if(datalen - 1 > 0){\r
+                pn->valuestring[datalen-1]='\0';\r
+                str = malloc(sizeof(char)*datalen);\r
+                savephonename =  malloc(sizeof(char)*datalen);\r
+                strcpy(str,pn->valuestring);\r
+                strcpy(savephonename,pn->valuestring);\r
+                printf("str:%s savephonename:%s\n",str,savephonename);\r
+            }\r
+            printf("设备名称: %s\n", pn->valuestring);\r
+        }\r
+        cJSON_Delete(root);\r
+    } \r
+    return str;\r
+}\r
+void getPhoneMac(uint8_t *crcnum,uint8_t *phoneMac)//获取手机设备mac这个是手表上传给手机的mac地址\r
+{\r
+    uint8_t *json = crcnum;\r
+    uint8_t phone_tmp[6];\r
+    memset(phone_tmp,0,6);\r
+    cJSON* root = cJSON_Parse((const char *)json);\r
+    uint8_t datalen = 0;\r
+    uint8_t count = 0;\r
+    if(root != NULL)\r
+    {\r
+        cJSON* mac = cJSON_GetObjectItem(root, "mac");\r
+        if (cJSON_IsArray(mac)) {\r
+            printf("MAC地址: ");\r
+            cJSON* macElement = NULL;\r
+            cJSON_ArrayForEach(macElement, mac) {\r
+                if (cJSON_IsNumber(macElement)) {\r
+                    printf("%d", macElement->valueint);\r
+                    if (macElement->prev != NULL) {\r
+                        phone_tmp[count++] = macElement->valueint;\r
+                        printf(", ");\r
+                    }\r
+                }\r
+            }\r
+            printf("\n");\r
+        }\r
+        if(phone_tmp[0] == 0 && phone_tmp[1] == 0 && phone_tmp[2] == 0 && phone_tmp[3] == 0 && phone_tmp[4] == 0 && phone_tmp[5] == 0){\r
+            memcpy(phoneMac,phone_tmp,6);\r
+        }else\r
+        {\r
+            memcpy(phoneMac,0,6);\r
+        }\r
+        cJSON_Delete(root);\r
+    } \r
+}\r
+\r
+void GetwatchSaveMac(uint8_t *mac,uint8_t *mactype)//获取手表本地保存的mac地址和mac地址类型 分共有和私有的\r
+{\r
+    uint8_t mac_tmp[6];\r
+    memset(mac_tmp,0,6);\r
+    uint8_t count = 0;\r
+    uint8_t type= 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
+        // 解析JSON数据\r
+        cJSON *root = cJSON_Parse(jsonData);\r
+        // 释放资源\r
+        free(jsonData);\r
+        if (root != NULL) {\r
+            cJSON *modifiedJson = cJSON_GetObjectItem(root,"mac");\r
+            if (cJSON_IsArray(modifiedJson)) {\r
+                printf("watch MAC地址: ");\r
+                cJSON* macElement = NULL;\r
+                cJSON_ArrayForEach(macElement, modifiedJson) {\r
+                    if (cJSON_IsNumber(macElement)) {\r
+                        printf("%d", macElement->valueint);\r
+                        if ((macElement->prev != NULL)) {\r
+                            mac_tmp[count] = macElement->valueint;\r
+                            count++;\r
+                            printf(", ");\r
+                        }\r
+                    }\r
+                }\r
+                printf("\n");\r
+            }\r
+            cJSON *mac_type = cJSON_GetObjectItem(root,"mac_type");\r
+            if(cJSON_IsNumber(mac_type))\r
+            {\r
+                memcpy(&mactype,&mac_type->valueint,1);\r
+            }\r
+        }\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
+            memcpy(mac,0,6);\r
+        }else\r
+        {\r
+            memcpy(mac,mac_tmp,6);\r
+        }\r
+        cJSON_Delete(root);\r
+    }\r
+}\r
+static void GetwatchSaveNameLen(uint8_t *datalen)//获取手表本地保存的手机设备名称长度\r
+{\r
+    uint8_t len = 0;\r
+    FILE *jsfile = fopen(PHONE_WATCH_CONFIG_PATH, "r");\r
+    if (jsfile != NULL) {\r
+        printf("GetwatchSaveNameLen 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 *pn = cJSON_GetObjectItem(root,"pn");\r
+            if(cJSON_IsString(pn))\r
+            {\r
+                len = strlen(pn->valuestring)+1;//多加一个加上字符串的结束符\0\r
+                printf("GetwatchSaveNameLen;%d",len);\r
+            }\r
+        };\r
+        memcpy(datalen,&len,1);\r
+        // 释放资源\r
+        cJSON_Delete(root);\r
+    }\r
+}\r
+static char *GetwatchSaveName(void)//获取手表本地保存的手机设备名称\r
+{\r
+    uint8_t count = 0;\r
+    char *str = NULL;\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 *pn = cJSON_GetObjectItem(root,"pn");\r
+            if(cJSON_IsString(pn))\r
+            {\r
+                uint8_t showname_len = strlen(pn->valuestring)+1;\r
+                if(showname_len-1 > 0){\r
+                    str = malloc(sizeof(char)*showname_len);\r
+                    pn->valuestring[showname_len-1]='\0';\r
+                    strcpy(str,pn->valuestring);\r
+                    printf("GetwatchSaveName:%s",pn->valuestring);\r
+                }\r
+            }\r
+        }\r
+        // 释放资源\r
+        cJSON_Delete(root);\r
+    }\r
+    return str;\r
+}\r
+void cleanUnbindInfor(void)//和旧手机解绑清除配对信息\r
+{\r
+    uint8_t MacType = 0;\r
+    uint8_t mac_data[6];\r
+    memset(mac_data,0,6);\r
+    GetwatchSaveMac(&mac_data,&MacType);\r
+    gap_ble_disconnect_remote_device(&disconect_addr);//与固定的mac设置地址进行断开连接\r
+    bd_addr_t inforaddr;\r
+    inforaddr.addr[0] = mac_data[0];\r
+    inforaddr.addr[1] = mac_data[1];\r
+    inforaddr.addr[2] = mac_data[2];\r
+    inforaddr.addr[3] = mac_data[3];\r
+    inforaddr.addr[4] = mac_data[4];\r
+    inforaddr.addr[5] = mac_data[5];\r
+    inforaddr.type = MacType;\r
+    // printf("inforaddr:%x-%x-%x-%x-%x-%x",inforaddr.addr[0],inforaddr.addr[1],inforaddr.addr[2],inforaddr.addr[3],inforaddr.addr[4],inforaddr.addr[5]);\r
+    gap_ble_remove_pair(&inforaddr);//清除配对信息\r
+    //清除保存的文件信息\r
+}\r
+void sendBindInfor(uint8_t *crcnum)\r
 {\r
     uint8_t value[20];\r
     memset(value,0,20);\r
@@ -470,71 +731,106 @@ void getPhoneInfo(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,u
     memcpy(value+7,&tmp,4);\r
     memcpy(value+11,&tmp,4);\r
     memcpy(value+15,&tmp_fen,2);\r
-    phoneDataFlag = 1;\r
-    \r
-    if(Check_CRC(crcnum,len,crcvalue))\r
-    {\r
-        uint8_t *tmp_data;\r
-        tmp_data = crcnum;\r
-        uint8_t copare_mac[6];\r
-        memset(copare_mac,0,6);\r
-        uint8_t datalen=0;\r
-        char devname[256];\r
-        memset(devname,0,256);\r
-        datalen = jsonCheck_phoneinfor(tmp_data,&copare_mac,&devname);\r
-        uint8_t bond = 1;//未与任何手机绑定过\r
-        errcode_t ret = 0;\r
-        firts_bond = 0;\r
-\r
-        uint8_t save_mac[6];\r
-        getPhoneMac(&save_mac);\r
-        memset(save_mac,0,6);\r
-        if(save_mac[0] == 0 && save_mac[1] == 0 && save_mac[2] == 0 && save_mac[3] == 0 && save_mac[4] == 0 && save_mac[5] == 0)//只要手表本地存储没有mac地址就走连接流程重新绑定\r
+\r
+    uint8_t copare_mac[6];\r
+    memset(copare_mac,0,6);\r
+    uint8_t datalen=0;\r
+    char *devname;\r
+    uint8_t devnamelen = 0;\r
+    uint8_t mac_tmp[6];\r
+    memset(mac_tmp,0,6);\r
+\r
+    uint8_t bond = 1;//未与任何手机绑定过\r
+    errcode_t ret = 0;\r
+    first_bond = 0;\r
+   \r
+\r
+    uint8_t save_mac[6];\r
+    memset(save_mac,0,6);\r
+    char *showname;\r
+    uint8_t showname_len = 0;\r
+    uint8_t MacType = 0;\r
+\r
+    GetwatchSaveMac(&save_mac,&MacType);//获取手表设备本地保存的mac地址和mac地址类型 \r
+    getPhoneMac(crcnum,&copare_mac);\r
+    memset(copare_mac,0,6);\r
+    if(save_mac[0] == 0 && save_mac[1] == 0 && save_mac[2] == 0 && save_mac[3] == 0 && save_mac[4] == 0 && save_mac[5] == 0)//只要手表本地存储没有mac地址就走连接流程重新绑定\r
+    {\r
+        #ifdef SUPPORT_DEVICE_PAIRING_NOTIFICATION\r
+        devnamelen = 0;\r
+        getPhoneNameLen(crcnum,&devnamelen);//获取手机下发的手机设备名称长度\r
+        if(devnamelen > 0 )\r
         {\r
-            bond = 0x01;//手表未和任何手机绑定过\r
-            if(copare_mac[0] == 0 && copare_mac[1] == 0 && copare_mac[2] == 0 && copare_mac[3] == 0 && copare_mac[4] == 0 && copare_mac[5] == 0)//只要app没有下发mac就开启弹窗\r
-            {\r
-                #ifdef SUPPORT_DEVICE_PAIRING_NOTIFICATION\r
-                if(datalen == 0){\r
-                    CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,NULL,0);\r
-                }else{\r
-                    CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,(uint8_t *)devname,datalen);\r
-                }\r
-                #endif\r
-            }else{\r
-                ret = gap_ble_pair_remote_device(&phone_addr);\r
+            devname = getPhoneName(crcnum);\r
+            printf("devname:%s devnamelen:%d",devname,devnamelen);\r
+            CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,(uint8_t *)devname,devnamelen);\r
+            if(devname){\r
+                free(devname);\r
             }\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
+        }else{\r
+            CustomEventPublish(TOPIC_EVENT_DEVICE_BIND,NULL,0);\r
+        }\r
+        #endif\r
+        bond = 0x01;//手表未和任何手机绑定过\r
+    }else\r
+    {\r
+        // printf("success parsing JSON :save_mac :%x %x %x %x %x %x copare_mac %x %x %x %x %x %x;\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
+        if(copare_mac[0] == 0 && copare_mac[1] == 0 && copare_mac[2] == 0 && copare_mac[3] == 0 && copare_mac[4] == 0 && copare_mac[5] == 0) \r
         {\r
-            if(copare_mac[0] != 0 && copare_mac[1] != 0 && copare_mac[2] != 0 && copare_mac[3] != 0 &&copare_mac[4] != 0 && copare_mac[5] != 0) \r
+            bond = 0x03;//手表和其他手机绑定过\r
+           \r
+        }else{//如果手机有保存mac app下发是空就提示和其他手机绑定过界面不在发起配对\r
+            int result = memcmp(copare_mac,save_mac,6);\r
+            if(result == 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
+                ret = gap_ble_pair_remote_device(&phone_addr);\r
+                bond = 0x02;//手表与该手机绑定过\r
+            }else{\r
+                bond = 0x03;//手表与其他手机绑定过\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
+    printf("bond flag:%d first_bond:%d\r\n",bond,first_bond);\r
+    value[17] = bond;//\r
+    value[18] = Calculate_CRC(value,18);\r
+    sendBleData(value,19);\r
+    if(bond == 0x03)\r
+    {\r
+        devnamelen = 0;\r
+        GetwatchSaveNameLen(&devnamelen);//获取手表设备保存手机的设备名称长度\r
+        if(devnamelen > 0)\r
+        {   \r
+            devname = GetwatchSaveName();\r
+            printf("devname:%s showname_len:%d",devname,devnamelen);\r
+            CustomEventPublish(TOPIC_EVENT_DEVICE_UNBIND,(uint8_t *)devname,devnamelen);\r
+            if(devname){\r
+                free(devname);\r
+            }\r
+        }else{\r
+            CustomEventPublish(TOPIC_EVENT_DEVICE_UNBIND,NULL,0);\r
         }\r
+        //加解绑提示界面是否和旧的手机解绑app 弹窗提示\r
+    }\r
+}\r
+void getPhoneInfo(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
+    uint32_t tmp = 1;\r
+    uint16_t tmp_fen= 1;\r
+    value[0] =0x72;\r
+    value[1] =0x02;\r
+    value[2] =0x10;\r
+    memcpy(value+3,&tmp,4);\r
+    memcpy(value+7,&tmp,4);\r
+    memcpy(value+11,&tmp,4);\r
+    memcpy(value+15,&tmp_fen,2);\r
+    phoneDataFlag = 1;\r
+    \r
+    if(Check_CRC(crcnum,len,crcvalue))\r
+    {\r
+        sendBindInfor(crcnum);\r
     }else{\r
         value[17] = 0x00;\r
         value[18] = Calculate_CRC(value,18);\r
@@ -543,10 +839,12 @@ void getPhoneInfo(uint16_t cmd,uint8_t *crcnum,uint16_t len,uint8_t *totalData,u
 }\r
 \r
 \r
-void sendParieSuccess(uint8_t flag,uint8_t *mac)//发送配对成功指令to app\r
+void sendParieSuccess(uint8_t flag,bd_addr_t *addr)//发送配对成功指令to app\r
 {\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",addr->addr[0],addr->addr[1],addr->addr[2],addr->addr[3],addr->addr[4],addr->addr[5]);\r
+    if(first_bond == 1 && phoneDataFlag == 1)//第一次连接绑定\r
+    // if(1)\r
+    {\r
         uint8_t value[25];\r
         uint8_t length = 0;\r
         memset(value,0,25);\r
@@ -569,11 +867,17 @@ void sendParieSuccess(uint8_t flag,uint8_t *mac)//发送配对成功指令to app
             cJSON* arrayJSON = cJSON_CreateArray();\r
             for(uint8_t id = 0;id<6;id++)\r
             {\r
-                cJSON_AddNumberToObject(arrayJSON,"id",mac[id]);\r
+                cJSON_AddNumberToObject(arrayJSON,"id",addr->addr[id]);\r
             }\r
-            \r
-            // cJSON_AddNumberToObject(dataJSON,"id",i);\r
+            if(savephonename != NULL)\r
+            {\r
+                cJSON_AddStringToObject(dataJSON,"pn",savephonename);\r
+                free(savephonename);\r
+            }\r
+            cJSON_AddNumberToObject(dataJSON,"phoneType",phoneType);\r
+            cJSON_AddNumberToObject(dataJSON,"mac_type",addr->type);\r
             cJSON_AddItemToObject(dataJSON,"mac",arrayJSON);\r
+\r
             char *jsonString = cJSON_PrintUnformatted(dataJSON);\r
             printf("phone %s",jsonString);\r
             FILE *file = fopen(PHONE_WATCH_CONFIG_PATH, "wb");\r
@@ -586,13 +890,11 @@ void sendParieSuccess(uint8_t flag,uint8_t *mac)//发送配对成功指令to app
                 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
+            memcpy(value+18,addr->addr,6);\r
+            memcpy(parie_mac,addr->addr,6);\r
             length = 18+6;\r
             uint8_t crcvalue = Calculate_CRC(value,length);\r
             value[length] = crcvalue;\r
@@ -3356,11 +3658,7 @@ void getPhoneInfo_test(void)
     // memcpy(value+15,&tmp_data,2);\r
     // memcpy(&value[17],buf,strlen(buf));\r
 \r
-    uint8_t buf[40] = {0x7b,0x22 ,0x70 ,0x6e ,0x22 ,0x3a ,0x22 ,0x46 ,0x72 ,0x61 ,0x6e ,0x6b ,0xe7 ,0x9a ,0x84 ,0x69 ,0x50 ,0x68 ,0x6f ,0x6e ,0x65 ,0x22 ,0x2c ,0x22 ,0x74 ,0x70 ,0x22 ,0x3a ,0x31 ,0x2c ,0x22 ,0x6d ,0x61 ,0x63 ,0x22 ,0x3a ,0x20 ,0x5b ,0x5d ,0x7d};\r
-    uint8_t lrc = Calculate_CRC(buf,40);\r
-    printf("lrc 0x%x",lrc);\r
-    // value[strlen(buf)+17] = Calculate_CRC(value,17+strlen(buf));\r
-    sendBleData(buf,40);\r
+    comfirmPaire(0);\r
 \r
 }\r
 \r
@@ -3369,17 +3667,12 @@ void bleLongRecvData(uint8_t *data, uint16_t data_size,uint8_t *buf_cmd,uint8_t
 {\r
     uint8_t type=buf_cmd[1];\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
+    switch (type)\r
     {\r
-        case 0x73://传输方向 0x73是app下发的 \r
-            switch (type)\r
-            {\r
-                case 0x02://获取手机信息\r
-                    type2AE4Data(buf_cmd,data,data_size,totalData,crcvalue);\r
-                    break;\r
-                default:\r
-                    break;\r
-            }\r
+        case 0x02://获取手机信息\r
+            type2AE4Data(buf_cmd,data,data_size,totalData,crcvalue);\r
+            break;\r
+        default:\r
             break;\r
     }\r
 }\r
@@ -3396,7 +3689,6 @@ void bleDataRecv(uint8_t *totalData, uint16_t event_size,uint16_t handle)
         return;\r
     }\r
     \r
-    \r
     uint8_t crcvalue= 0x00;\r
 \r
     if(data2ae3Cmd == handle)//短指令\r
index bbfa121..2516b0b 100644 (file)
@@ -4,6 +4,7 @@
 #include <stdio.h>
 #include "stdbool.h"
 #include "errcode.h"
+#include "bts_def.h"
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -572,12 +573,12 @@ void revBleOldData(uint8_t *buf, uint16_t event_size,uint16_t handle);//协议
 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 sendParieSuccess(uint8_t flag,bd_addr_t *addr);//发送配对成功指令to app mac手机端的地址
 void getPhoneInfo_test(void);
 void setFindWatchFlag(uint8_t flag);//查找手表标识
 errcode_t bondSucessCmd(void);//发送解绑指令,解绑界面调用这个函数 如果点了✓调用这个函数 返回成功后延迟10s再重启设备  
 void getDeviceState(void);
-
+void cleanUnbindInfor(void);//和旧手机解绑清除配对信息
 void comfirmPaire(uint8_t flag);//发送确认配对指令 1确认配对 0取消配对
 #ifdef __cplusplus
 }
index a9211ff..7184de0 100644 (file)
@@ -79,26 +79,32 @@ static bool AdverFlag = true;
 static uint8_t scan_data[BLE_SCAN_MAC_LENTH] = {0};\r
 \r
 uint8_t phone_mac_data[6]={0};\r
-bd_addr_t phone_addr;\r
+bd_addr_t phone_addr;//发起配对地址反序\r
+bd_addr_t disconect_addr;//断开连接地址不需要反序\r
 uint8_t Bleconnect = 0;//蓝牙默认是断开 0 1 为连接\r
 \r
 uint8_t bond_flag = 0;//绑定标识\r
 uint16_t ble_nus_max_data_len = SDK_BLE_MTU_MIN - 3; \r
 #define A2DP_STREAM_ACCEPT_TIMER_PERIOD 500\r
 static osal_timer g_a2dp_stream_accept_timer = {NULL, NULL, 0, 0};\r
-\r
+#define U6_DEBUG (1)\r
 uint8_t data2ae3Cmd = 0;//2ae3短指令特征值\r
 uint8_t data2ae4Cmd = 0;\r
 #ifdef SUPPORT_BLE_SERVICE\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
+    bd_addr_t new_addr;\r
+    new_addr.type = addr->type;\r
+    new_addr.addr[0] = addr->addr[5];\r
+    new_addr.addr[1] = addr->addr[4];\r
+    new_addr.addr[2] = addr->addr[3];\r
+    new_addr.addr[3] = addr->addr[2];\r
+    new_addr.addr[4] = addr->addr[1];\r
+    new_addr.addr[5] = addr->addr[0];\r
+    printf("set_phone_info:addr.type %x-%x-%x-%x-%x-%x-%x:%d new_addr.type->%d",new_addr.addr[5],new_addr.addr[4],new_addr.addr[3],new_addr.addr[2],new_addr.addr[1],new_addr.addr[0],addr->type,new_addr.type);\r
+    memcpy(&phone_addr,&new_addr,sizeof(bd_addr_t));\r
+    memcpy(&disconect_addr,addr,sizeof(bd_addr_t));\r
+    // printf("phone_addr:%x-%x-%x-%x-%x-%x",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
 enum{\r
@@ -138,7 +144,7 @@ static void svr_ble_adv_data_set(int adv_id)
     memset_s(&adv_data_info, sizeof(gap_ble_config_adv_data_t), 0, sizeof(gap_ble_config_adv_data_t));\r
 \r
 #if U6_DEBUG\r
-    unsigned char set_mac[6] = {0x61,0x22,0x33,0x44,0x09,0x14};\r
+    unsigned char set_mac[6] = {0x61,0x22,0x33,0x44,0x09,0x17};\r
     bluetooth_set_local_addr(set_mac,6);\r
     bd_addr_t addr_info;\r
     int32_t ret= 0;\r
@@ -611,7 +617,6 @@ 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
@@ -824,7 +829,7 @@ static void svr_gap_ble_connect_param_update_callback(uint16_t conn_id, errcode_
 }\r
 static void svr_gap_ble_auth_complete_callback(uint16_t conn_id, const bd_addr_t *addr, errcode_t status,ble_auth_info_evt_t* evt)\r
 {\r
-    sendParieSuccess(1,phone_addr.addr);\r
+    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
 }\r
 // 回调: gap_read_remote_rssi_value 接口的数据上报\r
index b5f3fa2..8c53e02 100644 (file)
@@ -8,6 +8,7 @@
 extern uint16_t g_ble_conn_id;
 extern uint16_t g_ble_server_id;
 extern bd_addr_t phone_addr;
+extern bd_addr_t disconect_addr;//断开连接地址不需要反序
 extern uint8_t bond_flag;
 extern uint8_t phone_mac_data[6];
 extern uint8_t Bleconnect;//蓝牙默认是断开 0 1 为连接
index c8a410a..95e2f79 100644 (file)
@@ -102,6 +102,7 @@ namespace OHOS
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PairingViewEventListener:: DeviceUnBindingButtonCancel  OnClick");
             // 不想执行解绑动作,并关闭解绑的通知界面。
+           
             NotificationManager::GetInstance()->StopNotify();
         }
         else if (&view == DeviceUnBindingButtonOK) // 设备解绑确认按钮
@@ -115,11 +116,16 @@ namespace OHOS
              */
 
             // 关闭通知界面
+            #ifdef SUPPORT_BLE_SERVICE
+            cleanUnbindInfor();
+            #endif
             NotificationManager::GetInstance()->StopNotify();
         }
         else if (&view == DeviceUnbindingRequestButtonOK) // 设备解除绑定请求(与新设备连接)确认
         {
             WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "PairingViewEventListener:: DeviceUnbindingRequestButtonOK  OnClick");
+            
+           
             NotificationManager::GetInstance()->StopNotify();
         }
         else if (&view == DeviceUnbindingRequestButtonCancel) //设备解除绑定请求(与新设备连接)取消