鸿蒙5.0&next开发【低功耗蓝牙开发】系统开发网络开发实战 ...

瑞星  论坛元老 | 2025-4-18 16:55:07 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1675|帖子 1675|积分 5025

概述

蓝牙(Bluetooth)是一种无线通信技术,被广泛应用于各种电子装备之间的短距离数据传输和连接。而低功耗蓝牙(Bluetooth Low Energy,简称 BLE)是一种可以或许在低功耗情况下进行通信的蓝牙技术。与传统蓝牙相比,BLE的功耗更低,适用于需要长时间运行的低功耗装备,如智能手表、康健监测装备、智能家居等。
本文适用于低功耗蓝牙通信相关的开发,主要先容了基于BLE进行蓝牙扫描管理、蓝牙连接状态管理、蓝牙装备特征值同步三个场景,并分别从服务端和客户端描述其相关实现。
实现原理

实现低功耗蓝牙通信的能力主要步骤如下:
首先服务端需要创建实例,乐成创建后,需要添加对应服务,才气开启BLE广播,向客户端通报相关信息。当服务端开启BLE广播后,还需要订阅BLE连接状态,即对连接状态进行监听。当连接状态变化时,如断开连接,则此时需要关闭BLE广播。在服务端接收到客户端发起的连接请求和发起的特征值订阅请求后,才气向客户端通报特征值信息。
而客户端同样需要创建实例,并获取相关服务,才气通过蓝牙扫描到服务端,并发起连接请求和特征值订阅请求。客户端也需要监听连接状态,当断开连接时,关闭对应的监听能力。

关键技术

实现低功耗蓝牙通信能力需要使用[@ohos.bluetooth.ble (蓝牙ble模块)]中提供的API能力,服务端使用的API主要包罗[创建服务器实例]、[发送BLE广播]、[特征值变化关照]等;客户端使用的API主要包罗[蓝牙连接]、[订阅蓝牙低功耗装备的特征值变化]、[订阅蓝牙低功耗装备的连接状态变化事件]等。
开发流程

在需要使用低功耗蓝牙进行通信的场景中:
服务端

  • 调用[createGattServer()]接口创建GattServer实例,即创建服务端。
  • 调用[addService()]接口在服务端添加服务。
  • 调用[startAdvertising()]接口开始发送BLE广播,向连接的客户端装备提供数据。
  • 调用[on(‘connectionStateChange’)]方法在服务端订阅BLE连接状态变化事件。
  • 调用[notifyCharacteristicChanged()]接口,在服务端特征值发生变化时,自动关照已连接的客户端装备。
客户端

  • 调用[createGattClientDevice()]接口创建GattClientDevice实例,即创建客户端。
  • 调用[connect()]接口发起连接远端蓝牙低功耗装备。
  • 调用[setCharacteristicChangeNotification()]接口向服务端发送设置关照此特征值请求。
  • 调用[on(‘BLECharacteristicChange’)]接口订阅蓝牙低功耗装备的特征值变化事件。需要先调用[setCharacteristicChangeNotification]接口或[setCharacteristicChangeIndication]接口才气接收服务端的关照。
  • 调用[on(‘BLEConnectionStateChange’)]接口订阅蓝牙低功耗装备的连接状态变化事件。
蓝牙扫描管理

场景描述

BLE扫描主要分为被动扫描和自动扫描两种模式。被动扫描是指装备监听周围的广播信息,不自动发起连接请求;而自动扫描则会在接收到广播的同时,向广播装备发送扫描请求,以获取更详尽的装备信息。
蓝牙扫描管理是在自动扫描中,对扫描出的结果进行管理。自动扫描时,不但可以设置扫描参数,还能处理扫描结果。如扫描时设置扫描时间间隔、扫描连续时间等;扫描出结果后,可对装备列表更新,并过滤相关装备信息。
实现原理

蓝牙扫描步骤如下:
首先服务端需要检查蓝牙状态,如未开启蓝牙,则需要向用户申请开启蓝牙;如已开启,则开启广播。然后客户端也需要检查蓝牙状态,如未开启蓝牙,则需要向用户申请开启蓝牙;如已开启,则设置扫描参数,并启动蓝牙扫描。根据扫描结果来处理相关装备信息并展示,然后自动发起蓝牙连接请求,连接远端装备。

关键技术
服务端:

  • 调用[access.getState()]接口,查询装备的蓝牙状态。根据返回结果[BluetoothState]的值来判断蓝牙是否开启。
  • 调用[startAdvertising()]接口,开启广播。只有服务端先开启广播,客户端才气搜索到装备。
  • 当完成广播时,调用[stopAdvertising()]接口,停止广播。
客户端:

  • 与服务端步骤1相同。
  • 调用[startBLEScan]接口,可通过[options]参数传入设置的扫描参数,进行扫描。
  • 调用[on(‘BLEDeviceFind’)]方法订阅BLE装备发现上报事件,并处理扫描到的结果。
  • 调用[connect()]接口,连接远端蓝牙低功耗装备。
  • 当断开连接时,调用[stopBLEScan()]接口,停止蓝牙扫描。
实现流程

服务端

  • 导入ble、access模块。
  1. import { ble } from '@kit.ConnectivityKit';
  2. import { access } from '@kit.ConnectivityKit';
复制代码

  • 开启广播前,需要先查询蓝牙是否可用,根据返回结果[BluetoothState]的值来判断蓝牙是否开启,当取值是STATE_ON 或STATE_TURNING_ON返回true,表示蓝牙已开启。
  1. isBluetoothEnabled(): boolean {
  2.   const state: access.BluetoothState = access.getState();
  3.   if (state === access.BluetoothState.STATE_ON || state === access.BluetoothState.STATE_TURNING_ON) {
  4.     return true;
  5.   }
  6.   return false;
  7. }
复制代码

  • 假如蓝牙未开启,服务端装备需要调用[access.enableBluetooth()]接口开启蓝牙。
    1. access.enableBluetooth();
    复制代码

  • 调用[createGattServer()]创建一个Gatt服务的实例,并调用[addservice()]接口,添加服务。服务添加乐成后,调用[startAdvertising()]接口开始广播。
  1. startAdvertiser(): boolean {
  2.   if (!this.isBluetoothEnabled()) {
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表