【微信小程序】连接蓝牙设备

1、检查小程序是否授权蓝牙功能
 initBluetooth() {const that = thiswx.getSetting({success: (res) => {if (res.authSetting.hasOwnProperty('scope.bluetooth')) {//'scope.bluetooth'属性存在,且为falseif (!res.authSetting['scope.bluetooth']) {wx.showModal({title: '温馨提示',showCancel: false,content: '获取蓝牙授权失败,需要手动授权'})} else {that.openBluetooth();}} else {//'scope.bluetooth'属性不存在,需要授权that.openBluetooth();}}})},
  • wx.getSetting()方法获取用户的设置信息
  • res.authSetting 包含 scope.bluetooth 属性,表示已经获取到了蓝牙权限的设置信息
  • scope.bluetooth 的值为false,即用户没有授权蓝牙权限,为 true,即用户已经授权蓝牙权限,调用 openBluetooth() 方法打开蓝牙功能

打开授权

 openBluetooth() {const that = thiswx.closeBluetoothAdapter({success(res) {wx.openBluetoothAdapter({success: function (res) {/*getBluetoothAdapterState() 获取本机蓝牙适配器状态,判断是否可用,available为false则因为用户没有开启系统蓝牙*/wx.getBluetoothAdapterState({success: function (res) {that.setData({findBluetoothState: setInterval(() => {if (!that.data.theBluetoothState) {that.initBluetooth()clearInterval(that.data.findTimer)}wx.getBluetoothAdapterState({success: function (res) {if (!res.available) {...}},fail: function (res) {...}})}, 1000)})// res.available==true适配器可用 res.available==false适配器不可用if (res.available) {that.findBluetooth()} else {wx.showModal({title: '温馨提示',showCancel: false,content: '蓝牙设备不可用',success(res) {...}})}},fail: function (res) {wx.showModal({title: '温馨提示',showCancel: false,content: '蓝牙设备不可用',success(res) {if (res.confirm) {wx.hideLoading()}}})}})},fail: function (err) {console.log(err);wx.showModal({title: '温馨提示',showCancel: false,content: '蓝牙初始化失败,请确认蓝牙功能已开启',success(res) {...}})}})}})},
  • wx.closeBluetoothAdapter() 方法关闭蓝牙适配器,在成功关闭蓝牙适配器后的回调函数中,调用 wx.openBluetoothAdapter() 方法打开蓝牙适配器。先关闭再打开的方式来初始化蓝牙功能,确保蓝牙适配器工作在一个可靠的状态下,这种做法可以帮助解决一些潜在的问题,比如之前可能存在的连接问题、缓存状态或其他异常情况
  • wx.getBluetoothAdapterState() 方法获取本机蓝牙适配器的状态
  • 蓝牙适配器可用(res.available 为 true),则去查找蓝牙设备;不可用(res.available 为 false),则给出提示
2、搜索附近蓝牙设备并匹配
findBluetooth() {const that = thiswx.startBluetoothDevicesDiscovery({services: [],allowDuplicatesKey: false,success: function () {//获取蓝牙设备输出信息列表let aaa = setInterval(() => {wx.getBluetoothDevices({success: function (res) {res.devices.forEach(item => {if (item.advertisData !== '') {if (...) {console.log('匹配到设备:deviceName-' + item.deviceName + ',deviceId-' + item.deviceId);that.creatDevice(item.deviceId)clearInterval(aaa)}}})}})}, 1000)},fail: function (err) {wx.showModal({title: '温馨提示',showCancel: false,content: '搜索蓝牙失败,请检测手机蓝牙,定位功能是否已开启',success(res) {if (res.confirm) {...}}})}});},
  • wx.startBluetoothDevicesDiscovery() 方法开始搜索附近的蓝牙设备
  • setInterval() 方法每隔一段时间执行一次蓝牙设备搜索操作,在每次执行时,使用 wx.getBluetoothDevices() 方法获取附近的蓝牙设备列表,根据匹配的条件,找到对应的设备,拿到设备的deviceId去与该设备进行连接,注意及时清理定时器

拓展:

wx.getBluetoothDevices()wx.onBluetoothDeviceFound 是小程序中用于搜索蓝牙设备的两种不同方法,它们有以下区别:

1、wx.getBluetoothDevices

  • 用来主动搜索附近的蓝牙设备,调用该方法后会返回附近的蓝牙设备列表
  • 是一个一次性的操作,即调用一次就会返回当前时刻附近的蓝牙设备列表,之后如果需要重新搜索需要再次调用该方法
  • 适用于需要手动触发搜索蓝牙设备的场景,比如用户点击搜索按钮时

2、wx.onBluetoothDeviceFound

  • 用来监听附近蓝牙设备的发现事件,当有新的蓝牙设备被发现时会触发该事件,从而可以实时获取附近蓝牙设备的信息
  • 是一个被动的操作,即当有新的蓝牙设备被发现时,会触发相应的事件回调函数,无需手动触发搜索
  • 适用于需要实时监测附近蓝牙设备变化的场景,比如展示附近蓝牙设备列表并实时更新
3、连接蓝牙设备
creatDevice(deviceId) {const that = thiswx.getConnectedBluetoothDevices({services: [this.data.serviceId],success(res) {console.log(res);if (res.devices.length > 0) {that.getServices(deviceId)} else {wx.createBLEConnection({deviceId,success: function (res) {console.log('连接成功输出信息', res)wx.onBLEConnectionStateChange(function (res) {// 该方法回调中可以用于处理连接意外断开等异常情况console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)if (!res.connected) {console.log('连接断开');wx.offBLEConnectionStateChange()clearTimeout(that.data.doLinkAgainTimer)that.setData({doLinkAgainTimer: setTimeout(() => {that.creatDevice(deviceId)}, 200),})}})that.getServices(deviceId)},fail: function (err) {console.log(err, '连接失败')},})}},fail(err) {console.log(err);}})
},
  • 使用 wx.getConnectedBluetoothDevices() 方法获取已连接的蓝牙设备列表
  • 如果已连接的设备列表中包含了符合特定服务 UUID 的设备,则直接去获取服务
  • 如果未找到已连接的符合条件的设备,则调用 wx.createBLEConnection() 方法尝试连接指定的设备
  • 如果连接成功,则会设置一个监听器 wx.onBLEConnectionStateChange() 来监测蓝牙连接状态的变化。如果连接意外断开,会在回调函数中重新尝试连接,并设置一个定时器来控制重新连接的时间间隔。
4、获取服务和特征值
getServices(deviceId) {const that = thiswx.getBLEDeviceServices({// 这里的 deviceId 需要已经通过 wx.createBLEConnection 与对应设备建立连接deviceId,success(res) {console.log('获取服务:', res)that.getServicesCharacteristics(deviceId)},fail(err) {console.log('获取服务失败:', err);}})
},
getServicesCharacteristics(deviceId) {const that = thiswx.getBLEDeviceCharacteristics({// 这里的 deviceId 需要已经通过 wx.createBLEConnection 与对应设备建立连接deviceId,serviceId: this.data.serviceId,success(res) {console.log('获取特征值:', res);let characteristics = res.characteristics.find(item => item.properties.notify)that.startNotice(characteristics.uuid)},fail(err) {console.log('获取特征值失败:', err);}})},
  • wx.getBLEDeviceServices获取到服务列表,里面每一条数据代表一个服务,UUID 是用来唯一标识一个蓝牙服务的字符串
  • wx.getBLEDeviceCharacteristics获取该服务的所有特征值列表,用properties来区分,代表该特征值支持的操作类型
5、启动蓝牙服务值变化监听及监听特征值变化
startNotice(uuid){var that = this;wx.notifyBLECharacteristicValueChange({state: true, // 启用 notify 功能deviceId: that.data.deviceid,serviceId: that.data.services,characteristicId: uuid,  //第一步 开启监听 notityid  第二步发送指令 writesuccess: function (res) {wx.onBLECharacteristicValueChange(function (res) {}})
},
  • wx.notifyBLECharacteristicValueChang用于启用蓝牙特征值变化通知
  • wx.onBLECharacteristicValueChange用于监听蓝牙设备特征值变化,当特征值发生变化时,会触发这个函数,并可以在这里获取变化后的值并进行相应的处理
6、建立长连接

蓝牙设备通常需要建立长连接才能进行稳定的数据传输和控制。默认情况下,微信小程序与蓝牙设备的连接会在一定时间内保持活跃,如果超过一定时间没有数据交互或者没有持续发送心跳包等保持连接的机制,连接可能会自动断开。

获取随机数并进行外部认证通常用于建立安全连接

  • 获取随机数:设备A生成一个随机数,并将其发送给设备B
  • 进行外部认证:设备B收到随机数后,可能会使用预共享密钥或其他加密算法对随机数进行处理,然后将处理后的结果发送给设备A
  • 验证认证结果:设备A收到处理后的结果后,进行验证以确保通信双方的身份和通信的完整性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/23642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 连接 MySQL 及 SQL增删改查(主要使用sqlalchemy)

目录 一、环境 二、MySQL的连接和使用 2.1方式一:sql为主 2.1.1创建连接 2.1.2 表结构 2.1.3 新增数据 ​编辑 2.1.4 查看数据 ​编辑 2.1.5 修改数据 2.1.6 删除数据 2.2方式二:orm对象关系映射 2.2.1 mysql连接 2.2.2 创建表 2.2.3 新增…

windows 安装pnpm

安装Node.js: 确保系统上已安装Node.js。pnpm需要Node.js来运行。如果尚未安装Node.js,请从其官方网站下载并安装适用于Windows的最新版本。 安装pnpm: 打开命令行工具(如CMD、PowerShell或Git Bash)。使用npm&…

解锁机器学习的无限可能:深入探究scikit-learn的强大功能

解锁机器学习的无限可能:深入探究scikit-learn的强大功能 第一部分:背景和功能介绍 在数据科学和机器学习领域,scikit-learn(简称sklearn)是一个广泛使用的Python库。它提供了简单高效的工具用于数据挖掘和数据分析&a…

【Python短期内快速掌握学习人工智能知识能力】:从零到入门的NLP学习秘籍

⭐️我叫忆_恒心,一名喜欢书写博客的研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三连支…

Echarts 在折线图的指定位置绘制一个图标展示

文章目录 需求分析需求 在线段交汇处用一个六边形图标展示 分析 可以使用 markPoint 和 symbol 属性来实现。这是一个更简单和更标准的方法来添加标记点在运行下述代码后,你将在浏览器中看到一个折线图,其中在 [3, 35] (即图表中第四个数据点 Thu 的 y 值为 35 的位置)处…

Java反射Reflect机制详解

文章目录 引言反射的基本概念反射基本原理反射应用场景反射基本使用获取类的Class对象获取构造方法并实例化对象获取和调用方法获取和修改字段反射工具类 反射源码解读获取Class对象的源码调用方法的源码 反射优缺点优点缺点 为什么需要反射总结 引言 Java反射是Java语言中的一…

【干货】视频文件抽帧(opencv和ffmpeg方式对比)

1 废话不多说,直接上代码 opencv方式 import time import subprocess import cv2, os from math import ceildef extract_frames_opencv(video_path, output_folder, frame_rate1):"""使用 OpenCV 从视频中抽取每秒指定帧数的帧,并保存到指定文件夹…

linux系统使用达梦数据库

在Linux系统中使用达梦数据库,首先需要确保已经正确安装了达梦数据库软件。以下是一个基本的使用示例,假设您已经安装了达梦数据库并且配置好了相关环境变量。 连接到数据库: 使用 dsql 命令连接到数据库 dsql -h hostname -u username -p…

宝贝,带上WebAssembly,换个姿势来优化你的前端应用

在你没崛起之前,脸是用来丢的 大家好,我是柒八九。一个专注于前端开发技术/Rust及AI应用知识分享的Coder 此篇文章所涉及到的技术有 WebAssemblyRustWeb Worker(comlink)wasm-packPhotonffmpeg.wasm脚手架生成前端项目因为,行文字数所限,有些概念可能会一带而过亦或者提供对…

BOM是什么东西

BOM(Byte Order Mark,字节顺序标记)是一个Unicode字符,通常出现在文本文件的开头。它的作用包括以下几个方面: 1. 指示文件的编码方式 BOM可以帮助软件识别文本文件使用的字符编码。不同的编码方式可能会使用不同的B…

经济与安全兼顾:茶饮店购买可燃气体报警器的价格考量

可燃气体报警器在如今的社会中扮演着至关重要的角色。它们用于检测环境中的可燃气体浓度,及早发现潜在的火灾隐患,保护人们的生命和财产安全。 在这篇文章中,佰德将介绍可燃气体报警器的安装、检定以及价格,通过实际案例和数据&a…

PCL 生成空间椭圆点云

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 设椭圆在 X O Y XOY XOY平面上,参数方程为:

怎么保障TikTok直播网络稳定?

TikTok,这个近年来风靡全球的社交媒体平台,已成为电商引流的新方向,尤其是其直播功能。然而,对于打算进军TikTok直播领域的商家和主播而言,确保网络稳定无疑是首要任务。那么,TikTok直播专线究竟是什么呢&a…

牛啊后续:如何一行C#代码实现解析类型的Summary注释(可用于数据字典快速生成)...

前言:下午有小伙伴要求,让我继续做个解析实体类注释信息的内容。所以我也顺便加入进来。以下开始正文实战操作: 项目需要勾选输出api文档文件。这样就可以让所有实体类的summary信息被写入到输出目录下。如果有多个xml文件也没关系&#xff0…

小程序 UI 风格美不胜收

小程序 UI 风格美不胜收 小程序 UI 风格美不胜收

PostgreSQL的视图pg_stat_replication

PostgreSQL的视图pg_stat_replication pg_stat_replication 是 PostgreSQL 提供的一个系统视图,用于显示主服务器上当前正在进行的复制会话的信息。它可以帮助数据库管理员监控和管理主从复制的状态,确保数据的正确同步和高可靠性。 pg_stat_replicati…

MyEclipse中properties文件中文乱码(Unicode字符)解决办法

程序代码园发文地址:MyEclipse中properties文件中文乱码(Unicode字符)解决办法-程序代码园小说,Java,HTML,Java小工具,程序代码园,http://www.byqws.com/ ,MyEclipse中properties文件中文乱码(Unicode字符)解决办法htt…

Django学习三:views业务层中通过models对实体对象进行的增、删、改、查操作。

文章目录 前言一、Django ORM介绍二、项目快速搭建三、操作1、view.pya、增加操作b、删除操作c、修改操作d、查询操作 2、urls.py 前言 上接博文:Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据…

一周发文9篇!MIMIC-IV数据库周报(5.22~5.28)

重症医学数据库(MIMIC)是由计算生理学实验室开发的公开数据集,其中包括与数千个重症监护病房入院相关的去识别化健康数据,致力于推动临床信息学、流行病学和机器学习的研究。 MIMIC数据库于2003年在美国国立卫生研究院的资助下&am…

2024上海初中生古诗文大会倒计时4个半月:单选题真题示例和独家解析

现在距离2024年初中生古诗文大会还有4个半月时间,我们来看10道选择题真题和详细解析,了解古诗文大会的考察方式和知识点,从而更好地备考。 以下题目截取自我独家制作的在线真题集,都是来自于历届真题,去重、合并后&am…