uniApp低功耗蓝牙一键开门、多对多查找、数组匹配数组、开锁
文章目录
- html
- JavaScript
- 坑
html
<view class="m_t_36"><view class="w_50_ h_100 lh_100 m_l_a m_r_a bc_409eff radius_10 color_fff ta_c" @click="openBluetoothAdapter()">一键开门</view>
</view>
JavaScript
export default {data() {return {timeout: undefined,// 后端保存蓝牙信息bluetooths: [{deviceId: "0A:45:32:0C:78:C6",name: "YX_0A45320C78C6",serviceId: '0000FFB0-0000-1000-8000-00805F9B34FB',notifyId: '0000FFB2-0000-1000-8000-00805F9B34FB',writeId: '0000FFB1-0000-1000-8000-00805F9B34FB',instruction: 'EE03E30100'},{deviceId: "5C:C3:36:8D:B9:FC",name: "RTK_BT_4.1v",serviceId: '0000FFB0-0000-1000-8000-00805F9B34FB',notifyId: '0000FFB2-0000-1000-8000-00805F9B34FB',writeId: '0000FFB1-0000-1000-8000-00805F9B34FB',instruction: 'EE03E30100'}],bluetooth: {}}},methods: {/*** 根据不同方法名调用方法,统一定时器的触发判断,* 当定时器触发时,无法确定当前调用的方法是哪个* @param {String} fnName */methodExecution(fnName = '') {if (this.timeout) {this[fnName]();} else {console.log('执行方法');}},// 数据初始化initInfo() {// 清除定时器无效的解决方案this.timeout = undefined;this.bluetooth = {};},// 初始化蓝牙模块openBluetoothAdapter() {let that = this;// 向低功耗蓝牙设备特征值中写入二进制数据。// 注意:必须设备的特征值支持 write 才可以成功调用。if (Object.keys(that.bluetooth).length) return that.writeBLECharacteristicValue();// 数据初始化that.initInfo();// 初始化蓝牙模块uni.openBluetoothAdapter({// 主服务的UUID是YX。传入这个参数,只搜索主服务UUID为YX的设备// services: ['YX'],success() {// 开始搜索附近的蓝牙设备that.startBluetoothDevicesDiscovery();},fail() {uni.showToast({icon: 'none',title: '查看手机蓝牙是否打开'});}});},// 开始搜索附近的蓝牙设备startBluetoothDevicesDiscovery() {let that = this;uni.showLoading({title: '加载中',mask: true});that.timeout = setTimeout(() => {// 数据初始化that.initInfo();uni.hideLoading();uni.showToast({icon: 'none',title: '开门失败'});}, 1000 * 20);// 开始搜索附近的蓝牙设备uni.startBluetoothDevicesDiscovery({success() {// 监听返回的蓝牙设备uni.onBluetoothDeviceFound(({devices}) => {if (devices.length) {let bluetooths = that.bluetooths;// 多对多查找for (let i = 0; i < devices.length; i++) {let itemI = devices[i];if (itemI.name) {for (let j = 0; j < bluetooths.length; j++) {let itemJ = bluetooths[i];if (itemI.deviceId === itemJ.deviceId && itemI.name === itemJ.name) {that.bluetooth = itemJ;setTimeout(() => { that.createBLEConnection() }, 0);return undefined;}}}}}});},fail() {that.methodExecution('startBluetoothDevicesDiscovery');}});},// 连接低功耗蓝牙设备createBLEConnection() {let that = this;// 连接低功耗蓝牙设备uni.createBLEConnection({deviceId: that.bluetooth.deviceId,success() {// 停止搜寻附近的蓝牙外围设备uni.stopBluetoothDevicesDiscovery({success() {// 获取蓝牙服务// that.getBLEDeviceServices();// 启用低功耗蓝牙设备特征值变化时的notify功能,订阅特征值that.notifyBLECharacteristicValueChange();},fail() { }});},fail() {// 连接低功耗蓝牙设备that.methodExecution('createBLEConnection');}});},// 启用低功耗蓝牙设备特征值变化时的notify功能,订阅特征值notifyBLECharacteristicValueChange() {let that = this,{ deviceId, serviceId, notifyId } = that.bluetooth;// 启用低功耗蓝牙设备特征值变化时的notify功能,订阅特征值uni.notifyBLECharacteristicValueChange({state: true,deviceId,serviceId,characteristicId: notifyId,success() {// 监听低功耗蓝牙设备的特征值变化事件。// 必须先启用 notifyBLECharacteristicValueChange 接口才能接收到设备推送的 notification。that.onBLECharacteristicValueChange();},fail() {// 启用低功耗蓝牙设备特征值变化时的notify功能,订阅特征值that.methodExecution('notifyBLECharacteristicValueChange');}});},// 监听低功耗蓝牙设备的特征值变化事件。// 必须先启用 notifyBLECharacteristicValueChange 接口才能接收到设备推送的 notification。onBLECharacteristicValueChange() {let that = this;// 监听低功耗蓝牙设备的特征值变化事件。// 必须先启用 notifyBLECharacteristicValueChange 接口才能接收到设备推送的 notification。uni.onBLECharacteristicValueChange(() => {that.writeBLECharacteristicValue();});},// 向低功耗蓝牙设备特征值中写入二进制数据。// 注意:必须设备的特征值支持 write 才可以成功调用。writeBLECharacteristicValue() {let that = this,{ deviceId, serviceId, writeId, instruction } = that.bluetooth,typedArray = new Uint8Array(instruction.match(/[\da-f]{2}/gi).map((h) => parseInt(h, 16))),buffer = typedArray.buffer;// 向低功耗蓝牙设备特征值中写入二进制数据。// 注意:必须设备的特征值支持 write 才可以成功调用。uni.writeBLECharacteristicValue({deviceId,serviceId,characteristicId: writeId,value: buffer,success() {uni.showToast({title: '开门成功',icon: 'none'});},fail() {uni.showToast({title: '开门失败',icon: 'none'});},complete() {clearTimeout(that.timeout);that.timeout = undefined;uni.hideLoading();}});},// 关闭(断开)蓝牙模块closeBluetoothAdapter() {let that = this;// 关闭(断开)蓝牙模块uni.closeBluetoothAdapter({success: () => {uni.showToast({title: '蓝牙已关闭',icon: 'none'});clearTimeout(that.timeout);that.timeout = undefined;uni.hideLoading();that.initInfo();},fail() {that.closeBluetoothAdapter();}});},// 监听页面隐藏onHide() {// 关闭(断开)蓝牙模块// this.closeBluetoothAdapter();},// 监听页面卸载onUnload() {// 关闭(断开)蓝牙模块this.closeBluetoothAdapter();}}
}
坑
1、
notifyBLECharacteristicValueChange方法用的是读取的特征值。
2、writeBLECharacteristicValue发送指令,返回成功,蓝牙设备无反应,大概率是指令问题。
3、关闭蓝牙有两个API,目前测试只有closeBluetoothAdapter彻底断开蓝牙。
4、setTimeout无法彻底清除定时器,需要手动设置属性值为undefined。
相关文章:
uniApp低功耗蓝牙一键开门、多对多查找、数组匹配数组、开锁
文章目录 htmlJavaScript坑 html <view class"m_t_36"><view class"w_50_ h_100 lh_100 m_l_a m_r_a bc_409eff radius_10 color_fff ta_c" click"openBluetoothAdapter()">一键开门</view> </view>JavaScript export…...
类和对象|六个默认成员函数|const成员函数|运算符重载
文章目录 默认成员构造函数1. 构造函数1.1 概念1.2 特性 2. 析构函数2.1 概念2.2 特性 3. 拷贝构造函数3.1 概念3.2 特性 4. 运算符重载4.1 赋值重载4.2 自增自减重载4.3 取地址操作符重载 5. const成员函数6. 取地址重载 默认成员构造函数 上一节我们说过,空类的大…...
从源码角度去深入分析关于Spring的异常处理ExceptionHandler的实现原理
ExceptionHandler的作用 ExceptionHandler是Spring框架提供的一个注解,用于处理应用程序中的异常。当应用程序中发生异常时,ExceptionHandler将优先地拦截异常并处理它,然后将处理结果返回到前端。该注解可用于类级别和方法级别,…...
04mysql查询语句之查询与分页02
1. 所有有门派的人员信息 ( A、B两表共有) INSERT INTO t_dept(deptName,address) VALUES(华山,华山); INSERT INTO t_dept(deptName,address) VALUES(丐帮,洛阳); INSERT INTO t_dept(deptName,address) VALUES(峨眉,峨眉山); INSERT INTO t_dept(deptN…...
原型模式——对象的克隆
1、简介 1.1、概述 可以通过一个原型对象克隆出多个一模一样的对象,该模式被称为原型模式。 在使用原型模式时,需要首先创建一个原型对象,再通过复制这个原型对象来创建更多同类型的对象。 1.2、定义 原型模式(Prototype Patt…...
[SQL挖掘机] - 多表连接
介绍: 在 SQL 中,多表连接是指将多个表根据某些条件进行联接,以获取相关联的数据。这允许我们跨多个表进行查询,并且根据表之间的关系获取所需的结果。 作用: 当在多个表中存储相关数据时,使用多表连接可以将这些表组合起来以获…...
Day 14 C++ 对象的初始化和清理
目录 为什么要进行对象的初始化和清理 构造函数和析构函数 构造函数(Constructor) 构造函数语法 调用时机 构造函数的调用方式 括号法 显式法 隐式转换法 构造函数分类 分类方式 按参数分为有参构造和无参构造 按类型分为普通构造和拷贝构造…...
Delphi7最佳登录窗体设计
Delphi7我们这里用登录窗体来做演示。输入正确用户名和密码后,登录窗体释放,显示主窗体。 方法/步骤 1.打开Delphi7集成开发环境,在默认工程的Form1窗体放置一个Label1控件,拖动控件边界调整大小,并将Object Inspect…...
动脑学院Jetpack Compose学习笔记
最近b站学习了一下Compose相关内容,整理了相关笔记,仅供大家参考。 资源链接如下,象征性收取1个积分 https://download.csdn.net/download/juliantem/88125198...
Qt中线程的使用
Qt中线程的使用 在qt中线程的使用有两种方式,第一种就是创建一个类继承QObject类,之后使用moveToThread函数将线程添加到类中。另一种就是创建一个类继承QThread类,在类中实现run函数。 第一种方式: 1、首先创建一个自定义的类…...
基于YOLOv8开发构建蝴蝶目标检测识别系统
在前面的一篇博文中已经很详细地描述了如何基于YOLOv8开发构建自己的个性化目标检测模型,感兴趣的话可以看下: 《基于YOLOv8开发构建目标检测模型超详细教程【以焊缝质量检测数据场景为例】》 本文的主要目的就是基于YOLOv8来开发构建细粒度的蝴蝶目标…...
【已解决】电脑连上网线但无法上网
文章目录 案例情况解决方案必要的解决方法简要概括详细步骤1、打开控制面板2、打开更改适配器设置3、 找Internet协议版本44、修改配置 可能有用的解决方法 问题解决原理Internet 协议版本 4(TCP/IPv4)确保IP地址和DNS服务器设置为自动获取 案例情况 网…...
Linux 学习记录57(ARM篇)
Linux 学习记录57(ARM篇) 本文目录 Linux 学习记录57(ARM篇)一、外部中断1. 概念2. 流程图框 二、相关寄存器1. GIC CPU Interface (GICC)2. GIC distributor (GICD)3. EXTI registers 三、EXTI 寄存器1. 概述2. 内部框图3. 寄存器功能描述4. EXTI选择框图5. EXTI_EXTICR1 &…...
Doris注意事项,Doris部署在阿里云,写不进去数据
1.Doris官网 Doris官网https://doris.apache.org/ 2.根本原因 本地idea访问FE,FE会返回BE的地址,但是在服务器上通过ip addr查看,发现只有局域网IP,所以FE返回了局域网的IP,导致idea连接不上BE 3.解决办法 重写Ba…...
502 Bad GateWay报错的解决方法
什么是502 bad gateway 报错 简单来说 502 是报错类型代码 bad gateway 错误的网关。是Web服务器作为网关或代理服务器时收到无效的响应。 用我们的口语说就是运行网站的服务器暂时挂了(不响应)。 产生错误的原因 1.连接超时 我们向服务器发送请求 由于服务器当前链接太多&am…...
openpnp - ReferenceStripFeeder 改版零件
文章目录 openpnp - ReferenceStripFeeder 改版零件概述笔记整体效果散料飞达主体磁铁仓盖板飞达编带中间压条飞达编带两边压条装配体用的8mm编带模型END openpnp - ReferenceStripFeeder 改版零件 概述 官方推荐了ReferenceStripFeeder的模型smd_strip_feeders_mod_tray.zip…...
VoxPoser:使用大语言模型(GPT-4)来对机器人操作的可组合三维值图【论文解读】
这是最近斯坦福的李飞飞团队的一篇论文:VoxPoser: Composable 3D Value Maps for Robotic Manipulation with Language Models 主要是通过大语言模型LLM和视觉语言模型VLM结合,来对机器人做各种日常操作,我们可以先来看下实际效果:大语言模型…...
RISC-V公测平台发布 · 第一个WEB Server “Hello RISC-V world!”
RISC-V公测平台Web Server地址:http://175.8.161.253:8081 一、前言 Web Server是互联网应用的基础设施,无论是用户访问网站,还是后端服务提供商和开发者构建各种应用程序,Web Server都在其中扮演着至关重要的角色。 显而易见…...
Linux 发行版 CentOS 于 Ubuntu 软件的安装、卸载、查找
CentOS于Ubuntu 内核都是Linux,是一样的。 CentOS 软件格式 .rpm sudo yum [-y] [ install | remove | search ] 软件名称 install 安装 remove 移除 search 搜索 Ubuntu 软件格式 .deb sudo apt [-y] [ install | remove | search ] 软件名称 install 安装 remove…...
cmd相关操作命令
1.根据端口号查询对应进程的PID netstat -ano | findstr 端口号 例如:netstat -ano | findstr 9080;该端口所属进程的PID为6684 2.根据PID查询对应进程 tasklist | findstr PID 例如:tasklist | findstr 6684;该PID所属进程名为…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
