uni-app低功耗蓝牙在Android上的使用
主要使用uniapp提供的低功耗蓝牙API进行hooks封装。
在使用时,注意Android版本必须5.1以上。
- uni-app低功耗蓝牙在Android上的使用
-
- 一.主要API初步封装(bluetooth.js)
-
- 1.1 初始化蓝牙模块(uni.openBluetoothAdapter(OBJECT))
- 1.2 获取蓝牙适配器状态(uni.getBluetoothAdapterState(OBJECT))
- 1.3 关闭蓝牙模块(uni.closeBluetoothAdapter(OBJECT))
- 1.4 开启搜索蓝牙设备(uni.startBluetoothDevicesDiscovery(OBJECT))
- 1.5 关闭搜索蓝牙设备(uni.stopBluetoothDevicesDiscovery(OBJECT))
- 1.6 连接低功耗蓝牙设备(uni.createBLEConnection(OBJECT))
- 1.7 断开低功耗设备蓝牙(uni.closeBLEConnection(OBJECT))
- 1.8 设置蓝牙最大传输单元(uni.setBLEMTU(OBJECT))
- 1.9 获取蓝牙设备服务(uni.getBLEDeviceServices(OBJECT))
- 1.10 获取特征值(uni.getBLEDeviceCharacteristics(OBJECT))
- 1.11 向低功耗蓝牙设备写入数据(uni.writeBLECharacteristicValue(OBJECT))
- 1.12读取蓝牙设备的二进制数据值(uni.readBLECharacteristicValue(OBJECT))
- 1.13 开启蓝牙设备发出的数据的监听功能(uni.notifyBLECharacteristicValueChange(OBJECT))
- 1.14 监听数据返回(uni.onBLECharacteristicValueChange())
- 1.15 报错代码清单
- 二、封装hooks主要方法(index.js)
- 三、部分注意事项
- 参考文档
一.主要API初步封装(bluetooth.js)
1.1 初始化蓝牙模块(uni.openBluetoothAdapter(OBJECT))
该接口是使用低功耗蓝牙相关API必须调用的一个接口,若未先调用此接口,将会返回代码为10000的报错;
// 初始化蓝牙模块
export function initBluetooth() {
return new Promise((resolve, reject) => {
uni.openBluetoothAdapter({
success(res) {
console.log('初始化蓝牙成功', res);
resolve(res)
},
fail(err) {
console.log('初始化蓝牙失败', err);
reject(err)
}
});
});
}
注意:
在用户蓝牙开关未开启或者手机不支持蓝牙功能的情况下,调用此接口会返回代码10001的错误,表示手机蓝牙功能不可用。
1.2 获取蓝牙适配器状态(uni.getBluetoothAdapterState(OBJECT))
// 获取蓝牙模块状态
export function getBluetoothAdapterState() {
return new Promise((resolve, reject) => {
uni.getBluetoothAdapterState({
success: (res) => {
console.log('获取本机蓝牙适配器状态', res);
resolve(res)
},
fail(err) {
console.log('获取本机蓝牙适配器状态', err);
reject(err)
}
})
});
}
返回数据
属性 | 类型 | 说明 |
---|---|---|
discovering | boolean | 是否正在搜索设备 |
available | boolean | 蓝牙适配器是否可用 |
1.3 关闭蓝牙模块(uni.closeBluetoothAdapter(OBJECT))
调用该方法将断开所有已建立的连接并释放系统资源。建议在使用蓝牙流程后,与 uni.openBluetoothAdapter 成对调用。
// 关闭蓝牙模块
export function closeBluetooth() {
return new Promise((resolve, reject) => {
uni.closeBluetoothAdapter({
success(res) {
console.log('关闭蓝牙成功', res);
resolve(res)
},
fail(err) {
console.log('关闭蓝牙失败', err);
reject(err)
}
})
})
}
1.4 开启搜索蓝牙设备(uni.startBluetoothDevicesDiscovery(OBJECT))
开始搜寻附近的蓝牙外围设备。此操作比较耗费系统资源,请在搜索并连接到设备后调用 uni.stopBluetoothDevicesDiscovery 方法停止搜索。
/**
* 启动蓝牙设备搜索
* @param {Object} params 参数
*/
export function startBluetoothSearch(params) {
return new Promise((resolve, reject) => {
uni.startBluetoothDevicesDiscovery({
...params,
success: (res) => {
console.log('开启蓝牙搜索成功', res);
resolve(res);
},
fail: (err) => {
console.log('开启蓝牙搜索失败', err);
reject(err);
}
})
});
}
传入参数params说明(全都非必填)
属性 | 类型 | 默认值 | 说明 |
---|---|---|---|
services | Array<String> |
要搜索的蓝牙设备主 service 的 uuid 列表。某些蓝牙设备会广播自己的主 service 的 uuid。如果设置此参数,则只搜索广播包有对应 uuid 的主服务的蓝牙设备。建议主要通过该参数过滤掉周边不需要处理的其他蓝牙设备。 | |
allowDuplicatesKey | boolean |
false | 是否允许重复上报同一设备。如果允许重复上报,则 uni.onBlueToothDeviceFound 方法会多次上报同一设备,但是 RSSI 值会有不同。 |
interval | number |
0 | 上报设备的间隔。0 表示找到新设备立即上报,其他数值根据传入的间隔上报。 |
powerLevel | string |
medium | 扫描模式,越高扫描越快,也越耗电,仅安卓支持。low:低,medium:中,high:高。仅京东小程序支持 |
注意
App 端目前仅支持发现ble蓝牙设备
1.5 关闭搜索蓝牙设备(uni.stopBluetoothDevicesDiscovery(OBJECT))
停止搜寻附近的蓝牙外围设备。已经找到需要的蓝牙设备并不需要继续搜索时,调用该接口停止蓝牙搜索。
// 关闭蓝牙设备搜素
export function closeBluetoothSearch() {
return new Promise((resolve, reject) => {
uni.stopBluetoothDevicesDiscovery({
success: (res) => {
console.log('关闭蓝牙搜索成功', res);
resolve(res);
},
fail: (err) => {
console.log('关闭蓝牙搜索失败', err);
reject(err);
}
});
});
}
1.6 连接低功耗蓝牙设备(uni.createBLEConnection(OBJECT))
/**
* 连接 BLE 设备
* @param {String} deviceId 设备ID
*/
export function connectBleById(deviceId, timeout = 10000) {
return new Promise((resolve, reject) => {
uni.createBLEConnection({
deviceId,
timeout,
success(res) {
console.log('连接成功', res);
resolve(res);
},
fail(err) {
console.log('连接失败', err);
resolve(err)
}
})
})
}
传入参数params说明(除deviceId必填外,为非必填,且默认值为空)
属性 | 类型 | 说明 |
---|---|---|
timeout | number |
超时时间,单位ms,不填表示不会超时,京东小程序不支持 |
注意
- 若APP在之前已有搜索过某个蓝牙设备,并成功建立连接,可直接传入之前搜索获取的 deviceId 直接尝试连接该设备,无需进行搜索操作。
- 请保证尽量成对的调用 createBLEConnection 和 closeBLEConnection 接口。安卓如果多次调用 createBLEConnection 创建连接,有可能导致系统持有同一设备多个连接的实例,导致调用 closeBLEConnection 的时候并不能真正的断开与设备的连接。
- 蓝牙连接随时可能断开,建议监听 uni.onBLEConnectionStateChange 回调事件,当蓝牙设备断开时按需执行重连操作。
- 若对未连接的设备或已断开连接的设备调用数据读写操作的接口,会返回 10006 错误,建议进行重连操作。
1.7 断开低功耗设备蓝牙(uni.closeBLEConnection(OBJECT))
/**
* 断开连接 BLE 设备
* @param {String} deviceId 设备ID
*/
export function closeConnectBleById(deviceId) {
return new Promise((resolve, reject) => {
uni.closeBLEConnection({
deviceId