Hello!我是程序员Feri—— 13 年编程老炮,实战派技术人,拆解编程技巧、分享副业心得,记录程序员的进阶路,AI 时代一起稳稳向前。
你每天用蓝牙连耳机听歌、连键盘打字、连车载导航——这个“设备间的无线传声筒”,其实藏着两种“性格”,还能在鸿蒙里轻松开发调用。不用怕技术术语,咱们从“怎么用”到“怎么开发”,用大白话讲明白。
一、先搞懂:蓝牙到底是个啥?
简单说,蓝牙就是让设备“不插线,近距离传数据”的技术,规矩由蓝牙技术联盟(SIG) 定,咱们常用的手机、耳机、打印机,都靠它“说话”。
它工作时靠两个关键:
- 频段:用大家熟悉的2.4GHz频段(和WiFi、微波炉有点像);
- 躲干扰技巧:会用“频率跳跃技术(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点
-
分两种:传统蓝牙“传得快、功能全”,BLE“省电费、续航久”;
-
工作时会“跳频道躲干扰”,避免和其他设备抢信号;
-
鸿蒙开发用蓝牙,先加权限、再封工具类、最后做页面,4步就落地。
如果大家想考取鸿蒙开发者认证的,欢迎加入我的专属考试链接中:developer.huawei.com/consumer/cn…
关注我,跟着我一起畅游鸿蒙代码!