在项目中,底层硬件的数据交互是有设计成可以通过蓝牙进行传输的。低功耗蓝牙传输和app的交互,有太多问题和坑,这篇文章就从头到尾的把所有碰到的问题以及解决的流程做一个讲解。
文章环境
-
编辑器-HbuilderX -
前端框架-uni-app -
UI框架-uview-ui
文章目录
1、设备的连接与鉴权
公司的蓝牙设备和app连接是有一个鉴权的过程的,保证只有我司的app可以与我司的设备进行数据对接。开始设计的连接方式有两种分别是蓝牙连接和扫码连接,两种连接的方式都一样都是通过
第一步、打开蓝牙 openBluetoothAdapter
uni.openBluetoothAdapter({
success: e => {
//成功打开蓝牙初始化
this.startBluetoothDevicesDiscovery_ble();
},
fail: e => {
//失败原因:因为设备蓝牙功能未打开
this.$refs.uToast.show({
title: "设备蓝牙功能未打开",
type: 'error'
})
}
});
第二步、发现蓝牙设备 startBluetoothDevicesDiscovery
uni.startBluetoothDevicesDiscovery({
success: e => {
uni.onBluetoothDeviceFound(res => {
// 将搜索到的蓝牙设备deviceId 发送给全局的蓝牙列表 蓝牙连接的子页面显示
if (that.bluelist.indexOf(res.devices[0].deviceId) == -1) {
that.bluelist.push(res.devices[0].deviceId)
}
})
// 跳转到子页面(该页面详细展示了所有的蓝牙设备地址号,用户可以在该页面进行相应蓝牙的连接)
uni.navigateTo({
url: './connecting-devieces-ble/index'
});
},
fail: e => {
// 弹窗-搜索蓝牙设备失败
this.$refs.uToast.show({
title: "搜索蓝牙设备失败",
type: 'error',
})
}
});
第三步、建立蓝牙连接 createBLEConnection与打开notify监听 notifyBLECharacteristicValueChange
/**
* @description: 将mac存入vuex中并发起连接
* @param 选择的mac值(deviceId)
* 以及以下由设备产家提供的数据值(也可以通过自己连接进行获取)
* serviceId: "0000FE60-0000-1000-8000-00805F9B34FB",
* characteristicId62: "0000FE62-0000-1000-8000-00805F9B34FB",
* characteristicId61: "0000FE61-0000-1000-8000-00805F9B34FB",
* @return void
*/
uni.createBLEConnection({
deviceId: this.mac,
success(res) {
// 延迟两秒启用设备的特征值功能(该功能只需要启动一次)
setTimeout(() => {
uni.notifyBLECharacteristicValueChange({
state: true,
deviceId: thit.mac,
serviceId: thit.serviceId,
characteristicId: thit.characteristicId62,
success(res) {
//这里如果成功则延时500ms后开始鉴权操作
setTimeout(() => {
thit.writeBLECharacteristicValue()
}, 500)
},
fail(res) {
thit.$refs.uToast.show({
title: '启用设备特征值失败',
type: 'error',
})
},
})
}, 2000)
},
});
这里谈到一个建议,由于蓝牙的搜索很多都是实时进行的。如果采样组件或者页面通讯,有可能会造成数据流失,所以我们采取vuex的全局数据通讯保证数据完整性
如果是利用扫码连接,那么则将设备的deviceId制作成二维码供设备扫码
scanConnect() {
// 扫码连接测试设备
uni.scanCode({
success: res => {
this.openBluetoothAdapter()
},
fail: err => {
}
});
},
成功的话对蓝牙设备是否打开进行检查…以下操作和上面一样
第四步、设备鉴权 writeBLECharacteristicValue 监听返回onBLECharacteristicValueChange
设备鉴权前都需要进行数据处理,关于数据的处理我放在下一个段落阐明
value的值就是需要写入的数据
uni.writeBLECharacteristicValue({
deviceId: this.mac,
serviceId: this.serviceId,
characteristicId: this.characteristicId61,
value: buffer,
success(res) {
uni.onBLECharacteristicValueChange(function(res) {
var data = ab2hex(res.value)
console.log(data)
})
},
fail(res) {
// 弹窗-设备连接失败请重试
thit.$refs.uToast.show({
title: '设备连接失败,请重试',
type: 'error'
})
}
})
第五步、实时监听设备情况 onBLEConnectionStateChange
onShow() {
this.onBLEConnectionStateChange()
},
onBLEConnectionStateChange() {
var that = this
uni.onBLEConnectionStateChange(function(res) {
// 该方法回调中可以用于处理连接意外断开等异常情况
console.log(`蓝牙连接状态 -------------------------->`);
console.log(JSON.stringify(res));
// 当设备意外断连时 监听时间会将全局的参数恢复到断连的情况
if (res.connected == false) {
that.backToDeviceShow = false
store.commit('mac', "No device")
store.commit('pushConsoleLog', "断开蓝牙设备")
store.commit('judgeStatus', false)
store.commit('judgeStatus2', true)
}
})
},
2、设备数据的读取与展示
3、参数的读取和修改
首先是设备参数的读取
版权声明:本文为wwt4007253原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。