HarmonyOS6.0的蓝牙技术入门:从日常用到鸿蒙开发,一篇讲透!

48 阅读4分钟

Hello!我是程序员Feri—— 13 年编程老炮,实战派技术人,拆解编程技巧、分享副业心得,记录程序员的进阶路,AI 时代一起稳稳向前。

你每天用蓝牙连耳机听歌、连键盘打字、连车载导航——这个“设备间的无线传声筒”,其实藏着两种“性格”,还能在鸿蒙里轻松开发调用。不用怕技术术语,咱们从“怎么用”到“怎么开发”,用大白话讲明白。

一、先搞懂:蓝牙到底是个啥?

简单说,蓝牙就是让设备“不插线,近距离传数据”的技术,规矩由蓝牙技术联盟(SIG) 定,咱们常用的手机、耳机、打印机,都靠它“说话”。

它工作时靠两个关键:

  1. 频段:用大家熟悉的2.4GHz频段(和WiFi、微波炉有点像);
  2. 躲干扰技巧:会用“频率跳跃技术(FHSS)”——在2.4GHz里不断换“小频道”,避免和WiFi、微波炉抢信号,减少卡顿。

二、蓝牙的两种“性格”:传统蓝牙 vs 低功耗蓝牙(BLE)

蓝牙不是“一刀切”,它分两种,适用场景完全不同,用表格一看就懂:

类型通俗特点关键参数你常用的场景
传统蓝牙(BR/EDR)“能扛大活”:传数据快、功能全,适合高清音频最高速率23Mbps(比BLE快20多倍),理想环境下能传100米连蓝牙耳机听无损音乐、连车载蓝牙读电话本、连打印机传文件
低功耗蓝牙(BLE)“超级省电”:速率够用,但功耗极低,续航超久最高速率1Mbps,通常传10米左右连智能手环测心率、连智能门锁、连物联网传感器(比如温湿度检测器)

三、鸿蒙开发里用蓝牙:4步搞定实操

如果你是鸿蒙开发者,想让APP支持蓝牙功能,不用复杂操作,跟着这4步来:

1. 先打包“开关工具”

把“打开蓝牙”“关闭蓝牙”的功能,封装成一个单独的操作类(比如叫BluetoothManager)。这样后续页面里不用重复写代码,直接调用就行。

示例代码:


//封装蓝牙的打开和关闭
import { access } from '@kit.ConnectivityKit';
import { BusinessError } from '@kit.BasicServicesKit';

export class BluetoothAdapter {
  // 定义蓝牙开关状态变化函数回调
  onReceiveEvent = (data: access.BluetoothState) => {
    let btStateMessage = '';
    switch (data) {
      case access.BluetoothState.STATE_OFF:
        // 表示蓝牙是关闭的
        btStateMessage += 'STATE_OFF';
        break;
      case access.BluetoothState.STATE_TURNING_ON:
        btStateMessage += 'STATE_TURNING_ON';
        break;
      case access.BluetoothState.STATE_ON:
        // 表示蓝牙是开启的,此时应用才可以使用蓝牙其他功能
        btStateMessage += 'STATE_ON';
        break;
      case access.BluetoothState.STATE_TURNING_OFF:
        btStateMessage += 'STATE_TURNING_OFF';
        break;
      case access.BluetoothState.STATE_BLE_TURNING_ON:
        btStateMessage += 'STATE_BLE_TURNING_ON';
        break;
      case access.BluetoothState.STATE_BLE_ON:
        btStateMessage += 'STATE_BLE_ON';
        break;
      case access.BluetoothState.STATE_BLE_TURNING_OFF:
        btStateMessage += 'STATE_BLE_TURNING_OFF';
        break;
      default:
        btStateMessage += 'unknown state';
        break;
    }
       console.log('蓝牙状态: ' + btStateMessage)
  };

  // 开启蓝牙
  public openBluetooth() {
    try {
      access.on('stateChange', this.onReceiveEvent);
    } catch (err) {
      console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
    }
    try {
      // 主动获取蓝牙当前的开关状态
      let state = access.getState();
      if (state == access.BluetoothState.STATE_OFF) {
        // 若蓝牙是关闭的,则主动开启蓝牙
        access.enableBluetooth();
      }
    } catch (err) {
      console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
    }
  }

  // 关闭蓝牙
  public closeBluetooth() {
    try {
      // 主动获取蓝牙当前的开关状态
      let state = access.getState();
      if (state == access.BluetoothState.STATE_ON) {
        // 若蓝牙是开启的,则主动关闭蓝牙
        access.disableBluetooth();
      }
    } catch (err) {
      console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
    }
  }
}

let adapter = new BluetoothAdapter();
export default adapter as BluetoothAdapter;

2. 加“蓝牙使用许可”

在项目的module.json5配置文件里,添加上蓝牙权限ohos.permission.ACCESS_BLUETOOTH

就像你用APP前要同意“使用蓝牙”,鸿蒙也需要这一步“授权”。

示例代码:

{//蓝牙权限
        "name": "ohos.permission.ACCESS_BLUETOOTH",
        "usedScene": {
          "abilities": [
            "FormAbility"
          ],
          "when": "inuse"
        },
        "reason": "$string:app_name"
      }

3. 做个简单的交互页面

写一个页面,核心要实现两件事:

  • 处理“用户授权”:如果用户没同意用蓝牙,弹出提示让他授权;

  • 放个“开关按钮”:用户点一下就能打开/关闭蓝牙,直观又好操作。

示例代码:

import { abilityAccessCtrl, bundleManager, Permissions } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import adapter from '../bluetooths/BluetoothAdapter';

@Entry
@Component
struct TwoPage {
  @State message: string = 'Hello World';
  async checkPermissionGrant(permission: Permissions): Promise {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;

    // 获取应用程序的accessTokenID。
    let tokenId: number = 0;
    try {
      let bundleInfo: bundleManager.BundleInfo =
        await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
      let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
      tokenId = appInfo.accessTokenId;
    } catch (error) {
      const err: BusinessError = error as BusinessError;
      console.error(`Failed to get bundle info for self, code: ${err.code}, message: ${err.message}`);
    }

    // 校验应用是否被授予权限。
    try {
      grantStatus = await atManager.checkAccessToken(tokenId, permission);
    } catch (error) {
      const err: BusinessError = error as BusinessError;
      console.error(`Failed to check access token, code: ${err.code}, message: ${err.message}`);
    }

    return grantStatus;
  }

  async checkPermissions(): Promise {
    let grantStatus1: boolean = await this.checkPermissionGrant('ohos.permission.ACCESS_BLUETOOTH') ===
    abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED; // 获取精确定位权限状态。
    // 精确定位权限只能跟模糊定位权限一起申请,或者已经有模糊定位权限才能申请精确定位权限。
    if (!grantStatus1) {
      // 申请精确蓝牙权限。
      this.message="未获取授权,请授权!"
      await abilityAccessCtrl.createAtManager().requestPermissionsFromUser(this.getUIContext().getHostContext(),
        ['ohos.permission.ACCESS_BLUETOOTH']);
    }
    else {
      // 已经授权,可以继续访问目标操作。
      this.message="以获取授权!";
    }
  }
  aboutToAppear(): void {
    this.checkPermissions()
  }

  build() {
    Column({ space: 20 }) {
      Text(this.message)
        .fontSize(30)
        .fontColor(Color.Red)
      
      Button("打开蓝牙")
        .onClick(() => {
          adapter.openBluetooth();
        })

      Button("关闭蓝牙")
        .onClick(() => {
          adapter.closeBluetooth();
        })
    }
    .height('100%')
    .width('100%')
  }
}

4. 跑起来测试

把项目装到鸿蒙设备(或模拟器)上,点一点开关,看看蓝牙能不能正常开启、关闭,授权流程有没有问题——没问题就搞定了!

小结:蓝牙技术核心记3点

  1. 分两种:传统蓝牙“传得快、功能全”,BLE“省电费、续航久”;

  2. 工作时会“跳频道躲干扰”,避免和其他设备抢信号;

  3. 鸿蒙开发用蓝牙,先加权限、再封工具类、最后做页面,4步就落地。

如果大家想考取鸿蒙开发者认证的,欢迎加入我的专属考试链接中:developer.huawei.com/consumer/cn…

关注我,跟着我一起畅游鸿蒙代码!