在一个平凡日子里,敲着平凡的代码,突然被老板叫去做了件不平凡的事情:"你把这个蓝牙灯控做一下吧"。于是开始了下边uniapp 蓝牙连接的探索历程。遇到问题放在最后了,希望能帮助到大家。
漫漫探索路
- 蓝牙初始化
在进入页面的时候需要先将蓝牙初始化,目的就是看看你的手机有没有打开蓝牙,蓝牙能不能用. ** 在对蓝牙进行操作的时候必须要做的操作, 后续方法可以放在初始化成功的回调里边 **
uni.openBluetoothAdapter({
success(res) {
console.log(res)
},
fail(error) {
console.log(error)
}
})
2. 初始化完成之后可以进行连接蓝牙(如果有设备的dev_id的话),一般是调用蓝牙的发现设备的方法。
uni.startBluetoothDevicesDiscovery({
success(res){
console.log(res)
},
fail(error) {
conosle.log(error)
}
})`
tip: 如果页面有刷新的操作的话,可以在刷新的时候调用一下这个方法(前提是你蓝牙设备已经初始化完成) 刷新完成之后调用停止搜索的方法
//uni页面刷新的方法
onPullDownRefresh() {
uni.startBluetoothDevicesDiscovery({
success(res){
console.log(res)
},
fail(error) {
conosle.log(error)
}
})`
}
//停止搜索,刷新完成之后调用或者beforeDestroy生命周期里边调用
uni.stopBluetoothDevicesDiscovery()
3.在开启设备搜索之前要调用下设备监听的方法,当发现到设备之后,会通过回调参数的形式传给你。具体参数和官网对照下。
uni.onBluetoothDeviceFound((devices) => {
const device = devices[0]
//有时候搜索到设备没有名称可以过滤一下
if(!device.name) return
//如果列表中的数据不再添加
const isHave = this.list.filter(dev => dev.dev_id == device.dev_id)
if(isHave.length > 0) return;
//搜索到设备之后将设备加到页面列表中
this.list.push(devices[0])
})
4.设备连接
uni.createBLEConnection({
dev_id: (在列表中保存的设备id),
success: () {
console.log("连接成功")
//连接成功之后,将连接成功的设备保存起来,方便对已经连接的设备进行写码操作。
},
fail: () {
console.log('连接失败,去除loading效果')
}
})
5.监听蓝牙设备状态改变事件
蓝牙连接成功之后可以执行下这个方法,用于监听蓝牙设备的状态。方便在断开连接之后对蓝牙设备重连接或提示操作。
uni.onBLEConnectionStateChange(({deviceId, connected}) => {
if(connected) {
console.log(‘连接成功’)
} else {
console.log(‘断开连接’)
}
})
6.写码操作
uni.writeBLECharacteristicValu({
deviceId: (设备id),
serviceId: (设备服务id,下一项会说到),
characteristicId: (设备特征值),
value: (写入的二进制数据)//只能是二进制数据;,
success() {
console.log('数据传递成功')
},
fail() {
console.log(‘数据传递失败’)
}
})
二进制方法
string2Buffer(msg) {
const buffer = new ArrayBuffer(msg.length)
const dataView = new DataView(buffer)
// dataView.setUint8(0, 0)
for (var i = 0; i < msg.length; i++) {
dataView.setUint8(i, msg.charAt(i).charCodeAt())
}
return buffer
}
7.获取设备服务id和获取设备特征值都可以在搜索到设备之后。这样可以将特征值和服务id一起放到列表数据中方便调用。
这边就使用连环嵌套的方式了,大家可以封成await,async 的形式。
在获取服务id之后,里边会有多个服务id,拿不同的服务id会得到不同特征值。大家可以根据项目要求进行取用。
uni.getBLEDeviceServices({
deviceId: (搜索到的设备id),
success: (serviess) => {
获取服务id成功之后,进行特征值的获取
uni.getBLEDeviceCharacteristics({
deviceId: (搜索到的设备id),
serviceId: serviess[0].uuid,
sucess(character) {
//获取成功之后将设备信息,特征值,服务id混成一个对象放到列表数组中
}
})
}
})
遇到的问题: 设备搜索不到的问题 某些设备被连接过之后,其他手机都不会搜到。 当你连接上之后需要调用uni.closeBLEConnection({ dev_id:(需要断开的设备id) }) 如果你保存了已经连接的设备列表,当你的蓝牙初始化之后,可以直接连接你添加的这些设备。不需要再进行搜索。