鸿蒙应用低功耗蓝牙地铁闸机实践DEMO源码分享 原创 精华

GeorgeGcs
发布于 2025-8-15 11:43
浏览
0收藏

鸿蒙应用低功耗蓝牙地铁闸机实践DEMO源码分享

DEMO源码下载链接为:(模拟器不能使用蓝牙功能)

https://ost.51cto.com/resource/3353

鸿蒙应用低功耗蓝牙地铁闸机实践DEMO源码分享-鸿蒙开发者社区

DEMO项目介绍:

HarmonyOS+BLE蓝牙DEMO展示了一个基于鸿蒙操作系统开发的蓝牙低功耗(BLE)的演示项目,该项目详细实现了与BLE蓝牙相关的一系列交互过程。在当今的物联网时代,蓝牙技术的应用极为广泛,尤其在低功耗设备之间进行数据传输方面具有重要地位。BLE作为蓝牙技术的一种,因其低能耗特性,在健康监测设备、智能家居、个人电子设备等领域应用尤为普遍。

鸿蒙应用低功耗蓝牙地铁闸机实践DEMO源码分享-鸿蒙开发者社区
DEMO中涉及的蓝牙开启和关闭管理是指在开发BLE应用时,必须能够控制蓝牙模块的电源状态,以节省电能并确保设备与BLE技术的兼容性。这通常涉及到操作系统级别的蓝牙驱动接口,需要开发者具备一定的系统编程能力和对操作系统蓝牙堆栈的理解。

外围设备的服务创建和广播是BLE交互的基础,外围设备在这里指那些充当数据提供者或数据接收端的设备。服务创建涉及到定义BLE服务和特征的过程,这些服务和特征决定了外围设备可以进行哪些类型的数据交互。广播则是外围设备对外宣布其存在和可提供服务的过程,中央设备通过扫描这些广播来发现潜在的连接目标。

中央设备的扫描、链接、读取特征和描述等步骤则涉及到中央设备(如智能手机或平板电脑)如何发现并连接到外围设备的过程。扫描是指中央设备定期搜索周围可连接的BLE外围设备,链接是指建立物理连接的过程,读取特征和描述则是在连接建立后获取外围设备详细信息的步骤,这对于数据交互和用户界面友好性至关重要。

通过这个DEMO,开发者能够深刻理解BLE技术的工作原理,并通过鸿蒙操作系统的相关API进行编程实践。这不仅仅是对BLE技术的应用,更是鸿蒙操作系统在物联网设备上应用潜力的一个示例。鸿蒙操作系统作为华为开发的操作系统,支持多种设备的互联互通,这个DEMO充分展示了鸿蒙在支持BLE方面的实力和便利性。

鸿蒙应用低功耗蓝牙地铁闸机实践DEMO源码分享-鸿蒙开发者社区

代码片段示例:

// 导入通用文本样式修饰器,用于统一管理文本的样式属性
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%') // 宽度占满全屏
  }
}

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
BLETest.zip 1.94M 7次下载
已于2025-8-15 11:44:05修改
收藏
回复
举报
回复
    相关推荐