uniapp·链接蓝牙 获取数据

uniapp·链接蓝牙 获取数据

//1.初始化蓝牙模块
const tapLinkBluetooth = (v) => {
	console.log("1.初始化蓝牙模块")
	uni.openBluetoothAdapter({
		success: function(res) {
			uni.showToast({
				title: '蓝牙已开启',
				icon: 'success',
				duration: 1000
			});
			tapSearchBluetooth();//开始搜索附近的蓝牙设备
		},
		fail: function(res) {
			uni.showToast({
				title: '请打开蓝牙',
				type: 'error',
				icon: 'none'
			});
		}
	});
}

//2.开始搜索附近的蓝牙设备
let listBluetooth = ref([]);
const  tapSearchBluetooth =()=>{
	console.log("2.开始搜索附近的蓝牙设备")
	uni.startBluetoothDevicesDiscovery({
		allowDuplicatesKey: false,
		interval: 0,
		success(res) {
			console.log("搜索附近的蓝牙设备", res)
			
			//提取蓝牙设备列表
			console.log("3.提取蓝牙设备列表")
			uni.getBluetoothDevices({
				success(res) {
					console.log('3.获取已搜索到的蓝牙设备列表', res);
					listBluetooth.value = res.devices; //res.devices[0].connectable true==可链接
					
					// tapThisBluetooth(listBluetooth.value[0]); //连接蓝牙
				}
			})
		}
	})
}

//4.指定某蓝牙并连接该蓝牙 (这里必须 嵌套执行)
const tapThisBluetooth = (v) => {
	console.log("4.低功耗连接蓝牙:", v);
	if (v && v.deviceId) {
		uni.showLoading()
		uni.createBLEConnection({ 
			deviceId: v.deviceId,
			success: function(res0) {
				uni.hideLoading();
				console.log('连接低功耗蓝牙设备:', res0)
				
				if (res0 && res0.errMsg === 'createBLEConnection:ok') {
					console.info("连接蓝牙设备 连接成功");
					uni.stopBluetoothDevicesDiscovery(); //停止搜寻附近的蓝牙外围设备,避免低端设备卡顿
					
					uni.showToast({title: '连接某蓝牙成功'});
					
					uni.getBLEDeviceServices({
						deviceId: v.deviceId,
						success(res1) {
							console.log('获取本蓝牙设备的所有服务:', res1.services)
							
							uni.getBLEDeviceCharacteristics({
								deviceId: v.deviceId,
								serviceId: res1.services[1].uuid,
								success(res2) {
									console.log('获取蓝牙设备指定服务中所有特征值:', res2)
									// console.log('特征值characteristics:', res2.characteristics)

									let characteristicIds = [];
									for (let vv of res2.characteristics) { //搜索可读取数据值
										if (vv.properties.notify) {
											characteristicIds.push(vv.uuid);
											console.log('搜索可读取数据值:', vv)
										}
									}

									for (let vv of characteristicIds) {
										uni.notifyBLECharacteristicValueChange({
											state: true, // 启用通知
											deviceId: v.deviceId,
											serviceId: res1.services[1]
												.uuid, //49535343-ACA3-481C-91EC-D85E28A60318
											characteristicId: vv,
											success: function(res3) {
												console.log('启用notify成功',res3);
												 
												uni.showToast({
													title: '获取数据中',
													icon: 'success',
												});
												// 监听特征值变化
												uni.onBLECharacteristicValueChange(
													function(res4) {
														let x16 = ab2hex(res4.value);
														let weight = hexToAscii(x16);
														console.log("设备反馈值变化:", weight, x16);
													})
											},
											fail: function(err) {
												uni.showToast({
													title: `${err.errMsg}`,
													icon: 'none',
												});
												console.error('启用notify失败',err)
											}
										})

									}
								}
							})

						}
					})
				}
			},
			fail: (err) => {
				uni.hideLoading();
				console.log("连接蓝牙设备 连接失败");
				uni.showToast({
					title: `连接失败${err.errMsg}`,
					icon: 'none',
				});
			}
		});
	} else {
		uni.showToast({
			title: '不可连接,无蓝牙设备ID',
			icon: 'none',
		});
	}
}
function ab2hex(buffer) {//二进制转16进制
		const hexArr = Array.prototype.map.call(
			new Uint8Array(buffer),
			function(bit) {
				return ('00' + bit.toString(16)).slice(-2)
			}
		)
		return hexArr.join('')
	}

function hexToAscii(hexString) { //16进制转明文
		hexString = hexString.replace(/\s/g, '');
		// 检查是否为有效的十六进制字符串
		if (!/^[0-9a-fA-F]+$/.test(hexString)) {
			throw new Error('Invalid hexadecimal string');
		}
		// 每两个字符分割,转换为ASCII字符
		let ascii = '';
		for (let i = 0; i < hexString.length; i += 2) {
			const hexByte = hexString.substr(i, 2);
			const charCode = parseInt(hexByte, 16);
			ascii += String.fromCharCode(charCode);
		}
		return ascii;
	}
分享你的喜爱
linwute
linwute

我要像梦一样自由,像大地一样宽容;
在艰辛放逐的路上,点亮生命的光芒;
我要像梦一样自由,像天空一样坚强;
在曲折蜿蜒的路上,体验生命的意义;

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注