鸿蒙中 蓝牙服务开发(一)
本文介绍了蓝牙技术原理及鸿蒙系统蓝牙开发要点。蓝牙分为传统蓝牙(BR/EDR)和低功耗蓝牙(BLE),前者适用于音频传输,后者适合物联网设备。在鸿蒙开发中,需配置蓝牙访问权限,并实现状态管理功能,包括状态监听、开启/关闭蓝牙等核心操作。开发时需注意权限申请、状态转换处理、超时机制等技术细节,建议遵循规范的设备发现、连接管理和数据传输流程。文章还提供了完整的代码示例,展示如何在鸿蒙系统中实现蓝牙功能
本文同步发表于微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
一、蓝牙定义
蓝牙技术是一种短距离无线通信技术,能够在设备之间传输数据。该技术由蓝牙技术联盟(Bluetooth Special Interest Group, SIG) 制定规范。
技术原理
蓝牙基于无线电技术实现通信:
-
工作频段:2.4GHz
-
抗干扰技术:采用频率跳跃扩频技术(Frequency Hopping Spread Spectrum, FHSS) 来避免与其他无线设备的干扰
-
通信方式:通过发送和接收数据包进行通信,使用不同的蓝牙协议控制通信流程和数据传输
蓝牙技术分类
传统蓝牙(BR/EDR)
-
全称:蓝牙基础率/增加数据率(Basic Rate/Enhanced Data Rate)
-
技术特点:
-
EDR是BR的增强版本,传输速率提高2-3倍
-
最高传输速率:2-3Mbps
-
通信范围:理想条件下约100米
-
-
支持协议:
-
高级音频分发协议
-
免提通话协议
-
个人局域网协议
-
电话簿访问协议
-
-
应用场景:
-
蓝牙耳机、音响听音乐
-
车载系统访问手机电话本、短信
-
设备间数据共享
-
低功耗蓝牙(BLE)
-
引入版本:从蓝牙4.0开始支持
-
核心优势:低功耗,适用于续航要求高的设备
-
性能参数:
-
最高传输速率:1Mbps
-
通信范围:通常10米左右
-
-
应用领域:
-
穿戴设备
-
智能家居
-
物联网传感器
-
| 特性维度 | 传统蓝牙(BR/EDR) | 低功耗蓝牙(BLE) |
|---|---|---|
| 功耗水平 | 较高 | 极低 |
| 最大速率 | 2-3 Mbps | 1 Mbps |
| 典型距离 | 100米 | 10米 |
| 连接时间 | 数秒 | 毫秒级 |
| 应用场景 | 音频传输、文件共享 | 传感器数据、智能设备 |
二、蓝牙开发流程
2.1 开发环境准备
2.1.1 权限配置
必须申请权限:ohos.permission.ACCESS_BLUETOOTH
-
权限用途:允许应用访问蓝牙功能
-
配置方式:
-
在
module.json5文件中声明权限 -
在应用运行时动态申请用户授权
-
权限配置:
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.ACCESS_BLUETOOTH",
"reason": "用于蓝牙设备连接和数据传输"
}
]
}
}
2.1.2 导入API模块
import { access } from '@kit.ConnectivityKit';
import { BusinessError } from '@kit.BasicServicesKit';
2.2 蓝牙状态管理
2.2.1 蓝牙状态定义
鸿蒙定义了以下蓝牙状态常量:
| 状态 | 描述 | 应用操作权限 |
|---|---|---|
STATE_OFF |
蓝牙已关闭 | 不可使用蓝牙其他功能 |
STATE_TURNING_ON |
蓝牙正在开启 | 过渡状态 |
STATE_ON |
蓝牙已打开 | 可以使用蓝牙其他功能 |
STATE_TURNING_OFF |
蓝牙正在关闭 | 过渡状态 |
STATE_BLE_TURNING_ON |
低功耗蓝牙正在开启 | 过渡状态 |
STATE_BLE_ON |
低功耗蓝牙已打开 | 可使用BLE功能 |
STATE_BLE_TURNING_OFF |
低功耗蓝牙正在关闭 | 过渡状态 |
2.2.2 订阅蓝牙开关状态变化
目的:获取实时的蓝牙开关状态
实现方法:
import { access } from '@kit.ConnectivityKit';
import { BusinessError } from '@kit.BasicServicesKit';
export class BluetoothManager {
private isSubscribed: boolean = false;
// 状态变化回调函数
private handleStateChange = (currentState: access.BluetoothState): void => {
let statusDescription: string = '';
switch(currentState) {
case access.BluetoothState.STATE_OFF:
statusDescription = '蓝牙已完全关闭';
break;
case access.BluetoothState.STATE_TURNING_ON:
statusDescription = '传统蓝牙启动中...';
break;
case access.BluetoothState.STATE_ON:
statusDescription = '传统蓝牙已就绪';
break;
case access.BluetoothState.STATE_BLE_TURNING_ON:
statusDescription = '低功耗蓝牙启动中...';
break;
case access.BluetoothState.STATE_BLE_ON:
statusDescription = '低功耗蓝牙已就绪';
break;
case access.BluetoothState.STATE_BLE_TURNING_OFF:
statusDescription = '低功耗蓝牙关闭中...';
break;
case access.BluetoothState.STATE_TURNING_OFF:
statusDescription = '传统蓝牙关闭中...';
break;
default:
statusDescription = '未知状态';
}
console.log(`蓝牙状态更新: ${statusDescription}`);
};
// 订阅状态变化
public startMonitoring(): void {
if (this.isSubscribed) {
console.warn('已存在状态监听,无需重复订阅');
return;
}
try {
access.on('stateChange', this.handleStateChange);
this.isSubscribed = true;
console.log('蓝牙状态监听已启动');
} catch (error) {
const err = error as BusinessError;
console.error(`监听失败,错误码: ${err.code}, 错误信息: ${err.message}`);
}
}
// 取消订阅
public stopMonitoring(): void {
if (!this.isSubscribed) {
return;
}
try {
access.off('stateChange', this.handleStateChange);
this.isSubscribed = false;
console.log('蓝牙状态监听已停止');
} catch (error) {
const err = error as BusinessError;
console.error(`取消监听失败,错误码: ${err.code}, 错误信息: ${err.message}`);
}
}
}
2.3 开启蓝牙功能
2.3.1 开启流程
-
获取当前蓝牙状态
-
如果状态为
STATE_OFF,则主动开启蓝牙 -
系统弹出授权对话框
-
用户同意后,蓝牙开启
2.3.2 实现代码
function enableDeviceBluetooth() {
try {
// 获取当前蓝牙状态
let currentState = access.getState();
// 检查是否为关闭状态
if (currentState == access.BluetoothState.STATE_OFF) {
// 主动开启蓝牙
access.enableBluetooth();
console.info('已请求开启蓝牙');
} else {
console.info('蓝牙已处于开启或中间状态');
}
} catch (err) {
console.error('开启蓝牙失败,错误码: ' + (err as BusinessError).code +
', 错误信息: ' + (err as BusinessError).message);
}
}
用户交互:系统会弹出对话框提示"想要开启蓝牙",需要用户确认授权
2.4 关闭蓝牙功能
2.4.1 关闭流程
-
获取当前蓝牙状态
-
如果状态为
STATE_ON,则主动关闭蓝牙 -
系统弹出确认对话框
-
用户同意后,蓝牙关闭
2.4.2 实现代码
function disableDeviceBluetooth() {
try {
// 获取当前蓝牙状态
let currentState = access.getState();
// 检查是否为开启状态
if (currentState == access.BluetoothState.STATE_ON) {
// 主动关闭蓝牙
access.disableBluetooth();
console.info('已请求关闭蓝牙');
} else {
console.info('蓝牙已处于关闭或中间状态');
}
} catch (err) {
console.error('关闭蓝牙失败,错误码: ' + (err as BusinessError).code +
', 错误信息: ' + (err as BusinessError).message);
}
}
用户交互:系统会弹出对话框提示"想要关闭蓝牙",需要用户确认授权
2.5 完整示例
import { access } from '@kit.ConnectivityKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 蓝牙适配器管理类
export class BluetoothAdapterController {
// 状态变化回调函数
private onBluetoothStatusChanged = (statusData: access.BluetoothState): void => {
let statusDescription = '';
switch(statusData) {
case access.BluetoothState.STATE_OFF:
statusDescription = 'STATE_OFF - 蓝牙已关闭';
break;
case access.BluetoothState.STATE_TURNING_ON:
statusDescription = 'STATE_TURNING_ON - 蓝牙正在开启';
break;
case access.BluetoothState.STATE_ON:
statusDescription = 'STATE_ON - 蓝牙已开启(可正常使用)';
break;
case access.BluetoothState.STATE_TURNING_OFF:
statusDescription = 'STATE_TURNING_OFF - 蓝牙正在关闭';
break;
case access.BluetoothState.STATE_BLE_TURNING_ON:
statusDescription = 'STATE_BLE_TURNING_ON - 低功耗蓝牙正在开启';
break;
case access.BluetoothState.STATE_BLE_ON:
statusDescription = 'STATE_BLE_ON - 低功耗蓝牙已开启';
break;
case access.BluetoothState.STATE_BLE_TURNING_OFF:
statusDescription = 'STATE_BLE_TURNING_OFF - 低功耗蓝牙正在关闭';
break;
default:
statusDescription = '未知状态';
}
console.info('蓝牙状态变化: ' + statusDescription);
};
// 初始化蓝牙状态监听
public initializeBluetoothMonitor(): void {
try {
// 订阅状态变化事件
access.on('stateChange', this.onBluetoothStatusChanged);
console.info('蓝牙状态监听已启动');
} catch (error) {
const btError = error as BusinessError;
console.error('启动监听失败,错误码: ' + btError.code +
', 错误信息: ' + btError.message);
}
}
// 开启蓝牙
public requestEnableBluetooth(): void {
try {
// 获取当前状态
const btStatus = access.getState();
if (btStatus === access.BluetoothState.STATE_OFF) {
// 蓝牙关闭状态下才请求开启
access.enableBluetooth();
console.info('已发送蓝牙开启请求');
} else {
console.info('蓝牙当前状态: ' + btStatus + ',无需重复开启');
}
} catch (error) {
const btError = error as BusinessError;
console.error('开启蓝牙失败,错误码: ' + btError.code +
', 错误信息: ' + btError.message);
}
}
// 关闭蓝牙
public requestDisableBluetooth(): void {
try {
// 获取当前状态
const btStatus = access.getState();
if (btStatus === access.BluetoothState.STATE_ON) {
// 蓝牙开启状态下才请求关闭
access.disableBluetooth();
console.info('已发送蓝牙关闭请求');
} else {
console.info('蓝牙当前状态: ' + btStatus + ',无需重复关闭');
}
} catch (error) {
const btError = error as BusinessError;
console.error('关闭蓝牙失败,错误码: ' + btError.code +
', 错误信息: ' + btError.message);
}
}
// 停止监听蓝牙状态
public stopBluetoothMonitor(): void {
try {
access.off('stateChange', this.onBluetoothStatusChanged);
console.info('蓝牙状态监听已停止');
} catch (error) {
const btError = error as BusinessError;
console.error('停止监听失败,错误码: ' + btError.code +
', 错误信息: ' + btError.message);
}
}
// 获取当前蓝牙状态描述
public getCurrentBluetoothStatus(): string {
try {
const currentState = access.getState();
return this.convertStateToString(currentState);
} catch (error) {
return '获取状态失败';
}
}
// 状态值转描述文字
private convertStateToString(state: access.BluetoothState): string {
switch(state) {
case access.BluetoothState.STATE_OFF:
return '蓝牙关闭';
case access.BluetoothState.STATE_ON:
return '蓝牙开启';
case access.BluetoothState.STATE_BLE_ON:
return '低功耗蓝牙开启';
default:
return '状态转换中';
}
}
}
// 创建实例并导出
const bluetoothController = new BluetoothAdapterController();
export default bluetoothController;
三、注意事项
-
必须声明权限:在应用配置文件中明确声明蓝牙访问权限
-
动态权限申请:在运行时向用户申请授权
-
权限检查:在执行蓝牙操作前检查权限状态
-
权限拒绝处理:提供友好的用户引导,说明权限必要性
-
超时处理:为状态转换设置合理的超时机制
-
状态监听:始终监听状态变化,处理异常情况
开启蓝牙/关闭蓝牙:系统会自动弹出"想要开启蓝牙"对话框
建议
在蓝牙开启后,可以:
-
设备扫描:发现周边蓝牙设备
-
设备过滤:根据服务UUID过滤目标设备
-
连接管理:建立和维护设备连接
-
数据传输:实现数据读写功能
针对BLE设备:
-
服务发现:获取设备提供的服务列表
-
特性读写:读取和写入设备特性值
-
通知订阅:订阅特性值变化通知
-
描述符操作:配置通信参数
更多推荐




所有评论(0)