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

devtools/2024/11/16 19:38:05/

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/devtools/134505.html

相关文章

路由器基本原理与配置

一 &#xff0c; 路由是什么&#xff1f; 从源主机到目标主机的转发过程&#xff1b; 二 &#xff0c; 路由器 &#xff08;1&#xff09;路由器的工作原理 路由器是一种三层设备&#xff0c;是使用IP地址寻址&#xff0c;实现从源IP到达目标IP地址的端到端的服务&#xff0c…

Emacs进阶之插入时间信息(一百六十三)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

通过wsl配置Qt的中文开发环境

本文列举了一些在WSL上配置Qt编译环境中遇到的一些问题及解决方案 关键词: Win10 22HUbuntu18.04xfce桌面交叉编译arm64qt / qtcreator中文输入及显示标题 安装qt,qtcreatorqt.qpa.screen: QXcbConnection: Could not connect to displayld: cannot find -lGLqmake: could no…

mongoDB的安装及使用

文章目录 1、mongoDB的简介2、mongoDB的安装及配置3、node.js项目中mongoDB使用3.1.引入库3.2.数据操作增删改 4、mongoDB的查询4.1.查询4.2.高级查询 1、mongoDB的简介 MongoDB是一个流行的开源文档型数据库&#xff0c;它使用类似 JSON 的文档模型存储数据&#xff0c;这使得…

基于微信小程序的平安驾校预约平台的设计与实现(源码+LW++远程调试+代码讲解等)

摘 要 互联网发展至今&#xff0c;广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#xff0c;劳动强度大&#xff0c;费时费力…

Tidb数据恢复

表删除delete删除恢复(误删除) 指定时间查询 恢复 #恢复数据 #查看安全点 select * from mysql.tidb where variable_nametikv_gc_safe_point; #安全时间 select * from mysql.tidb where variable_name tikv_gc_life_time; #避免操作过慢 延长安全时间 update mysql.tidb set …

H.264/H.265播放器EasyPlayer.js无插件直播流媒体音视频播放器延迟丢帧的原因

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

1436:数列分段II -整型二分

1436&#xff1a;数列分段II 题目来源&#xff1a;一本通 【输入样例】 5 3 4 2 4 5 1【输出样例】 6题意 将数列分成若干段&#xff0c;最多M段&#xff0c;求这些段中最大值中的最小值。&#xff08;M<N是M的约束&#xff09; 思路 最大最小问题考虑二分。由于M越大&…