0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenHarmony BLE蓝牙连接教程

OpenHarmony威廉希尔官方网站 社区 来源:OST开源开发者 2023-04-17 10:11 次阅读

OpenHarmony 蓝牙模块提供了基础的传统蓝牙能力以及 BLE 的扫描、广播等功能。

这里将介绍如何通过 OpenHarmony 提供的 @ohos.bluetooth (蓝牙接口)打开当前设备的蓝牙,关闭蓝牙,以及连接 BLE 蓝牙设备。

设备与环境:

设备:九联 s905l3a 机顶盒、开鸿智谷学生卡 BLE 蓝牙设备

系统:OpenHarmony 3.2 beta2

SDK:9

逻辑流程

首先机顶盒在开始的时候获取蓝牙相关权限,然后通过 OpenHarmony 提供的蓝牙接口打开蓝牙。

3b736820-dc25-11ed-bfe3-dac502259ad0.png

接着订阅发现 BLE 设备发现事件,然后通过 OpenHarmony 提供的蓝牙接口开启 BLE 设备扫描。

当发现到了 BLE 蓝牙设备后,进行上报,BLE 设备发现事件触发,获取到来自 BLE 设备的广播信息包,然后进行 BLE 蓝牙连接。

实现过程

①获取蓝牙相关权限

在使用蓝牙接口之前,首先要让设备获取一下权限:

ohos.permission.USE_BLUETOOTH //:允许应用查看蓝牙的配置。

ohos.permission.DISCOVER_BLUETOOTH //:允许应用配置本地蓝牙,查找远端设备且与之配对连接。

ohos.permission.LOCATION //:允许应用获取设备位置信息。

ohos.permission.MANAGE_BLUETOOTH //:允许应用配对蓝牙设备,并对设备的电话簿或消息进行访问。

打开 DevEco Studio 3.1.0.200,创建新的 Stage 项目,在项目中的 module.json 文件中添加相关权限:

"requestPermissions":[
{
"name":"ohos.permission.USE_BLUETOOTH",
"reason":"$string:grant_use_bluetooth",
"usedScene":{
"abilities":[
"MainAbility"
],
"when":"inuse"
}
},
{
"name":"ohos.permission.DISCOVER_BLUETOOTH",
"reason":"$string:grant_discovery_bluetooth",
"usedScene":{
"abilities":[
"MainAbility"
],
"when":"inuse"
}
},
{
"name":"ohos.permission.LOCATION",
"reason":"$string:grant_location",
"usedScene":{
"abilities":[
"MainAbility"
],
"when":"inuse"
}
},
{
"name":"ohos.permission.MANAGE_BLUETOOTH",
"reason":"$string:grant_manage_bluetooth",
"usedScene":{
"abilities":[
"MainAbility"
],
"when":"inuse"
}
}
]

②打开设备的蓝牙

首先,通过调用 bluetooth.getState()蓝牙接口来获取当前设备蓝牙是否打开,并设置蓝牙开关的标识位 isOn。

asyncaboutToAppear(){
//等待获取蓝牙权限
awaitglobalThis.abilityContext.requestPermissionsFromUser(['ohos.permission.USE_BLUETOOTH','ohos.permission.DISCOVER_BLUETOOTH','ohos.permission.LOCATION','ohos.permission.MANAGE_BLUETOOTH'])
logger.info(TAG,`获取权限grantPermission,requestPermissionsFromUser,PermissionRequestResult`)
//获取蓝牙状态
letstate=bluetooth.getState()
//判断当前设备蓝牙是否打开
if(state===bluetooth.BluetoothState.STATE_ON){
this.isOn=true
}
if(state===bluetooth.BluetoothState.STATE_OFF){
this.isOn=false
}
}

如果当前设备蓝牙未打开,则通过调用 bluetooth.enableBluetooth()蓝牙接口来打开蓝牙。

//打开蓝牙函数
initBluetooth(){
this.enable=bluetooth.enableBluetooth()
//判断蓝牙是否成功打开
if(this.enable==true){
prompt.showToast({
message:'Openbluetooth'+this.enable,
duration:2000,
});
}
}

③注册发现 BLE 设备监听器

在设备打开蓝牙之后,通过调用 bluetooth.BLE.on('BLEDeviceFind')蓝牙接口来订阅 BLE 设备发现上报事件。 该接口参数如下:

3b83a37a-dc25-11ed-bfe3-dac502259ad0.png

通过注册发现 BLE 设备监听器,可以得到发现设备的集合,BLE 设备的广播包、地址、信号强度 rssi。

在这里发现获取连接 BLE 设备名字的接口 getDeviceName 无法成功调用,所以自己通过解析广播包来获取设备名字。

//订阅BLE设备发现上报事件
//获取到的data包括BLE设备的广播包、地址、信号强度rssi
bluetooth.BLE.on('BLEDeviceFind',(data)=>{
logger.info(TAG,`enteronbluetoothBLEDeviceFind`)
logger.info("rgytl 开始扫描设备地址! 1")
if(data!==null&&data.length>0){
logger.info("rgytl 开始扫描设备地址! 2")
if(this.discoveryBleList.indexOf(data[0])===-1){
//把发现的设备地址存入列表
this.discoveryBleList.push(data[0].deviceId)
logger.info("rgytl----discoveryBleList="+JSON.stringify(this.discoveryBleList))
//读取广播包,解析广播包,得到设备名字,并存入设备列表
vari=0;
varx=data[0].data[i]
vary=data[0].data[i+1]
while(y!=0x09&&i+x+2
 

④开启 BLE 设备扫描

在完成订阅 BLE 设备发现上报事件后,通过调用 bluetooth.BLE.startBLEScan 接口去开启 BLE 设备扫描。 通过该接口,可以对扫描 BLE 设备进行过滤,可以过滤的参数有:BLE 设备的地址、名字、以及服务的 UUID 等。

3b9886e6-dc25-11ed-bfe3-dac502259ad0.png

在这里,我设置只扫描包含我 BLE 设备名字的 BLE 设备,这样子就不会说扫描到一大堆其他的 BLE 设备,影响使用,只需要开启一次扫描和订阅一次 BLE 设备发现上报事件就可以了,使用的时候只要没有关闭,就不需要重复调用。

//设置蓝牙BLE扫描模式(根据名字扫描)
bluetooth.BLE.startBLEScan(
[{
deviceId:null,
name:"bleslavetest",
serviceUuid:null
}],
{
interval:0,
dutyMode:bluetooth.ScanDuty.SCAN_MODE_LOW_POWER,
matchMode:bluetooth.MatchMode.MATCH_MODE_AGGRESSIVE,
}
)

⑤连接 BLE 设备

在扫描到 BLE 设备之后,可以通过 on(‘BLEConnectionStateChange’)来订阅获取 BLE 设备的连接状态变化事件。 在使用该接口之前,要先通过 bluetooth.BLE.createGattClientDevice('XXXXXX:XX')接口创建一个可使用的 GattClientDevice 实例。

3bafac36-dc25-11ed-bfe3-dac502259ad0.png

//订阅BEL状态变化
if(this.BleOnflag){
//只创建一个GattClient对象
this.BleOnflag=false
this.BLEDevice=bluetooth.BLE.createGattClientDevice(item);
//订阅获取BLE设备的连接状态变化事件
this.BLEDevice.on('BLEConnectionStateChange',(data)=>{
console.log('bluetoothconnectStatestatechanged');
letconnectState=data.state;
//根据不通的连接状态,提示不同的信息
if(JSON.stringify(connectState)==0){
logger.info(`connectState=${JSON.stringify(connectState)},断开连接`)
prompt.showToast({
message:'断开连接',
duration:2000,
});
}elseif(JSON.stringify(connectState)==2){
logger.info(`connectState=${JSON.stringify(connectState)},连接成功`)
prompt.showToast({
message:'连接成功',
duration:2000,
});
}elseif(JSON.stringify(connectState)==1){
logger.info(`connectState=${JSON.stringify(connectState)},正在连接`)
}else{
logger.info(`connectState=${JSON.stringify(connectState)},正在断连`)
}
logger.info(`connectState=${JSON.stringify(connectState)}`);
})
}
在前面通过 bluetooth.BLE.createGattClientDevice(item)创建一个 GattClientDevice 实例 BLEDevice 后,我们可以通过该实例去调用 connect()方法连接 BLE 设备。

注意,GattClientDevice 实例只需要创建一个就可以。

3bc0a270-dc25-11ed-bfe3-dac502259ad0.png

//连接蓝牙
letBLEConnect=this.BLEDevice.connect()
//如果连接成功,则把BLE设备存入连接成功列表
if(BLEConnect){
this.deviceBleList.push(item)
}

⑥结尾处理

当不连接 BLE 设备的时候,要记得关闭 BLE 设备扫描,取消订阅设备发现事件。

取消 BLE 设备连接,通过之前创建的 GattClientDevice 实例 BLEDevice 调用 disconnect()方法断开连接 BLE 设备。

Button("断开")
.alignSelf(ItemAlign.Center)
.onClick(()=>{
AlertDialog.show({
title:$r('app.string.disconnect'),
message:'此操作将会断开该设备的连接',
primaryButton:{
value:$r('app.string.cancel'),
action:()=>{
}
},
secondaryButton:{
value:$r('app.string.confirm'),
action:()=>{
//断开连接BLE设备
letBLEdisConnect=this.BLEDevice.disconnect()
if(BLEdisConnect){
logger.info(`connectStateBLEdisConnect=${JSON.stringify(BLEdisConnect)},断开连接`)
//移出BLE设备连接列表
this.deviceBleList.pop(item)
}
}
}
})
})
在断开连接、关闭蓝牙之后,可以通过 off(‘connectStateChange’)取消订阅 BLE 连接状态变化事件、bluetooth.BLE.stopBLEScan 停止 BLE 扫描、以及 bluetooth.BLE.off(‘BLEDeviceFind’)取消订阅 BLE 设备发现上报事件。

最后通过 bluetooth.disableBluetooth()关闭蓝牙:

.onChange((isOn:boolean)=>{
if(isOn){
this.isOn=true
this.initBluetooth()
}else{
this.isOn=false
bluetooth.BLE.off('BLEDeviceFind',()=>{
logger.info("rgytl 取消BLE设备发现订阅!")
})
bluetooth.BLE.stopBLEScan()
this.disable=bluetooth.disableBluetooth()
this.discoveryList=[]
this.BleInfo=[]
this.BleRssi=[]
if(this.disable==true){
prompt.showToast({
message:'Closebluetooth'+this.disable,
duration:2000,
});
}
}
})

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    8580

    浏览量

    151029
  • BLE
    BLE
    +关注

    关注

    12

    文章

    660

    浏览量

    59392
  • 蓝牙模块
    +关注

    关注

    30

    文章

    573

    浏览量

    55726
  • SDK
    SDK
    +关注

    关注

    3

    文章

    1035

    浏览量

    45905
  • OpenHarmony
    +关注

    关注

    25

    文章

    3716

    浏览量

    16260

原文标题:OpenHarmony BLE蓝牙连接

文章出处:【微信号:gh_834c4b3d87fe,微信公众号:OpenHarmony威廉希尔官方网站 社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    BLE连接威廉希尔官方网站 对比与应用

    BLE连接威廉希尔官方网站 在现实生活场景中其实有很多应用,例如在电表中,蓝牙支持多主多从的工作模式,能被采集器、自动化终端设备、手持设备主机连接的同时,与多个从机(外置负荷开关、报警装置、各类传
    的头像 发表于 04-27 00:24 4496次阅读

    电脑端BLE蓝牙助手

    电脑端BLE蓝牙助手
    的头像 发表于 06-14 10:34 2698次阅读
    电脑端<b class='flag-5'>BLE</b><b class='flag-5'>蓝牙</b>助手

    FCC & CE认证 蓝牙5.1协议 主从并存 低功耗蓝牙模块BLE5101# 蓝牙

    BLE蓝牙模块
    思为无线
    发布于 :2023年10月12日 09:31:13

    BLE低功耗蓝牙模块为何如此受欢迎?

    BLE低功耗蓝牙模块为何如此受欢迎? BLE 低功耗蓝牙模块一般是指蓝牙4.0模块,BLE
    发表于 12-01 15:11 18次下载

    经验分享:如何选择适合的BLE蓝牙模块

    物联网应用中,成功连接设备的过程,连接性的角色至关重要,选择范围也很广:如Wi-Fi、低功耗蓝牙BLE)、RFID、NFC等等。根据市占率估计,在2021年前,将有60%的无线装置使
    的头像 发表于 06-11 15:26 1.1w次阅读

    如何利用API增加BLE连接

    本视频中,我们将回顾API如何配合低功耗蓝牙(BLE)设备工作。我们将了解如何利用API方便、快捷地为应用增加BLE连接性。
    的头像 发表于 10-09 04:04 3317次阅读

    BLE蓝牙的角色功能

    蓝牙设备之间进行通讯时,必须有一个为主机,一个为从机,才能进行通信。通信时,也必须由主机进行查找,并发起配对,建立连接后,双方即可收发数据。BLE蓝牙的角色主要包括:主机、从机、主从一
    的头像 发表于 10-30 18:45 3798次阅读

    盘点BLE低功耗蓝牙和传统蓝牙之间的五大区别

    下兼容。相较于传统的蓝牙BLE蓝牙的优点就是快速搜索、快速连接、超低功耗、保持连接和传输数据,弱点就是传输速率低,物理宽带只有1M,而实际
    发表于 07-24 14:42 6256次阅读

    BLE蓝牙模块选型表介绍

    BLE蓝牙模块的功能着手,简单介绍蓝牙模块的物联网应用。 SKYLAB的蓝牙模块根据支持的蓝牙协议分为B
    的头像 发表于 07-27 16:39 4873次阅读
    <b class='flag-5'>BLE</b><b class='flag-5'>蓝牙</b>模块选型表介绍

    BLE蓝牙的具体优势以及BLE蓝牙智能门锁的应用

    一、BLE蓝牙的具体优势: 1、BLE蓝牙的待机时间超长, 市面上的蓝牙智能锁基本都是使用干电池供电,而
    发表于 08-17 14:03 3097次阅读
    <b class='flag-5'>BLE</b><b class='flag-5'>蓝牙</b>的具体优势以及<b class='flag-5'>BLE</b><b class='flag-5'>蓝牙</b>智能门锁的应用

    蓝牙BLE(低功耗蓝牙)的区别是什么

    来源:罗姆半导体社区  蓝牙BLE蓝牙低功耗)是无线个人局域网(WPAN)标准。蓝牙低功耗蓝牙旨在处理发送小块数据的问题。它旨在使用纽扣
    的头像 发表于 02-02 17:54 6545次阅读

    蓝牙模块有哪些种类?BLE低功耗蓝牙模块有什么特点?

    Ble蓝牙模块是专为物联网无线数据传输而生,ble蓝牙模块以其超低功耗、快速连接、容易交互等特点,已广泛应用于物联网
    的头像 发表于 08-09 13:49 5936次阅读
    <b class='flag-5'>蓝牙</b>模块有哪些种类?<b class='flag-5'>BLE</b>低功耗<b class='flag-5'>蓝牙</b>模块有什么特点?

    Telink BLE连接应用的SDK简介

    本系列的几篇文章主要讲述"Bluetooth LE Multiple Connection",此SDK是Telink BLE连接应用的SDK,所谓的BLE连接就是
    的头像 发表于 09-22 14:41 3915次阅读

    BLE蓝牙模块功能应用②——定位功能

    蓝牙定位是BLE蓝牙模块的重要功能,可以弥补GPS无法覆盖室内定位的场景。本文将从iBeacon概述、定位威廉希尔官方网站 原理以及william hill官网 来展开介绍,带大家熟悉了解BLE
    的头像 发表于 10-18 08:25 829次阅读
    <b class='flag-5'>BLE</b><b class='flag-5'>蓝牙</b>模块功能应用②——定位功能

    带你深入了解BLE蓝牙模块工作模式

    蓝牙是一种新兴无线通讯威廉希尔官方网站 是一个标准的无线通讯协议,可实现无线数据和语音通信。基于低成本设备的收发器芯片,可做近距离的无线连接,为固定和移动设备监理通信环境的一种近距离无线连接威廉希尔官方网站 。其中,BL
    的头像 发表于 07-16 13:54 819次阅读
    带你深入了解<b class='flag-5'>BLE</b><b class='flag-5'>蓝牙</b>模块工作模式