
鸿蒙应用低功耗蓝牙地铁闸机实践DEMO源码分享 原创 精华
鸿蒙应用低功耗蓝牙地铁闸机实践DEMO源码分享
DEMO源码下载链接为:(模拟器不能使用蓝牙功能)
https://ost.51cto.com/resource/3353
DEMO项目介绍:
HarmonyOS+BLE蓝牙DEMO展示了一个基于鸿蒙操作系统开发的蓝牙低功耗(BLE)的演示项目,该项目详细实现了与BLE蓝牙相关的一系列交互过程。在当今的物联网时代,蓝牙技术的应用极为广泛,尤其在低功耗设备之间进行数据传输方面具有重要地位。BLE作为蓝牙技术的一种,因其低能耗特性,在健康监测设备、智能家居、个人电子设备等领域应用尤为普遍。
DEMO中涉及的蓝牙开启和关闭管理是指在开发BLE应用时,必须能够控制蓝牙模块的电源状态,以节省电能并确保设备与BLE技术的兼容性。这通常涉及到操作系统级别的蓝牙驱动接口,需要开发者具备一定的系统编程能力和对操作系统蓝牙堆栈的理解。
外围设备的服务创建和广播是BLE交互的基础,外围设备在这里指那些充当数据提供者或数据接收端的设备。服务创建涉及到定义BLE服务和特征的过程,这些服务和特征决定了外围设备可以进行哪些类型的数据交互。广播则是外围设备对外宣布其存在和可提供服务的过程,中央设备通过扫描这些广播来发现潜在的连接目标。
中央设备的扫描、链接、读取特征和描述等步骤则涉及到中央设备(如智能手机或平板电脑)如何发现并连接到外围设备的过程。扫描是指中央设备定期搜索周围可连接的BLE外围设备,链接是指建立物理连接的过程,读取特征和描述则是在连接建立后获取外围设备详细信息的步骤,这对于数据交互和用户界面友好性至关重要。
通过这个DEMO,开发者能够深刻理解BLE技术的工作原理,并通过鸿蒙操作系统的相关API进行编程实践。这不仅仅是对BLE技术的应用,更是鸿蒙操作系统在物联网设备上应用潜力的一个示例。鸿蒙操作系统作为华为开发的操作系统,支持多种设备的互联互通,这个DEMO充分展示了鸿蒙在支持BLE方面的实力和便利性。
代码片段示例:
// 导入通用文本样式修饰器,用于统一管理文本的样式属性
import { CommonTextModifier } from '../common/CommonTextModifier'
// 导入BLE管理器,封装了蓝牙相关的核心操作(开启/关闭、广播、扫描等)
import { BLEMgr } from '../mgr/BLEMgr';
// 导入提示框工具(用于显示操作结果)和路由工具(用于页面跳转)
import { promptAction, router } from '@kit.ArkUI';
// 导入权限工具类,用于请求和检查应用所需权限(如蓝牙权限)
import { PermissionsUtil } from '../utils/PermissionsUtil';
// 标记为入口组件,作为应用的首页
@Entry
@Component
struct Index {
// 响应式状态变量,用于记录并实时更新蓝牙的开启/关闭状态(UI会随其变化)
@State isOpenBluetooth: boolean = false;
// BLE管理器实例,负责处理蓝牙的具体操作(与底层蓝牙功能交互)
private mBLEMgr: BLEMgr = new BLEMgr();
// 文本样式修饰器实例,用于统一设置页面中所有文本的样式(如字体、颜色等)
txtModifier: CommonTextModifier = new CommonTextModifier()
/**
* 生命周期方法:页面即将显示时调用
* 主要作用:初始化时检查应用所需权限,若权限不足则引导至设置页;权限充足则获取当前蓝牙状态
*/
async aboutToAppear() {
// 调用权限工具请求必要权限(如蓝牙访问权限)
let isHave: boolean = await PermissionsUtil.requestPermission();
if(isHave){
// 权限获取成功,从BLE管理器获取当前蓝牙状态并更新到UI
this.isOpenBluetooth = this.mBLEMgr.getBluetoothState();
}else{
// 权限获取失败,跳转到系统设置页面引导用户开启权限
this.toSysSettingPage();
}
}
/**
* 生命周期方法:页面显示时调用
* 主要作用:再次检查权限和蓝牙状态(例如用户从设置页返回后同步最新状态)
*/
async onPageShow() {
let isHave: boolean = await PermissionsUtil.requestPermission();
if(isHave){
// 权限有效时,更新蓝牙状态
this.isOpenBluetooth = this.mBLEMgr.getBluetoothState();
}else{
// 权限仍缺失时,继续引导至设置页
this.toSysSettingPage();
}
}
/**
* 跳转到系统设置页面(应用信息页)
* 当应用缺少必要权限时调用,引导用户手动开启权限
*/
private toSysSettingPage(){
globalThis.sysContext.startAbility({
bundleName: 'com.huawei.hmos.settings', // 系统设置应用的包名
abilityName: 'com.huawei.hmos.settings.MainAbility', // 设置应用的主能力入口
uri: 'application_info_entry', // 跳转至应用信息页的路径标识
parameters: {
// 传入当前应用的包名,用于定位到具体应用的设置页面
pushParams: globalThis.sysContext.abilityInfo.bundleName
}
});
}
/**
* "开启蓝牙"按钮点击事件处理
* 流程:检查权限 -> 调用BLE管理器开启蓝牙 -> 根据结果显示提示
*/
onClickStart = async ()=>{
// 再次检查权限(防止权限状态在页面显示后发生变化)
let isHave: boolean = await PermissionsUtil.requestPermission();
if(isHave){
// 调用BLE管理器的开启蓝牙方法,传入回调处理结果
this.mBLEMgr.startBluetooth((str: string)=>{
let content: string = "";
if (str == 'STATE_ON') {
content = "蓝牙已开启"; // 开启成功提示
}else{
content = "开启错误:" + str; // 开启失败时显示错误信息
}
// 显示操作结果提示框
promptAction.showToast({ message: content });
});
}else{
// 权限不足时跳转至设置页
this.toSysSettingPage();
}
}
/**
* "关闭蓝牙"按钮点击事件处理
* 流程:检查权限 -> 调用BLE管理器关闭蓝牙 -> 根据结果显示提示
*/
onClickClose = async ()=>{
let isHave: boolean = await PermissionsUtil.requestPermission();
if(isHave){
// 调用BLE管理器的关闭蓝牙方法,传入回调处理结果
this.mBLEMgr.closeBluetooth((str: string)=>{
let content: string = "";
if (str == 'STATE_OFF') {
content = "蓝牙已关闭"; // 关闭成功提示
}else{
content = "关闭错误:" + str; // 关闭失败时显示错误信息
}
promptAction.showToast({ message: content });
});
}else{
this.toSysSettingPage();
}
}
/**
* "开启广播"按钮点击事件处理
* 调用BLE管理器开启蓝牙广播,并通过提示框反馈操作结果
*/
onClickStartAdv = ()=>{
this.mBLEMgr.startAdvertising((advState: string)=>{
let content: string = "";
if(advState == "STARTED"){
content = "广播已开启"; // 广播开启成功
}else{
content = "广播错误:" + advState; // 广播开启失败
}
promptAction.showToast({ message: content });
});
}
/**
* "关闭广播"按钮点击事件处理
* 调用BLE管理器关闭蓝牙广播,并反馈结果
*/
onClickCloseAdv = ()=>{
this.mBLEMgr.stopAdvertising((str: string)=>{
promptAction.showToast({ message: str });
});
}
/**
* "开启扫描"按钮点击事件处理
* 启动蓝牙扫描,并跳转到扫描结果页面展示扫描到的设备
*/
onClickStartScan = ()=>{
this.mBLEMgr.startScan(); // 开始扫描周围蓝牙设备
router.pushUrl({ url: "pages/ScanResultPage" }); // 跳转到结果展示页
}
/**
* "关闭扫描"按钮点击事件处理
* 调用BLE管理器停止蓝牙扫描
*/
onClickCloseScan = ()=>{
this.mBLEMgr.stopScan();
}
/**
* "启动服务"按钮点击事件处理
* 注册BLE服务(使设备可被其他设备发现并连接),并反馈结果
*/
onClickStartServer = ()=>{
this.mBLEMgr.registerServer((res: string)=>{
promptAction.showToast({ message: res });
});
}
/**
* "关闭服务"按钮点击事件处理
* 注销BLE服务(停止作为蓝牙服务端),并反馈结果
*/
onClickCloseServer = ()=>{
this.mBLEMgr.unRegisterServer((res: string)=>{
promptAction.showToast({ message: res });
});
}
/**
* 分隔线构建器(@Builder装饰,用于复用UI片段)
* 生成页面中的水平分隔线,用于区分不同功能区域
*/
@Builder LineView(){
Line()
.width("100%") // 宽度占满父容器
.height(px2vp(2)) // 高度为2px(px转vp适配不同屏幕)
.backgroundColor(Color.Black) // 颜色为黑色
.margin({ top: px2vp(100) }) // 顶部外边距100px
}
/**
* 页面UI构建方法
* 定义页面的整体布局和所有可见元素
*/
build() {
Column() { // 垂直布局容器(从上到下排列元素)
// 蓝牙状态信息区域
Column(){
// 显示当前蓝牙状态(已开启/已关闭)
Text(this.isOpenBluetooth ? "蓝牙状态: 已开启" : "蓝牙状态: 已关闭")
// 显示当前设备的蓝牙名称
Text("蓝牙设备名:" + this.mBLEMgr.getCurrentDeviceName())
}
// 蓝牙开关操作区域
Text("开启蓝牙")
.attributeModifier(this.txtModifier) // 应用统一文本样式
.onClick(this.onClickStart) // 绑定开启蓝牙事件
Text("关闭蓝牙")
.attributeModifier(this.txtModifier)
.onClick(this.onClickClose) // 绑定关闭蓝牙事件
// 分隔线:区分蓝牙开关与服务管理区域
this.LineView()
// 服务管理操作区域
Text("启动服务")
.attributeModifier(this.txtModifier)
.onClick(this.onClickStartServer) // 绑定启动服务事件
Text("关闭服务")
.attributeModifier(this.txtModifier)
.onClick(this.onClickCloseServer) // 绑定关闭服务事件
// 广播控制操作区域
Text("开启广播")
.attributeModifier(this.txtModifier)
.onClick(this.onClickStartAdv) // 绑定开启广播事件
Text("关闭广播")
.attributeModifier(this.txtModifier)
.onClick(this.onClickCloseAdv) // 绑定关闭广播事件
// 分隔线:区分服务/广播与扫描操作区域
this.LineView()
// 扫描控制操作区域
Text("开启扫描")
.attributeModifier(this.txtModifier)
.onClick(this.onClickStartScan) // 绑定开启扫描事件
Text("关闭扫描")
.attributeModifier(this.txtModifier)
.onClick(this.onClickCloseScan) // 绑定关闭扫描事件
}
.height('100%') // 高度占满全屏
.width('100%') // 宽度占满全屏
}
}
