Uni-App开发BLE低功耗蓝牙步骤
开发蓝牙很多小伙伴刚开始一头雾水,不知道从何下手,网上可以查的资料少之又少,所以写这篇文章来总结一下BLE低功耗蓝牙开发流程,话不多说,仔细看!!
- 初始化蓝牙 uni.openBluetoothAdapter(OBJECT)
- 开始搜索蓝牙设备 uni.startBluetoothDevicesDiscovery(OBJECT)
- 发现外围设备 uni.onBluetoothDeviceFound(CALLBACK)
- 停止搜寻附近的蓝牙外围设备 uni.stopBluetoothDevicesDiscovery(OBJECT)
- 连接低功耗蓝牙设备 uni.createBLEConnection(OBJECT)
- 获取蓝牙设备所有服务 uni.getBLEDeviceServices(OBJECT)
- 获取蓝牙特征 uni.getBLEDeviceCharacteristics(OBJECT)
- 启用蓝牙设备特征值变化时的 notify 功能 uni.notifyBLECharacteristicValueChange(OBJECT)
- 监听低功耗蓝牙设备的特征值变化 uni.onBLECharacteristicValueChange(CALLBACK)
基本使用步骤我们总结完了,那么接下来就介绍怎么使用
1.初始化蓝牙
这里主要目的就是检测一下手机蓝牙是否打开
uni.openBluetoothAdapter({
success:(res)=> { //已打开
uni.getBluetoothAdapterState({//蓝牙的匹配状态
success:(res1)=>{
console.log(res1,'“本机设备的蓝牙已打开”')
// 开始搜索蓝牙设备
this.startBluetoothDeviceDiscovery()
},
fail(error) {
uni.showToast({icon:'none',title: '查看手机蓝牙是否打开'
}
});
},
fail:err=>{ //未打开
uni.showToast({icon:'none',title: '查看手机蓝牙是否打开'});
}
})
2.开始搜索蓝牙设备
// 开始搜索蓝牙设备
startBluetoothDeviceDiscovery(){
uni.startBluetoothDevicesDiscovery({
success: (res) => {
console.log('startBluetoothDevicesDiscovery success', res)
// 发现外围设备
this.onBluetoothDeviceFound()
},fail:err=>{
console.log(err,'错误信息')
}
})
}
3.发现外围设备
到这个位置就会搜索到设备了
这个地方重点就是获取到了 deviceId 这是连接蓝牙的重要ID,存起来到data里面后面我们会用到
// 发现外围设备
onBluetoothDeviceFound() {
// console.log("zhixing")
uni.onBluetoothDeviceFound((res) => {
// console.log(res)
// ["name", "deviceId"]
// 吧搜索到的设备存储起来,方便我们在页面上展示
if(this.list.indexOf(res.devices[0].deviceId)==-1){
this.list.push(res.devices[0].deviceId)
}
})
}
4.点击选择自己需要连接的设备
在上面搜索到设备之后我们把设备存储到list里面,方便我们在页面展示,然后点击选择我们要连接的设备,吧deviceId传进来,保存起来,说明我们连接的是这个设备,下面还需要用到,我们存到data里面就行
//选择设备连接吧deviceId传进来
createBLEConnection(deviceId){
let thit = this
//data里面建立一个deviceId,存储起来
this.deviceId = deviceId
//连接蓝牙
uni.createBLEConnection({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId:this.deviceId,
success(res) {
//防止在这里面取不到this,古在外面用thit存储了this
thit.stopBluetoothDevicesDiscovery()
console.log(res)
console.log("蓝牙连接成功")
},fail(res) {
console.log("蓝牙连接失败",res)
}
})
},
5.当我们连接成功的时候,一定要停止搜索外围设备,停止,停止,停止
// 停止搜寻蓝牙设备
stopBluetoothDevicesDiscovery(){
uni.stopBluetoothDevicesDiscovery({
success: e => {
this.loading = false
console.log('停止搜索蓝牙设备:' + e.errMsg);
},
fail: e => {
console.log('停止搜索蓝牙设备失败,错误码:' + e.errCode);
}
});
}
6.获取蓝牙设备所有服务
getBLEDeviceServices这个方法里面填一个参数deviceId就是我们刚刚获取到的
成功就会获取到了services uuid 同理也存储起来
等下来获取特征值
注:这个地方使用了setTimeout等待一秒种再去获取,直接获取我们可能出现获取不到的情况
//获取蓝牙的所有服务
getBLEDeviceServices(){
setTimeout(()=>{
uni.getBLEDeviceServices({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId:this.deviceId,
success:(res)=>{
// console.log("成功",res)
console.log('device services:', res)
//这里会获取到好多个services uuid 我们只存储我们需要用到的就行,这个uuid一般硬件厂家会给我们提供
res.services.forEach((item)=>{
if(item.uuid.indexOf("AE00")!=-1){
this.serviceId = item.uuid;
//进入特征
this.getBLEDeviceCharacteristics()
}
})
}
})
},1000)
},
7.获取蓝牙特征
这里需要穿2个参数了,就是上面的两个id,分别是deviceId、services
这里获取的特征值的uuid才是我们真正需要操作的uuid
//获取蓝牙特征
getBLEDeviceCharacteristics(){
console.log("进入特征");
setTimeout(()=>{
uni.getBLEDeviceCharacteristics({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId:this.deviceId,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId:this.serviceId,
success:(res)=>{
console.log(res,'特征getBLEDeviceCharacteristics')
this.characteristics = res.characteristics
console.log(this.characteristics)
//循环所有的uuid
// for(let i=0;i<3;i++){
// this.notifyBLECharacteristicValueChange(res.characteristics[i].uuid)
// console.log(res.characteristics[i].uuid)
// console.log(i,'i')
// }
res.characteristics.forEach((item)=>{
if(item.uuid.indexOf("AE02") != -1){
console.log('characteristicId:', item.uuid)
//利用传参的形势传给下面的notify,这里的uuid如果都需要用到,就不用做判断了,建议使用setTimeout进行间隔性的调用此方法
this.notifyBLECharacteristicValueChange(item.uuid)
}
})
},
fail:(res)=>{
console.log(res)
}
})
},1000)
},
8.启用蓝牙设备特征值变化时的 notify 功能
当我们启动notify功能,才能知道我们当前蓝牙的读写状态,
到这里蓝牙连接基本就完成了,然后就是需要自己用到读写操作
“properties”: {
“read”: true, //读
“write”: true, //写
“notify”: true, //广播
“indicate”: false
}
// 启用 notify 功能
notifyBLECharacteristicValueChange(characteristicId){
console.log(characteristicId,'characteristicId')
uni.notifyBLECharacteristicValueChange({
state: true, // 启用 notify 功能
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId:this.deviceId,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId:this.serviceId,
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
characteristicId:characteristicId,
success:(res)=> {
console.log(res)
// console.log(this.characteristicId)
console.log('notifyBLECharacteristicValueChange success', res.errMsg)
},
fail:(res)=> {
console.log('notifyBLECharacteristicValueChange success2', res.errMsg)
}
})
},
9.再多介绍一个采坑的记录
那就是监听变化这个方法的使用
最开始我是写在了8.启用 notify 功能里面,可我发现只能监听一个,后来我就吧这个监听方法放在了6.获取蓝牙设备所有服务,这个地方可以监听到所有特征值的变化,所以我们的代码改进一下
就成了下面这段,读取成功就会在这个地方监听输出
//获取蓝牙的所有服务
getBLEDeviceServices(){
setTimeout(()=>{
uni.getBLEDeviceServices({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId:this.deviceId,
success:(res)=>{
// console.log("成功",res)
console.log('device services:', res)
res.services.forEach((item)=>{
if(item.uuid.indexOf("AE00")!=-1){
// this.serviceId = item.uuid;
//存储到状态
this.$store.commit("upserviceId",item.uuid)
console.log(this.serviceId)
// 这里获取回调,读取成功就的值就会在这个地方接收到!!!
uni.onBLECharacteristicValueChange((res)=>{
console.log("监听成功",res)
//res.value是ArrayBuffer类型的,官方给了一个方法转16进制,我们再进行操作
this.shiliu = this.ab2hex(res.value)
})
this.getBLEDeviceCharacteristics()
}
})
}
})
},1000)
}
到这里基本上就完成了蓝牙的连接
自己需要执行读写操作,就在下面读写就行,如果想默认读写操作,就可以在 8.启用 notify 功能 里面进行操作
就到这里了,如果对你有帮助,请点击喜欢