【HarmonyOS】鸿蒙应用低功耗蓝牙BLE的使用心得 (三)

news/2024/11/22 2:36:55/

BLE__0">【HarmonyOS】鸿蒙应用蓝牙>低功耗蓝牙BLE的使用心得 (三)

一、前言

在这里插入图片描述
在这里插入图片描述

目前鸿蒙最新系统,经过测试还有两个BLE相关Bug正在修复:
1.获取本地设备蓝牙名称,会为空,只有点击到设置蓝牙中查看后,该接口才能获取到值
2.建立BLE链接后,断开链接,返回的状态没有已断开,只有断开中

鸿蒙相对于Android和IOS而言,对于蓝牙接口的划分其实非常友好,使用也很简单。不需要你套娃一样生成多个对象,蓝牙操作对象,例如GATT都是单例的形式,直接调用即可,例如:

	// 通过ble就可以直接操作蓝牙>低功耗蓝牙相关接口this.gattClient = ble.createGattClientDevice(peerDevice);try {this.gattClient.connect(); } catch (err) {console.error(TAG, 'errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);}

BLEDEMO_23">三、BLE蓝牙>低功耗蓝牙DEMO项目示例参考:

HaronyOS+BLE蓝牙DEMO
实现了BLE蓝牙完整的交互过程:
1.管理蓝牙的开启和关闭
2.外围设备的服务创建,广播等
3.中央设备的扫描,链接,读取特征和描述等

ScanResultPage .ets

import { ArrayList, HashMap } from '@kit.ArkTS'
import { BleDeviceInfo } from '../bean/BleDeviceInfo'
import { promptAction } from '@kit.ArkUI';
import { EventHubUtils } from '../utils/EventHubUtils';
import { BLEMgr } from '../mgr/BLEMgr';

struct ScanResultPage {private mBLEMgr: BLEMgr = new BLEMgr();private mCacheMap: HashMap<string, string> = new HashMap(); connStr: string = ""; optionSelect: number = -1;aboutToAppear(): void {EventHubUtils.getEventHub().on("ScanRes", this.onScanRes);EventHubUtils.getEventHub().on("ConnStateChange", this.onConnStateChange);}aboutToDisappear(): void {EventHubUtils.getEventHub().off("ScanRes", this.onScanRes);EventHubUtils.getEventHub().off("ConnStateChange", this.onConnStateChange);}onConnStateChange = (state: string)=>{if(state == "CONNECTING"){this.connStr = "连接中";}else if(state == "CONNECTED"){this.connStr = "已连接";// 进行设备的服务查询this.mBLEMgr.discoverServices();}else if(state == "DISCONNECTING"){this.connStr = "断开中";}else{this.connStr = "断开连接";setTimeout(()=>{this.optionSelect = -1;}, 2000);}}onScanRes = (info: BleDeviceInfo)=>{let deviceId: string = info.DeviceData?.deviceId ?? "";if(!this.mCacheMap.hasKey(deviceId)){this.mCacheMap.set(deviceId, deviceId);this.mListDeviceInfo.push(info);}} mListDeviceInfo: Array<BleDeviceInfo> = new Array(); ListView(){List() {ForEach(this.mListDeviceInfo, (item: BleDeviceInfo, index: number) => {ListItem() {Column(){Text("设备ID: " + item.DeviceData?.deviceId).fontSize(px2fp(52)).fontColor(Color.White).width('100%')Text("设备名: " + item.DeviceData?.deviceName).fontSize(px2fp(52)).fontColor(Color.White).width('100%')Text("RSSI: " + item.DeviceData?.rssi).fontSize(px2fp(52)).fontColor(Color.White).width('100%')Text(item.DeviceData?.connectable ? "连接状态: 可连接" : "连接状态: 不可连接").fontSize(px2fp(52)).fontColor(Color.White).width('100%')if(this.optionSelect == index){Row(){Button(this.connStr).backgroundColor(Color.Yellow).fontColor(Color.Blue).onClick(()=>{// 断开AlertDialog.show({title:"BLE断开",message:"是否选择" + item.DeviceData?.deviceName + "进行BLE断开?",autoCancel: true,primaryButton: {value:"确定",action:()=>{promptAction.showToast({ message: item.DeviceData?.deviceName + " 断开ing!"});this.mBLEMgr.stopConnect();}},secondaryButton: {value:"取消",action:()=>{promptAction.showToast({ message: "取消!"});}},cancel:()=>{promptAction.showToast({ message: "取消!"});}});})if(this.connStr == "已连接"){Button("读取特征值").backgroundColor(Color.Yellow).fontColor(Color.Blue).onClick(()=>{this.mBLEMgr.getClient().readCharacteristicValue();}).margin({ left: px2vp(10) })Button("读取描述").backgroundColor(Color.Yellow).fontColor(Color.Blue).onClick(()=>{this.mBLEMgr.getClient().readDescriptorValue();}).margin({ left: px2vp(10) })}}.width("100%")}Divider().height(px2vp(1)).width("100%")}.padding({left: px2vp(35),right: px2vp(35)}).width('100%').height(px2vp(450)).justifyContent(FlexAlign.Start).onClick(()=>{// 点击选择处理配对AlertDialog.show({title:"BLE连接",message:"是否选择" + item.DeviceData?.deviceName + "进行BLE连接?",autoCancel: true,primaryButton: {value:"确定",action:()=>{promptAction.showToast({ message: item.DeviceData?.deviceName + " 连接ing!"});this.mBLEMgr.startConnect(item.DeviceData?.deviceId);this.optionSelect = index;}},secondaryButton: {value:"取消",action:()=>{promptAction.showToast({ message: "取消!"});}},cancel:()=>{promptAction.showToast({ message: "取消!"});}});})}}, (item: string, index: number) => JSON.stringify(item) + index)}.width('100%')}build() {Column() {this.ListView()}.height('100%').width('100%').backgroundColor(Color.Blue)}
}

完整DEMO下载地址

在这里插入图片描述


http://www.ppmy.cn/news/1548917.html

相关文章

STM32低功耗设计NFC与无线距离感应智能钥匙扣-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 智能钥匙扣作为一种小巧而实用的智能设备&#xff0c;凭借其便携性…

el-table常用知识点1

实现在一个表格某一行数据的上方浮动一个图片 <el-table :data"tableData" borderheight"90%":style"{width: 100%}" ><el-table-column prop"startDate" label"开始日期" align"center"><templa…

【C++进阶实战】打砖块小游戏

游戏规则 玩家控制底部的一个挡板&#xff0c;反弹球击碎上方排列的砖块。如果球掉到底部&#xff0c;则游戏结束。如果所有砖块都被击碎&#xff0c;则玩家胜利。 安装 EasyX 为了更好的视觉效果&#xff0c;我们将使用 EasyX 图形库。EasyX 是一个适用于 Windows 平台的轻…

git使用流程梳理

之前觉得git比较麻烦&#xff0c;还是习惯本地使用而没有推送至远程&#xff0c;自从不小心rm -rf清空所有代码后&#xff0c;幡然醒悟。后续梳理一下相关使用方法 整体过程 1 建立库&#xff0c;建立远程连接 2 本地创建分支并查看分支 (假定本地分支名字为test) git che…

高级网络安全——IP 安全(week5)

加粗样式 文章目录 一、前言二、重点概念IP 安全概述IPSec的应用IPSec概述:典型场景IPSec安全协议AH与ESP的功能对比IPSec协议与加密算法IPSec模式AH协议:传输模式与隧道模式完整性检查值(ICV)AH协议的ICV计算封装安全载荷(ESP)协议IPSec的策略导向方法IPSec策略IPSec策略…

《Python浪漫的烟花表白特效》

一、背景介绍 烟花象征着浪漫与激情&#xff0c;将它与表白结合在一起&#xff0c;会创造出别具一格的惊喜效果。使用Python的turtle模块&#xff0c;我们可以轻松绘制出动态的烟花特效&#xff0c;再配合文字表白&#xff0c;打造一段专属的浪漫体验。 接下来&#xff0c;让…

基于YOLOv8深度学习的医学影像肝病检测系统研究与实现(PyQt5界面+数据集+训练代码)

本研究提出了一种基于YOLOv8深度学习算法的医学影像肝病检测系统&#xff0c;旨在通过先进的图像处理与深度学习技术提高肝病的检测效率和准确性。系统采用YOLOv8作为核心算法模型&#xff0c;其具备快速高效的物体检测能力&#xff0c;能够精确定位肝脏区域&#xff0c;并对可…

Jenkins下载安装、构建部署到linux远程启动运行

Jenkins详细教程 Winodws下载安装Jenkins一、Jenkins配置Plugins插件管理1、汉化插件2、Maven插件3、重启Jenkins&#xff1a;Restart Safely插件4、文件传输&#xff1a;Publish Over SSH5、gitee插件6、清理插件&#xff1a;workspace cleanup system系统配置1、Gitee配置2、…