Uni-App开发BLE低功耗蓝牙流程

Uni-App开发BLE低功耗蓝牙步骤

开发蓝牙很多小伙伴刚开始一头雾水,不知道从何下手,网上可以查的资料少之又少,所以写这篇文章来总结一下BLE低功耗蓝牙开发流程,话不多说,仔细看!!

  1. 初始化蓝牙 uni.openBluetoothAdapter(OBJECT)
  2. 开始搜索蓝牙设备 uni.startBluetoothDevicesDiscovery(OBJECT)
  3. 发现外围设备 uni.onBluetoothDeviceFound(CALLBACK)
  4. 停止搜寻附近的蓝牙外围设备 uni.stopBluetoothDevicesDiscovery(OBJECT)
  5. 连接低功耗蓝牙设备 uni.createBLEConnection(OBJECT)
  6. 获取蓝牙设备所有服务 uni.getBLEDeviceServices(OBJECT)
  7. 获取蓝牙特征 uni.getBLEDeviceCharacteristics(OBJECT)
  8. 启用蓝牙设备特征值变化时的 notify 功能 uni.notifyBLECharacteristicValueChange(OBJECT)
  9. 监听低功耗蓝牙设备的特征值变化 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 功能 里面进行操作
就到这里了,如果对你有帮助,请点击喜欢

上一篇:BLE低功耗蓝牙和传统蓝牙的五大区别


下一篇:BLE 技术(七)--- BLE MESH 是如何设计的?