HarmonyOS 鸿蒙Next中目前是否有监听蓝牙断开连接的相关api

HarmonyOS 鸿蒙Next中目前是否有监听蓝牙断开连接的相关api

【问题描述】:监听蓝牙断开事件可以通过其它方案实现,比较麻烦,是否有直接监听蓝牙断开的api,如果没有后续是否有加入这个api的计划;还有蓝牙取消配对,也无对应的取消蓝牙配对的API

【问题现象】:需求问题

【版本信息】:开发工具版本:6.0.0 Api语言版本:20

【复现代码】:无

【尝试解决方案】:无

8 回复

暂时还没有提供直接监听spp蓝牙断开的api,可以参考以下方案是否满足,可以设置监听事件来监听蓝牙设备连接状态的变化,当有设备连接或断开时触发回调:

  • 方案一:可以通过sppWrite接口判断经典蓝牙是否已经断连,如果try-catch中捕获到了错误码2901054,表示经典蓝牙已经断开了连接。参考样例如下:
    import { socket } from '@kit.ConnectivityKit';
    
    // 入参clientNumber由sppAccept或sppConnect接口获取。
    let clientNumber = -1;
    let arrayBuffer = new ArrayBuffer(8);
    let data = new Uint8Array(arrayBuffer);
    data[0] = 123;
    try {
      socket.sppWrite(clientNumber, arrayBuffer);
    } catch (err) {
      // 调用sppWrite方法写入时,如果经典蓝牙已经断开了连接,此处可以捕获到2901054:SPP IO error。
    }
    
  • 方案二:可以通过循环调用sppReadAsync方法来监听spp蓝牙是否断开连接,如果spp蓝牙断开的话,接口会返回2901054错误。参考代码如下:
    import { socket } from '@kit.ConnectivityKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    let clientNumber = -1; // 入参clientNumber由sppAccept或sppConnect接口获取。
    let buffer = new ArrayBuffer(1024);
    let data = new Uint8Array(buffer);
    let flag = 1;
    while (flag) {
      try {
        socket.sppReadAsync(clientNumber).then((outBuffer: ArrayBuffer) => {
          buffer = outBuffer;
        });
        if (buffer != null) {
          console.info('sppRead success');
        } else {
          console.error('sppRead error, data is null');
        }
      } catch (err) {
        flag = 0;
        console.error('startSppRead errCode');
      }
    }
    

更多关于HarmonyOS 鸿蒙Next中目前是否有监听蓝牙断开连接的相关api的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


基于信息安全考虑,目前不支持通过代码取消配对。若需取消配对,可引导用户进入蓝牙设置页面手动操作。打开系统蓝牙设置页面的方法如下:

/**
 * Opens the system Bluetooth settings page.
 * This method uses HarmonyOS Ability framework to launch the system settings ability specifically for Bluetooth configuration.
 */
private openBlueToothSettingsPage() {
  const context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext;
  const want: Want = {
    bundleName: 'com.huawei.hmos.settings',
    abilityName: 'com.huawei.hmos.settings.MainAbility',
    uri: 'bluetooth_entry'
  };
  context.startAbility(want).catch((err: BusinessError) => {
    console.error(`Failed to open bluetooth settings, error info: ${JSON.stringify(err)}`);
  });
}

请问您是在什么样的业务场景中使用该能力,交互流程是怎样的,在哪一个环节遇到了问题?方便说明能力不满足可能带来的影响:什么时间用到?是否高频?有无三方库可以做到?若提供该能力,是否会造成大工作量返工?请您注意提供的内容不要包含您或第三方的非公开信息,如给您带来不便,敬请谅解。

你好,不好意思我想问的是SPP 经典蓝牙 不是BLE,是否有直接监听蓝牙断开的api,

已在最新楼层回复,

可以参考以下:

client端使用BLE蓝牙监听代码可参考on(‘BLEConnectionStateChange’)

server端使用BLE蓝牙监听代码可参考on(‘connectionStateChange’)

无论是使用client端监听接口,还是使用server端监听接口,都需要提前创建对应的对象实例,并且保证调用监听接口时,对象实例未被销毁。当BLE蓝牙断开连接,监听接口不再需要使用时,应当及时调用相应的off接口取消监听。

【背景知识】

名称 说明
STATE_DISCONNECTED 0 表示profile已断连
STATE_CONNECTING 1 表示profile正在连接
STATE_CONNECTED 2 表示profile已连接
STATE_DISCONNECTING 3 表示profile正在断连

蓝牙实例可以注册一个监听,用来监听蓝牙连接状态的:蓝牙连接状态监听,你可以根据里面的state来执行不同的操作。

取消配对一般是在手机的蓝牙上操作的吧?

HarmonyOS Next蓝牙连接状态监听

HarmonyOS Next提供了蓝牙连接状态监听API。通过BluetoothHoston('stateChange')方法可以监听蓝牙适配器状态变化,包括断开连接事件。

具体实现需要注册状态变化回调,在回调函数中处理CONNECTEDDISCONNECTED状态。

相关接口在@ohos.bluetooth.connection模块中定义。

在HarmonyOS Next(API 20)中,目前没有提供直接监听蓝牙断开连接事件的专用API。开发者通常需要通过轮询蓝牙连接状态或监听蓝牙状态变化来实现类似功能,这确实会增加实现的复杂度。

关于取消蓝牙配对的API,当前版本同样没有提供直接接口。取消配对操作通常需要依赖系统级的蓝牙管理功能,目前开放的能力中未包含此接口。

根据HarmonyOS的演进规划,蓝牙相关的能力会持续增强,后续版本中可能会考虑加入更完善的连接事件监听和配对管理API。建议关注官方文档和版本更新日志,以获取最新的API支持信息。

回到顶部