保姆级别uni-app使用低功耗蓝牙

2023-10-29

实现方式:

本文使用 uni-app + Vue3 的方式进行开发,以手机app的方式运行。

uni-app 提供了低功耗蓝牙 的 api ,和微信小程序提供的 api 是一样的,所以本文的讲解也适用于微信小程序。


本文参考文档:

https://blog.csdn.net/xx_ll_/article/details/108761621?ops_request_misc=&request_id=&biz_id=102&utm_term=uniapp%E8%93%9D%E7%89%99%E6%B5%81%E7%A8%8B&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-108761621.142^v38^pc_rank_34&spm=1018.2226.3001.4187

官方文档

https://uniapp.dcloud.net.cn/

配置环境:

  1. 开发工具:HBuilder X(最新版)
  2. 框架:uni-app
  3. 演示效果: iOS或者安卓APP

整体流程:

  1. 初始化蓝牙(openBluetoothAdapter):查看蓝牙是否可用,若初始化失败,则是蓝牙未打开,提示用户打开蓝牙。若已经打开蓝牙,则准备进行蓝牙搜索。

  2. 搜索蓝牙(startBluetoothDevicesDiscovery):开始搜索蓝牙备。这一步需要和关闭搜索蓝牙(stopBluetoothDevicesDiscovery)成对使用,长时间占用搜索设备,浪费资源,在查找到需要的设备连接之后需要主动去停止搜索设备。

  3. 获取已搜索到的蓝牙列表(getBluetoothDevices):查看所有已经发现的蓝牙设备getBluetoothDevices。在这一步可以查看到以前已经获取到的蓝牙设备deviceId。可以在这一步中查看以前已经连接到的设备,主动去尝试连接这个设备。

  4. 连接蓝牙设备(createBLEConnection):通过设备的deviceId来连接设备。在这里如果APP若是已经连接过此低功耗蓝牙设备,可以直接传入之前设备ID进行尝试连接。这一步的连接操作需要和关闭连接closeBLEConnection成对操作。如果多次调用创建连接,有可能会导致系统持有一个设备的多个连接实例,导致在调用关闭连接的时候不能真正关闭连接。

  5. 获取设备所有服务(getBLEDeviceServices):在连接设备之后,APP需要主动去获取设备的所有服务(services),设备会返回给APP设备的服务列表(services)包含设备服务的UUID,该服务是否为主服务。

  6. 获取服务特征值(getBLEDeviceCharacteristic):在获取设备的服务列表之后,根据自己设备的蓝牙协议接口文档,根据指定的服务ID(serviceId)使用获取服务特征值方法传入两个参数设备ID(deviceId)和服务ID(serviceId)向设备获取该服务中的所有的特征值(characteristic),设备会向APP返回该服务中的所有特征值列表,列表包含设备特征值的UUID,该特征值支持的操作类型。

  7. 向设备写入控制命令(writeBLECharacteristicValue):可以向设备写入(发送)控制命令writeBLECharacteristicValue,此方法是向低功耗蓝牙设备特征值写入二进制数据。需要注意只有该特征值的属性支持write才可以调用此方法。在此方法调用成功后,设备特征值发生改变,就会触发onBLECharacteristicValueChange回调,主动返回特征值数据。


1 初始化蓝牙代码:
<template>
	<view class="content">
		<image class="logo" src="/static/logo.png"></image>
		<view class="text-area">
			<button @click="init">初始化一下咯</button>
		</view>
	</view>
</template>
<script>
	export default {
		data() {
			return {
				title: 'Hello'
			}
		},
		onLoad() {
		},
		methods: {
         init() {
				uni.openBluetoothAdapter({
					success(res) {
						console.log('初始化蓝牙成功')
						uni.showToast({
							title: '初始化成功',
						})
						console.log(res)
					},
					fail(err) {
						console.log('初始化蓝牙失败')
						console.error(err)
					}
				})
			}}
}
</script>
<style>
	.content {
		display: flex;
		flex-direction: column;
		align-items: center;
		justify-content: center;
	}
	.logo {
		height: 200rpx;
		width: 200rpx;
		margin-top: 200rpx;
		margin-left: auto;
		margin-right: auto;
		margin-bottom: 50rpx;
	}
	.text-area {
		display: flex;
		justify-content: center;
	}

	.title {
		font-size: 36rpx;
		color: #8f8f94;
	}
</style>

2 搜索蓝牙设备并获取蓝牙设备列表代码:
<template>
	<view class="content">
	
		<view class="text-area">
			<button @click="init">初始化一下咯</button>
				<button @click="search">搜索蓝牙</button>
		</view>
		<scroll-view scroll-y class="box">
			<view class="item" v-for="item in deviceList">
				<view>
					<text>id:{{item.deviceId}}</text>
				</view>
				<view>
					<text>name:{{item.name}}</text>
					<button @click="connect(item)">连接</button>
				</view>
		
			</view>
		</scroll-view>
		
	</view>
</template>

<script>
	export default {
		data() {
			return {
				title: 'Hello',
				deviceId: '',
				serviceId: '',
				characteristicId: '',
				deviceList: [],
			}
		},
		onLoad() {

		},
		methods: {

       init() {
       	uni.openBluetoothAdapter({
       		success(res) {
       			console.log('初始化蓝牙成功')
       			uni.showToast({
       				title: '初始化成功',
       			})
       			console.log(res)
       		},
       		fail(err) {
       			console.log('初始化蓝牙失败')
       			console.error(err)
       
       		}
       	})
       },
       search() {
       	var that = this;
       	uni.startBluetoothDevicesDiscovery({
       
       		success(res) {
       			uni.showToast({
       				title: '开始搜索请等待...',
       			});
       			setTimeout(() => {
       				uni.hideLoading()
       			}, 2000);
       			setTimeout(() => {
       				that.getBluetoothDevices();
       			}, 1000);
       			console.log('开始搜索')
       
       			// 开启监听回调
       		},
       		/* fail(err) {
       		     console.log('搜索失败')
       	      console.error(err)
       		 } */
       	})
       },
       getBluetoothDevices() {
       	//获取蓝牙设备列表
       	uni.getBluetoothDevices({
       		success: res => {
       			let data = res.devices
       			let tempList = [];
       			data.map(device => {
       				if (!!device.localName) {
       					tempList.push(device)
       				}
       			});
       			this.deviceList = tempList;
       		}
       	});
       },
       
       stop() {
       	//停止搜索蓝牙
       	uni.stopBluetoothDevicesDiscovery({
       		success(res) {
       			console.log(res)
       		}
       	})
       },

}
		}
	
</script>

<style>
.box {
		width: 100%;
		height: 800rpx;
		box-sizing: border-box;
		margin-bottom: 20rpx;
		border: 2px solid dodgerblue;
	}

	.item {
		box-sizing: border-box;
		padding: 10rpx;
		border-bottom: 1px solid #ccc;
	}

	button {
		margin-bottom: 20rpx;
	}
</style>


3 连接设备,并且获取到相关信息传到指定页面:
<template>
	<view class="content">
		<view class="text-area">
			<button @click="init">初始化一下咯</button>
			<button @click="search">搜索蓝牙</button>
			<!--  <button @click="goto1">控制风扇</button> -->
		</view>
		<scroll-view scroll-y class="box">
			<view class="item" v-for="item in deviceList">
				<view>
					<text>id:{{item.deviceId}}</text>
				</view>
				<view>
					<text>name:{{item.name}}</text>
					<button @click="connect(item)">连接</button>
				</view>

			</view>
		</scroll-view>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				title: 'Hello',
				deviceId: '',
				serviceId: '',
				characteristicId: '',
				deviceList: [],

			}
		},
		onLoad() {

		},
		methods: {
			init() {
				uni.openBluetoothAdapter({
					success(res) {
						console.log('初始化蓝牙成功')
						uni.showToast({
							title: '初始化成功',
						})
						console.log(res)
					},
					fail(err) {
						console.log('初始化蓝牙失败')
						console.error(err)

					}
				})
			},
			search() {
				var that = this;
				uni.startBluetoothDevicesDiscovery({

					success(res) {
						uni.showToast({
							title: '开始搜索请等待...',
						});
						setTimeout(() => {
							uni.hideLoading()
						}, 2000);
						setTimeout(() => {
							that.getBluetoothDevices();
						}, 1000);
						console.log('开始搜索')

						// 开启监听回调
					},
					/* fail(err) {
					     console.log('搜索失败')
				      console.error(err)
					 } */
				})
			},
			getBluetoothDevices() {
				//获取蓝牙设备列表
				uni.getBluetoothDevices({
					success: res => {
						let data = res.devices
						let tempList = [];
						data.map(device => {
							if (!!device.localName) {
								tempList.push(device)
							}
						});
						this.deviceList = tempList;
					}
				});
			},

			stop() {
				//停止搜索蓝牙
				uni.stopBluetoothDevicesDiscovery({
					success(res) {
						console.log(res)
					}
				})
			},

			connect(item) {
				let deviceId = item.deviceId
				let that = this
				console.log(deviceId) //设备id
				 uni.setStorageSync("deviceId",deviceId);
				uni.createBLEConnection({
						deviceId,// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
					success(res) {
						console.log(res)
						uni.showToast({
							title: '连接成功'
						});
						that.stop();
						setTimeout(() => {
							uni.getBLEDeviceServices({
								deviceId, // 设备ID
								success(res) {
									for(let i=0;i < res.services.length;i++)
									{
										if(res.services[i].isPrimary)
										{
											this.serviceId=res.services[i].uuid;//获取到isprimary不等于空的哪个ServiceId
										}
									};
									
									let serviceId=this.serviceId;
									console.log(serviceId)
									uni.setStorageSync('serviceId',this.serviceId);
                              
									setTimeout(() => {
										uni.getBLEDeviceCharacteristics({

											deviceId, // 设备ID,在前面已经获取到
											serviceId, // 服务UUID,在前面已经获取到
											success(res) {
												console.log('分割线')
                                              for(let i=0;i<res.characteristics.length;i++)
											  {   
												  console.log('分割线2')
												  let item=res.characteristics[i];
												  if(item.properties.write)	
												  {    
													  console.log('分割线222')
													  this.serviceId=serviceId;
													  this.characteristics=item.uuid;//获取到characteristicsId
													  let characteristicId=this.characteristics;
													  uni.setStorageSync('characteristicId',this.characteristics);
												  }
											  };
											let characteristicId=this.characteristics;
											
												console.log(characteristicId)
	
												uni.navigateTo({
													deviceId, // 设备ID
													serviceId, // 服务UUID
													characteristicId,
													url: '/pages/fancontrol/fancontrol?deviceId=' +
														deviceId +
														'&serviceId=' +
														serviceId +
														'&characteristicId=' +
														characteristicId,//页面传参,url地址需要改成你自己的

													success() {
														console.log(
														'跳转成功');
													},
													fail(res) {
														console.log(
														'跳转失败');
													}
												})
											},
											fail(err) {
												console.error(err)
											}
										})
									})

								},
								fail(err) {
									console.error(err)
								}
							})
						});
					}
				})


			}
		


		}
	}
</script>

<style>
	.box {
		width: 100%;
		height: 800rpx;
		box-sizing: border-box;
		margin-bottom: 20rpx;
		border: 2px solid dodgerblue;
	}

	.item {
		box-sizing: border-box;
		padding: 10rpx;
		border-bottom: 1px solid #ccc;
	}

	button {
		margin-bottom: 20rpx;
	}
</style>

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

保姆级别uni-app使用低功耗蓝牙 的相关文章

  • 闲置资源优化,轻松检查集群中的空闲成本

    前言 Kubernetes 提供了对计算 网络 存储资源的抽象 提升了集群资源管理的效率 然而 由于用户不需要直接管理底层资源 可能导致部分闲置资源未及时发现 造成成本浪费 在企业 IT 成本治理过程中 如何发现并处理这部分资源 是成本优化
  • Nvidia Deepstream极致细节:3. Deepstream Python RTSP视频输出显示

    Nvidia Deepstream极致细节 3 Deepstream Python RTSP视频输出显示 此章节将详细对官方案例 deepstream test 1 rtsp out py作解读 deepstream test 1 rtsp
  • Buuctf——[RCTF2015]EasySQL

    Buuctf RCTF2015 EasySQL 一 解题步骤 1 看到注册登录 闲着没事先注册个号试试 1 123 2 进去看了 除了受到文化熏陶 别的好像没有啥 点一下试试其有什么功能 一不小心就看到了修改密码 3 惊奇的发现 密码可以被

随机推荐

  • 【数据结构】二、顺序表的定义和基本操作的实现

    目录 数据结构 DATA STRUCTURE 二 线性表 2 1 线性表的定义和基本操作概述 2 2 线性表的顺序表示 2 2 1 顺序表存储结构描述和特点 1 静态存储方式 2 动态存储方式 3 顺序表的优缺点 2 2 2 顺序表基本操作
  • 数据库-ER建模

    目录 基本概念 1 实体 entity 2 属性 attribute 3 联系 relation 3 1 基数约束的四种形态 3 1 1 基数约束形态一 3 1 2 基数约束形态二 3 1 3 基数约束形态三 3 1 4 基数约束形态四 扩
  • OneOS文字转语言组件实操

    本文分享自中移OneOS微信公众号 当万耦遇上chaoTTS 作者 柏灵 大家好 柏灵又又又来啦 相信大家已经开始在寒冷的冬季种植鲜嫩的豌豆尖 火锅里烫上豌豆尖 从此打工人有了豌豆尖自由 还没有种植的小伙伴 可以通过OneOS 基于端云融合
  • fit、transform、fit_transform的区别,为什么训练集用 fit_transform , 测试集用 transform

    三个函数的使用具体解释 在数据预处理中的应用 1 只涉及一组数据 fit data 对数据进行拟合 获得了数据的均值 最大最小 标准差等属性值 transform data 利用 fit data 获取到的属性对数据做预处理 如标准化 归一
  • cocos cretor shader effect-the book of shader前言

    前言 说来惭愧 半年前开始接触cocso creator shader的时候 看了官方教程 看了大神写的例子 搞懂了一些语法概念 可是当时看一遍有种似懂非懂的感觉 那种感觉就是听过很多道理 任然过不好一生 在cocos论坛里有大神也分享过自
  • Foxmail 搜索功能找不到全部邮件问题的解决方法。

    经常使用Foxmail办公收发邮件 发现Foxmail 搜索功能找不到全部邮件 原来问题出在搜索上 举例说明 迁移到Foxmail后 王卡卡同志给我发过3封邮件 可是我用据称无比强大的Foxmail搜索邮件时 输入关键字 root 只能找到
  • [计算机毕业设计]数字水印算法

    前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度的 对本科同学来说是充满挑战 为帮助大
  • 梦幻模拟战pc版更新服务器正在维护,梦幻模拟战PC版免CD(更新2代跳出补丁 一些实用说明)...

    最近看到游侠有发梦幻模拟战PC版1 2 下载 不过要禁用DX 还要拔光驱 比较麻烦 我把我以前收藏的L1 L2 免CD发出来分享 我自己反正测试可以用 1代 第1步 替换langpc exe 请做好备份 第2步 复制光盘上 DISK1 ID
  • shell脚本中$!、$@、$#、$$、$0、$1、$2、$*的含义

    一 shell脚本中 0 1 2 的含义 Shell最后运行的后台Process的PID 后台运行的最后一个进程的进程ID号 添加到shell当中参数的个数 Shell本身的PID ProcessID 即脚本运行的当前进程ID号 0 脚本本
  • 【第八章 线程的同步机制(同步代码块、同步方法)】

    第八章 线程的同步机制 同步代码块 同步方法 1 线程的同步机制方式一 同步代码块 java中通过同步机制解决线程安全问题 synchronized 同步监视器 需要被同步的代码 说明 操作共享数据的代码即为需要被同步的代码 共享数据 多个
  • 关于浏览器静止音频自动播放的问题

    背景 今天在制作前端页面时 想要给网页加上会自动播放的音乐 但是用audio标签设置音频的自动播放后 即使将autoplay属性设置成true 谷歌等浏览器页面加载完成后也不会自动播放音乐 尝试了各种办法无果 原因 目前 最为流行的浏览器共
  • 求助TCanvas内存无限涨的问题

    求助TCanvas内存无限涨的问题 Delphi Windows SDK API http www delphi2007 net DelphiMultimedia html delphi 20061110220830160 html pro
  • 利用Wireshark分析TCP三次握手

    首先打开 http www baidu com这个网址进行抓包 首先在过滤器中输入 http过滤 找到 GET HTTP 1 1 我们可以看到在出现了三条TCP记录之后才出现了HTTP这也更加相信HTTP是基于TCP协议的 第一次TCP握手
  • uniapp 顶部头部样式

  • 【Python】剑指offer 14:剪绳子

    题目 给你一根长度为n的绳子 请把绳子剪成m段 m和n都是整数 n gt 1并且m gt 1 每段绳子的长度记为k 0 k 1 k m 请问k 0 k 1 k m 可能的最大乘积是多少 例如 当绳子的长度为8时 我们把它剪成长度分别为2 3
  • idea中类存在编译器报错类无法找到,打包正常解决

    步骤 关键在于清掉类在idea的cache 1 刷新maven项目 2 清理idea缓存 3 maven clean install 4 重新bulid 5 如果使用了lombok插件开启之后重新build 6 maven依赖冲突导致
  • Gin微服务框架_golang web框架_完整示例Demo

    Gin简介 前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 Gin是一个golang的微框架 封装比较优雅 API友好 源码注释比较明确 具有快速灵活 容错方便等特点 其实对于golang而
  • Haystack 太强了!存 2600 亿图片

    作者 奇伢 来源 奇伢云存储 小文件存储 小文件存储 老生常谈的问题 先聊聊小文件存储重点关注的是什么 以前我们提过 对于磁盘来说 小 io 吃 iops 大块 io 吃吞吐 划重点 小文件的重点是 io 次数 为什么每次提到海量小文件的时
  • 定时器串口收发和空闲中断串口收发+STM32CubeMX

    引言 最近在做串口实验 总结了两种串口收发的方法 第一种是用定时器定的 第二种是使用空闲中断 第一种 使用定时器 具体做法是在串口接收数据时启动定时器 每接收一帧数据要复位定时值以保证定时器不会溢出 根据波特率计算出大概什么时候接收数据完成
  • 保姆级别uni-app使用低功耗蓝牙

    实现方式 本文使用 uni app Vue3 的方式进行开发 以手机app的方式运行 uni app 提供了低功耗蓝牙 的 api 和微信小程序提供的 api 是一样的 所以本文的讲解也适用于微信小程序 本文参考文档 https blog