uniapp 蓝牙连接设备 下发命令 监听蓝牙与设备的连接状态(兼容 微信小程序和支付宝小程序)

这篇具有很好参考价值的文章主要介绍了uniapp 蓝牙连接设备 下发命令 监听蓝牙与设备的连接状态(兼容 微信小程序和支付宝小程序)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1:创建蓝牙需要调用的Api文件 ly.js

// 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) => {
		// mode: 'central',
		uni.openBluetoothAdapter({
			success: (r) => {
				console.log("蓝牙初始化成功");
				// 获取蓝牙的匹配状态
				uni.getBluetoothAdapterState({
					success: function(row) {
						console.log('蓝牙状态:', row.available);
						if (row.available) {
							bluetoothOpen = true;
							resolve();
						} else {
							// 请开启蓝牙
							uni.showToast({
								title: '请打开蓝牙',
								icon: 'none'
							})
							bluetoothOpen = false;
							bluetoothConnect = false;

							reject();
						}
					},
					fail: function(err) {
						// 请开启蓝牙
						uni.showToast({
							title: '请打开蓝牙',
							icon: 'none'
						})
						bluetoothOpen = false;
						bluetoothConnect = false;
						reject();
					}
				})
			},
			fail: (err) => {
				// 请开启蓝牙
				console.log('蓝牙初始化失败'+ JSON.stringify(err));
				uni.showToast({
					title: '请前往手机设置,打开此APP蓝牙权限',
					icon: 'none'
				})
				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 = (deviceName) => {
	return new Promise((resolve, reject) => {
		uni.getBluetoothDevices({
			success(res) {
				console.log('获取搜索到的设备信息', res.devices);

				bluetoothConnect = false;
				// 过滤掉name为空或者未知设备的设备
				let devices = res.devices.filter(function(obj) {
					return obj.name !== "" && obj.name !== "未知设备"
				});
				console.log('有名称蓝牙列表', devices, deviceName);
				devices && devices.forEach(item => {
					if (item.name && item.name === deviceName) {
						deviceId = item.deviceId;
						isHaveDevice = true;
						resolve(isHaveDevice);
						console.log('设备ID', deviceId, item);
					}
				});
			},
			fail: function() {
				console.log('搜索蓝牙设备失败');
				bluetoothConnect = false;
				isHaveDevice = false;
				reject(isHaveDevice);
			},
			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;
				console.log('连接蓝牙成功', deviceId);
				// 蓝牙连接成功后关闭蓝牙搜索
				stopDiscoveryBluetooth();
				resolve();
				// 获取服务id
				getServiceId();
			},
			fail(err) {
				bluetoothConnect = false;
				console.log("蓝牙连接失败",err);
				reject();
			}
		});
	});
};
// 获取服务id
const getServiceId = () => {
	uni.getBLEDeviceServices({
		deviceId: deviceId,
		success(res) {
			let model = res.services[0];
			serviceId = model.uuid;
			console.log("获取服务Id",serviceId, res)
			// 调用蓝牙监听和写入功能
			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) {
					// 监听
					
					// 微信
					// #ifdef MP-WEIXIN
					notify = item.uuid;
					
					// #endif
					
					//支付宝
					// #ifdef MP-ALIPAY
						notify =  item.characteristicId;
					// #endif
					startNotice();
				}
				// 002
				if (item.properties.write === true) {
					// 写入 
					
					// 微信
					// #ifdef MP-WEIXIN
					let writeId = item.uuid;
					uni.setStorageSync("writeId", item.uuid);
					// #endif
					
					//支付宝
					// #ifdef MP-ALIPAY
					let writeId = item.serviceId;
					uni.setStorageSync("writeId", item.characteristicId);
					// #endif
					
					
				}
			});
		},
		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);
					// let data = result.value;
					console.log('帽子返回数据', result)
				}
			})
		}
	});
};


// 蓝牙发送数据
const writeData = (buffer) => {
	return new Promise((resolve, reject) => {
		console.log(uni.getStorageSync("writeId"),'下发命令1writeId');
		console.log(deviceId,'下发命令2deviceId');
		console.log(serviceId,'下发命令3serviceId');
		console.log(buffer,'下发命令4buffer');
		
		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();
			}
		});
	});
};


const createBlec = () => {
	uni.createBLEConnection({
		deviceId:deviceId,
		success(res) {
			console.log(res, '断开成功')
		},
		fail(err) {
			console.log("断开失败", err);
		}
	})
}

const BLECStateChange=()=>{
	 return new Promise((resolve, reject) => {
		 uni.onBLEConnectionStateChange(function (res) {
			 // 该方法回调中可以用于处理连接意外断开等异常情况
			 console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)
			 return resolve(res)
		  
		 })
	 })
	
}




// closeBLEConnection  deviceId  断开蓝牙
export default {
	getBluetoothState,
	discoveryBluetooth,
	stopDiscoveryBluetooth,
	getBluetoothDevices,
	connectBluetooth,
	getServiceId,
	getCharacteId,
	startNotice,
	writeData,
	createBlec,
	BLECStateChange
};

2 在页面中使用index.vue 文章来源地址https://www.toymoban.com/news/detail-850785.html

<template>
	<view class="device_container">
		<image src="@/static/bg.png" class="bg"></image>
		<view class="textimg">
			<image src="@/static/text.png"></image>
			<!-- <button type="default" @click="login">微信登录</button>
			<button open-type="getAuthorize" scope='userInfo' @getAuthorize="loginAli"
				onError="onAuthError">支付宝登录</button> -->

		</view>
		<view class="orderText" @click="clickOrder">
			订单列表
		</view>
		<view class="card">
			<view class="tsip" @click="clicljydTisp">
			</view>
			<image class="mb" src="@/static/mb.png" style="width: 100%;height: 100%;"></image>
			<view class="info">
				<view class="beoka">
					<image src="@/static/beoka.png"></image>
				</view>
				<view class="infos">
					<view>
						产品型号: {{deviceName?'Beoka12e432':'XXXXXXXXXX'}}
					</view>
					<view>
						产品编号:{{deviceName?deviceName:'XXXX XXXX XXXX'}}
						<!-- 产品编号:{{deviceName?'866 9288 98376':' XXXX XXXX XXXX'}} -->
					</view>
				</view>
				<view class="priceText">
					<view>
						计费规则
					</view>
					<view>
						五分钟内归还免费,20元/小时,300元/24小时封顶1000元
					</view>

				</view>

			</view>
		</view>


		<view v-if="state">
			<view class="text" v-if="deviceName&&bluetoothStatus" @click="clickUse">
				立即使用
			</view>
			<view class="sm" v-else @click="snacode">扫码连接设备 {{stateText}}</view>
		</view>
		<view class="" v-if="!state">
			<view class="ljgh" @click="clickReturn" v-if="deviceInfo.state==0">
				立即归还
			</view>
			<view class="ljgh" @click="clickPay" v-if="deviceInfo.state==1">
				去支付
			</view>
		</view>
		<!-- 连接引导弹窗 -->
		<uni-popup ref="ljydPopup" type="center">
			<view class="ljyd">
				<view class="title">
					连接引导
					<image src="@/static/close.png" @click="clickClose('ljydPopup')"></image>
				</view>
				<view class="item">
					<view class="itemText">
						1.打开设备电源
					</view>
					<view class="itemImg">
						<image src="@/static/img1.png"></image>
					</view>
				</view>
				<view class="item">
					<view class="itemText">
						1.打开手机蓝牙
					</view>
					<view class="itemImg">
						<image src="@/static/img2.png"></image>
					</view>
				</view>
				<view class="item">
					<view class="itemText">
						1.连接设备
					</view>
					<view class="itemImg">
						<image src="@/static/img3.png"></image>
					</view>
				</view>
			</view>

		</uni-popup>
		<!-- 归还提示弹窗 -->
		<uni-popup ref="tispPopup" type="center" :is-mask-click='false'>
			<view class="tisp">
				<view class="tispTitle">
					提示
				</view>
				<view class="tispText">
					是否归还该设备
				</view>
				<view class="tispBtn">
					<view class="close" @click="clickClose('tispPopup')">
						取消
					</view>
					<view class="confirm" @click="clickConfirm">
						确认
					</view>
				</view>

			</view>
		</uni-popup>

		<!-- 归还成功 -->
		<uni-popup ref="successPopup" type="center" :is-mask-click='false'>
			<view class="success">
				<view class="img">
					<image src="@/static/success.png"></image>
				</view>
				<view class="successtext">
					归还成功
				</view>
				<view class="successConfirm" @click="clickConfirmSuccess">
					确认
				</view>
			</view>

		</uni-popup>


	</view>
</template>

<script>
	// Hi-BEOKA-POC003AEE
	import bluetooth from '@/uilts/ly.js';
	import {
		oderList,
		deviceReturn,
		wxPay,
		createOrder
	} from "@/api/index.js"
	export default {
		data() {
			return {
				state: true,
				deviceState: null, //判断是扫码进入的小程序还是 点击小程序进入的
				stateText: '未连接',
				bluetoothStatus: false, // 蓝牙连接状态
				deviceName: '', //蓝牙名字
				deviceInfo: {}, //设备信息
				deviceConnectState: true, //监听状态
			}
		},

		onLoad(e) {
			let str = e.q
			console.log('indexOnLoad');
			let _this = this
			if (str) {
				this.deviceState = true
				let bluetooth = str.substring(str.length - 18)
				this.deviceName = bluetooth
			} else {
				this.deviceState = true
			}

		},
		onShow() {
			// #ifdef  MP-ALIPAY
			console.log('---');
			my.tradePay({
				orderStr:'201711152100110410533667792',
			})
			// #endif
			let _this = this
			this.getOderList(() => {
				if (this.state && this.deviceName && !this.bluetoothStatus && this.deviceConnectState) {
					_this.initBluetooth(() => {
						console.log('连接成功');
					}, _this.deviceName)
				}
			})

		},
		onUnload() {

		},
		methods: {

			// 支付宝登录
			loginAli() {
				my.getUserInfo({
					success: (res) => {
						console.log('支付宝用户基础信息', res);
						uni.showToast({
							title: res.userName,
							icon: 'none'
						})
					},
					complete: (err) => {
						console.log(err, '00000');

					}
				});

			},
			// 微信登录
			login() {
				uni.login({
					provider: 'weixin',
					success: function(loginRes) {
						console.log(loginRes);
						// 获取用户信息
						uni.getUserInfo({
							provider: 'weixin',
							success: function(infoRes) {
								console.log('用户昵称为:' + JSON.stringify(infoRes.userInfo));
							}
						});
					}
				});
			},
			// 查询订单
			getOderList(callBack) {
				console.log('订单信息请求');
				oderList({
					state: '',
					deviceId: ''
				}).then(res => {
					console.log(res.list, '订单信息');
					let _this = this
					let v = res.list[0]
					if (v) {
						if (v.state == 0 || v.state == 1) {
							this.state = false
							this.deviceInfo = v
							this.deviceName = v.deviceId
						} else {
							this.state = true
							if (callBack) {
								callBack()
							}
						}


					} else {
						this.state = true
						// 获取蓝牙和设备连接状态
					}
				})
			},


			// 获取蓝牙和设备是否已连接
			initBluetooth(callback, deviceName) {
				let _this = this;
				_this.stateText = '搜索蓝牙'
				uni.showLoading({
					title: _this.stateText
				})
				// 初始化蓝牙
				bluetooth.getBluetoothState().then(() => {
					// 搜索外围蓝牙设备
					bluetooth.discoveryBluetooth().then(() => {
						_this.discoveryLoading = true;
						// 获取蓝牙设备
						bluetooth.getBluetoothDevices(deviceName).then((isHaveDevice) => {
							if (isHaveDevice) {
								_this.stateText = '连接中...'
								// 搜索到指定设备,连接蓝牙
								bluetooth.connectBluetooth().then((bluetoothConnect) => {
									console.log('连接成功');
									callback()
									_this.deviceName = deviceName
									_this.stateText = '连接成功'
									uni.hideLoading();
									_this.bluetoothStatus = true;

									// 监听蓝牙与设备连接状态
									bluetooth.BLECStateChange().then(res => {
										_this.bluetoothStatus = res.connected
										_this.deviceConnectState = res.connected
										_this.stateText = '未连接'
										console.log(res, '监听设备连接状态');
									})
								}).catch((err) => {
									_this.stateText = '连接失败'
									_this.bluetoothStatus = false;
									_this.deviceState = false
									uni.hideLoading();
									uni.showToast({
										title: '蓝牙连接失败',
										icon: 'none'
									})
								})
							} else {
								// 未搜到设备
								_this.bluetoothStatus = false;
								_this.deviceState = false
								uni.hideLoading();
								uni.showToast({
									title: '请打开设备',
									icon: 'none'
								})
							}
						}, () => {
							// 蓝牙搜索失败
							_this.bluetoothStatus = false;
							_this.deviceState = false
						});
					});
				}, () => {
					// 未开启蓝牙
					_this.bluetoothStatus = false;
					_this.deviceState = false
				});
			},
			// 向设备发送数据
			writeBlueData(buffer, type) {
				let _this = this
				bluetooth.writeData(buffer).then(res => {
					uni.showLoading({
						title: type == 1 ? "开启中..." : "关闭中..."
					})
					if (type == 1) {

						console.log(_this.deviceName, type);
						createOrder({
							deviceId: _this.deviceName
						}).then(res => {
							console.log('订单创建成功', res);
							uni.showToast({
								title: '开启成功',
								icon: 'none'
							})
							_this.getOderList()

						}).catch(err => {
							uni.showToast({
								title: err.msg,
								icon: 'none'
							})
						})

					} else {
						deviceReturn({
							deviceId: _this.deviceName
						}).then(res => {
							_this.state = true
							_this.$refs.tispPopup.close()
							this.$refs.successPopup.open()

						}).catch(err => {
							uni.showToast({
								title: '归还失败',
								icon: 'none'
							})
						})

					}
					uni.hideLoading()


				})
			},
			// 立即使用 并向设备发送命令
			clickUse() {
				let _this = this
				let buffer = _this.arr2ab([170, 85, 1, 1, 1])
				console.log(buffer, 'buffer', _this.deviceName);

				if (this.bluetoothStatus) {

					_this.writeBlueData(buffer, 1)
				} else {
					_this.initBluetooth(() => {
						_this.writeBlueData(buffer, 1)
					}, _this.deviceName);
				}

			},
			// 扫码
			snacode() {
				let _this = this;
				uni.scanCode({
					success: function(res) {
						let str = res.result
						let bluetooth = str.substring(str.length - 18)
						console.log('1111', bluetooth);
						_this.initBluetooth(() => {
							_this.deviceName = bluetooth

						}, bluetooth);

						_this.deviceState = true
					},
					fail: (err => {
						_this.deviceState = false
					})

				});
			},
			// 点击归还
			clickReturn() {
				let _this = this
				if (this.bluetoothStatus) {
					_this.$refs.tispPopup.open()
				} else {
					_this.initBluetooth(() => {
						_this.$refs.tispPopup.open()
					}, _this.deviceName);
				}

			},

			// 连接引导弹窗
			clicljydTisp() {
				console.log('999');
				this.$refs.ljydPopup.open()
			},
			// 归还成功确认弹窗
			clickConfirmSuccess() {
				this.$refs.successPopup.close()
				this.getOderList()

			},
			clickPay() {
				uni.navigateTo({
					url: '/pages/index/orderlist'
				})

			},

			// 确定归还弹窗 确认
			clickConfirm() {
				let _this = this
				let buffer = _this.arr2ab([170, 85, 1, 1, 0])
				_this.writeBlueData(buffer, 2)
				// if (this.bluetoothStatus) {
				// 	_this.writeBlueData(buffer, 2)
				// } else {
				// 	_this.initBluetooth(() => {
				// 		_this.writeBlueData(buffer, 2)
				// 	}, _this.deviceName);
				// }



			},
			// 10进制转换
			arr2ab(arr) {
				const buffer = new ArrayBuffer(arr.length);
				const dataView = new DataView(buffer);
				for (var i = 0; i < arr.length; i++) {
					dataView.setUint8(i, arr[i]);
				}
				return buffer;
			},

			// 点击关闭
			clickClose(name) {
				this.$refs[name].close()
			},
			// 点击订单列表
			clickOrder() {
				uni.navigateTo({
					url: '/pages/index/orderlist'
				})
			},

		},

	}
</script>

<style lang="scss">
	page {
		height: 100%;
	}

	.bg {
		width: 100vw;
		height: 100vh;
	}

	.ljgh,
	.text,
	.sm {
		border-radius: 100px;
		background: #3A87EF;
		width: calc(100% - 96rpx);
		height: 112rpx;
		box-shadow: 0px 20px 60px 0px rgba(58, 96, 178, 0.30);
		text-align: center;
		line-height: 112rpx;
		color: #FFF;
		font-size: 32rpx;
		font-style: normal;
		font-weight: 500;
		position: fixed;
		bottom: 120rpx;
		left: 50%;
		transform: translateX(-50%);
		letter-spacing: 2rpx;
	}

	.textimg {
		width: 530rpx;
		height: 204rpx;

		image {
			width: 100%;
			height: 100%;
		}

		position: fixed;
		bottom: 120rpx;
		left: 16rpx;
		top: 10%;
	}

	.orderText {
		border-radius: 30rpx 0px 0px 30rpx;
		background: rgba(1, 31, 76, 0.45);
		width: 160rpx;
		height: 60rpx;
		text-align: center;
		font-family: PingFang HK;
		font-size: 28rpx;
		font-weight: 400;
		line-height: 60rpx;
		position: absolute;
		right: 0;
		top: 12.7%;
		color: #FFF;
	}

	.card {
		width: calc(100% - 64rpx);
		height: 520rpx;
		position: fixed;
		top: 43%;
		left: 50%;
		transform: translateX(-50%);

		.md {
			width: 100%;
			height: 100%;
		}

		.tsip {
			width: 32rpx;
			height: 32rpx;
			border-radius: 100%;
			position: absolute;
			right: 44rpx;
			top: 32rpx;
			// background-color: red;
			z-index: 1;

		}

		.info {
			position: absolute;
			top: 0;
			padding: 60rpx 40rpx 22rpx;
			box-sizing: border-box;

			.beoka {
				width: 65px;
				height: 20px;

				image {
					width: 65px;
					height: 20px;
				}

			}
		}

		.infos {
			font-size: 32rpx;
			font-style: normal;
			font-weight: 700;
			line-height: normal;
			margin-top: 44rpx;
			border-bottom: 2rpx dashed #E9ECF3;
			padding-bottom: 32rpx;

			view {
				margin-top: 32rpx;
			}
		}

		.priceText {
			box-sizing: border-box;
			height: 146rpx;
			border-radius: 8rpx;
			box-sizing: border-box;
			border: 2rpx solid rgba(0, 130, 180, 0.06);
			background: #E7F0F7;
			padding: 16rpx 22rpx;
			margin: 32rpx 0 20rpx;

			view {
				color: #3D4C5F;
				font-family: PingFang HK;
				font-size: 24rpx;
				font-weight: 400;
				line-height: 38rpx;
			}
		}
	}

	.ljyd {
		width: 644rpx;
		background-color: #fff;
		border-radius: 28rpx;
		padding-bottom: 16rpx;
		// height: 517px;

		.title {
			color: #333;
			text-align: center;
			font-size: 32rpx;
			font-style: normal;
			font-weight: 600;
			line-height: 44rpx;
			/* 137.5% */
			width: 100%;
			padding: 32rpx 0 48rpx;
			position: relative;

			image {
				width: 20rpx;
				height: 20rpx;
				position: absolute;
				right: 44rpx;
				top: 45rpx;
			}
		}

		.item {
			margin: 0 32rpx 32rpx;

			.itemText {
				color: var(--unnamed, #333);
				text-align: left;
				font-family: PingFang HK;
				font-size: 16px;
				font-style: normal;
				font-weight: 400;
				line-height: normal;
				letter-spacing: -0.408px;
				margin-bottom: 12rpx;
			}

			.itemImg {
				width: 340rpx;
				height: 210rpx;
				margin: auto;

				image {
					width: 100%;
					height: 100%;
				}
			}
		}
	}

	.tisp {
		width: 566rpx;
		height: 304rpx;
		border-radius: 28rpx;
		background: #FFF;
		padding: 32rpx;
		box-sizing: border-box;
		display: flex;
		flex-direction: column;
		justify-content: space-between;

		.tispTitle {
			color: #333;
			text-align: center;
			font-size: 32rpx;
			font-style: normal;
			font-weight: 600;
			line-height: 44rpx;
			/* 137.5% */
			width: 100%;
		}

		.tispText {
			text-align: center;
			color: #5C5C5C;
			font-size: 28rpx;
			font-style: normal;
			font-weight: 400;
			line-height: 44rpx;
			/* 157.143% */
		}

		.tispBtn {
			display: flex;
			justify-content: space-between;

			.close,
			.confirm {
				text-align: center;
				width: 234rpx;
				height: 72rpx;
				line-height: 72rpx;
				border-radius: 32rpx;
				font-size: 28rpx;
				font-weight: 400;
				letter-spacing: 2rpx;
			}

			.close {
				color: #3A87EF;
				background-color: #EBF3FF;

			}

			.confirm {
				color: #fff;
				background-color: #3A87EF;
			}

		}
	}

	.success {
		width: 566rpx;
		height: 432rpx;
		border-radius: 28rpx;
		background: #FFF;
		padding: 32rpx;
		box-sizing: border-box;

		.img {
			width: 344rpx;
			height: 206rpx;
			margin: 0 auto;

			image {

				width: 100%;
				height: 100%;
			}
		}

		.successtext {
			margin-top: 16rpx;
			color: #333;
			font-size: 32rpx;
			font-weight: 700;
			text-align: center;
		}

		.successConfirm {
			text-align: center;
			width: 234rpx;
			height: 72rpx;
			line-height: 72rpx;
			border-radius: 32rpx;
			font-size: 28rpx;
			font-weight: 400;
			letter-spacing: 2rpx;
			color: #fff;
			background-color: #3A87EF;
			margin: 30rpx auto 0;
		}
	}
</style>

到了这里,关于uniapp 蓝牙连接设备 下发命令 监听蓝牙与设备的连接状态(兼容 微信小程序和支付宝小程序)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp 蓝牙小程序-兼容安卓和iOS

    withTimeout方法可以在搜寻设备时等待指定的秒数,如果30秒内未搜索到则取消搜索  计算数据校验和: 校验字节等于命令字节与所有数据字节之和的反码。求和按带进位加 (ADDC)方式计算,每个进位都被加到本次结果的最低位(LSB)。 vue页面代码   js函数代码 

    2024年02月03日
    浏览(43)
  • uniapp 安卓端实时监听网络状态

    写在uniapp的APP.vue的onShow方法中 uni.onNetworkStatusChange(function(res) {                 if (res.isConnected) {                     uni.showModal({                         title: \\\'系统提示\\\',                         content: \\\'当前设备网络已恢复\\\',                  

    2024年02月05日
    浏览(38)
  • uniapp切换路由监听导航跳转(在监听网络状态时非常常用)

    在实时监听网络状态的时候我们切换页面经常会用到此场景 注意:监听页面跳转变化要写在onLaunch方法里面         每次切换页面的时候都会执行调用watchRouter函数里面的方法 标题  

    2024年02月15日
    浏览(84)
  • 小程序蓝牙通讯设备数据对接实战uniapp

          最近很闲,但是行业很卷!因为公司有硬件设备对接,但是介于原生app。闲来无事,便研究了下这个小程序通过蓝牙与硬件设备进行通讯。废话少说上干货! 本次讲解的目录大致分为三模块。根据我写的代码做讲解。 初始化并搜索蓝牙 获取并启用service服务 数据读取

    2024年02月09日
    浏览(38)
  • 蓝牙鼠标HID设备连接流程

    首先我们需要大致知道下HID( The Human Interface Device )是啥,手机和鼠标分别扮演什么角色,这里我们大致了解下即可,然后又在看代码。HID 定义了蓝牙在人机接口设备中的协议、特征和使用规程。典型的应用包括蓝牙鼠标、蓝牙键盘、蓝牙游戏手柄等。该协议改编自USB HID Pro

    2024年04月09日
    浏览(47)
  • 检测已连接的蓝牙设备 - iOS

    检测蓝牙已连接 的情况下更加具体的获取一些当前连接设备的信息数据,具体实现方法如下: 以上便是此次分享的全部内容,希望能对大家有所帮助!

    2024年02月12日
    浏览(43)
  • iOS设备和蓝牙模块连接基础知识

    iOS设备和蓝牙模块连接基础知识 一:iOS连接外设的几种方式 如图下面几种方式: CoreBluetooth和ExternalAccessory,两个框架,基本上是蓝牙设备与iOS设备连接的方式 有图可知,EAP要MFi认证,要求设备的设计理念符合苹果的要求,不仅可以进行无线蓝牙通信,还可以进行有线通信(

    2023年04月20日
    浏览(50)
  • 【Windows】电脑修改已连接的蓝牙设备名称

    问题 有好几个同款的蓝牙耳机,连接电脑后默认显示名字一样,想像手机上一样备注这些耳机的名称。 网上搜索半天,只有修改电脑本身蓝牙名称的方法,而不是修改连接的设备的名称!摸索半天,得出下边的方法 修改连接的蓝牙设备名称 注1: 此方法重启后可能会恢复如

    2024年02月13日
    浏览(43)
  • 微信小程序 蓝牙设备连接,控制开关灯

    微信小程序中连接蓝牙设备,信息写入流程 1 、检测当前使用设备(如自己的手机)是否支持蓝牙/蓝牙开启状态 wx:openBluetoothAdapter({}) 2 、如蓝牙已开启状态,检查蓝牙适配器的状态 wx.getBluetoothAdapterState({}) 3 、添加监听蓝牙适配器状态变化 wx.onBluetoothAdapterStateChange({}) 4 、搜

    2024年02月12日
    浏览(52)
  • 微信小程序连接蓝牙设备并传递数据

    流程图 分步详解 wx.getSystemInfo(Object object)  获取系统信息 获取操作系统及版本 页面加载的时候(或者app.js中 ) ↓ 初始化蓝牙模块  wx.openBluetoothAdapter(Object object) 在用户蓝牙开关未开启或者手机不支持蓝牙功能的情况下,通过错误码(errCode=10001),提示打开蓝牙或蓝牙功能

    2024年02月08日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包