基于 react-native-ble-manager 的 OpenHarmony 适配版,蓝牙 BLE 管理库(扫描、连接、收发数据)
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 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
随后编译并运行即可。
约束与限制
兼容性
本文档内容已在以下版本中验证通过:
- 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) ,欢迎自由使用并参与开源。