更新记录
1.1.3(2026-09-06)
- 归并本轮 Android 权限修复:打开蓝牙适配器和扫描前按系统版本与宿主 targetSdkVersion 主动申请附近设备或定位权限,拒绝授权统一返回
9014013;版本号保持1.1.3,发布时与本版本内容一起提交。 - 修复 uni-app x Android 示例的函数声明顺序、ArrayBuffer 类型和蓝牙结果字段读取导致的 UTS 编译错误。
1.1.2(2026-08-31)
- 新增微信小程序真实 BLE Central 实现,覆盖适配器、扫描、连接、服务/特征发现、读写、通知、MTU、RSSI、分包写入和稳定会话。
- 新增 HarmonyOS NEXT ConnectivityKit 真实 BLE Central 实现,覆盖扫描、GATT 连接、服务/特征发现、读写、通知、MTU、RSSI、多连接和有限自动重连。
- Android、iOS、HarmonyOS 与微信小程序统一公开 API、错误码、运行态、能力矩阵和稳定会话合同;Web 与其他未实现平台继续明确返回
9014001。 - HarmonyOS 声明
ohos.permission.ACCESS_BLUETOOTH,系统蓝牙开关仍由用户控制;Harmony 运行需重新构建包含本版本的 HAP。 - 微信小程序新增可控
wxBLE 模拟运行回归,验证扫描、连接、服务/特征、读写、MTU、RSSI、会话 ready 和通知响应匹配。
1.1.1(2026-08-28)
- 读特征与通知事件新增稳定
hex字段,修复 Android uni-app 页面收到 UTSArrayBuffer桥接包装对象后无法直接显示真实字节的问题;原value: ArrayBuffer保持兼容。 - 修复 uni-app 示例在部分 Android App WebView 中依赖缺失的
TextEncoder,原始写入与分包写入改为页面内 UTF-8 编码。 - 修复 Android GATT 回调 UUID 大小写不一致导致读、写和通知订阅回调无法命中,稳定会话现可正常从
subscribing进入ready。 - Android uni-app 示例对官方不支持的
ArrayBuffer入参明确提示兼容边界,保留文本、Hex 与稳定会话的真实可用路径。 - 补全示例的会话阶段文案,服务/特征发现与
closed停止状态不再显示为未知。 - 使用 RootCanal + Bumble 可控 GATT 外设完成 Android 模拟器扫描、连接、服务/特征发现、读写、通知、MTU 与 RSSI 回归。
平台兼容性
uni-app(5.07)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| √ | √ | × | × | √ | √ | √ | √ | √ |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(5.07)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| × | × | √ | √ | √ | √ |
lizhao-ble
lizhao-ble 是面向 uni-app / uni-app x 的跨端 BLE Central UTS API 插件,统一封装扫描、连接、GATT 读写、通知、RSSI、自动重连和分包写入,适合传感器、门锁、仪表、医疗外设与自定义蓝牙协议等业务。
功能特色
- Android BLE Central 完整链路:适配器、扫描、连接、服务发现、特征发现、读、写、通知和多连接。
- iOS 12+ 前台链路:基于 CoreBluetooth 提供扫描、连接、GATT、通知、RSSI、多连接、分包写入与 iOS 前台有限自动重连。
- HarmonyOS NEXT 原生链路:基于 ConnectivityKit 提供扫描、GATT 连接、服务/特征发现、读写、通知、MTU、RSSI、多连接与有限自动重连。
- 微信小程序原生链路:直接使用微信 BLE API,保留与 App 端一致的基础 API、运行态和稳定会话合同。
- 常用链路增强:MTU 协商、RSSI 读取、UTF-8 文本写入、Hex 写入和串行分包写入。
- 连接策略可控:支持自动重连开关、最大尝试次数与重连间隔,不会无限重试。
- 运行状态可观测:
getCapabilities用于能力探测,getRuntimeState用于读取设备、连接和通知订阅快照。 - 稳定会话:一次调用完成连接、服务/特征发现和通知订阅,并提供每设备串行请求队列、响应匹配、取消与有限重连。
- API 兼容性:保留常见方法别名,并兼容
filterNames/fliterNames、scanComplete/scanComplate两组拼写。 - 平台边界真实:Android、iOS、HarmonyOS 与微信小程序使用各自平台真实实现;Web 与其他未实现平台返回明确错误,不伪造成功。
接入方式选择
| 场景 | 推荐方式 | 说明 |
|---|---|---|
| 标准 BLE 外设通信 | 规范 API | 依次打开适配器、扫描、连接、发现服务/特征,再读写或订阅通知 |
| 长指令或大数据写入 | writeBLECharacteristicValueChunked |
按 chunkSize 串行写入,上一包成功后才发送下一包 |
| 文本或十六进制协议 | writeBLECharacteristicValueByText / writeBLECharacteristicValueByHex |
业务侧无需手动转换 ArrayBuffer |
| 不稳定链路 | createBLEConnection 自动重连参数 |
设置有限次数和间隔,避免无限重试 |
| 多端项目 | getCapabilities |
展示 BLE 入口前先检查 supported 和具体能力字段 |
| 设备协议交互 | 会话 API | 使用 startBLESession + sendBLESessionRequest,减少业务层自行维护状态机和请求队列 |
| 打印机专用协议 | 单独封装业务插件 | 本插件只提供通用 BLE Central,不包含厂商打印 SDK、排版或打印任务 |
支持平台
| 平台 | 是否支持 | 说明 |
|---|---|---|
| uni-app Android | 支持 | Vue2、Vue3、app-vue、app-nvue;Android 5.0+ |
| uni-app x Android | 支持 | UVUE;Android 5.0+ |
| iOS | 有限支持 | iOS 12+ 前台 CoreBluetooth 能力;支持扫描、连接、GATT、通知、RSSI 与前台有限自动重连,MTU 协商返回明确不支持 |
| HarmonyOS NEXT | 支持 | 使用 ConnectivityKit;需声明蓝牙权限并重新构建包含插件的 HAP,系统蓝牙开关由用户控制 |
| Web | 不支持 | 保留类型一致的降级入口,核心 API 返回 9014001 |
| 微信小程序 | 支持 | 使用微信 BLE API;能力受微信基础库、手机系统和设备厂商实现约束 |
| 支付宝小程序 | 不支持 | 保留类型一致的降级入口,核心 API 返回 9014001 |
环境与安装
- HBuilderX 5.07+
- Android 5.0+(API 21+)
- iOS 12.0+(仅前台 BLE Central 能力)
- HarmonyOS NEXT(使用 ConnectivityKit)
- 微信小程序(建议使用当前稳定基础库)
- 通过 HBuilderX 将插件导入项目的
uni_modules/lizhao-ble - 页面和其他插件只能从插件根目录导入,不要导入
utssdk内部文件
// 正确:从插件根目录导入。
import * as Ble from '@/uni_modules/lizhao-ble'
Android 调试必须使用包含本插件 Kotlin 混编代码、Manifest 权限和 UTS 生成物的自定义基座。标准基座或旧自定义基座不能承载新导入的原生代码。Swift 原生代码更新后必须重新制作并安装匹配的 iOS 自定义基座,更新 wgt 或 appResource 不能替换旧基座内的原生代码。
权限准备
插件已在 AndroidManifest.xml 声明所需权限,并会在首次打开适配器或启动扫描时主动发起对应的系统授权:
| 系统版本 | 运行时权限 | 用途 |
|---|---|---|
Android 12+ 且应用 targetSdkVersion >= 31 |
BLUETOOTH_SCAN |
扫描附近 BLE 设备 |
Android 12+ 且应用 targetSdkVersion >= 31 |
BLUETOOTH_CONNECT |
读取适配器状态、连接设备和 GATT 通信 |
| Android 6–11,或 Android 12+ 且应用 targetSdkVersion < 31 | ACCESS_FINE_LOCATION |
系统对 BLE 扫描的兼容要求 |
Android 12+ 且项目 targetSdkVersion >= 31 时使用“附近设备”授权;旧 target 基座和 Android 6–11 使用定位授权兼容扫描。用户拒绝或永久拒绝时,插件进入 fail 并返回 9014013,不会绕过系统授权。项目也可以在调用插件前自行完成授权。
现代 Android 版本通常不允许普通应用静默打开系统蓝牙。如果蓝牙关闭,请先引导用户在系统设置或系统授权界面中打开蓝牙,再调用插件 API。
iOS 已声明蓝牙用途说明。首次访问蓝牙时由系统弹出授权;插件不能绕过授权,也不能代替用户打开或关闭系统蓝牙开关。插件只在本机内存中处理扫描结果、设备标识和通信数据,不采集业务数据,不上传蓝牙数据。
HarmonyOS 需要 ohos.permission.ACCESS_BLUETOOTH,并使用包含本插件原生代码的 HAP;插件不会静默打开或关闭系统蓝牙。微信小程序需在小程序后台和隐私合规配置中按业务实际声明蓝牙用途,授权与系统蓝牙状态以微信客户端回调为准。
最小可运行示例
uni-app(Vue2 / Vue3)
<script>
import * as Ble from '@/uni_modules/lizhao-ble'
export default {
onLoad() {
// 先注册监听,避免漏掉扫描开始后的首批设备。
Ble.onBluetoothDeviceFound((devices) => {
console.log('发现 BLE 设备', devices)
})
// 插件会按 Android 系统版本和项目 targetSdkVersion 主动申请所需权限。
Ble.openBluetoothAdapter({
success: () => {
Ble.startBluetoothDevicesDiscovery({
allowDuplicatesKey: false,
success: (res) => {
console.log('扫描已启动', res)
},
fail: (err) => {
console.log('扫描失败', err)
}
})
},
fail: (err) => {
console.log('打开蓝牙适配器失败', err)
}
})
},
onUnload() {
// 页面销毁时停止扫描并清理监听,避免持续占用蓝牙资源。
Ble.stopBluetoothDevicesDiscovery({})
Ble.offBluetoothDeviceFound()
Ble.closeBluetoothAdapter({})
}
}
</script>
uni-app x(UVUE)
<script setup lang="uts">
import {
openBluetoothAdapter,
startBluetoothDevicesDiscovery,
onBluetoothDeviceFound,
offBluetoothDeviceFound,
stopBluetoothDevicesDiscovery
} from '@/uni_modules/lizhao-ble'
import type {
OpenBluetoothAdapterOptions,
StartBluetoothDevicesDiscoveryOptions,
StopBluetoothDevicesDiscoveryOptions
} from '@/uni_modules/lizhao-ble'
// 类型只从插件根目录导入,避免依赖插件内部文件结构。
class BleDemoOptions {
success?: (res: any) => void
fail?: (err: any) => void
complete?: (res: any) => void
allowDuplicatesKey?: boolean
}
onLoad(() => {
onBluetoothDeviceFound((devices) => {
console.log('发现 BLE 设备', devices)
})
const openOptions = new BleDemoOptions()
openOptions.success = (_res: any) => {
const scanOptions = new BleDemoOptions()
scanOptions.allowDuplicatesKey = false
scanOptions.fail = (err: any) => {
console.log('扫描失败', err)
}
startBluetoothDevicesDiscovery(scanOptions as StartBluetoothDevicesDiscoveryOptions)
}
openOptions.fail = (err: any) => {
console.log('打开蓝牙适配器失败', err)
}
openBluetoothAdapter(openOptions as OpenBluetoothAdapterOptions)
})
onUnload(() => {
const stopOptions = new BleDemoOptions()
stopBluetoothDevicesDiscovery(stopOptions as StopBluetoothDevicesDiscoveryOptions)
offBluetoothDeviceFound()
})
</script>
推荐调用顺序
- Android 由插件在首次打开适配器或启动扫描时申请当前系统版本所需权限;iOS 由系统在首次使用时请求蓝牙授权。
- 注册
onBluetoothDeviceFound、onBLEConnectionStateChange等监听器。 - 调用
openBluetoothAdapter。 - 调用
startBluetoothDevicesDiscovery,拿到目标deviceId后停止扫描。iOS 的 deviceId 不是 Android MAC,而是来自CBPeripheral.identifier的系统 UUID,必须使用本次扫描或系统检索返回的值。 - 调用
createBLEConnection。 - 调用
getBLEDeviceServices与getBLEDeviceCharacteristics。 - 根据特征属性执行读取、写入或
notifyBLECharacteristicValueChange。 - 页面退出时关闭通知、断开连接、停止扫描并移除监听器。
常见增强示例
自动重连
import * as Ble from '@/uni_modules/lizhao-ble'
// 仅在非主动断开时尝试有限次数重连。
Ble.createBLEConnection({
deviceId: '从扫描结果取得的 deviceId',
timeout: 10000,
autoReconnect: true,
reconnectAttempts: 3,
reconnectInterval: 2000,
success(res) {
console.log('连接成功', res)
},
fail(err) {
console.log('连接失败', err)
}
})
自动重连只恢复系统连接状态,不自动恢复已经发现的 GATT 服务、特征或通知订阅。连接状态重新变为已连接后,业务必须再次调用 getBLEDeviceServices、getBLEDeviceCharacteristics,并按需重新调用 notifyBLECharacteristicValueChange。
MTU 与 RSSI
import * as Ble from '@/uni_modules/lizhao-ble'
// Android 可主动请求 MTU;iOS 不支持主动 MTU 协商,调用会 fail(9014001)。
Ble.requestBLEMTU({
deviceId: '从扫描结果取得的 deviceId',
mtu: 185,
success(res) {
console.log('协商后的 MTU', res.mtu)
}
})
// RSSI 读取要求设备已经连接。
Ble.readBLEDeviceRSSI({
deviceId: '从扫描结果取得的 deviceId',
success(res) {
console.log('当前 RSSI', res.RSSI)
}
})
文本、Hex 与分包写入
import * as Ble from '@/uni_modules/lizhao-ble'
const target = {
deviceId: '从扫描结果取得的 deviceId',
serviceId: '0000fff0-0000-1000-8000-00805f9b34fb',
characteristicId: '0000fff2-0000-1000-8000-00805f9b34fb'
}
// UTF-8 文本写入。
Ble.writeBLECharacteristicValueByText({
...target,
text: 'ping'
})
// Hex 支持空格、冒号、短横线和 0x 前缀。
Ble.writeBLECharacteristicValueByHex({
...target,
hex: '70 69 6e 67'
})
// 长数据按 20 字节串行写入,每包间隔 20 ms。
Ble.writeBLECharacteristicValueChunked({
...target,
value: new TextEncoder().encode('long payload').buffer,
chunkSize: 20,
interval: 20
})
完整示例
- uni-app:
uni_modules/lizhao-ble/example/uniapp/ble.vue - uni-app x:
uni_modules/lizhao-ble/example/uniappx/index.uvue
示例页会触发插件的 Android 系统授权流程,但不会绕过用户选择,也不能替代真实 BLE 外设验收。
稳定会话 API
会话层是可选能力,不会改变底层扫描、连接和特征 API。它适合“写入一条命令并等待通知响应”的设备协议;Android 与 iOS 均支持,且需要包含当前原生源码的自定义基座。
import {
startBLESession,
sendBLESessionRequest,
onBLESessionData
} from '@/uni_modules/lizhao-ble'
onBLESessionData((event) => {
console.log(event.direction, event.requestId, event.hex, event.matched)
})
startBLESession({
deviceId: '扫描得到的设备标识',
serviceId: '服务 UUID',
writeCharacteristicId: '写特征 UUID',
notifyCharacteristicId: '通知特征 UUID',
autoReconnect: true,
success(state) {
console.log('会话已就绪', state.phase)
}
})
sendBLESessionRequest({
deviceId: '扫描得到的设备标识',
requestId: 'query-status-1',
encoding: 'hex',
hex: 'A001',
responseMode: 'hexPrefix',
responseHex: 'A081',
timeout: 10000,
success(result) {
console.log('收到匹配响应', result)
}
})
| API | 说明 |
|---|---|
startBLESession(options) |
建立/替换指定设备会话,并完成服务、特征和通知准备 |
sendBLESessionRequest(options) |
提交每设备串行请求;支持 none / nextNotification / hexPrefix / hexEquals |
cancelBLESessionRequest(options) |
取消排队或当前等待响应请求;已交给系统的字节不声明撤回 |
stopBLESession(options) |
主动停止会话并清理队列、计时器和重连 |
getBLESessionState(options) |
获取单设备或全部会话只读快照 |
on/offBLESessionStateChange |
监听/清理会话阶段、队列、RSSI 和错误状态 |
on/offBLESessionData |
监听实际发送和接收数据,包含 requestId、Hex 与 matched |
sendBLESessionRequest 的 encoding 为 text 时使用 text,为 hex 时使用偶数长度 hex,为 buffer 时使用 value: ArrayBuffer。队列最多保留 100 项;断线时正在执行的请求失败且不会偷偷重发,尚未开始的排队请求可在有限重连恢复后继续。
iOS 闭包监听器无法稳定按对象身份比较,因此 offBLESessionStateChange(listener) 和 offBLESessionData(listener) 无论是否传 listener,都会清空对应类别的全部监听器。
API 列表
| 分类 | API |
|---|---|
| 适配器 | openBluetoothAdapter、closeBluetoothAdapter、getBluetoothAdapterState |
| 扫描 | startBluetoothDevicesDiscovery、stopBluetoothDevicesDiscovery、getBluetoothDevices、getConnectedBluetoothDevices |
| 扫描监听 | onBluetoothAdapterStateChange、offBluetoothAdapterStateChange、onBluetoothDeviceFound、offBluetoothDeviceFound |
| 连接 | createBLEConnection、closeBLEConnection、onBLEConnectionStateChange、offBLEConnectionStateChange |
| GATT | getBLEDeviceServices、getBLEDeviceCharacteristics、readBLECharacteristicValue、writeBLECharacteristicValue |
| 写入增强 | writeBLECharacteristicValueByText、writeBLECharacteristicValueByHex、writeBLECharacteristicValueChunked |
| 链路增强 | requestBLEMTU、readBLEDeviceRSSI |
| 通知 | notifyBLECharacteristicValueChange、onBLECharacteristicValueChange、offBLECharacteristicValueChange |
| 诊断 | getCapabilities、getRuntimeState |
通用回调参数
除 onXxx/offXxx 监听器外,异步 API 的 options 均支持以下回调:
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.success | function | 否 | 操作成功时触发一次 | 无 | 无 |
| options.fail | function | 否 | 操作失败时触发一次,参数为 BleFail |
无 | 无 |
| options.complete | function | 否 | success 或 fail 之后触发一次 | 无 | 无 |
适配器 API
openBluetoothAdapter(options)
说明
初始化插件管理的蓝牙适配器资源。调用前应已获得当前平台授权并确保系统蓝牙可用。
支持平台
Android 5.0+、iOS 12+ 前台、HarmonyOS NEXT、微信小程序;Web 与其他未实现平台通过 fail 返回 9014001。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | OpenBluetoothAdapterOptions | 是 | 打开参数 | 无 | success / fail / complete |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| available | boolean | 系统蓝牙是否可用 |
closeBluetoothAdapter(options)
说明
停止扫描、关闭当前连接并释放插件维护的适配器状态。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | CloseBluetoothAdapterOptions | 是 | 关闭参数 | 无 | success / fail / complete |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| available | boolean | 关闭后的适配器可用状态 |
getBluetoothAdapterState(options)
说明
获取当前适配器和扫描状态。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | GetBluetoothAdapterStateOptions | 是 | 查询参数 | 无 | success / fail / complete |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| available | boolean | 系统蓝牙是否可用 |
| discovering | boolean | 当前是否正在扫描 |
扫描与设备 API
startBluetoothDevicesDiscovery(options)
说明
启动 BLE 扫描。名称筛选采用不区分大小写的包含匹配;服务 UUID 由 Android 扫描过滤器处理。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.services | Array<string> | 否 | 按广播服务 UUID 过滤 | [] |
UUID 字符串数组 |
| options.allowDuplicatesKey | boolean | 否 | 是否持续回调重复设备 | false |
true / false |
| options.filterNames | Array<string> | 否 | 按 name/localName 包含匹配 | [] |
名称关键字数组 |
| options.fliterNames | Array<string> | 否 | filterNames 的旧拼写兼容字段 |
[] |
名称关键字数组 |
| options.interval | number | 否 | 兼容字段;Android 与 iOS 扫描 API 均无可保证一致效果的原生等价能力,不据此伪造扫描节流 | 0 |
无 |
| options.powerLevel | string | 否 | 兼容字段;Android 与 iOS 无统一原生功率档位等价能力,当前不承诺改变系统扫描功率 | high |
low / medium / high |
| options.scanComplete | function | 否 | 停止扫描成功时触发 | 无 | 无 |
| options.scanComplate | function | 否 | scanComplete 的旧拼写兼容字段 |
无 | 无 |
| options.success | function | 否 | 扫描成功启动时触发 | 无 | 无 |
| options.fail | function | 否 | 扫描启动失败时触发 | 无 | 无 |
| options.complete | function | 否 | 启动结果完成时触发 | 无 | 无 |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| discovering | boolean | 是否已进入扫描状态 |
stopBluetoothDevicesDiscovery(options)
说明
停止当前扫描,并在成功后触发 scanComplete/scanComplate。
参数
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.scanComplete | function | 否 | 停止成功后触发 | 无 | 无 |
| options.scanComplate | function | 否 | 旧拼写兼容字段 | 无 | 无 |
| options.success | function | 否 | 停止成功时触发 | 无 | 无 |
| options.fail | function | 否 | 停止失败时触发 | 无 | 无 |
| options.complete | function | 否 | 停止结果完成时触发 | 无 | 无 |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| discovering | boolean | 停止成功后为 false |
getBluetoothDevices(options)
说明
返回插件本次运行期间已发现的设备列表。
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | GetBluetoothDevicesOptions | 是 | 查询参数 | 无 | success / fail / complete |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| devices | Array<BleDevice> | 已发现设备列表 |
getConnectedBluetoothDevices(options)
说明
返回当前由插件维护的已连接设备列表。
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.services | Array<string> | 否 | 兼容字段;当前 Android 返回插件维护的全部连接 | [] |
服务 UUID 数组 |
| options.success | function | 否 | 查询成功时触发 | 无 | 无 |
| options.fail | function | 否 | 查询失败时触发 | 无 | 无 |
| options.complete | function | 否 | 查询完成时触发 | 无 | 无 |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| devices | Array<BleDevice> | 已连接设备列表 |
连接 API
createBLEConnection(options)
说明
连接目标设备,并可配置受控自动重连。
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.deviceId | string | 是 | 扫描结果中的设备 ID | 无 | 无 |
| options.timeout | number | 否 | 连接超时,单位 ms | 10000 |
大于 0 |
| options.autoReconnect | boolean | 否 | 非主动断开后是否自动重连 | false |
true / false |
| options.reconnectAttempts | number | 否 | 自动重连最大尝试次数 | 0 |
大于等于 0 |
| options.reconnectInterval | number | 否 | 重连间隔,单位 ms | 2000 |
大于等于 0 |
| options.success | function | 否 | 连接成功时触发 | 无 | 无 |
| options.fail | function | 否 | 连接失败或超时时触发 | 无 | 无 |
| options.complete | function | 否 | 连接结果完成时触发 | 无 | 无 |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| deviceId | string | 已连接设备 ID |
| connected | boolean | 连接成功时为 true |
closeBLEConnection(options)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.deviceId | string | 是 | 要断开的设备 ID | 无 | 无 |
| options.success | function | 否 | 断开成功时触发 | 无 | 无 |
| options.fail | function | 否 | 断开失败时触发 | 无 | 无 |
| options.complete | function | 否 | 断开结果完成时触发 | 无 | 无 |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| deviceId | string | 已断开设备 ID |
| connected | boolean | 断开成功时为 false |
服务与特征 API
getBLEDeviceServices(options)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.deviceId | string | 是 | 已连接设备 ID | 无 | 无 |
| options.success | function | 否 | 服务发现成功时触发 | 无 | 无 |
| options.fail | function | 否 | 服务发现失败时触发 | 无 | 无 |
| options.complete | function | 否 | 操作完成时触发 | 无 | 无 |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| services | Array<BleService> | 服务列表,包含 uuid/isPrimary |
getBLEDeviceCharacteristics(options)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.deviceId | string | 是 | 已连接设备 ID | 无 | 无 |
| options.serviceId | string | 是 | 服务 UUID | 无 | 无 |
| options.success | function | 否 | 特征发现成功时触发 | 无 | 无 |
| options.fail | function | 否 | 特征发现失败时触发 | 无 | 无 |
| options.complete | function | 否 | 操作完成时触发 | 无 | 无 |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| characteristics | Array<BleCharacteristic> | 特征列表及 read/write/notify 等属性 |
readBLECharacteristicValue(options)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.deviceId | string | 是 | 已连接设备 ID | 无 | 无 |
| options.serviceId | string | 是 | 服务 UUID | 无 | 无 |
| options.characteristicId | string | 是 | 可读特征 UUID | 无 | 无 |
| options.success | function | 否 | 读取成功时触发 | 无 | 无 |
| options.fail | function | 否 | 读取失败时触发 | 无 | 无 |
| options.complete | function | 否 | 操作完成时触发 | 无 | 无 |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| deviceId | string | 设备 ID |
| serviceId | string | 服务 UUID |
| characteristicId | string | 特征 UUID |
| value | ArrayBuffer | 读取到的原始字节 |
| hex | string | 与 value 相同内容的十六进制文本;uni-app 页面建议优先使用 |
writeBLECharacteristicValue(options)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.deviceId | string | 是 | 已连接设备 ID | 无 | 无 |
| options.serviceId | string | 是 | 服务 UUID | 无 | 无 |
| options.characteristicId | string | 是 | 可写特征 UUID | 无 | 无 |
| options.value | ArrayBuffer | 是 | 待写入原始字节 | 无 | 无 |
| options.writeNoResponse | boolean | 否 | 是否优先使用无响应写入 | false |
true / false |
| options.success | function | 否 | 写入成功时触发 | 无 | 无 |
| options.fail | function | 否 | 写入失败时触发 | 无 | 无 |
| options.complete | function | 否 | 操作完成时触发 | 无 | 无 |
Android uni-app 页面需要写入文本或十六进制数据时,优先使用 writeBLECharacteristicValueByText 或 writeBLECharacteristicValueByHex;这样不依赖页面与 UTS 插件之间的 ArrayBuffer 入参桥接。
写入增强 API
writeBLECharacteristicValueByText(options)
在 writeBLECharacteristicValue 的设备、服务、特征和回调参数基础上,使用以下字段:
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.text | string | 是 | 按 UTF-8 编码写入的文本 | 无 | 无 |
| options.writeNoResponse | boolean | 否 | 是否优先使用无响应写入 | false |
true / false |
writeBLECharacteristicValueByHex(options)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.hex | string | 是 | 十六进制文本 | 无 | 可包含空格、冒号、短横线、0x |
| options.writeNoResponse | boolean | 否 | 是否优先使用无响应写入 | false |
true / false |
writeBLECharacteristicValueChunked(options)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.deviceId | string | 是 | 已连接设备 ID | 无 | 无 |
| options.serviceId | string | 是 | 服务 UUID | 无 | 无 |
| options.characteristicId | string | 是 | 可写特征 UUID | 无 | 无 |
| options.value | ArrayBuffer | 是 | 待分包数据 | 无 | 无 |
| options.chunkSize | number | 否 | 每包字节数 | 20 |
1-512 |
| options.interval | number | 否 | 包间隔,单位 ms | 0 |
大于等于 0 |
| options.writeNoResponse | boolean | 否 | 是否优先使用无响应写入 | false |
true / false |
| options.success | function | 否 | 全部分包写完后触发 | 无 | 无 |
| options.fail | function | 否 | 任一分包失败时触发 | 无 | 无 |
| options.complete | function | 否 | 整体操作结束时触发 | 无 | 无 |
Android uni-app 页面无法直接向 UTS 插件传入 ArrayBuffer,因此本接口应在 uni-app x 或支持该桥接的平台调用。Android uni-app 的长文本 / Hex 数据可使用稳定会话的 sendBLESessionRequest,通过 encoding 与 chunkSize 让插件原生层完成分包。
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| chunks | number | 实际成功写入的分包数量 |
链路增强 API
requestBLEMTU(options)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.deviceId | string | 是 | 已连接设备 ID | 无 | 无 |
| options.mtu | number | 是 | 期望 MTU | 无 | 23-517 |
| options.success | function | 否 | 协商成功时触发 | 无 | 无 |
| options.fail | function | 否 | 协商失败时触发 | 无 | 无 |
| options.complete | function | 否 | 操作完成时触发 | 无 | 无 |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| deviceId | string | 设备 ID |
| mtu | number | 系统和外设最终协商结果 |
readBLEDeviceRSSI(options)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.deviceId | string | 是 | 已连接设备 ID | 无 | 无 |
| options.success | function | 否 | 读取成功时触发 | 无 | 无 |
| options.fail | function | 否 | 读取失败时触发 | 无 | 无 |
| options.complete | function | 否 | 操作完成时触发 | 无 | 无 |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| deviceId | string | 设备 ID |
| RSSI | number | 当前接收信号强度 |
通知 API
notifyBLECharacteristicValueChange(options)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options.deviceId | string | 是 | 已连接设备 ID | 无 | 无 |
| options.serviceId | string | 是 | 服务 UUID | 无 | 无 |
| options.characteristicId | string | 是 | notify/indicate 特征 UUID | 无 | 无 |
| options.state | boolean | 是 | true 开启,false 关闭 |
无 | true / false |
| options.success | function | 否 | 设置成功时触发 | 无 | 无 |
| options.fail | function | 否 | 设置失败时触发 | 无 | 无 |
| options.complete | function | 否 | 操作完成时触发 | 无 | 无 |
监听 API
监听器均持续有效,直到调用对应 offXxx。Android 可按插件实现移除监听;iOS 调用 offXxx(listener) 会清空该类监听,因为 Swift 闭包不能安全依赖跨语言相等比较。offXxx() 不传 listener 时同样清空该类全部监听器。
| API | listener 类型 | 事件参数 | 释放方式 |
|---|---|---|---|
onBluetoothAdapterStateChange(listener) |
(BleAdapterState) => void |
available/discovering |
offBluetoothAdapterStateChange(listener?) |
offBluetoothAdapterStateChange(listener?) |
可选 | 无 | 不传参数时清空全部适配器监听 |
onBluetoothDeviceFound(listener) |
(Array<BleDevice>) => void |
本批发现设备 | offBluetoothDeviceFound(listener?) |
offBluetoothDeviceFound(listener?) |
可选 | 无 | 不传参数时清空全部设备监听 |
onBLEConnectionStateChange(listener) |
(BleConnectionState) => void |
连接状态、时间、MTU | offBLEConnectionStateChange(listener?) |
offBLEConnectionStateChange(listener?) |
可选 | 无 | 不传参数时清空全部连接监听 |
onBLECharacteristicValueChange(listener) |
(BleCharacteristicValue) => void |
设备/服务/特征/value/hex;uni-app 页面建议优先读取 hex |
offBLECharacteristicValueChange(listener?) |
offBLECharacteristicValueChange(listener?) |
可选 | 无 | 不传参数时清空全部特征监听 |
诊断 API
getCapabilities(options)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | GetCapabilitiesOptions | 是 | 能力查询参数 | 无 | success / fail / complete |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| supported | boolean | 当前设备是否具备 BLE Central 能力 |
| platform | string | 当前平台标识 |
| adapter | boolean | 适配器能力 |
| discovery | boolean | 扫描能力 |
| connection | boolean | 连接能力 |
| serviceDiscovery | boolean | 服务发现能力 |
| characteristicDiscovery | boolean | 特征发现能力 |
| read | boolean | 特征读取能力 |
| write | boolean | 特征写入能力 |
| notify | boolean | 通知订阅能力 |
| mtu | boolean | MTU 协商能力 |
| rssi | boolean | RSSI 读取能力 |
| chunkedWrite | boolean | 分包写入能力 |
| textWrite | boolean | 文本写入能力 |
| hexWrite | boolean | Hex 写入能力 |
| autoReconnect | boolean | 自动重连能力 |
| multiConnection | boolean | 多连接能力 |
| session | boolean | 稳定会话、串行请求和通知响应匹配能力 |
| requiresCustomBase | boolean | App 调试是否需要自定义基座 |
| restrictedReason | string | 不支持时的原因 |
getRuntimeState(options)
| 参数 | 类型 | 必填 | 说明 | 默认值 | 可选参数 |
|---|---|---|---|---|---|
| options | GetRuntimeStateOptions | 是 | 运行态查询参数 | 无 | success / fail / complete |
返回值
| 字段 | 类型 | 说明 |
|---|---|---|
| adapterState | BleAdapterState | 适配器与扫描状态 |
| knownDevices | Array<BleDevice> | 当前进程已发现设备 |
| connectedDeviceIds | Array<string> | 当前连接设备 ID |
| notificationSubscriptions | Array<BleNotifySubscription> | 当前通知订阅 |
| lastError | BleFail | null | 最近一次插件错误 |
| lastUpdatedAt | number | 最近更新时间戳 |
兼容别名
兼容别名与规范 API 参数、回调和平台边界完全相同。新项目建议使用规范 API。
| 兼容别名 | 规范 API |
|---|---|
openBtBluetooth |
openBluetoothAdapter |
closeBtBluetooth |
closeBluetoothAdapter |
startScanBle |
startBluetoothDevicesDiscovery |
stopScanBle |
stopBluetoothDevicesDiscovery |
onBluetoothFound |
onBluetoothDeviceFound |
offBluetoothFound |
offBluetoothDeviceFound |
connectBle |
createBLEConnection |
disconnectBle |
closeBLEConnection |
getConnectedBluetoothServices |
getBLEDeviceServices |
getConnectedBluetoothCharacteristics |
getBLEDeviceCharacteristics |
错误码
| 错误码 | 含义 | 说明 |
|---|---|---|
| 9014001 | platform unsupported | 当前平台、设备能力或 App 上下文不支持 |
| 9014002 | invalid options | 必填参数缺失、MTU/Hex/分包参数非法 |
| 9014003 | bluetooth adapter unavailable | 系统蓝牙适配器不可用 |
| 9014004 | bluetooth adapter not opened | 尚未初始化或打开适配器 |
| 9014005 | start discovery failed | 启动扫描失败 |
| 9014006 | stop discovery failed | 停止扫描失败 |
| 9014007 | BLE connection failed | 连接、断开或重连失败 |
| 9014008 | BLE service not found | 服务发现失败或服务不存在 |
| 9014009 | BLE characteristic not found | 特征发现失败或特征不存在 |
| 9014010 | read characteristic failed | 特征值或 RSSI 读取失败 |
| 9014011 | write characteristic failed | 写入、分包写入或 MTU 协商失败 |
| 9014012 | notify characteristic failed | 通知订阅设置失败 |
| 9014013 | permission denied | Android 蓝牙或位置运行时权限不足 |
| 9014014 | operation timeout | BLE 操作超时 |
| 9014015 | system error | 系统蓝牙调用或适配器关闭失败 |
| 9014016 | session not found | 指定设备会话不存在 |
| 9014017 | session not ready | 会话尚未完成连接、发现或通知准备 |
| 9014018 | request cancelled | 请求被主动取消或因连接中断终止 |
| 9014019 | response timeout | 等待匹配通知响应超时 |
| 9014020 | duplicate request | 同一会话的 requestId 重复 |
| 9014021 | session queue full | 单设备会话队列已达到 100 项上限 |
失败对象包含 errSubject='lizhao-ble'、errCode、errMsg 和可选 details/data。
自定义基座与发布
- 首次导入插件、升级 Kotlin 原生代码或权限后,需要重新制作 Android 自定义基座。
- Swift 原生代码更新后必须重新制作并安装匹配的 iOS 自定义基座;仅更新页面、wgt 或 appResource 不能替换旧基座中的 Swift。
- 仅更新 wgt/appResource 不能替换旧基座中已经编译的 UTS/Kotlin/Swift 原生代码。
- 正式发布 App 时,使用当前插件源码重新执行原生联编或云打包。
- iOS 能力发布前建议在 iOS 12+ 真机与真实 BLE 外设完成扫描、连接、GATT、通知、RSSI、分包、回调次数和前台有限自动重连验收;源码守卫或生成 Swift 不能代替真机证据。
- 付费插件试用需要使用与当前 appid、包名匹配的自定义基座;旧工程或其他账号生成的基座不能作为当前试用证据。
注意事项
- BLE 外设协议并不统一;服务 UUID、特征 UUID、字节序、校验、分包和响应规则由具体设备协议决定。
chunkSize=20是兼容默认值。协商更大 MTU 后,仍应按外设实际可接受长度设置分包大小。writeNoResponse=true只适用于声明writeWithoutResponse的特征;不支持时应改用有响应写入。- 无响应写入的 success 仅表示系统接受发送请求,不代表外设已经接收、校验或执行指令;需要业务确认时应设计通知或读取回执。
- iOS 不支持主动 MTU 协商,
requestBLEMTU会返回9014001;分包上限由 CoreBluetooth 当前连接自动给出。 - 系统蓝牙开关不能由插件关闭;
closeBluetoothAdapter只释放插件管理的扫描、连接、定时器和监听状态。 - 自动重连仅处理非主动断开;主动调用
closeBLEConnection或closeBluetoothAdapter会清理重连状态。 - 页面销毁时应停止扫描、关闭不再使用的通知和连接,并移除持续监听器。
- 自动编译不能替代 Android 真机与真实 BLE 外设验收。
作者系列 UTS 插件
以下为已在 DCloud 插件市场上架的作者系列 UTS 插件,可按业务场景组合使用。未列出的插件表示当前未确认公开市场页,后续上架后再补充。
| 插件 | 能力方向 | 插件市场 |
|---|---|---|
lizhao-nfc-pro |
NFC 标签读写、NDEF、IsoDep 与诊断 | 查看插件 |
lizhao-float-window |
悬浮窗、画中画、权限与诊断 | 查看插件 |
lizhao-device-id |
设备标识、隐私策略与诊断 | 查看插件 |
lizhao-scan-pro |
原生扫码、连续扫码、相册识别 | 查看插件 |
lizhao-choose-file |
原生文件选择、上传、进度与取消 | 查看插件 |
lizhao-bg-audio |
背景音频播放、队列、倍速与事件 | 查看插件 |
lizhao-smart-tts |
系统 TTS、云端合成、听书方案 | 查看插件 |
lizhao-share-plus |
系统分享、远程文件下载后分享 | 查看插件 |
lizhao-sqlite-pro |
原生 SQLite、迁移、备份与诊断 | 查看插件 |
lizhao-icon-pro |
SVG 图标组件、多主题与缓存 | 查看插件 |
lizhao-cast-screen |
DLNA 投屏、AirPlay 路由入口 | 查看插件 |
lizhao-call-kit |
电话、短信、通讯录原生能力 | 查看插件 |
lizhao-app-keepalive |
应用保活、唤醒、自愈与报告 | 查看插件 |
lizhao-doc-corrector |
文档扫描、矫正、增强与识别 | 查看插件 |
lizhao-emu-detect |
模拟器环境检测、风险评分与证据 | 查看插件 |
lizhao-gallery-pro |
相册媒体分页、筛选、缩略图与导出 | 查看插件 |
lizhao-video-thumb |
视频封面、批量取帧与 Base64 返回 | 查看插件 |
lizhao-ble |
BLE 扫描、连接、读写、通知与自动重连 | 查看插件 |
lizhao-sse-pro |
SSE、Line、JSONL 与 Raw 流式请求 | 查看插件 |
lizhao-pdf-pro |
PDF 阅读、签批、真实写回与页面处理 | 查看插件 |
lizhao-serial-port |
路径串口、USB 串口、多会话收发与诊断 | 查看插件 |
lizhao-wechat-kit |
微信登录、分享、支付、小程序与客服 | 查看插件 |
lizhao-video-editor |
视频裁剪、压缩、取帧与 FFmpeg/FFprobe | 查看插件 |
lizhao-vpn-pro |
企业 VPN、IKEv2、安全接入与脱敏诊断 | 查看插件 |

收藏人数:
购买源码授权版(
试用
赞赏(0)
下载 6486
赞赏 5
下载 12569174
赞赏 1949
赞赏
京公网安备:11010802035340号