HarmonyOS 鸿蒙Next中低功耗蓝牙连接成功后,没显示“已连接”和怎么取消配对

HarmonyOS 鸿蒙Next中低功耗蓝牙连接成功后,没显示“已连接”和怎么取消配对

使用低功耗蓝牙,连接成功之后,发起配对,打印了配对成功,数据也可以正常的发送和接收。现在有二个疑问:

  1. 配对成功之后,在系统里面会有显示这个设备,但是没有显示“已连接”,手动在系统中点击这个设备,才可以显示“已连接”。需要再调用什么代码可以连接成功之后,自动显示“已连接”?

  2. 配对成功之后,需要取消这个配对(在系统中不显示这个设备),鸿蒙开发中是否有对应的方法?

this.dev = ble.createGattClientDevice(deviceId)
// 连接
this.dev.connect()

// 配对
connection.pairDevice(this.deviceId).then(() => {
    console.log('配对成功');
}, (error: BusinessError) => {
    console.log('配对失败 errCode: ' + error.code + ',errMessage' + error.message);
})

更多关于HarmonyOS 鸿蒙Next中低功耗蓝牙连接成功后,没显示“已连接”和怎么取消配对的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

【背景知识】

蓝牙技术是一种无线通信技术,短距离内进行连接通信,蓝牙connection模块ble模块提供了对蓝牙操作和管理的方法。

【解决方案】

目前BLE蓝牙暂无自动连接功能; 手动点击连接之后,可以订阅BLE连接状态变化,通过connection.getRemoteDeviceName(connection.getPairedDevices[n]) 方法获取到已配对设备的名称,作为ble扫描过滤条件找到指定设备,在后续断开时的回调中编写重连机制实现重连,可参考如下代码:

import { ble, connection, constant } from '@kit.ConnectivityKit';

let gattClient: ble.GattClientDevice = ble.createGattClientDevice('XX:XX:XX:XX:XX:XX');
gattClient.connect();

let deviceName = connection.getRemoteDeviceName(connection.getPairedDevices()[n])

gattClient.on('BLEConnectionStateChange', (state: ble.BLEConnectionChangeState) => {
  console.log('BluetoothPage bluetooth connect state changed');
  let deviceId = state.deviceId;
  console.log(`BluetoothPage deviceId connectState ${deviceId}`)

  // 检测到断开连接
  if (state.state == constant.ProfileConnectionState.STATE_DISCONNECTED) {
    // 根据设备名设置蓝牙扫描过滤条件
    let scanFilter: ble.ScanFilter = {name: deviceName}
    let scanOptions: ble.ScanOptions = {
      interval: 500,
      dutyMode: ble.ScanDuty.SCAN_MODE_LOW_POWER,
      matchMode: ble.MatchMode.MATCH_MODE_AGGRESSIVE,
    }
    ble.startBLEScan([scanFilter], scanOptions);

    // 根据扫描结果获取deviceId进行重连
    ble.on('BLEDeviceFind', (data: Array<ble.ScanResult>) => {
      console.info(`bluetooth device find on = ${data.toString()}`)
      if (data.length > 0) {
        gattClient = ble.createGattClientDevice(data[0].deviceId);
        gattClient.connect()
      }
    });
  }
})

更多关于HarmonyOS 鸿蒙Next中低功耗蓝牙连接成功后,没显示“已连接”和怎么取消配对的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


这些流程我都懂,就是想配对成功之后,在系统的蓝牙里面,可以显示这个设备是“已连接”的,这些代码并不能实现得到啊。

2个原因:

  • Profile连接缺失

    • 配对与连接是独立流程,配对成功后需主动发起profile连接。在BLE场景中,需要确保已建立有效的GATT连接:
    // 在配对成功后补充GATT特征值订阅
    this.dev.connect((err: BusinessError) => {
        if (!err) {
            // 订阅特征值变化通知
            this.dev.setCharacteristicChangeNotification(serviceUuid, characteristicUuid, true)
                .then(() => {
                    console.log('特征值订阅成功');
                });
        }
    });
    
  • 系统UI更新机制

    • 系统显示连接状态需要触发蓝牙profile的实际数据传输。在数据交互后可添加状态更新:
    // 发送任意特征值数据触发状态更新
    const data = new Uint8Array([0x01]);
    this.dev.writeCharacteristicValue(serviceUuid, characteristicUuid, data)
        .then(() => {
            console.log('初始化数据交互成功'); 
        });
    

取消配对的方法

取消配对的API:

import { connection } from '@kit.ConnectivityKit';

// 取消配对目标设备
try {
    connection.unpairDevice(this.deviceId).then(() => {
        console.log('取消配对成功');
    });
} catch (err) {
    console.error('取消配对失败: ' + (err as BusinessError).message);
}

注意

  • 权限配置

    • 确保在module.json5中声明蓝牙权限:
    "requestPermissions": [
        {
            "name": "ohos.permission.DISCOVER_BLUETOOTH",
            "reason": "$string:desc_bluetooth"
        },
        {
            "name": "ohos.permission.USE_BLUETOOTH",
            "reason": "$string:desc_bluetooth"
        }
    ]
    
  • 状态监听(建议补充):

    // 监听连接状态变化
    connection.on('BLEConnectionStateChange', (state: connection.BLEConnectionChangeParam) => {
        if (state.state === 2) { // STATE_CONNECTED
            console.log('系统连接状态已更新');
        }
    });
    

连接成功了,也订阅特征值变化通知。配对也成功了,但是系统的蓝牙里面,并没有显示“已连接”。
一样的硬件设备,在安卓和 iOS 设备中是可以显示到“已连接”的。

connection并没有unpairDevice方法啊,

在HarmonyOS鸿蒙Next中,蓝牙连接成功但未显示"已连接"状态可能是由于UI状态未及时更新或设备未正确上报连接状态。取消配对的操作路径为:进入"设置" > “蓝牙” > 点击已配对设备右侧的齿轮图标 > 选择"取消配对"。若状态显示异常,可尝试关闭蓝牙后重新开启。系统会记录配对信息但不会自动重连。

关于HarmonyOS Next中低功耗蓝牙连接显示和配对管理的问题:

  1. 连接状态显示问题:
  • 系统未自动显示"已连接"状态是因为连接成功后需要主动调用setDeviceStateChangeCallback监听设备状态变化
  • 建议在connect()成功后立即调用:
this.dev.setDeviceStateChangeCallback({
  onConnectionStateChange: (state) => {
    if (state === profile.ConnectionState.STATE_CONNECTED) {
      // 这里会触发系统更新连接状态
    }
  }
});
  1. 取消配对方法:
  • 可以使用connection.unpairDevice()接口:
connection.unpairDevice(this.deviceId).then(() => {
  console.log('取消配对成功');
}).catch((error) => {
  console.error('取消配对失败', error);
});

注意:取消配对后需要重新扫描才能发现设备。这两个接口都属于@ohos.bluetooth.connection模块,请确保已正确导入。

回到顶部