问自己三个问题
1、蓝牙授权拿到了吗?
2、蓝牙模块启用了吗?
3、流程是从获取蓝牙模块状态发起的吗? (如果不是,想办法在前面流程中关闭蓝牙模块,并确保业务流程从启动蓝牙模块开始 … 后面所有流程都跑一遍,IOS是的)
const target = {
deviceId: null,
serviceId: null,
characteristicId: null,
notifyId: null,
}
// 获取蓝牙模块授权 ,这里存在已授权和已拒绝、未授权等情况,自己封装下 helperHandle.wxPreAuthorize
const initKitBluetooth = (force = false) => {
return new Promise((resolve, reject) => {
helperHandle
.wxPreAuthorize({
scope: 'scope.bluetooth',
scopeNamed: '蓝牙',
force,
})
.then(() => {
// 启动蓝牙
uni.openBluetoothAdapter({
success: async () => {
await store.dispatch('app/setBluetoothAdapterState', 2)
resolve()
},
fail: async (res) => {
let message = res.errMsg || ''
if (res.errCode === 10001) {
await store.dispatch('app/setBluetoothAdapterState', 1)
message = '请打开手机蓝牙'
} else {
await store.dispatch('app/setBluetoothAdapterState', 0)
}
reject(message)
},
})
})
.catch((reason) => {
reject(reason)
})
})
}
const linkBLEWithWrite = ({ deviceId, value = 'GET', onListen = null } = {}) => {
return new Promise((resolve, reject) => {
console.log('准备开始连接设备:' + deviceId)
createBLEConnection(deviceId)
.then(() => {
console.log('设备已连接')
target.deviceId = deviceId
// 设备已连接 # 获取服务
return getBLEDeviceServices(deviceId)
})
.then((services) => {
console.log('已获取到设备服务', services)
// 根据服务 # 获取特征值
const serviceId = services[0].uuid
target.serviceId = serviceId
return getBLEDeviceCharacteristics({
deviceId,
serviceId,
})
})
.then(async (characteristics) => {
console.log('已获取到特征值', characteristics)
// 根据特征值进行通信
// 订阅消息的特征值UUID
const notifyId = characteristics[0].uuid
target.notifyId = notifyId
// 发送指令的特征值UUID
const characteristicId = characteristics[1].uuid
target.characteristicId = characteristicId
// 判断是否订阅消息通知
if (onListen) {
console.log('开始侦听设备广播', target)
await notifyBLECharacteristicValueChange(target)
console.log('侦听已启动')
// 订阅回调
onBLECharacteristicValueChange(onListen)
}
return Promise.resolve()
})
.then(async () => {
console.log('开始向设备写入信息:' + value)
// 根据情景 # 向设备写入数据
await writeBLECharacteristicValue({
value,
deviceId: target.deviceId,
serviceId: target.serviceId,
characteristicId: target.characteristicId,
})
})
.then(() => {
console.log('已写入')
resolve()
})
.catch((reason) => {
reject(reason)
})
})
}
const clearBLEServices = (deviceId) => {
return new Promise((resolve) => {
closeBLEConnection(deviceId)
.then(() => {
console.log('连接已关闭')
return closeBluetoothAdapter()
})
.then(async () => {
await store.dispatch('app/setBluetoothAdapterState', 0)
console.log('蓝牙已关闭')
resolve()
})
})
}
0 个评论
要回复文章请先登录或注册