微信小程序蓝牙通信

2023-10-27

微信小程序目前只支持低功耗蓝牙(BLE),不支持经典蓝牙。

微信小程序的当前最新版本为2.3.0,根据实际测试,IOS支持很好但对Android支持非常不好,各厂商的Android手机遇到的问题也不一样。因此要开发蓝牙功能,推荐只提供IOS版本。

 

小程序与蓝牙进行通信的过程如下:

  • 打开小程序的蓝牙模块(wx.openBluetoothAdapter)。
  • 搜索蓝牙设备(wx.startBluetoothDevicesDiscovery)。需要调用接口(wx.stopBluetoothDevicesDiscovery)来停止搜索。
  • 获取所有蓝牙设备(wx.getBluetoothDevices)。
  • 连接蓝牙设备(wx.createBLEConnection)。
  • 获取service(wx.getBLEDeviceServices)。与设备连接之后,即可调用接口来获取该设备的所有service。接口会返回一个service数组。
  • 获取characteristic(wx.getBLEDeviceCharacteristics)。此时可以启用notify(wx.notifyBLECharacteristicValueChange)并设置监听(wx.onBLECharacteristicValueChange)。
  • 向蓝牙设备写入数据(wx.writeBLECharacteristicValue),等待监听返回。写入的数据必须是ArrayBuff类型。
  • 通信完毕,断开与蓝牙设备的连接(wx.closeBLEConnection)。
  • 关闭小程序蓝牙模块(wx.closeBluetoothAdapte)。

 

关于其中各个要点的详细解释:

蓝牙模块

微信小程序提供了一个蓝牙模块,用于为自身提供蓝牙功能支持。小程序蓝牙模块属于小程序,而不是手机。手机的蓝牙是否打开与小程序蓝牙模块是否打开是无关的。可以类比为家中的网络:手机蓝牙就是网络供应商提供的服务,而小程序蓝牙是家中路由器。

  • 无论网络供应商是否提供服务,我们的路由器都可以打开/关闭(无论手机蓝牙是否打开,小程序蓝牙模块都可以打开/关闭)。
  • 即使网络供应商提供了服务,若路由器关闭,我们是无法使用网络服务的(手机蓝牙打开,但小程序蓝牙模块关闭,则依然无法使用蓝牙服务)。
  • 若网络供应商未提供服务,即使路由器打开,依然无法使用网络服务,但此时路由器是可以检测到网络状况的(手机蓝牙关闭,但小程序蓝牙打开,无法使用蓝牙服务。但小程序蓝牙模块能检测到手机蓝牙是否打开,并且在有相应权限的情况下,小程序蓝牙模块可以申请打开手机蓝牙)。

 

搜索蓝牙设备

即使手机已经打开蓝牙并已经搜索到了一些设备,但对于小程序蓝牙模块而言,并不知道已经发现了哪些设备,必须经过搜索才能获取所有蓝牙设备列表。 搜索是一个持续的动作,必须调用关闭接口(wx.stopBluetoothDevicesDiscovery)才会停止,否则会一直搜索。

 

获取所有蓝牙设备

调用获取所有蓝牙设备接口,会返回小程序所记录的蓝牙设备列表。这一步通常在调用了小程序的搜索蓝牙设备功能之后进行。而由于搜索是一个持续的动作,所以当发现返回的设备列表中出现了目标设备后,就可以调用关闭接口来停止搜索。

若返回的设备列表中没有目标设备,则可等待几秒,让搜索继续进行,然后再次调用获取所有蓝牙设备的接口。反复该过程,直到发现目标设备。

微信小程序目前只支持低功耗蓝牙,不支持经典蓝牙。对于经典蓝牙设备,手机蓝牙可以搜到,但小程序蓝牙的获取所有蓝牙设备列表中是没有的。同时,对于某些低功耗蓝牙设备也可能无法列出,比如蓝牙耳机。

 

连接蓝牙设备

搜索到的设备会提供deviceId。使用该deviceId即可调用接口来创建与设备的连接。

若设备已与手机进行配对,则可直接创建连接;否则会弹出配对提示框。

小程序对连接的蓝牙设备数量并没有限制,但手机有。Android手机一般是5-10个,而IOS多一些。

 

servicecharacteristic

与经典蓝牙不同,低功耗蓝牙(BLE)的通信使用service(服务)与characteristic(蓝牙设备特征值)。

service即提供的服务。BLE提供多个service。实际使用过程中,若能满足具体需求,则使用哪个service都是可以的。至于一个service是否能满足需求,这要看该service下是否有合适的characteristic。

每个service下有多个characteristic。一个characteristic结构如下:

{
    "properties": {
        "notify": false, 
        "write": true, 
        "indicate": false, 
        "read": true
    }, 
    "uuid": "49535343-6DAA-4D02-ABF6-19569ACA69FE"
}

其中:

  • uuid:characteristic的id。
  • properties:characteristic的操作类型。有4个属性:read,write,notify,indicate。这4个属性之间没有制约关系。每个属性可以为true(表示支持该操作)或false(表示不支持该操作)。

characteristic是进行蓝牙通信的媒介。例如要对蓝牙设备进行写操作,那么就需要使用write为true的characteristic;要对蓝牙设备进行读操作,那么就需要使用read为true的characteristic;要对蓝牙设备进行接收数据监听,那么就需要使用notify为true的characteristic。

characteristic的4个属性由于相互独立,所以characteristic下的属性可以有0-4个为true。因此,若一个characteristic的read和write为true,则该characteristic就既支持读操作,又支持写操作。

characteristic只是一个媒介,并不存储数据,所以只要一个characteristic具有我们需要的权限,那么就可以用来进行蓝牙通信。满足需求的characteristic可能有多个,使用其中一个即可。

但是由于characteristic是service下的,对于同一个设备而言,只要确保同一个service下的characteristic的id不同即可,因此不同service下的characteristic的id是可以相同的。所以,characteristicid可以使用硬编码,或者自定义的规则。

同理,不同设备的service也是相互隔离的,因此不同设备serviceid也是可以相同的。所以,serviceid也可以使用硬编码或者自定义的规则,只要确保同一设备下的各个serviceid不同即可。

实际开发过程中,需要确认具体的蓝牙设备通信使用哪个characteristic。例如,蓝牙设备指定了必须使用某个characteristic来进行write操作,那么即使其他的characteristic的write属性也为true,执行write操作也返回成功,但蓝牙设备很可能是不响应的。

蓝牙通信往往也并不是只依赖一个characteristic,而是多个characteristic配合的结果。例如,使用一个write为true的characteristic(设为A)来进行写操作,同时使用一个notify为true的characteristic(设为B)来进行数据监听。使用A对蓝牙设备执行写操作,然后A的任务就完成了。若蓝牙设备有数据返回,则B会监听到,并调用用户自定义的回调函数。

常规的通信有两种方式:

  • 发出请求,然后等待返回。返回的参数中带有所需要的结果。
  • 设置监听。发出请求,然后等待返回。返回的是该次请求是否成功,并不带有结果。当请求接收方需要返回数据时,设置的监听会监听到。

BLE的蓝牙通信使用第二种方式。因此,实际的蓝牙通信过程中,使用read操作的很少,往往是一个writetruecharacteristic配合一个notifytruecharacteristic来进行通信

执行write操作时,需要对蓝牙设备write指定的命令,这个是硬件提供的。调用的wx.writeBLECharacteristicValue需要传入一个value参数,该参数是一个ArrayBuff类型,因此需要将写入的命令转为二进制形式存储在这里。

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

微信小程序蓝牙通信 的相关文章

  • 异常中禁用e.printStackTrace()

    相信大家在开发代码的过程中都用过try catch语句 不知道有没有人写过这种语句 try catch Exception e e printStackTrace log error error e 或者 try catch Excepti
  • js时间对比的问题

    开发中 对于时间对比 大家都比较喜欢从页面获取时间之后 直接使用大于小于做判断 比如这样 javascript view plain copy if bgTime edTime bgTime gt edTime alert 开始时间不能晚于
  • 超好用的webssh(支持秘钥登录)

    webssh 项目地址 https github com billchurch WebSSH2 安装 webssh cd usr local git clone https github com billchurch WebSSH2 git
  • 调用其他文件的define_DEFINE_PROFILE用法介绍(1)

    01 概述 可以使用DEFINE PROFILE定义一个自定义边界配置文件或单元格区域条件 该条件随空间坐标或时间而变化 可以自定义的变量如下 速度 压力 温度 湍流动能 湍流耗散率 质量流量 目标质量流量作为流动时间的函数 物种质量分数
  • 新春特辑

    志在哪里 哪里就有成功 心在哪里 哪里就有风景 爱在哪里 哪里就有感动 在新年来临之际 互联互通社区衷心祝愿您 春节快乐 身体健康 心想事成 1 中国非结构化数据中台实践白皮书 2 2020中国服装行业数据中台研究报告 3 2020中国数据

随机推荐

  • Java嵌套if选择结构

    嵌套if选择结构本期用两个例题来讲解 例题1 学校举行运动会 百米赛跑成绩在12s内有资格进入决赛 否则淘汰 进入决赛再根据性别来区别进入男子组决赛和女子组决赛 public static void main String args Sca
  • 区块链学习3:区块链的共识机制

    前往老猿Python博文目录 共识机制主要用于解决分布式计算的根本问题数据的一致性 所谓共识 简单理解就是指参与方都达成一致 在区块链系统中 如何让每个节点通过一个规则将各自的数据保持一致是一个很核心的问题 这个问题的解决方案就是制定一套共
  • Python 写函数,传入一个参数n,返回n的阶乘

    def factorial n param n 参数 return 返回结果 if n lt 0 exit sum 1 for i in range 1 n 1 sum i print sum return factorial 8
  • 分享8个超神的Pycharm插件们,可以说是无敌的存在!

    分享几个YYDS的Pycharm插件 1statics staitcs可以作为KPI摸鱼好助手 120w次下载的这个插件 可以直接统计代码的具体情况 对工程里的每个代码文件进行统计代码量 空行量 注释量 代码行占比等进行清晰统计 下次就算功
  • centos7 nodejs 启动vue项目

    1 准备项目文件及目录 2 检查nodejs 环境 3 安装vue cli脚手架构建工具 命令 npm install g vue cli 4 切换项目目录 运行初始化命令 切换命令 cd projects DDSWeb 初始化命令 vue
  • STM32F1端口复用与重映射(学习心得)

    端口的复用 以USART1为例 PA9管脚的复用功能为 USART1 TX 串口发送端 PA10管脚的复用功能为USART1 RX 串口接收端 对端口复用的配置 GPIO端口的时钟使能 RCC APB2PeriphClockCmd RCC
  • C语言编程必将成为通用技能

    正文 为什么我们要学习编程 编程是当今时代不可或缺的核心技能 它不仅仅是程序员的专属领域 而是逐渐成为一种通用技能 被越来越多的人所需 想象一下 不久的将来 编程将变成人人都会的事情 而职业编程人员会逐渐减少 就像识字一样 编程将成为人们必
  • 用Java实现分页

    查询完全表之后 接下来要做的是查询总条数 和当前是第几页 总共有几页 包括数据 通过Java思想将封装为类 然后调用 pageBean java类可以当做通用的分页的类 Service作用是封装一类服务 比如说注册或者说登录 它是一类服务
  • IMS中Binder案例

    IMS中Binder案例 1 FWK层中AIDL形式 1 1 服务端实现Stub 1 2 客户端获取proxy 2 Native层中AIDL形式 2 1 服务端对应Bn端 2 2 客户端对应Bp端 android12 release 1 F
  • C++指针的使用

    一 指针的定义和使用 可以通过指针来保存一个变量的地址 例如 int a 2 就相当于内存中分出了一个内存块给变量a 而这个内存块中储存的数值为2 假设这个内存块的地址为0x2e 则可以通过定义一个指针来储存这个地址0x2e 指针就是一个地
  • Qt GraphicsView图形视图框架(Graphics View Framework)

    Graphics View提供了一个surface 用于管理大量定制的2D图形项并与之交互 还提供了一个View小部件 用于可视化项目 并支持缩放和旋转 该框架包含一个事件传播框架 该架构允许对场景中的项目提供精确的双精度交互功能 项目可以
  • IP地址总结

    IP地址分类 IP地址的编码分为两部分 网络号和主机号 A类地址默认子网掩码 255 0 0 0 B类地址默认子网掩码 255 255 0 0 C类地址默认子网掩码 255 255 255 0 D类默认子网掩码 255 255 255 25
  • 数学实验-迭代(Mathematica实现)

    一 实验名称 迭代 二 实验环境 Mathematica 10 3软件 三 实验目的 本实验通过Mathematica 10 3软件利用迭代求解方程的近似解 了解迭代方法在解决问题的收敛速度的异同 认识到函数的迭代是数学研究中的一个非常重要
  • P2P和CS架构

    P2P架构 Peer to Peer 特点 1 没有服务器 2 任意端系统直接通信 3 节点阶段性接入internet 4 节点可能更换ip地址 优缺点 优点 动态和随机性 缺点 难以管理 P2P和CS进行文件分发的比较 当文件数增多时 P
  • CSAPP阅读笔记——第二章:信息的表示和处理

    核心内容 编码原则 无符号 补码 浮点 溢出 无符号 补码 精度 浮点 一 信息存储 字节 存储最小单元 程序的内存管理是在虚拟地址层面上 字长 用于指明整数和指针数据的大小 编码虚拟地址 决定虚拟地址空间大小 数据大小 编码数字的格式 其
  • 【LLMs】关于LLMs的语义搜索

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • ElementUI组件el-time-picker的使用(只显示小时,分钟)

    在开发项目的时候 会经常用到时间选择器 但是ElementUI文档上给的示例是带有秒的 下面就是实现只显示小时和分钟的代码
  • libQt5XcbQpa.so.5多个导致load冲突

    直接运行labelme报错如下 qt qpa plugin Could not load the Qt platform plugin xcb in even though it was found This application fai
  • Windows中缺少mfc140.dll文件解决方法

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或者损坏了 这时你只需下载这个mfc140 dll文件进行安装 前提是找到适合
  • 微信小程序蓝牙通信

    微信小程序目前只支持低功耗蓝牙 BLE 不支持经典蓝牙 微信小程序的当前最新版本为2 3 0 根据实际测试 对IOS支持很好 但对Android支持非常不好 各厂商的Android手机遇到的问题也不一样 因此要开发蓝牙功能 推荐只提供IOS