Uniapp低功耗蓝牙操作实例

2023-11-13

uniapp低功耗蓝牙在移动端使用较为平常,本文相较于官方文档介绍一下低功耗蓝牙的操作案例,即取即用。低功耗蓝牙虽工作原理与经典蓝牙类似,但是有着独特的架构体系,所以LE独立出来成为一种蓝牙形态。不过LE和经典蓝牙使用相同的2.4G无线电频率,可以共享同一个天线,组成双模蓝牙。
在这里插入图片描述

扫描蓝牙设备

Search() {
  var that = this;
  console.log("search:", that.searching);
  if (!that.searching) {
    //关闭现有的蓝牙连接
    uni.closeBluetoothAdapter({
      complete: function (res) {
        console.log("关闭蓝牙模块-----------------------------------------");
        console.log(res);
        //打开蓝牙适配
        uni.openBluetoothAdapter({
          success: function (res) {
            console.log(
              "初始化蓝牙模块----------------------------------------"
            );
            console.log(res);
            uni.getBluetoothAdapterState({
              success: function (res) {
                console.log(
                  "获取本机蓝牙适配器状态----------------------------------------"
                );
                console.log(res);
              },
            });

            //开始搜索蓝牙设备
            uni.startBluetoothDevicesDiscovery({
              allowDuplicatesKey: false,
              success: function (res) {
                console.log(
                  "搜索设备-----------------------------------------"
                );
                that.onBluetoothDeviceFound();
                that.searching = true;
                that.devicesList = [];
              },
            });
          },
          fail: function (res) {
            console.log("############");
            console.log(res);
            setTimeout(() => {
              uni.showModal({
                title: "温馨提示",
                content: "蓝牙未打开,请打开后再连接",
                showCancel: false,
                confirmColor: "#008fd6",
              });
              that.isSearch = false;
            }, 1000);
          },
        });
      },
    });
  } else {
    uni.stopBluetoothDevicesDiscovery({
      success: function (res) {
        console.log("停止搜索设备-----------------------------------------");
        console.log(res);
        that.searching = false;
      },
    });
  }
}

连接设备

ConnectByID(item, index) {
				var that = this;
				// console.log(item);
				that.connectedDeviceId = item.deviceId;
				uni.setStorageSync('pageName', item.name);
				uni.setStorageSync('connectedDeviceId', that.connectedDeviceId)
				 uni.showLoading({
				 	title: '正在连接设备...',
				 })

				uni.createBLEConnection({
					deviceId: item.deviceId,
					success(res) {
						uni.hideLoading()
						uni.showToast({
							title: '连接成功',
							duration: 2000,
							icon: "none"
						});
						// that.open()
						console.log("已连接设备----------------------------------------");
						that.getBLEDeviceServices(); //获取特征值

					},
					fail(res) {
						console.log(res)
						uni.hideLoading()
						uni.showModal({
							title: '提示',
							content: '连接失败',
							showCancel: false
						})
					}
				})
				// }
			},

获取设备UUID

			//获取蓝牙设备的服务uuid    //服务uuid可能有多个
			getBLEDeviceServices() {
				var that = this;
				setTimeout(() => {
					//获取数据可能会有延迟
					uni.getBLEDeviceServices({
						deviceId: that.connectedDeviceId,
						success: function(res) {
							console.log(
								"获取蓝牙设备的服务uuid:" + JSON.stringify(res.services)
							);
							that.services = res.services;
							that.serviceId = res.services[2].uuid;
							that.deviceId = that.connectedDeviceId;
							uni.setStorageSync("serviceId", that.serviceId);
							that.getBLEDeviceCharacteristics();
						},
						fail(res) {
							console.log(res);
						},
					});
				}, 3000);
			},

获取蓝牙特征值开始监听

// 根据服务uuid获取蓝牙特征值开始监听写入和接收
			getBLEDeviceCharacteristics() {
				let that = this;
				uni.getBLEDeviceCharacteristics({
					deviceId: that.connectedDeviceId,
					serviceId: that.serviceId,
					success: function(res) {
						console.log(
							"获取蓝牙设备的特征" + JSON.stringify(res.characteristics)
						);
						for (var i = 0; i < res.characteristics.length; i++) {
							if (res.characteristics[i].properties.notify === true) {
								that.characteristics = res.characteristics[i];
								that.characteristicId = res.characteristics[i].uuid;
							}

							if (res.characteristics[i].properties.write === true) {
								that.characteristics = res.characteristics[i];
								that.writeId = res.characteristics[i].uuid;
							}
						}
						uni.setStorageSync("characteristicId", that.characteristicId);
						uni.setStorageSync("writeId", that.writeId);
						that.notifyBLECharacteristicValueChange(); //7.0,开始侦听数据
					},
				});
			},

开启蓝牙数据监听

notifyBLECharacteristicValueChange() {
				var that = this;
				uni.notifyBLECharacteristicValueChange({
					state: true,
					deviceId: that.deviceId,
					serviceId: that.serviceId,
					characteristicId: that.characteristicId,

					success: function(res) {
						console.log("启用notify成功");
						that.onBLECharacteristicValueChange();
					},
					fail: function(res) {
						console.log("启用notify失败");
					},
				});
			},

接收处理数据

			//设备返回数据的接收
			onBLECharacteristicValueChange() {
				var that = this;
				uni.onBLECharacteristicValueChange((res) => {
					// 此时可以拿到蓝牙设备返回来的数据是一个ArrayBuffer类型数据,所以需要通过这个方法转换成字符串
					var resHex = that.ab2hex(res.value);
					// that.dealWithData(resHex);
					console.log("接收数据:" + resHex);
					var hexArray = stickyBag(resHex);
					for (let s of hexArray) {
						//处理数据
					}
				});
			},

监听寻找新设备

			//监听寻找到新设备的事件
			onBluetoothDeviceFound() {
				var that = this;
				console.log("打开设备监听");
				uni.onBluetoothDeviceFound(function(devices) {
					var reg = new RegExp(/[^\s]+/g);
					if (devices.devices) {
						if (devices.devices[0].name.match(reg)) {
							console.log(devices.devices[0]);
							that.devicesList.push(devices.devices[0]);
						}
					}
				});
			},

监听蓝牙状态

onBLEConnectionStateChange() {
				var that = this;
				uni.onBLEConnectionStateChange(function(res) {
					that.connected = res.connected;
					if (!that.connected) {
						console.log("蓝牙已断开");
						uni.createBLEConnection({
							// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
							deviceId: that.connectedDeviceId,
							success(res) {
								that.getBLEDeviceServices();
								//获取该设备地址
								console.log("蓝牙重新连接" + JSON.stringify(res));
							},
							fail(res) {
								console.log("蓝牙重新连接失败" + JSON.stringify(res));
							},
						});
					} else {
						console.log("蓝牙连接成功");
					}
				});
			},

低功耗蓝牙相较于传统蓝牙,连接速度更快,接收成功后会自动断开,下一次连接的时候再激活就可以了

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

Uniapp低功耗蓝牙操作实例 的相关文章

  • React 组件渲染被调用两次而不改变状态

    我正在渲染一个简单的反应组件 其中没有设置状态和道具 我在渲染函数中仅将文本记录到控制台一次 但它被记录了两次 rendering counter rendering counter 下面是counter js组件的代码 import Re
  • Angular $http.get:如何捕获所有错误?

    我发送一个表单到nodejs进行身份验证 使用 http get在以下函数中并添加promise gt then 在生产中 这是否可以处理我可能从服务器收到的所有错误 我还需要向此功能添加其他内容吗 MyApp controller Log
  • Jasmine 条件 callThrough 和 callFake

    我有一个返回函数引用的方法 function methodetobeMoked param case1 return func1 case 2 return func2 case n return funcN 我需要监视这个方法并返回特定输
  • 使用 jquery 淡入/淡出

    我正在研究我的学生项目 我是新的 jquery 对于该项目 我必须使用 jquery 来增强一些功能 并且我已经学到了很多来执行基本任务 但我陷入了一些非常令人困惑的事情 我的一个脚本实际上在鼠标悬停在功能上时更改了 div 容器的图像 功
  • Exceljs:迭代每行和每列的每个单元格

    我想在所有单元格中添加粗边框 这是一个有角度的项目 我正在使用打字稿 我可以为 1 个单元格做到这一点 worksheet getCell A1 border top style thick left style thick bottom
  • javascript函数知道它的名字吗

    我有一个名为 getItem 的函数 我想使用其中的代码读取该函数的名称 这可能吗 function getItem var functionName how do I read the function name alert functi
  • 如何使用jquery格式化数字

    我正在尝试删除 之后的数字 然后我想格式化数字 16810900 211233 喜欢这个 16 810 900 但我不知道该怎么做 这是我的 html 是这样的 div class main p class active 10200 00
  • 流媒体性能 - Canvas 与

    我正在开发一个应用程序 需要通过 webSocket 连接以每秒至少 30 帧的速度持续传输图像 我遇到了一些性能问题 并希望尽我所能进行优化 我想知道使用不断更新的图像之间的性能差异是什么 就像这样 img src someDynamic
  • 如何获得相对于特定父级的偏移量?

    我想获取元素相对于的偏移量特定的父母不是直接的 也不是文档 我在互联网上查找并找到了offset http api jquery com offset and position http api jquery com position jQ
  • 将其作为参数传递给 addEventListener()

    我想添加change一组复选框的事件 我如何访问this在我的事件函数中 这样当我执行事件时我可以访问复选框的值 这是我当前的代码 var checkboxes document getElementsByClassName cb Arra
  • 上传前如何检查图片的宽度和高度

    对于图片上传 我编写了以下 html 代码
  • 元素在主体内找不到足够的空间 - JavaScript 样式

    相关信息 该页面包含两个元素 An
  • jQuery 如何通过不同的列值计算表中的行数

    如何按表列计算不同的表行 Example table thead tr th NAME th th TECHNOLOGY th tr thead tbody tr td john td td jQuery td tr tr td mark
  • 如何使用 JavaScript 播放任意 MIDI 音符?

    澄清一下 我不想生成 MIDI 文件 也不想播放 MIDI 文件 我希望即时播放 MIDI 音符 我尝试使用https github com mudcube MIDI js https github com mudcube MIDI js作
  • 谷歌浏览器如何启动桌面应用程序?

    我真的不知道术语 所以我将从一个例子开始 如果我点击磁力链接 Google Chrome 会询问我是否要启动 torrent 客户端 我单击 确定 chrome 启动该应用程序 该应用程序根据链接执行一些操作 现在有办法查看应用程序如何从
  • 调用不带括号的 javascript 函数

    以下 renderChat 函数用于将消息和图像渲染到聊天板上 该函数内部还有另一个函数 var onComplete function 它完成创建列表元素并将其附加到聊天列表的所有工作 onComplete函数之后就只有这三行代码 img
  • 限制线的长度

    我正在尝试画一条代表 弹弓 的线 并且希望它具有最大拉伸长度 在 p5 中 我在位置和位置之间画了一条线 line posA x posA y posB x posB y posA 是鼠标 x 和 y posB 是画布上圆的位置 我想要做的
  • Firefox 和 Chrome 为 offsetTop 提供了不同的值

    我试图相对于输入字段定位一个跨度元素 让我们称之为 工具提示跨度 为此 我将工具提示跨度和输入字段包装在另一个跨度元素中 我们称之为 包装器跨度 该元素具有position relative 然后我设置position absolute在工
  • .parents() 没有 jquery - 或 querySelectorAll 为父母[重复]

    这个问题在这里已经有答案了 可能的重复 使用 matchesSelector js 检查 event target parentElement https stackoverflow com questions 12977658 check
  • javascript:获取带有单位的CSS prop值[重复]

    这个问题在这里已经有答案了 我的代码是这样的 image 1 position absolute top 3vw 我的尝试 http jsfiddle net z8k6t3fb 1 http jsfiddle net z8k6t3fb 1

随机推荐

  • [vue报错]has been blocked by CORS policy

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 8080 setMealDetail goodsId 36363684365 1 Access to XMLHttpRequest at http 132 121 80 2
  • react hook

    一 hook的定义 Hook 是 React 16 8 的新增特性 它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 二 使用react hook的好处 1 使用类组件 相关逻辑的代码会被分割到不同生命
  • Java-多线程-给线程命名

    Java 多线程 给线程命名 在Java中 通过继承Thread创建的线程 有以下两种方式可以给线程命名 通过构造器命名 因为线程类继承自Thread类 所有也继承了Thread的name属性 可以通过super的方法调用父类构造器 将na
  • 关于xxxxxxRepository.search()方法一个分页的小陷阱

    背景介绍 我有20几万的数据 现在要推送给别人 这样我势必要从自己的数据库中先查出来 然后一点一点的传给对方 所以我的思路是这样的 20万数据 Repository自带的search方法有分页功能 我只需要传一个pageable给它 告诉它
  • Linux 多线程 ( 多线程概念 )

    文章目录 Linux线程概念 什么是线程 二级页表 线程的优点 线程的缺点 线程异常 Linux线程概念 什么是线程 在一个程序里的一个执行路线叫做线程 thread 更准确的定义为 线程是一个进程内部的控制序列 一切进程至少有一个执行线程
  • TwinCAT3中松下伺服A6BF的全闭环设置步骤

    以TwinCAT3和A6BF进行全闭环测试 带有编码器和绝对式光栅尺 实测有效 扫描硬件 首先安装EtherCAT网口驱动 点击安装网卡驱动 TWINCAT Show Realtime Ethercat Compatibel Devices
  • CAN 为什么需要收发器

    在RTL代码中集成了两个CAN node 打算直接连接将两个node的Rx和Tx对接 发现两个CAN Node无法通信 询问技术支持后才知道必须要收发器 那为什么一定需要收发器呢 除了转换单端的CAN信号用于不同的传输 收发器也会将CANT
  • Unity-ML-Agents安装

    目录 1 下载ML Agents 1 1 前往官网 1 2 选择版本 1 3 下载文件 2 下载Anaconda 3 虚拟环境 3 1 构建虚拟环境 3 2 创建项目 导入package json 3 2 1 创建项目 导入package
  • Linux查询文件行数

    wc l find name c
  • OpenCV之warpPerspective--透视变换

    OpenCV之warpPerspective 透视变换 参考博客链接 https blog csdn net liuphahaha article details 50719275 为了记录自己的学习 一 OpenCV透视变化进行图像中的关
  • 《神经网络与深度学习》-概率图模型

    概率图模型 1 模型的表示 1 1 有向图模型 1 2 常见的有向图模型 1 2 1 Sigmoid信念网络 1 2 2 朴素贝叶斯分类器 1 2 3 隐马尔科夫模型 1 3 无向图模型 1 4 无向图模型的概率分解 1 5 常见的无向图模
  • 【面试总结】设计思想解读开源框架:(1)

    12 策略模式 Strategy Pattern 13 适配器模式 Adapter Pattern 14 迭代器模式 Iterator Pattern 15 组合模式 Composite Pattern 16 观察者模式 Observer
  • gcc- -O 优化选项

    查查gcc手册就知道了 每个编译选项都控制着不同的优化选项 下面从网络上copy过来的 真要用到这些还是推荐查阅手册 O设置一共有五种 O0 O1 O2 O3和 Os 除了 O0以外 每一个 O设置都会多启用几个选项 请查阅gcc手册的优化
  • json文件中数据类别个数统计与类别信息可视化

    将json文件保存的数据信息利用URL下载数据以后 希望将统计出数据集中每一类图片个数 且进行可视化 看数据分布是否均匀 然后在进行相应的操作 数据还是kaggle比赛中提供的数据集 json文件内容如下 python实现上述要求 导入相应
  • Mac创建定时任务

    Mac 有两种方式可以添加定时任务 crontab 命令 launchctl 定时任务 crontab 命令 通过crontab 命令 我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本 时间间隔的单位可以是分钟 小
  • 观察者模式 & 发布-订阅模式(设计模式与开发实践 P8)

    文章目录 观察者模式 运用 实现 观察者模式 定义 他用来定义对象之间一种一对多的依赖关系 当一个对象状态发生改变时 所有依赖他的对象都会得到通知 运用 如果我们使用过 DOM 上的事件函数 那就接触过观察者模式 document body
  • (亲测好用)idea提示内存不足( ran out of available memory)

    idea提示内存不足 ran out of available memory 错误提示 The IDE ran out of available memory Please consider increasing the value of
  • 【LeetCode】3. 无重复字符的最长子串 给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。

    3 无重复字符的最长子串 给定一个字符串s 请你找出其中不含有重复字符的最长子串的长度 示例 1 输入 s abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例 2 输入 s bbbbb 输出 1 解
  • webpack打包优化和打包上线

    通过 npm run serve 启动本地 执行 development 通过 npm run test 打包测试 执行 testing 通过 npm run build 打包正式 执行 production 图片优化 使用 url loa
  • Uniapp低功耗蓝牙操作实例

    uniapp低功耗蓝牙在移动端使用较为平常 本文相较于官方文档介绍一下低功耗蓝牙的操作案例 即取即用 低功耗蓝牙虽工作原理与经典蓝牙类似 但是有着独特的架构体系 所以LE独立出来成为一种蓝牙形态 不过LE和经典蓝牙使用相同的2 4G无线电频