rntpc_react-native-ble-manager:基于 react-native-ble-manager 的 OpenHarmony 适配版,蓝牙 BLE 管理库(扫描、连接、收发数据)

基于 react-native-ble-manager 的 OpenHarmony 适配版,蓝牙 BLE 管理库(扫描、连接、收发数据)

分支4Tags3
文件最后提交记录最后更新时间
1 个月前
1 个月前
1 个月前
3 年前
1 个月前
1 个月前
1 年前
10 年前
3 个月前
1 年前
1 个月前
1 个月前
2 年前
1 个月前
3 年前

文档模板:v0.4.2

react-native-ble-manager

本项目基于 react-native-ble-manager 开发。

该第三方库的仓库已迁移至 GitCode,并支持直接从 npm 下载。新的包名为:@react-native-ohos/react-native-ble-manager。版本对应关系如下:

三方库名称 三方库版本(npm 地址) 发布信息 支持 RN 版本 Autolink 编译 API 版本 社区基线版本 源码地址
@react-native-ohos/react-native-ble-manager ~12.2.0(开发中) GitCode Releases 0.82.* 是 API12+ 12.2.2 master
@react-native-ohos/react-native-ble-manager ~12.1.7 GitCode Releases 0.77.* 否 API12+ 12.1.5 br_rnoh0.77
@react-native-oh-tpl/react-native-ble-manager ~11.5.3 GitCode Releases 0.72.* 否 API12+ 11.5.2 br_rnoh0.72

简介

react-native-ble-manager 是一个用于 React Native 的蓝牙低功耗(BLE)通信管理库。
支持扫描、连接外围设备,获取外围设备的服务与特征,以及特征的读取、写入、开启通知等操作。

下载安装

对于未发布到 npm 的旧版本,请参考安装指南安装 tgz 包。

进入工程目录,并输入以下命令:

npm

npm install @react-native-ohos/react-native-ble-manager

yarn

yarn add @react-native-ohos/react-native-ble-manager

链接

是否支持 Autolink RN 框架版本
~12.2.0 是 0.82

使用 AutoLink 的工程需根据该文档进行配置,Autolink 框架指导文档:https://gitcode.com/CPF-RN/ohos_react_native/blob/master/docs/zh-cn/Autolinking.md

如果您使用的版本支持 Autolink,并且工程已接入 Autolink,可跳过 ManualLink 配置。

ManualLink:此步骤为手动配置原生依赖项的指导 首先,请使用 DevEco Studio 打开项目中的 HarmonyOS 工程 `harmony`。

1. 覆盖 RN SDK

为使工程依赖同一版本的 RN SDK,需要在工程根目录的 oh-package.json5 中添加 overrides 字段,指向工程所需的 RN SDK 版本。替换版本既可以是具体版本号,也可以是模糊版本,还可以是本地存在的 HAR 包或源码目录。

关于该字段的作用,请阅读官方说明

{
  "overrides": {
    "@rnoh/react-native-openharmony": "~0.82.18" // ohpm 在线版本
    // "@rnoh/react-native-openharmony" : "./react_native_openharmony.har" // 指向本地 har 包的路径
    // "@rnoh/react-native-openharmony" : "./react_native_openharmony" // 指向源码路径
  }
}

2. 引入原生端代码

当前有两种接入方式:

  • 通过 har 包引入;
  • 直接引用源码。

方式一:通过 har 包引入(推荐)

har 包位于第三方库安装路径下的 `harmony` 文件夹中。

打开 entry/oh-package.json5,添加如下依赖:

"dependencies": {
    "@rnoh/react-native-openharmony": "file:../react_native_openharmony",
    "@react-native-ohos/react-native-ble-manager": "file:../../node_modules/@react-native-ohos/react-native-ble-manager/harmony/ble_manager.har",
  }

点击右上角的 sync 按钮

或者在终端执行:

cd entry
ohpm install

方法二:直接链接源码

如需使用直接链接源码,请参考[直接链接源码说明](https://gitcode.com/CPF-RN/usage-docs/blob/master/zh-cn/link-source-code.md)

3. 配置 CMakeLists 和引入 BleManagerPackage

打开 entry/src/main/cpp/CMakeLists.txt,添加:

project(rnapp)
cmake_minimum_required(VERSION 3.4.1)
set(CMAKE_SKIP_BUILD_RPATH TRUE)
set(RNOH_APP_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
set(NODE_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../node_modules")
+ set(OH_MODULES "${CMAKE_CURRENT_SOURCE_DIR}/../../../oh_modules")
set(RNOH_CPP_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../../../../../react-native-harmony/harmony/cpp")
set(LOG_VERBOSITY_LEVEL 1)
set(CMAKE_ASM_FLAGS "-Wno-error=unused-command-line-argument -Qunused-arguments")
set(CMAKE_CXX_FLAGS "-fstack-protector-strong -Wl,-z,relro,-z,now,-z,noexecstack -s -fPIE -pie")
set(WITH_HITRACE_SYSTRACE 1) # for other CMakeLists.txt files to use
add_compile_definitions(WITH_HITRACE_SYSTRACE)

add_subdirectory("${RNOH_CPP_DIR}" ./rn)

# RNOH_BEGIN: manual_package_linking_1
add_subdirectory("../../../../sample_package/src/main/cpp" ./sample-package)
+ add_subdirectory("${OH_MODULES}/@react-native-ohos/react-native-ble-manager/src/main/cpp" ./rnoh_ble_manager)


# RNOH_END: manual_package_linking_1

file(GLOB GENERATED_CPP_FILES "./generated/*.cpp")

add_library(rnoh_app SHARED
    ${GENERATED_CPP_FILES}
    "./PackageProvider.cpp"
    "${RNOH_CPP_DIR}/RNOHAppNapiBridge.cpp"
)
target_link_libraries(rnoh_app PUBLIC rnoh)

# RNOH_BEGIN: manual_package_linking_2
target_link_libraries(rnoh_app PUBLIC rnoh_sample_package)
+ target_link_libraries(rnoh_app PUBLIC rnoh_ble_manager)
# RNOH_END: manual_package_linking_2

打开 entry/src/main/cpp/PackageProvider.cpp,在其中添加:

#include "RNOH/PackageProvider.h"
#include "generated/RNOHGeneratedPackage.h"
#include "SamplePackage.h"
+ #include "BleManagerPackage.h"

using namespace rnoh;

std::vector<std::shared_ptr<Package>> PackageProvider::getPackages(Package::Context ctx) {
    return {
      std::make_shared<RNOHGeneratedPackage>(ctx),
      std::make_shared<SamplePackage>(ctx),
+     std::make_shared<BleManagerPackage>(ctx)
    };
}

4. 在 ArkTs 侧引入 BlePackage

打开 entry/src/main/ets/RNPackagesFactory.ts,添加:

  ...
+ import { BlePackage } from '@react-native-ohos/react-native-ble-manager/ts';


export function createRNPackages(ctx: RNPackageContext): RNPackage[] {
  return [
    new SamplePackage(ctx),
+    new BlePackage(ctx)
  ];
}

运行

点击右上角的 sync 按钮

或在终端中执行:

cd entry
ohpm install

随后编译并运行即可。

约束与限制

兼容性

本文档内容已在以下版本中验证通过:

  1. RNOH:0.82.18; SDK: HarmonyOS 6.0.1 Release SDK; IDE: DevEco Studio 6.0.1 Release; ROM:6.0.0.120 SP7;

权限要求

  • 由于本库涉及蓝牙系统控制功能,调用相应接口时需要配置相应权限,权限应配置在entry/src/main目录下module.json5文件中。其中部分权限需要弹窗向用户申请授权。具体权限配置请参见文档:程序访问控制。

  • 本库的部分功能和接口需要normal权限:ohos.permission.ACCESS_BLUETOOTH。

编译与运行的 API 要求

当前第三方库的所有版本均已实现版本隔离,支持在 `API12+` 工程中编译,并在 `API12+` ROM 上运行。

使用示例

使用时 import 的库名保持不变。

import BleManager from 'react-native-ble-manager';

async function demo(peripheralId: string, serviceUUID: string, characteristicUUID: string) {
  await BleManager.start();

  const discoverListener = BleManager.addListener(
    'BleManagerDiscoverPeripheral',
    (peripheral) => {
      console.log('发现设备:', peripheral.id, peripheral.name);
    },
  );

  await BleManager.scan([serviceUUID], 5, true);

  await BleManager.connect(peripheralId);
  await BleManager.retrieveServices(peripheralId);
  const value = await BleManager.read(peripheralId, serviceUUID, characteristicUUID);
  console.log('read:', value);
  await BleManager.write(peripheralId, serviceUUID, characteristicUUID, [1]);

  await BleManager.startNotification(peripheralId, serviceUUID, characteristicUUID);

  await BleManager.disconnect(peripheralId);
  discoverListener.remove();
}

使用说明

初始化

调用其他接口前,请先调用 start 初始化蓝牙管理器:

import ReactNativeBleManager from 'react-native-ble-manager';
ReactNativeBleManager.start();

事件监听

import { NativeEventEmitter, NativeModules } from 'react-native';
import ReactNativeBleManager from 'react-native-ble-manager';

const BleManagerModule = NativeModules.BleManager;
const bleManagerEmitter = new NativeEventEmitter(BleManagerModule);

// 监听扫描到的外围设备
const discoverListener = bleManagerEmitter.addListener(
    'BleManagerDiscoverPeripheral',
    (peripheral) => {
        console.log('发现设备:', peripheral.id, peripheral.name);
    }
);

// 监听通知数据(需先调用 startNotification 开启通知)
const notifyListener = bleManagerEmitter.addListener(
    'BleManagerDidUpdateValueForCharacteristic',
    ({ peripheral, characteristic, value }) => {
        console.log('收到通知:', peripheral.id, characteristic, value);
    }
);

// 不再使用时移除监听,避免内存泄漏
discoverListener.remove();
notifyListener.remove();

扫描设备

// 扫描指定服务的外围设备(参数:服务 UUID 列表、扫描时长(秒)、是否记录重复设备)
ReactNativeBleManager.scan(['00001888-0000-1000-8000-00805F9B34FB'], 0, true).then(() => {
    // 扫描结果通过 BleManagerDiscoverPeripheral 事件返回
});

// 停止扫描
ReactNativeBleManager.stopScan();

连接与数据交互

// 连接设备
await ReactNativeBleManager.connect(peripheralId);

// 获取设备的服务与特征列表
const peripheralInfo = await ReactNativeBleManager.retrieveServices(peripheralId);

// 读取特征值
const readData = await ReactNativeBleManager.read(peripheralId, serviceUUID, characteristicUUID);

// 写入特征值
await ReactNativeBleManager.write(peripheralId, serviceUUID, characteristicUUID, [1]);

// 开启特征值通知,数据变化时通过 BleManagerDidUpdateValueForCharacteristic 事件返回
await ReactNativeBleManager.startNotification(peripheralId, serviceUUID, characteristicUUID);

// 断开连接
await ReactNativeBleManager.disconnect(peripheralId);

接口说明

“Platform”列表示该属性在原第三方库中支持的平台。

“OpenHarmony Support”列中,yes 表示 OpenHarmony 平台支持该属性;no 表示不支持;partially 表示部分支持。跨平台使用方法一致,效果与 iOS 或 Android 保持一致。

API

名称 描述 类型 必填 平台 OpenHarmony平台支持
start 初始化模块。返回 Promise 对象。请勿重复调用此方法。 Promise No iOS/Android Yes
scan 扫描可用外围设备。 Promise No iOS/Android Yes
stopScan 停止扫描。 Promise<void> No iOS/Android Yes
connect 尝试连接外围设备。大多数情况下,若无法连接,需先扫描外围设备。 Promise No iOS/Android Yes
disconnect 断开与外围设备的连接。 Promise<void> No iOS/Android Yes
enableBluetooth 创建 ACTION_REQUEST_ENABLE,用于请求用户开启蓝牙。 Promise<void> No Android Yes
checkState 强制模块检查原生 BLE 管理器状态,并触发 BleManagerDidUpdateState 事件。 Promise<BleState> No iOS/Android Yes
readRSSI 读取当前 RSSI 值。 Promise No iOS/Android Yes
createBond 启动与远程设备的绑定(配对)流程。 Promise No Android Yes
retrieveServices 获取外围设备的服务与特征。 Promise No iOS/Android Yes
startNotification 在指定特征上开启通知。 Promise No iOS/Android Yes
read 读取指定特征的当前值。 Promise No iOS/Android Yes
write 向指定特征写入(带响应)。 Promise No iOS/Android Yes
readDescriptor 读取指定描述符的当前值。 Promise No iOS/Android Yes
writeDescriptor 向指定描述符写入值。 Promise No iOS/Android Yes
requestMTU 请求指定连接使用的 MTU 大小。 Promise No Android Yes
getConnectedPeripherals 返回已连接的外围设备。 Promise<Peripheral[]> No iOS/Android Yes
getBondedPeripherals 返回已绑定的外围设备。 Promise<Peripheral[]> No iOS/Android Yes
getDiscoveredPeripherals 返回扫描发现的外围设备。 Promise<Peripheral[]> No iOS/Android Yes
removeBond 移除已配对的设备。 Promise No Android No
refreshCache 刷新外围设备的服务与特征缓存。 Promise No Android No
requestConnectionPriority 请求更新连接参数。 Promise No Android No
startNotificationWithBuffer12.2.0+ 在指定特征上开启通知(使用缓冲区)。 Promise No iOS/Android Yes
removePeripheral 从缓存列表中移除已断开连接的外围设备。 Promise No Android Yes
companionScan 扫描配套设备。 Promise No Android No
getAssociatedPeripherals 获取关联外围设备(来自配套设备管理器)。 Promise<Peripheral[]> No Android No
removeAssociatedPeripheral 移除已关联的外围设备。 Promise No Android No
setName 创建用于设置蓝牙适配器名称的请求。 void No Android No
isScanning 检查扫描是否正在进行,返回 true 或 false。 Promise<boolean> No iOS/Android Yes
writeWithoutResponse 向指定特征写入(不带响应)。 Promise No iOS/Android No
getMaximumWriteValueLengthForWithoutResponse 返回不带响应写入的最大值长度。 Promise<number> No iOS No
getMaximumWriteValueLengthForWithResponse 返回带响应写入的最大值长度。 Promise<number> No iOS No
isPeripheralConnected 检查指定外围设备是否已连接,返回 true 或 false。 Promise<boolean> No iOS Yes
supportsCompanion 检查当前设备是否支持配套设备管理器。 Promise<boolean> No Android No
stopNotification 停止指定特征上的通知。 Promise No iOS/Android No

遗留问题

  • refreshCache 用于清理并刷新蓝牙设备缓存的一部分 issue#3
  • requestConnectionPriority 用于请求蓝牙连接优先级 issue#4
  • startNotificationWithBuffer 用于启动带缓冲区的通知服务 issue#6
  • companionScan 扫描配套设备issue#5
  • getAssociatedPeripherals 检索相关外围设备(来自配套管理器) issue#7
  • removeAssociatedPeripheral 移除相关外围设备 issue#8
  • setName 创建并设置蓝牙适配器名称 issue#9
  • supportsCompanion 检查当前设备是否支持配套设备管理器 issue#10
  • stopNotification 停止指定特征值的更新通知 issue#11
  • writeWithoutResponse 向指定特征值执行无响应写入 issue#12
  • removeBond 移除已配对设备 issue#13
  • getMaximumWriteValueLengthForWithoutResponse 获取无响应写入支持的最大数据长度 issue#14
  • getMaximumWriteValueLengthForWithResponse 获取带响应写入支持的最大数据长度 issue#15

其他

无

目录结构

/rntpc_react-native-ble-manager  # 项目根目录
├── harmony                        # 鸿蒙适配代码
│    ├─ ble_manager.har            # har包
│    ├─ ble_managerGatt.har        # GATT har包
│    ├─ ble_managerServers.har     # Servers har包
│    └─ ble_manager                # 鸿蒙适配核心代码
│         ├─ index.ets             # 鸿蒙适配代码入口
│         ├─ ts.ets                # TS 导出入口
│         └─ src/main
│              ├─ cpp              # C++ 侧代码(BleManagerPackage、codegen 生成代码)
│              └─ ets              # 鸿蒙适配源码
│                   ├─ BlePackage.ets    # 包入口,注册 BleTurboModule
│                   ├─ BleTurboModule.ts # TurboModule 实现,桥接 JS 与原生 BLE 接口
│                   ├─ DefaultScanManager.ts # 扫描管理实现
│                   ├─ NotifyBufferContainer.ts # 通知缓冲区管理
│                   ├─ PeripheralData.ts # 外围设备数据封装
│                   ├─ BleManagerLogger.ts # 日志工具
│                   ├─ types.ts         # 鸿蒙侧类型定义
│                   ├─ utils/Util.ts    # 工具类
│                   └─ generated        # codegen 生成的代码
├── src                            # RN代码
│    ├─ index.ts                   # 入口文件
│    ├─ types.ts                   # 类型文件
│    └─ NativeGeneratedBleManagerTurboModule.ts # codegen类型文件
├── docs                           # 原库文档
├── README.md                      # 中文安装使用方法
└── README_en.md                   # 英文安装使用方法

贡献代码

在使用过程中,如发现任何问题,均可提交 Issue。当然,也非常欢迎提交 PR 。

开源协议

本项目基于 The MIT License (MIT) ,欢迎自由使用并参与开源。

项目介绍

基于 react-native-ble-manager 的 OpenHarmony 适配版,蓝牙 BLE 管理库(扫描、连接、收发数据)

定制我的领域