首页 > 编程语言 >【微信小程序】连接蓝牙设备

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

时间:2024-06-05 18:00:59浏览次数:14  
标签:success 微信 蓝牙 deviceId res 设备 连接 wx

1、检查小程序是否授权蓝牙功能
 initBluetooth() {
    const that = this
    wx.getSetting({
      success: (res) => {
        if (res.authSetting.hasOwnProperty('scope.bluetooth')) {
          //'scope.bluetooth'属性存在,且为false
          if (!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 = this
   wx.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 = this
   wx.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 = this
  wx.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 = this
  wx.getBLEDeviceServices({
    // 这里的 deviceId 需要已经通过 wx.createBLEConnection 与对应设备建立连接
    deviceId,
    success(res) {
      console.log('获取服务:', res)
      that.getServicesCharacteristics(deviceId)
    },
    fail(err) {
      console.log('获取服务失败:', err);
    }
  })
},
getServicesCharacteristics(deviceId) {
   const that = this
   wx.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  第二步发送指令 write
    success: function (res) {
    wx.onBLECharacteristicValueChange(function (res) {
 
  }
  })
},
  • wx.notifyBLECharacteristicValueChang用于启用蓝牙特征值变化通知
  • wx.onBLECharacteristicValueChange用于监听蓝牙设备特征值变化,当特征值发生变化时,会触发这个函数,并可以在这里获取变化后的值并进行相应的处理
6、建立长连接

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

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

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

标签:success,微信,蓝牙,deviceId,res,设备,连接,wx
From: https://blog.csdn.net/m0_46613429/article/details/137496388

相关文章

  • c# MongoDB.Driver 连接mongo 数据库失败的解决方法
    在连接数据库的时候连接本的的时候连接字符串是mongodb://localhost:端口号(默认27017)/数据库名(选填)用这种格式的连接字符串去做本地的测试是没问题的,但是连接服务器上面的数据库的时候就要加上用户名和密码,这个时候就需要在字符串的末尾添加后缀:mongodb://用户名:密码(都不......
  • 2024-06-05:用go语言,给定三个正整数 n、x 和 y, 描述一个城市中由 n 个房屋和 n 条街道
    2024-06-05:用go语言,给定三个正整数n、x和y,描述一个城市中由n个房屋和n条街道连接的情况。城市中存在一条额外的街道连接房屋x和房屋y。需要计算对于每个街道数(从1到n),有多少房屋对满足从一个房屋到另一个房屋经过的街道数正好为该街道数。在结果数组中,索引k对......
  • Microsoft Remote Desktop for Mac(微软远程连接软件)v10.9.7直装版
    MicrosoftRemoteDesktop是微软开发的远程连接工具,支持Windows、macOS、iOS和Android,允许用户通过互联网远程访问其他计算机的桌面和应用程序,实现跨设备文件共享。同时,它提供网络层身份验证、数据加密和多重身份验证等安全功能,确保用户隐私和数据安全。MicrosoftRemoteDesk......
  • 微信小程序(uniapp)页面之间通信
    前言开发微信小程序,页面与页面之间少不了数据通信,一起来看看有哪些方法。以下是本篇文章正文内容,下面案例可供参考一、跳转路径?拼接参数适合数据量小的情况,如数据量大的情况不建议此方式。注意:如传递了number类型数据,接收回来的数据会转换成string类型/**A.vue**/......
  • 微信公众号的广告投放实施攻略
    微信公众号作为微信生态的重要组成部分,拥有庞大的用户群体和强大的社交属性。对于企业而言,如何在微信公众号上投放广告,实现精准触达和高效转化,是营销的重要课题。本文将为你提供一份详细的微信公众号广告投放实施攻略,帮助你从零开始,逐步掌握投放技巧。一、定位与选择在投放......
  • SpringBoot+微信支付-JSAPI{微信支付回调}
    引入微信支付SDKMaven:com.github.wechatpay-apiv3:wechatpay-java-core:0.2.12Maven:com.github.wechatpay-apiv3:wechatpay-java:0.2.12响应微信回调的封装@Getter@Setter@NoArgsConstructor@AllArgsConstructor@Accessors(chain=true)publicclassWxNotifyVo{......
  • beego-yaml-viper 配置数据库连接
    定义config.yaml文件 mysql:driver:mysqluser:rootpassword:roothost:127.0.0.1port:8889database:2204aredis:addr:"127.0.0.1:6379"password:""db:0在main.go文件中packagemainimport( "github.com/b......
  • 企业微信群发功能:提升沟通效率,助力企业营销
    随着信息技术的快速发展,企业微信作为企业内部沟通和企业对外营销的重要工具,其功能也在不断更新和完善。其中,企业微信的多次群发功能,不仅极大地提升了企业内部的沟通效率,更为企业的对外营销提供了强有力的支持。本文将从多个角度探讨企业微信群发功能的应用与价值。一、群发功......
  • 企业微信自动群发工具:高效沟通的得力助手
    随着企业数字化转型的加速,企业微信作为企业内部沟通的重要工具,其功能和效率成为了企业关注的焦点。在众多功能中,自动群发工具凭借其高效、便捷的特点,成为了企业沟通的新宠。本文将详细介绍企业微信自动群发工具的特点、应用场景及其在企业运营中的重要作用。一、自动群发工具......
  • 基于微信小程序的健身小助手打卡预约教学系统(源码+lw+部署文档+讲解等)
    文章目录前言详细视频演示项目运行截图技术框架后端采用SpringBoot框架前端框架Vue可行性分析系统测试系统测试的目的系统功能测试数据库表设计代码参考数据库脚本为什么选择我?获取源码前言......