uniapp微信小程序蓝牙连接与设备数据对接

avatar
作者
猴君
阅读量:0

uniapp微信小程序蓝牙连接与设备数据对接

蓝牙连接并通信方法封装大致步骤。
  1. 初始化蓝牙并搜索;
  2. 获取并启用service服务;
  3. 数据读取和监听设备返回数据

需要使用uniapp官方提供api:

// 关闭蓝牙 uni.closeBluetoothAdapter({}) // 打开蓝牙 uni.openBluetoothAdapter({}) // 搜索附近的蓝牙 uni.startBluetoothDevicesDiscovery({}) // 停止搜索 uni.stopBluetoothDevicesDiscovery({}) // 连接低功耗BLE蓝牙 uni.createBLEConnection({}) // 获取蓝牙设备所有服务(service) uni.getBLEDeviceServices({}) // 获取蓝牙特征值 uni.getBLEDeviceCharacteristics({}) // 启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值 uni.notifyBLECharacteristicValueChange({}) // 监听低功耗蓝牙设备的特征值变化事件 uni.onBLECharacteristicValueChange({}) // 读取低功耗蓝牙设备的特征值的二进制数据值 uni.readBLECharacteristicValue({}) 

1、开启蓝牙适配器初始化蓝牙模块,获取手机蓝牙是否打开

const getBluetoothState = () => { 	return new Promise((resolve, reject) => { 		uni.openBluetoothAdapter({ 			mode: 'central', // 主机模式 			success: (r) => { 				console.log("蓝牙初始化成功"); 				// 获取蓝牙的匹配状态 				uni.getBluetoothAdapterState({ 					success: function(row) { 						console.log('蓝牙状态:', row.available); 						if (row.available) { 							// 蓝牙连接成功,开启蓝牙设备搜索 							resolve(); 						} else { 							// 请开启蓝牙 							uni.showToast({ 								title: "请开启蓝牙", 								icon: 'none', 								duration: 2000 							}); 							reject(); 						} 					}, 					fail: function(err) { 						// 请开启蓝牙 						uni.showToast({ 							title: "请开启蓝牙", 							icon: 'none', 							duration: 2000 						}); 						reject(); 					} 				}) 			}, 			fail: () => { 				// 请开启蓝牙 				uni.showToast({ 					title: "请开启蓝牙", 					icon: 'none', 					duration: 2000 				}); 				reject(); 			} 		}); 	}); } 

2、开启蓝牙设备搜索:

const discoveryBluetooth = () => { 	return new Promise((resolve) => { 		uni.startBluetoothDevicesDiscovery({ 			success(res) { 				uni.showLoading({ 	                title: "正在搜索设备", 	                icon:"none", 	                duration: 2000 	            }); 				console.log('搜索蓝牙外围设备完成', res) 				setTimeout(() => { 					// 监听寻找到的蓝牙设备 					resolve(); 				}, 2000); 			} 		}); 	}); } 

3、获取搜索到的设备信息

const getBluetoothDevices = () => { 	return new Promise((resolve, reject) => { 		uni.getBluetoothDevices({ 			success(res) { 				// 过滤掉name为空或者未知设备的设备 				let devices = res.devices.filter(function(obj) { 					return obj.name !== "" && obj.name !== "未知设备" 				}); 				devices && devices.forEach(item => { 					// 获取指定连接deviceId 					if(item.name && item.name.substring(0, 5) === 'aaaa-'){ 						// aaaa-*********蓝牙设备型号,根据需求选择设备型号 						// item.deviceId; 					} 				}); 			}, 			fail: function() { 				console.log('搜索蓝牙设备失败'); 				reject(); 			}, 			complete: function() { 				console.log("蓝牙搜索完成"); 				resolve(); 			} 		}); 	}); } 

4、关闭蓝牙搜索:

const stopDiscoveryBluetooth = () => { 	uni.stopBluetoothDevicesDiscovery({ 		success(r) { 			console.log("停止搜索蓝牙设备", r); 		} 	}); }; 

5、连接蓝牙

const connectBluetooth = () => { 	return new Promise((resolve, reject) => { 		uni.createBLEConnection({ 			deviceId: deviceId, // 设备id 			success() { 				// 蓝牙连接成功后关闭蓝牙搜索并获取服务id 				stopDiscoveryBluetooth(); 				resolve(); 				// 获取服务id 				getServiceId(); 			}, 			fail() { 				console.log("蓝牙连接失败"); 				reject(); 			} 		}); 	}); }; 

6、获取服务id

const getServiceId = () => { 	uni.getBLEDeviceServices({ 		deviceId: deviceId, 		success(res) { 			console.log("获取服务Id", res) 			// serviceId固定,获取蓝牙设备某个服务中的所有特征值【读写属性】 			let model = res.services[0]; 			serviceId = model.uuid; 			// 调用蓝牙监听和写入功能 			getCharacteId(); 		}, 		fail(err){ 			console.log('获取服务失败', err); 		} 	}) }; 

7、获取蓝牙低功耗设备某个服务中所有特征

const getCharacteId = () => { 	uni.getBLEDeviceCharacteristics({ 		deviceId: deviceId, // 蓝牙设备id 		serviceId: serviceId, // 蓝牙服务UUID 		success(res) { 			console.log('数据监听', res); 			res.characteristics.forEach(item => { 				// 003 				if (item.properties.notify === true) { 					// 监听 					notify = item.uuid; 				} 				// 002 				if (item.properties.write === true) { 					// 写入 					let writeId = item.uuid; 				} 			}); 		}, 		fail(err) { 			console.log("数据监听失败", err) 		} 	}) }; 

8、监听设备返回数据,启用低功耗蓝牙设备特征值变化时的notify功能

const startNotice = () => { 	uni.notifyBLECharacteristicValueChange({ 		characteristicId: notify, 		deviceId: deviceId, 		serviceId: serviceId, 		state: true, 		success(res) { 			// 监听低功耗蓝牙设备的特征值变化 			uni.onBLECharacteristicValueChange(result => { 				console.log("监听低功耗蓝牙设备的特征值变化", result); 				if (result.value) { 					console.log('设备返回数据', result.value) 				} 			}) 		} 	}); }; 

9、向蓝牙设备发送数据

const writeData = (buffer) => { 	return new Promise((resolve, reject) => { 		uni.writeBLECharacteristicValue({ 			characteristicId: uni.getStorageSync("writeId"), 			deviceId: deviceId, 			serviceId: serviceId, 			value: buffer, 			success(res) { 				console.log("writeBLECharacteristicValue success", res); 				resolve(); 			}, 			fail(err) { 				console.log("报错了", err); 				reject(); 			} 		}); 	}); }; 

封装完整方法:

import { TextDecoder } from 'text-encoding-utf-8'; let bluetoothOpen = false; // 手机蓝牙是否打开 let bluetoothConnect = false; // 设备和蓝牙是否连接 let isHaveDevice = false; // 是否查找到设备 let deviceId = null; // 设备id let serviceId = null; // 服务id let notify = null; // 监听uuid let writeId = null; // 写入uuid /**  * 获取手机蓝牙是否打开  */ const getBluetoothState = () => { 	// 主机模式 	return new Promise((resolve, reject) => { 		uni.openBluetoothAdapter({ 			mode: 'central', 			success: (r) => { 				console.log("蓝牙初始化成功"); 				// 获取蓝牙的匹配状态 				uni.getBluetoothAdapterState({ 					success: function(row) { 						console.log('蓝牙状态:', row.available); 						if (row.available) { 							bluetoothOpen = true; 							resolve(); 						} else { 							// 请开启蓝牙 							bluetoothOpen = false; 							bluetoothConnect = false; 							reject(); 						} 					}, 					fail: function(err) { 						// 请开启蓝牙 						bluetoothOpen = false; 						bluetoothConnect = false; 						reject(); 					} 				}) 			}, 			fail: () => { 				// 请开启蓝牙 				bluetoothOpen = false; 				bluetoothConnect = false; 				reject(); 			} 		}); 	}); }; /**  * 开始搜索蓝牙设备  */ const discoveryBluetooth = () => { 	return new Promise((resolve) => { 		uni.startBluetoothDevicesDiscovery({ 			success(res) { 				console.log('搜索蓝牙外围设备完成', res) 				setTimeout(() => { 					resolve(); 				}, 2000); 			} 		}); 	}) }; // 关闭蓝牙搜索 const stopDiscoveryBluetooth = () => { 	uni.stopBluetoothDevicesDiscovery({ 		success(r) { 			console.log("停止搜索蓝牙设备", r); 		} 	}); }; /**  * 获取搜索到的设备信息  */ const getBluetoothDevices = () => { 	return new Promise((resolve, reject) => { 		uni.getBluetoothDevices({ 			success(res) { 				bluetoothConnect = false; 				// 过滤掉name为空或者未知设备的设备 				let devices = res.devices.filter(function(obj) { 					return obj.name !== "" && obj.name !== "未知设备" 				}); 				devices && devices.forEach(item => { 					if(item.name && item.name.substring(0, 5) === 'aaaa-'){ 						deviceId = item.deviceId; 					} 				}); 			}, 			fail: function() { 				console.log('搜索蓝牙设备失败'); 				bluetoothConnect = false; 				reject(); 			}, 			complete: function() { 				console.log("蓝牙搜索完成"); 				// 是否具有当前设备 				if (deviceId) { 					isHaveDevice = true; 				} else { 					isHaveDevice = false; 				} 				resolve(isHaveDevice); 			} 		}); 	}); } /**  * 连接蓝牙  * deviceId 蓝牙设备id  */ const connectBluetooth = () => { 	return new Promise((resolve, reject) => { 		uni.createBLEConnection({ 			deviceId: deviceId, // 设备id 			success() { 				bluetoothConnect = true; 				// 蓝牙连接成功后关闭蓝牙搜索 				stopDiscoveryBluetooth(); 				resolve(); 				// 获取服务id 				getServiceId(); 			}, 			fail() { 				bluetoothConnect = false; 				console.log("蓝牙连接失败"); 				reject(); 			} 		}); 	}); }; // 获取服务id const getServiceId = () => { 	uni.getBLEDeviceServices({ 		deviceId: deviceId, 		success(res) { 			console.log("获取服务Id", res) 			let model = res.services[0]; 			serviceId = model.uuid; 			// 调用蓝牙监听和写入功能 			getCharacteId(); 		} 	}) }; // 获取蓝牙低功耗设备某个服务中所有特征 const getCharacteId = () => { 	uni.getBLEDeviceCharacteristics({ 		deviceId: deviceId, // 蓝牙设备id 		serviceId: serviceId, // 蓝牙服务UUID 		success(res) { 			console.log('数据监听', res); 			res.characteristics.forEach(item => { 				// 003 				if (item.properties.notify === true) { 					// 监听 					notify = item.uuid; 					startNotice(); 				} 				// 002 				if (item.properties.write === true) { 					// 写入 					let writeId = item.uuid; 					uni.setStorageSync("writeId", item.uuid); 				} 			}); 		}, 		fail(err) { 			console.log("数据监听失败", err) 		} 	}) }; // 启用低功耗蓝牙设备特征值变化时的notify功能 const startNotice = () => { 	uni.notifyBLECharacteristicValueChange({ 		characteristicId: notify, 		deviceId: deviceId, 		serviceId: serviceId, 		state: true, 		success(res) { 			// 监听低功耗蓝牙设备的特征值变化 			uni.onBLECharacteristicValueChange(result => { 				console.log("监听低功耗蓝牙设备的特征值变化", result); 				if (result.value) { 					let decoder = new TextDecoder('utf-8'); 					let data = decoder.decode(result.value); 					console.log('帽子返回数据', data) 				} 			}) 		} 	}); }; // 蓝牙发送数据 const writeData = (buffer) => { 	return new Promise((resolve, reject) => { 		uni.writeBLECharacteristicValue({ 			characteristicId: uni.getStorageSync("writeId"), 			deviceId: deviceId, 			serviceId: serviceId, 			value: buffer, 			success(res) { 				console.log("writeBLECharacteristicValue success", res); 				resolve(); 			}, 			fail(err) { 				console.log("报错了", err); 				reject(); 			} 		}); 	}); }; export default { 	getBluetoothState, 	discoveryBluetooth, 	stopDiscoveryBluetooth, 	getBluetoothDevices, 	connectBluetooth, 	getServiceId, 	getCharacteId, 	startNotice, 	writeData }; 

使用案例:

<template> 	<view class="device_container"> 	</view> </template>  <script> 	import bluetooth from '../bluetooth.js'; 	export default { 		data() { 			return { 				bluetoothStatus: false, // 蓝牙连接状态 			} 		}, 		methods: { 			// 获取蓝牙和设备是否已连接 			initBluetooth() { 				let _this = this; 				// 初始化蓝牙 				bluetooth.getBluetoothState().then(() => { 					// 搜索外围蓝牙设备 					bluetooth.discoveryBluetooth().then(() => { 						this.discoveryLoading = true; 						// 获取蓝牙设备 						bluetooth.getBluetoothDevices().then((isHaveDevice) => { 							if (isHaveDevice) { 								// 搜索到指定设备,连接蓝牙 								bluetooth.connectBluetooth().then(() => { 									_this.bluetoothStatus = true; 								}, () => { 									_this.bluetoothStatus = false; 								}); 							} else { 								// 未搜到设备 								_this.bluetoothStatus = false; 							} 						}, () => { 							// 蓝牙搜索失败 							_this.bluetoothStatus = false; 						}); 					}); 				}, () => { 					// 未开启蓝牙 					_this.bluetoothStatus = false; 				}); 			}, 			// 向设备发送数据 			writeBlueData() { 				let obj = { 					cmd: 3, 					freq: 430125, 					speakable: 1 				}; 				let objStr = JSON.stringify(obj); 				let buffer = new ArrayBuffer(objStr.length); // 每个字符占用2个字节 				let bufView = new Uint8Array(buffer); 				for (let i = 0; i < objStr.length; i++) { 					bufView[i] = objStr.charCodeAt(i); 				} 				bluetooth.writeData(buffer); 			} 		}, 		onShow() { 			// 获取蓝牙和设备连接状态 			this.initBluetooth(); 		}, 	} </script>  <style lang="scss"> 	page { 		height: 100%; 	} </style> 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!