添加蓝牙设备解绑逻辑 2809/1 2809/head 2810/target/1
authorluozheng <1732036298@qq.com>
Thu, 27 Nov 2025 02:04:18 +0000 (10:04 +0800)
committerluozheng <1732036298@qq.com>
Thu, 27 Nov 2025 02:04:18 +0000 (10:04 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/bluetooth/src/BluetoothModel.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/bluetooth/src/Ln_Bluetooth_apiC.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/include/bluetooth/BluetoothModel.h
code/sdk/application/wearable/ln/nativeapp/nativeui/include/bluetooth/Ln_Bluetooth_apiC.h
code/sdk/zhihui/leiniao/imsl_ln/leiniao_api_at.c
code/sdk/zhihui/leiniao/imsl_ln/ln_api.c

index 5f08874..f5071ed 100644 (file)
@@ -567,6 +567,69 @@ int BluetoothModel::UnBindLocalDevice(void)
     return ret;\r
 }\r
 \r
+/* 解析蓝牙地址字符串为 bd_addr_t 结构 */\r
+static int parse_bt_address(const char *addr_str, bd_addr_t *addr)\r
+{\r
+    if (addr_str == NULL || addr == NULL) {\r
+        return 0;\r
+    }\r
+    \r
+    // 支持格式: "AA:BB:CC:DD:EE:FF" 或 "AABBCCDDEEFF"\r
+    unsigned int addr_bytes[6] = {0};\r
+    int count = sscanf(addr_str, "%02X:%02X:%02X:%02X:%02X:%02X",\r
+                       &addr_bytes[0], &addr_bytes[1], &addr_bytes[2],\r
+                       &addr_bytes[3], &addr_bytes[4], &addr_bytes[5]);\r
+    \r
+    if (count != 6) {\r
+        // 尝试无冒号格式\r
+        count = sscanf(addr_str, "%02X%02X%02X%02X%02X%02X",\r
+                       &addr_bytes[0], &addr_bytes[1], &addr_bytes[2],\r
+                       &addr_bytes[3], &addr_bytes[4], &addr_bytes[5]);\r
+        if (count != 6) {\r
+            return 0;\r
+        }\r
+    }\r
+    \r
+    // 蓝牙地址是反向存储的\r
+    addr->addr[0] = (unsigned char)addr_bytes[5];\r
+    addr->addr[1] = (unsigned char)addr_bytes[4];\r
+    addr->addr[2] = (unsigned char)addr_bytes[3];\r
+    addr->addr[3] = (unsigned char)addr_bytes[2];\r
+    addr->addr[4] = (unsigned char)addr_bytes[1];\r
+    addr->addr[5] = (unsigned char)addr_bytes[0];\r
+    \r
+    return 1;\r
+}\r
+\r
+// 解绑远程设备\r
+int BluetoothModel::UnBindRemoteDevice(const char *mac)\r
+{\r
+    if (mac == nullptr) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnBindRemoteDevice mac is nullptr");\r
+        return 0;\r
+    }\r
+    bd_addr_t addr = {0};\r
+    if (parse_bt_address((char*)mac, &addr) != 1) {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ERROR: Invalid Bluetooth address format");\r
+        return ERRCODE_FAIL;\r
+    }\r
+    bool ret = gap_remove_pair(&addr);\r
+    WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "gap_remove_pair %d", ret);\r
+    if(ret == false)\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnBindRemoteDevice gap_remove_pair ret = 0");\r
+        char *bluetoothStatus = "UNBIND_FAILED";\r
+        do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_BLUETOOTH_STATUS_REPORT, bluetoothStatus, strlen(bluetoothStatus));\r
+    }\r
+    else\r
+    {\r
+        WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "UnBindRemoteDevice gap_remove_pair ret = 1");\r
+        char *bluetoothStatus = "UNBIND_SUCCESS";\r
+        do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_BLUETOOTH_STATUS_REPORT, bluetoothStatus, strlen(bluetoothStatus));\r
+    }\r
+    return ret;\r
+}\r
+\r
 // 设置绑定的本地设备MAC地址\r
 void BluetoothModel::SetBoundDeviceMac(const char *mac)\r
 {\r
@@ -720,8 +783,8 @@ void BtGapPairStatusChangedCallback(const bd_addr_t *bdAddr, int status)
         bdAddr->addr[3], bdAddr->addr[2], bdAddr->addr[1], bdAddr->addr[0], status); /* addr下标 0 1 2 3 */\r
     if(status == GAP_PAIR_NONE){\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "取消配对");\r
-        char *bluetoothStatus = "UNBIND_SUCCESS";\r
-        do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_BLUETOOTH_STATUS_REPORT, bluetoothStatus, strlen(bluetoothStatus));\r
+        // char *bluetoothStatus = "UNBIND_SUCCESS";\r
+        // do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_BLUETOOTH_STATUS_REPORT, bluetoothStatus, strlen(bluetoothStatus));\r
     } else if(status == GAP_PAIR_PAIRING){\r
         WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "正在配对");\r
     } else if(status == GAP_PAIR_PAIRED){\r
index 7d0617a..512e61f 100644 (file)
@@ -184,6 +184,18 @@ extern "C"
         return 0;
     }
 
+    // 解绑远程设备
+    int ln_bt_unbind_remote_device(const char *addr)
+    {
+        if (addr == NULL)
+        {
+            WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ln_bt_unbind_remote_device addr is NULL");
+            return -1;
+        }
+        OHOS::BluetoothModel::GetInstance()->UnBindRemoteDevice(addr);
+        return 0;
+    }
+
     // 获取绑定的本地设备MAC地址
     char *ln_bt_get_bound_device_mac(void)
     {
index cee1db3..70f3c9e 100644 (file)
@@ -90,6 +90,7 @@ public:
     int ConnectRemoteDevice(const bd_addr_t *addr);\r
     int DisconnectRemoteDevice(void);\r
     int UnBindLocalDevice(void);\r
+    int UnBindRemoteDevice(const char *mac);\r
     void SetBoundDeviceMac(const char *mac);\r
     void SetLastConnedDeviceName(const char *name);\r
     char *GetBoundDeviceMac(void);\r
index 5751ec6..c00385b 100644 (file)
@@ -21,6 +21,10 @@ int ln_bt_disconnect(void);
 // 解绑本地设备
 int ln_bt_unbind(void);
 
+// 解绑远程设备
+int ln_bt_unbind_remote_device(const char *addr);
+
+
 // 获取绑定的本地设备MAC地址
 char *ln_bt_get_bound_device_mac(void);
 
index 2c5bb2b..4fb245d 100644 (file)
@@ -1660,8 +1660,8 @@ static uint32_t ln_bluetooth_status_report_at(uint8_t *para, uint32_t paraLen, c
     }
     printf("+LN_BLUETOOTH_STATUS_REPORT: OK\n");
     printf("[LN][BLUETOOTH_STATUS_REPORT] bluetoothStatus=%s\n", bluetoothStatus);
-    // do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_BLUETOOTH_STATUS_REPORT, bluetoothStatus, strlen(bluetoothStatus));
-    push_bluetooth_connect_notification(bluetoothStatus);
+    do_ln_http_server_send_data(LN_HTTP_SERVICE_CMD_BLUETOOTH_STATUS_REPORT, bluetoothStatus, strlen(bluetoothStatus));
+    // push_bluetooth_connect_notification(bluetoothStatus);
     return ERRCODE_SUCC;
 }
 /* 格式化打印蓝牙地址 */
index c2135c3..8932f3a 100644 (file)
@@ -20,6 +20,7 @@
 #ifdef CUSTOM_UTILS
 #include "custom_utils.h"
 #endif
+#include "bluetooth/Ln_Bluetooth_apiC.h"
 // 声明播放器消息处理函数
 
 static app_task_definition_t ln_send_taskcfg = {0};
@@ -946,6 +947,7 @@ void ln_ws_process_message(const ws_data_msg_t *data_msg, ws_command_t type)
             );
             /* TODO: 这里应该调用实际的蓝牙解绑接口,执行解绑操作 */
             /* 解绑完成后,通过BluetoothStatusReport命令上报最终状态 */
+            ln_bt_unbind_remote_device(unbind_data->bluetooth_address);
         }
         break;
     }