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

embedded/2024/11/16 19:43:11/

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/embedded/138085.html

相关文章

基于matlab的CNN食物识别分类系统,matlab深度学习分类,训练+数据集+界面

文章目录 前言&#x1f393;一、数据集准备&#x1f393;二、模型训练&#x1f340;&#x1f340;1.初始化&#x1f340;&#x1f340;2.加载数据集&#x1f340;&#x1f340;3.划分数据集&#xff0c;并保存到新的文件夹&#x1f340;&#x1f340;4.可视化数据集&#x1f34…

Keil基于ARM Compiler 5的工程迁移为ARM Compiler 6的工程

环境&#xff1a; keil版本为5.38&#xff0c;版本务必高于5.30 STM32F4的pack包版本要高于2.9 软件包下载地址&#xff1a;https://zhuanlan.zhihu.com/p/262507061 一、更改Keil中编译器 更改后编译&#xff0c;会报很多错&#xff0c;先不管。 二、更改头文件依赖 观察…

LuaRocks如何安装数据库驱动?

大家好&#xff0c;我是袁庭新。通过LuaRocks来安装数据库驱动如何实现呢&#xff1f;这篇文章帮你搞定。 LuaSQL是从Lua到DBMS的简单接口。LuaSQL它使Lua程序能够&#xff1a; 连接到ODBC、ADO、Oracle、MySQL、SQLite、Firebird和PostgreSQL数据库&#xff1b; 执行任意的S…

【免越狱】iOS砸壳 可下载AppStore任意版本 旧版本IPA下载

软件介绍 下载iOS旧版应用&#xff0c;简化繁琐的抓包流程。 一键生成去更新IPA&#xff08;手机安装后&#xff0c;去除App Store的更新检测&#xff09;。 软件界面 支持系统 Windows 10/Windows 8/Windows 7&#xff08;由于使用了Fiddler库&#xff0c;因此需要.Net环境…

[Qt platform plugin问题] Could not load the Qt platform plugin “xcb“

Qt platform plugin 是 Qt 应用程序启动时加载的插件。不同的平台有不同的插件。 常见的插件有:linuxfb Wayland xcb 简单来说就是启动一个GUI程序, 离不开这些插件.选择其中一个就好 出现这个问题要么就是没有插件&#xff0c;要么就是插件依赖的库没有。 要么就是插件选则的…

《配电网高质量发展行动实施方案(2024~2027年)》发布,智能巡检机器人助力新型电力系统建设

8月&#xff0c;国家能源局印发《配电网高质量发展行动实施方案&#xff08;2024~2027年&#xff09;》&#xff08;以下简称《方案》&#xff09;&#xff0c;深入推进配电网高质量发展重点任务落地见效。《方案》明确提出&#xff0c;要重点推进建设一批满足新型主体接入的项…

如何在JavaScript中实现保留两位小数

在JavaScript中&#xff0c;处理数字并格式化它们以显示特定的小数位数是一个常见的需求。特别是&#xff0c;当你需要显示货币、测量值或其他需要精确到两位小数的数据时&#xff0c;这一点尤为重要。本文将详细介绍几种在JavaScript中实现保留两位小数的方法。 1. 使用 toFi…

【代码大模型】Is Your Code Generated by ChatGPT Really Correct?论文阅读

Is Your Code Generated by ChatGPT Really Correct? Rigorous Evaluation of Large Language Models for Code Generation key word: evaluation framework, LLM-synthesized code, benchmark 论文&#xff1a;https://arxiv.org/pdf/2305.01210.pdf 代码&#xff1a;https:…