1、Uni-APP蓝牙使用流程
在阅读这篇内容之前,建议您详细浏览一遍uni-app官方关于蓝牙和低功耗蓝牙(BLE)使用教程文档
uni-app官方低功耗蓝牙接口,如果您有微信小程序方面的开发经验,那您看这篇文章会很快上手,uni-app官方的蓝牙模块接口均是按照微信小程序的蓝牙模块接口编写。
思路流程
- 手机上打开蓝牙,设备打开蓝牙
- APP初始化蓝牙模块
- APP调用蓝牙搜寻设备
- APP存储搜寻到的指定设备deviceId
- APP根据指定deviceId连接蓝牙设备
- APP连接设备之后获取设备的服务列表serviceId
- APP根据serviceId获取设备的特征值列表characteristicId
- APP根据指定特征值属性开启notify订阅特征值
- APP根据指定特征值属性向设备发送写入控制指令
- 设备根据APP发送指令作出相应操作
- 设备通过特征值数据改变,APP的notify订阅查看改变的值
详细流程
-
- 首先要初始化蓝牙模块
openBluetoothAdapter
,即查看蓝牙是否可用,若初始化失败,则是蓝牙未打开,提示用户打开蓝牙。若已经打开蓝牙,则准备进行蓝牙搜索。
- 首先要初始化蓝牙模块
-
- 搜索蓝牙
startBluetoothDevicesDiscovery
,执行搜索方法,开始搜索蓝牙设备。这一步需要和关闭搜索蓝牙stopBluetoothDevicesDiscovery
成对使用,长时间占用搜索设备,浪费资源,在查找到需要的设备连接之后需要主动去停止搜索设备。
- 搜索蓝牙
-
- 查看所有已经发现的蓝牙设备
getBluetoothDevices
。在这一步可以查看到以前已经获取到的蓝牙设备deviceId
。可以在这一步中查看以前已经连接到的设备,主动去尝试连接这个设备。
- 查看所有已经发现的蓝牙设备
-
- 监听寻找到新设备的事件
onBluetoothDeviceFound
在这里查看搜索蓝牙已经搜索到的设备,可以在这里通过设备名称(name)或其他已知信息(deviceId等)判断是否已经搜寻到需要的指定设备。
- 监听寻找到新设备的事件
-
- 在上两步已经获取到需要连接的设备之后,通过设备ID(deviceId)来连接低功耗蓝牙设备
createBLEConnection
。在这里如果APP若是已经连接过此低功耗蓝牙设备,可以直接传入之前设备ID进行尝试连接。这一步的连接操作需要和关闭连接closeBLEConnection
成对操作。如果多次调用创建连接,有可能会导致系统持有一个设备的多个连接实例,导致在调用关闭连接的时候不能真正关闭连接。
- 在上两步已经获取到需要连接的设备之后,通过设备ID(deviceId)来连接低功耗蓝牙设备
-
- 在连接设备之后,APP需要主动去获取蓝牙设备
getBLEDeviceServices
的所有服务(services),设备会返回给APP设备的服务列表(services)包含设备服务的UUID,该服务是否为主服务。
- 在连接设备之后,APP需要主动去获取蓝牙设备
-
- 在获取设备的服务列表之后,根据自己设备的蓝牙协议接口文档,根据指定的服务ID(serviceId)使用获取服务特征值方法
getBLEDeviceCharacteristic
传入两个参数设备ID(deviceId)和服务ID(serviceId)向设备获取该服务中的所有的特征值(characteristic),设备会向APP返回该服务中的所有特征值列表,列表包含设备特征值的UUID,该特征值支持的操作类型。
- 在获取设备的服务列表之后,根据自己设备的蓝牙协议接口文档,根据指定的服务ID(serviceId)使用获取服务特征值方法
-
- 启用低功耗蓝牙设备特征值变化时候的notify通知功能,订阅特征值
notifyBLECharacteristicValueChange
。只有设备的该特征值支持notify或者indicate才可以调用此方法。在此之外,需要注意,只有调用了订阅特征值方法notifyBLECharacteristicValueChange
,才能监听设备的特征值改变事件characteristicValueChange
。在特征值订阅成功后,只有设备的特征值主动更新,才会触发onBLECharacteristicValueChange回调,回调会显示改变的特征值。
- 启用低功耗蓝牙设备特征值变化时候的notify通知功能,订阅特征值
-
- 在订阅特征值成功之后,可以向设备写入(发送)控制命令
writeBLECharacteristicValue
,此方法是向低功耗蓝牙设备特征值写入二进制数据。需要注意只有该特征值的属性支持write才可以调用此方法。在此方法调用成功后,设备特征值发生改变,就会触发onBLECharacteristicValueChange
回调,主动返回特征值数据。
- 在订阅特征值成功之后,可以向设备写入(发送)控制命令
流程图
2、Uni-APP蓝牙使用案例
使用uni-app连接血压仪
- 这部分代码是我测试中写的,主要是按照上面总结的思路流程写的代码,写的有些乱,还又长,就像老太太的裹脚布那样,又臭又长,有的写的不好,无意中总会创造各种各样的BUG,在实际项目中改动了好多部分代码,做了一些蓝牙使用场景的判断,尽量去融合蓝牙设备使用中遇到的各式各样的问题,尽量去提高用户体验。
- 代码下载连接,拷贝进uni-app项目即可https://download.youkuaiyun.com/download/qq_38734155/11195286
<template>
<view class="content">
<view class="" v-for="device in devicesList" :key="device">
<text>{
{
device}}</text>
</view>
<button type="primary" @tap="nextToDiscoveryBLE">下一步</button>
<button type="primary" @tap="pickUpOnce">测量一次</button>
<view class="">
<text>动态血压值: {
{
measureResult[0].pressure}}</text>
</view>
<view class="">
<text>收缩压值: {
{
measureResult[0].SYS}}</text>
</view>
<view class="">
<text>舒张压值: {
{
measureResult[0].DIA}}</text>
</view>
<view class="">
<text>脉搏值: {
{
measureResult[0].PUL}}</text>
</view>
</view>
</template>
<script>
export default {
components: {
},
data() {
return {
//是否已经打开蓝牙,默认为false,当蓝牙适配器初始化成功后为true
isOpenBle: false,
//主服务的UUID
primaryUUID: "FFF0",
//设备列表
devicesList: [{
"device": "初始设备"
}],
//设备Id
deviceId: "",
//服务Id
serviceId: "",
//特征值ID
characteristicId: [{
//支持写入操作的特征值
writeId: "",
//支持notify操作的特征值
notifyId: ""
}],
//控制命令
wirteControlCode: [{
//开始测量命令
beginMeasure: "0240DD04FFFD020198",
//停止测量命令
stopMeasure: "",
//上传数据命令
uploadData: "",
//停止上传数据命令
stopUploadData: "0240DD04FFFD02059C",
//关机命令
shutDown: ""
}],
//测量结果
measureResult: [{
//动态压力值
pressure: "",
//收缩压
SYS: "",
//舒张压
DIA: "",
//脉搏
PUL: ""
}]
}
},
onLoad() {
//在页面加载时候初始化蓝牙适配器
uni.openBluetoothAdapter({
success: e => {
console.log('初始化蓝牙成功:' + e.errMsg);
this.$data.isOpenBle = true;
console.log(this.$data