『uni-app、小程序』蓝牙连接、读写数据全过程

这篇具有很好参考价值的文章主要介绍了『uni-app、小程序』蓝牙连接、读写数据全过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


theme: smartblue

本文简介

点赞 + 关注 + 收藏 = 学会了

这是一次真实的 蓝牙收发数据 的全过程讲解。

本文使用 uni-app + Vue3 的方式进行开发,以手机app的方式运行(微信小程序同样可行)。

uni-app 提供了 蓝牙低功耗蓝牙api ,和微信小程序提供的 api 是一样的,所以本文的讲解也适用于微信小程序

本文只实现 蓝牙收发数据 功能,至于样式,我懒得调~

蓝牙相关功能我会逐步讲解。如果你基础好,又急的话,可以直接跳到 『完整代码』的章节查看,那里没废话。

『uni-app、小程序』蓝牙连接、读写数据全过程

花了几块钱巨款买回来的蓝牙学习套装~

环境说明

  • 开发工具:HBuilder X 3.4.7.20220422
  • uni-app + Vue3
  • 以安卓App的方式运行(iOS和小程序同理)

思路

蓝牙收发数据的逻辑和我们常用的 AJAX 进行的网络请求是有一丢丢不同的。

其中较大的区别是:蓝牙接收数据不是那么的稳定,相比起网络请求,蓝牙更容易出现丢包的情况。

在开发中,AJAX 发起的请求不管成功还是失败,浏览器基本都会给你一个答复。但 uni-app 提供的 api 来看,蓝牙接收数据会显得更加 “异步”

大致思路

使用蓝牙进行数据传输的大概思路如下:

  1. 初始化:打开蓝牙模块
  2. 搜寻:检测附近存在的设备
  3. 连接:找到目标设备进行
  4. 监听:开启监听功能,接收其他设备传过来的数据
  5. 发送指令:不管发送数据还是读取数据,都可以理解为向外发送指令

实现

上面整理出使用蓝牙传输数据的5大动作,但每个动作其实都是由 uni-app 提供的一个或者多个 api 组合而成。

初始化阶段

使用蓝牙之前,需要初始化蓝牙模块,这是最最最开始就要做的!

使用 uni.openBluetoothAdapter 这个 api 就可以初始化蓝牙模块。其他蓝牙相关 API 必须在 uni.openBluetoothAdapter 调用之后使用。否则 API 会返回错误( errCode=10000 )。

错误代码可以查阅 《错误码文档》

代码示例

```html

```

如果你手机开启了蓝牙,点击页面上的按钮后,控制台就会输出如下内容

初始化蓝牙成功 {"errMsg":"openBluetoothAdapter:ok"}

如果手机没开启蓝牙,就会返回如下内容

初始化蓝牙失败 {"errMsg":"openBluetoothAdapter:fail not available","code":10001}

根据文档提示,10001代表当前蓝牙适配器不可用

『uni-app、小程序』蓝牙连接、读写数据全过程

『uni-app、小程序』蓝牙连接、读写数据全过程

如果你的控制台能打印出 {"errMsg":"openBluetoothAdapter:ok"} 证明第一步已经成功了。

接下来可以开始搜索附近蓝牙设备。

搜寻附近设备

这一步需要2个 api 配合完成。所以可以分解成以下2步:

  1. 开启搜寻功能uni.startBluetoothDevicesDiscovery
  2. 监听搜寻到新设备uni.onBluetoothDeviceFound

开发蓝牙相关功能时,操作逻辑更像是推送,所以“开启搜索”和“监听新设备”是分开操作的。

uni.startBluetoothDevicesDiscovery 可以让设备开始搜索附近蓝牙设备,但这个方法比较耗费系统资源,建议在连接到设备之后就使用 uni.stopBluetoothDevicesDiscovery 停止继续搜索。

uni.startBluetoothDevicesDiscovery 方法里可以传入一个对象,该对象接收几个参数,但初学的话我们只关注 successfail。如果你的项目中硬件佬有提供 service 的 uuid 给你的话,你也可以在 services 里传入。其他参数可以查看官方文档的介绍。

在使用 uni.startBluetoothDevicesDiscovery (开始搜索)后,可以使用 uni.onBluetoothDeviceFound 进行监听,这个方法里面接收一个回调函数。

代码示例

```html id: {{ item.deviceId }} name: {{ item.name }}

<button @click="initBlue">初始化蓝牙</button>

    <button @click="discovery">搜索附近蓝牙设备</button>

</view>

```

上面代码的逻辑是,如果开启 “寻找附近设备” 功能成功,接着就开启 “监听寻找到新设备的事件”

搜索到的设备会返回以下数据:

json { "devices": [{ "deviceId": "B4:10:7B:C4:83:14", "name": "蓝牙设备名", "RSSI": -58, "localName": "", "advertisServiceUUIDs": ["0000FFF0-0000-1000-8000-00805F9B34FB"], "advertisData": {} }] }

每监听到一个新的设备,我都会将其添加到 蓝牙设备列表(blueDeviceList) 里,最后讲这个列表的数据渲染到页面上。

『uni-app、小程序』蓝牙连接、读写数据全过程

连接目标设备

连接目标设备只需要1个 api 就能完成。但根据文档提示,我们连接后还需要关闭 “搜索附近设备” 的功能,这个很好理解,既然找到了,再继续找就是浪费资源。

流程如下:

  1. 获取设备ID:根据 uni.onBluetoothDeviceFound 回调,拿到设备ID
  2. 连接设备:使用设备ID进行连接 uni.createBLEConnection
  3. 停止搜索uni.stopBluetoothDevicesDiscovery

我给每条搜索到的蓝牙结果添加一个 click 事件,会向目标设备发送连接请求。

我的设备名称是 leihou ,所以我点击了这条。

代码示例

```html id: {{ item.deviceId }} name: {{ item.name }}

<button @click="initBlue">初始化蓝牙</button>

    <button @click="discovery">搜索附近蓝牙设备</button>

​ ​

```

连接成功后在控制台会输出

bash 连接成功 {"errMsg":"createBLEConnection:ok"}

在连接成功后就立刻调用 uni.stopBluetoothDevicesDiscovery 方法停止继续搜索附近其他设备,停止成功后会输出

bash 停止成功 {"errMsg":"stopBluetoothDevicesDiscovery:ok"}

『uni-app、小程序』蓝牙连接、读写数据全过程 连接成功后,设备也亮起了绿灯。

监听

在连接完设备后,就要先开启监听数据的功能。这样才能接收到发送读写指令后设备给你回调的信息。

要开启监听,首先需要知道蓝牙设备提供了那些服务,然后通过服务获取特征值,特征值会告诉你哪个可读,哪个可写。最后根据特征值进行消息监听

步骤如下:

  1. 获取蓝牙设备服务uni.getBLEDeviceServices
  2. 获取特征值uni.getBLEDeviceCharacteristics
  3. 开启消息监听uni.notifyBLECharacteristicValueChange
  4. 接收消息监听传来的数据uni.onBLECharacteristicValueChange

正常情况下,硬件佬会提前把蓝牙设备的指定服务还有特征值告诉你。

比如我这个设备的蓝牙服务是:0000FFE0-0000-1000-8000-00805F9B34FB

特征值是:0000FFE1-0000-1000-8000-00805F9B34FB

第一步,获取蓝牙服务

```html

```

此时点击按钮,将会获取到已连接设备的所有服务。

我的设备有以下几个服务。你在工作中拿到的 服务uuid 和我的是不一样的,数量也不一定相同。

可以发现,我拿到的结果里有 0000FFE0-0000-1000-8000-00805F9B34FB 这条服务。

json { "services": [{ "uuid": "00001800-0000-1000-8000-00805F9B34FB", "isPrimary": true }, { "uuid": "00001801-0000-1000-8000-00805F9B34FB", "isPrimary": true }, { "uuid": "0000180A-0000-1000-8000-00805F9B34FB", "isPrimary": true }, { "uuid": "0000FFF0-0000-1000-8000-00805F9B34FB", "isPrimary": true }, { "uuid": "0000FFE0-0000-1000-8000-00805F9B34FB", "isPrimary": true }], "errMsg": "getBLEDeviceServices:ok" }

第二步,获取指定服务的特征值

获取特征值,需要传 设备ID服务ID

在上两步我拿到了 设备IDB4:10:7B:C4:83:14服务ID0000FFE0-0000-1000-8000-00805F9B34FB

```html

```

最后成功输出

json { "characteristics": [{ "uuid": "0000FFE1-0000-1000-8000-00805F9B34FB", "properties": { "read": true, "write": true, "notify": true, "indicate": false } }], "errMsg": "getBLEDeviceCharacteristics:ok" }

characteristics 字段里保存了该服务的所有特征值,我的设备这个服务只有1个特征值,并且读、写、消息推送都为 true

你的设备可能不止一条特征值,需要监听那条特征值这需要你和硬件佬协商的(通常也是硬件佬直接和你说要监听哪条)。

第三、四步,开启消息监听 并 接收消息监听传来的数据

根据已经拿到的 设备ID服务ID特征值,就可以开启对应的监听功能。

使用 uni.notifyBLECharacteristicValueChange 开启消息监听;

并在 uni.onBLECharacteristicValueChange 方法触发监听到的消息。

```html

```

listenValueChange 方法是用来接收设备传过来的消息。

上面的例子中,res 的结果是

json { "deviceId": "B4:10:7B:C4:83:14", "serviceId": "0000FFE0-0000-1000-8000-00805F9B34FB", "characteristicId": "0000FFE1-0000-1000-8000-00805F9B34FB", "value": {} }

设备传过来的内容就放在 value 字段里,但因为该字段的类型是 ArrayBuffer,所以无法在控制台用肉眼直接观察。于是就通过 ab2hex 方法将该值转成 16进制 ,最后再用 hexCharCodeToStr 方法将 16进制 转成 ASCII码

我从设备里发送一段字符串过来:leihou

『uni-app、小程序』蓝牙连接、读写数据全过程

App端收到的数据转成 16进制 后的结果:6c6569686f75

再从 16进制 转成 ASCII码 后的结果:leihou

发送指令

终于到最后一步了。

uni-app微信小程序 提供的蓝牙api 来看,发送指令只要有2个方法:

  • uni.writeBLECharacteristicValue:向低功耗蓝牙设备特征值中写入二进制数据。
  • uni.readBLECharacteristicValue:读取低功耗蓝牙设备的特征值的二进制数据值。

这里需要理清一个概念,本节的内容为 “发送指令” ,也就是说,从你的app或小程序向其他蓝牙设备发送指令,而这个指令分2种情况,一种是你要发送一些数据给蓝牙设备,另一种情况是你叫蓝牙设备给你发点信息。

uni.writeBLECharacteristicValue

这两种情况我们需要分开讨论,先讲讲 uni.writeBLECharacteristicValue

uni.writeBLECharacteristicValue 从文档可以看出,这个 api 是可以发送一些数据给蓝牙设备,但发送的值要转成 ArrayBuffer

代码示例

```html

```

此时,如果 uni.writeBLECharacteristicValuesuccess ,证明你已经把数据向外成功发送了,但不代表设备一定就收到了。

通常设备收到你发送过去的信息,会返回一条消息给你,而这个回调消息会在 uni.onBLECharacteristicValueChange 触发,也就是 第【9】步 那里。但这是蓝牙设备那边控制的,你作为前端佬,人家“已读不回”你也拿人家没办法。

『uni-app、小程序』蓝牙连接、读写数据全过程

uni.readBLECharacteristicValue

“监听” 部分,我们使用了 uni.getBLEDeviceCharacteristics 获取设备的特征值,我的设备提供的特征值支持 read ,所以可以使用 uni.readBLECharacteristicValue 向蓝牙设备发送一条 “读取” 指令。然后在 uni.onBLECharacteristicValueChange 里可以接收设备发送过来的数据。

代码示例

```html

```

使用 “读取” 的方式向设备发送指令,是不需要另外传值的。

此时我的设备返回 00

『uni-app、小程序』蓝牙连接、读写数据全过程

这个数据是硬件那边设置的。

在日常工作中,uni.readBLECharacteristicValue 的作用主要是读取数据,但使用场景不算很多。

我在工作中遇到的场景是:蓝牙设备提供了几个接口,而且传过来的数据比较大,比如传图片给app这边。我就会先用 uni.writeBLECharacteristicValue 告诉设备我现在需要取什么接口的数据,然后用 uni.readBLECharacteristicValue 发送读取数据的请求,如果数据量比较大,就要重复使用 uni.readBLECharacteristicValue 进行读取。比如上面的例子,我读第一次的时候返回 00 ,读第二次就返回 01 ……

最后再提醒一下,uni.readBLECharacteristicValue 只负责发送读取的请求,并且里面的 successfail 只是返回你本次发送请求的动作是否成功,至于对面的蓝牙设备有没有收到这个指令你是不清楚的。

最后需要通过 uni.getBLEDeviceCharacteristics 监听设备传过来的数据。

完整代码

```html id: {{ item.deviceId }} name: {{ item.name }}

<button @click="initBlue">1 初始化蓝牙</button>

    <button @click="discovery">2 搜索附近蓝牙设备</button>

    <button @click="getServices">3 获取蓝牙服务</button>

    <button @click="getCharacteristics">4 获取特征值</button>

    <button @click="notify">5 开启消息监听</button>

    <button @click="send">6 发送数据</button>

    <button @click="read">7 读取数据</button>

    <view class="msg_x">
        <view class="msg_txt">
            监听到的内容:{{ message }}
        </view>
        <view class="msg_hex">
            监听到的内容(十六进制):{{ messageHex }}
        </view> 
    </view>

​ ​

```

『uni-app、小程序』蓝牙连接、读写数据全过程

『uni-app、小程序』蓝牙连接、读写数据全过程

以上就是本文的完整代码。

相关文档

uni-app 蓝牙文档

uni-app 低功耗蓝牙文档

微信小程序 蓝牙文档

微信小程序 低功耗蓝牙文档

DataView 使用方法

推荐阅读

👍 uni-app App端半屏连续扫码

记住:点赞 + 关注 + 收藏 = 学会了文章来源地址https://www.toymoban.com/news/detail-487379.html

到了这里,关于『uni-app、小程序』蓝牙连接、读写数据全过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uni-app蓝牙操作

    1、打开蓝牙适配器 2、开启蓝牙搜索 3、监听蓝牙设备列表 4、建立连接 5、关闭蓝牙连接 6、停止蓝牙搜搜 7、获取蓝牙设备服务 8、获取蓝牙特征值

    2024年02月13日
    浏览(50)
  • 记一次uni-app中调用java代码中的方法全过程

    一、 开发环境 • JAVA环境 jdk1.8 • AndroidStudio 下载地址:Android Studio官网 : https://developer.android.google.cn/studio/index.html • App离线SDK下载 请下载2.9.8+版本的android平台SDK. https://nativesupport.dcloud.net.cn/AppDocs/download/android.html# • HBuilderX下载 官方下载地址: https://www.dcloud.io/hbuilderx.ht

    2024年02月12日
    浏览(63)
  • 小程序-uni-app:实现锚点连接/锚点跳转(uni.pageScrollTo、scroll-into-view)

    Uniapp支持锚点连接,可以通过以下步骤实现锚点连接 一、在需要设置锚点的页面,为需要跳转的部分设置id属性。 例如,设置一个id为“section1”的元素: 二、在需要跳转到锚点的页面,使用 uni.navigateTo 或 uni.redirectTo 方法,搭配URL参数的方式实现跳转。 例如,跳转到id为“

    2024年02月14日
    浏览(58)
  • 微信小程序之蓝牙连接全过程封装

    1、初始化蓝牙 不管是ios操作系统还是安卓操作系统,第一步都需要初始化蓝牙 2、获取蓝牙适配器状态 3、ios和安卓的操作系统对蓝牙的连接方式不同 安卓是直接对设备的macAddress进行连接 ios需要对周边的蓝牙设备就行搜索: 4、蓝牙连接 5、获取蓝牙多个service 6、开启notif

    2024年02月15日
    浏览(40)
  • 解决uni-app uniCloud小程序预览没有数据

    例如:最近小程序的项目是用uni-app写的,项目用uniCloud作为后端,原本以为unicloud跟微信小程序云开发差不多,但是预览到手机的时候没有数据了…… unicloud作为后端,手机预览没有数据,通过查阅文献和网搜,进行了一系列的排查。 跟以往的微信云开发不同,unicloud作为后

    2024年02月09日
    浏览(51)
  • uni-app(android、ios) 使用蓝牙便携式打印机(热敏打印机)

    HSPOS 点密度:576点/行(8dots/mm,203dpi) 接口类型: 蓝牙(Bluetooth2.0,4.0双模,支持Android,IOS) 打印方式:图形打印(位图) 打印指令集: ESC/POS 1、 实现蓝牙连接 **B12.js方法封装 *** vue文件中内容 2、获取位图信息 vue页面中拿到像素(位图)信息; 3、开始打印; b12s.js 1、安

    2024年02月15日
    浏览(179)
  • uni-app 实现navigateBack返回修改前一页面数据(H5、APP、小程序)

    先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年最新Web前端全套学习资料》,

    2024年04月29日
    浏览(69)
  • jQuery、vue、小程序、uni-app中的本地存储数据和接受数据

    jQuery: 存储数据: 获取数据: Vue.js: 存储数据: 获取数据: 小程序(微信小程序、支付宝小程序、百度小程序等): 存储数据: 获取数据: uni-app: 存储数据: 获取数据: 以上是四种常用的前端框架/技术中使用本地存储数据和接收数据的方法。具体使用哪一种取决于你正在

    2024年02月03日
    浏览(42)
  • uni-app小程序父组件数据更新,实现自定义组件刷新视图

    之前错误的思路 新思路(忽略我的参数命名,写文章的时候方便。)

    2024年02月16日
    浏览(51)
  • jQuery、vue、小程序、uni-app中的本地存储数据和接受数据是什么?

    在这四个工具/框架中,Uni-app和微信小程序比较类似,因为它们都是为了实现跨平台开发而设计的。 jQuery  是一个快速、小巧且特性丰富的 JavaScript 库。它提供了各种操作和处理 HTML DOM、事件、动画,以及提供各种工具函数的功能。然而,关于本地存储数据,jQuery 本身并没有

    2024年02月21日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包