蓝牙连接并通信方法封装大致步骤。
- 初始化蓝牙并搜索;
- 获取并启用service服务;
- 数据读取和监听设备返回数据
需要使用uniapp官方提供api:
javascript
// 关闭蓝牙
uni.closeBluetoothAdapter({})
// 打开蓝牙
uni.openBluetoothAdapter({})
// 搜索附近的蓝牙
uni.startBluetoothDevicesDiscovery({})
// 停止搜索
uni.stopBluetoothDevicesDiscovery({})
// 连接低功耗BLE蓝牙
uni.createBLEConnection({})
// 获取蓝牙设备所有服务(service)
uni.getBLEDeviceServices({})
// 获取蓝牙特征值
uni.getBLEDeviceCharacteristics({})
// 启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值
uni.notifyBLECharacteristicValueChange({})
// 监听低功耗蓝牙设备的特征值变化事件
uni.onBLECharacteristicValueChange({})
// 读取低功耗蓝牙设备的特征值的二进制数据值
uni.readBLECharacteristicValue({})
1、开启蓝牙适配器初始化蓝牙模块,获取手机蓝牙是否打开
javascript
const getBluetoothState = () => {
return new Promise((resolve, reject) => {
uni.openBluetoothAdapter({
mode: 'central', // 主机模式
success: (r) => {
console.log("蓝牙初始化成功");
// 获取蓝牙的匹配状态
uni.getBluetoothAdapterState({
success: function(row) {
console.log('蓝牙状态:', row.available);
if (row.available) {
// 蓝牙连接成功,开启蓝牙设备搜索
resolve();
} else {
// 请开启蓝牙
uni.showToast({
title: "请开启蓝牙",
icon: 'none',
duration: 2000
});
reject();
}
},
fail: function(err) {
// 请开启蓝牙
uni.showToast({
title: "请开启蓝牙",
icon: 'none',
duration: 2000
});
reject();
}
})
},
fail: () => {
// 请开启蓝牙
uni.showToast({
title: "请开启蓝牙",
icon: 'none',
duration: 2000
});
reject();
}
});
});
}
2、开启蓝牙设备搜索
javascript
const discoveryBluetooth = () => {
return new Promise((resolve) => {
uni.startBluetoothDevicesDiscovery({
success(res) {
uni.showLoading({
title: "正在搜索设备",
icon:"none",
duration: 2000
});
console.log('搜索蓝牙外围设备完成', res)
setTimeout(() => {
// 监听寻找到的蓝牙设备
resolve();
}, 2000);
}
});
});
}
3、获取搜索到的设备信息
javascript
const getBluetoothDevices = () => {
return new Promise((resolve, reject) => {
uni.getBluetoothDevices({
success(res) {
// 过滤掉name为空或者未知设备的设备
let devices = res.devices.filter(function(obj) {
return obj.name !== "" && obj.name !== "未知设备"
});
devices && devices.forEach(item => {
// 获取指定连接deviceId
if(item.name && item.name.substring(0, 5) === 'aaaa-'){
// aaaa-*********蓝牙设备型号,根据需求选择设备型号
// item.deviceId;
}
});
},
fail: function() {
console.log('搜索蓝牙设备失败');
reject();
},
complete: function() {
console.log("蓝牙搜索完成");
resolve();
}
});
});
}
4、关闭蓝牙搜索
javascript
const stopDiscoveryBluetooth = () => {
uni.stopBluetoothDevicesDiscovery({
success(r) {
console.log("停止搜索蓝牙设备", r);
}
});
};
5、连接蓝牙
javascript
const connectBluetooth = () => {
return new Promise((resolve, reject) => {
uni.createBLEConnection({
deviceId: deviceId, // 设备id
success() {
// 蓝牙连接成功后关闭蓝牙搜索并获取服务id
stopDiscoveryBluetooth();
resolve();
// 获取服务id
getServiceId();
},
fail() {
console.log("蓝牙连接失败");
reject();
}
});
});
};
6、获取服务id
javascript
const getServiceId = () => {
uni.getBLEDeviceServices({
deviceId: deviceId,
success(res) {
console.log("获取服务Id", res)
// serviceId固定,获取蓝牙设备某个服务中的所有特征值【读写属性】
let model = res.services[0];
serviceId = model.uuid;
// 调用蓝牙监听和写入功能
getCharacteId();
},
fail(err){
console.log('获取服务失败', err);
}
})
};
7、获取蓝牙低功耗设备某个服务中所有特征
javascript
const getCharacteId = () => {
uni.getBLEDeviceCharacteristics({
deviceId: deviceId, // 蓝牙设备id
serviceId: serviceId, // 蓝牙服务UUID
success(res) {
console.log('数据监听', res);
res.characteristics.forEach(item => {
// 003
if (item.properties.notify === true) {
// 监听
notify = item.uuid;
}
// 002
if (item.properties.write === true) {
// 写入
let writeId = item.uuid;
}
});
},
fail(err) {
console.log("数据监听失败", err)
}
})
};
8、监听设备返回数据,启用低功耗蓝牙设备特征值变化时的notify功能
javascript
const startNotice = () => {
uni.notifyBLECharacteristicValueChange({
characteristicId: notify,
deviceId: deviceId,
serviceId: serviceId,
state: true,
success(res) {
// 监听低功耗蓝牙设备的特征值变化
uni.onBLECharacteristicValueChange(result => {
console.log("监听低功耗蓝牙设备的特征值变化", result);
if (result.value) {
console.log('设备返回数据', result.value)
}
})
}
});
};
9、向蓝牙设备发送数据
javascript
const writeData = (buffer) => {
return new Promise((resolve, reject) => {
uni.writeBLECharacteristicValue({
characteristicId: uni.getStorageSync("writeId"),
deviceId: deviceId,
serviceId: serviceId,
value: buffer,
success(res) {
console.log("writeBLECharacteristicValue success", res);
resolve();
},
fail(err) {
console.log("报错了", err);
reject();
}
});
});
};
封装完整方法:
javascript
import { TextDecoder } from 'text-encoding-utf-8';
let bluetoothOpen = false; // 手机蓝牙是否打开
let bluetoothConnect = false; // 设备和蓝牙是否连接
let isHaveDevice = false; // 是否查找到设备
let deviceId = null; // 设备id
let serviceId = null; // 服务id
let notify = null; // 监听uuid
let writeId = null; // 写入uuid
/**
* 获取手机蓝牙是否打开
*/
const getBluetoothState = () => {
// 主机模式
return new Promise((resolve, reject) => {
uni.openBluetoothAdapter({
mode: 'central',
success: (r) => {
console.log("蓝牙初始化成功");
// 获取蓝牙的匹配状态
uni.getBluetoothAdapterState({
success: function(row) {
console.log('蓝牙状态:', row.available);
if (row.available) {
bluetoothOpen = true;
resolve();
} else {
// 请开启蓝牙
bluetoothOpen = false;
bluetoothConnect = false;
reject();
}
},
fail: function(err) {
// 请开启蓝牙
bluetoothOpen = false;
bluetoothConnect = false;
reject();
}
})
},
fail: () => {
// 请开启蓝牙
bluetoothOpen = false;
bluetoothConnect = false;
reject();
}
});
});
};
/**
* 开始搜索蓝牙设备
*/
const discoveryBluetooth = () => {
return new Promise((resolve) => {
uni.startBluetoothDevicesDiscovery({
success(res) {
console.log('搜索蓝牙外围设备完成', res)
setTimeout(() => {
resolve();
}, 2000);
}
});
})
};
// 关闭蓝牙搜索
const stopDiscoveryBluetooth = () => {
uni.stopBluetoothDevicesDiscovery({
success(r) {
console.log("停止搜索蓝牙设备", r);
}
});
};
/**
* 获取搜索到的设备信息
*/
const getBluetoothDevices = () => {
return new Promise((resolve, reject) => {
uni.getBluetoothDevices({
success(res) {
bluetoothConnect = false;
// 过滤掉name为空或者未知设备的设备
let devices = res.devices.filter(function(obj) {
return obj.name !== "" && obj.name !== "未知设备"
});
devices && devices.forEach(item => {
if(item.name && item.name.substring(0, 5) === 'aaaa-'){
deviceId = item.deviceId;
}
});
},
fail: function() {
console.log('搜索蓝牙设备失败');
bluetoothConnect = false;
reject();
},
complete: function() {
console.log("蓝牙搜索完成");
// 是否具有当前设备
if (deviceId) {
isHaveDevice = true;
} else {
isHaveDevice = false;
}
resolve(isHaveDevice);
}
});
});
}
/**
* 连接蓝牙
* deviceId 蓝牙设备id
*/
const connectBluetooth = () => {
return new Promise((resolve, reject) => {
uni.createBLEConnection({
deviceId: deviceId, // 设备id
success() {
bluetoothConnect = true;
// 蓝牙连接成功后关闭蓝牙搜索
stopDiscoveryBluetooth();
resolve();
// 获取服务id
getServiceId();
},
fail() {
bluetoothConnect = false;
console.log("蓝牙连接失败");
reject();
}
});
});
};
// 获取服务id
const getServiceId = () => {
uni.getBLEDeviceServices({
deviceId: deviceId,
success(res) {
console.log("获取服务Id", res)
let model = res.services[0];
serviceId = model.uuid;
// 调用蓝牙监听和写入功能
getCharacteId();
}
})
};
// 获取蓝牙低功耗设备某个服务中所有特征
const getCharacteId = () => {
uni.getBLEDeviceCharacteristics({
deviceId: deviceId, // 蓝牙设备id
serviceId: serviceId, // 蓝牙服务UUID
success(res) {
console.log('数据监听', res);
res.characteristics.forEach(item => {
// 003
if (item.properties.notify === true) {
// 监听
notify = item.uuid;
startNotice();
}
// 002
if (item.properties.write === true) {
// 写入
let writeId = item.uuid;
uni.setStorageSync("writeId", item.uuid);
}
});
},
fail(err) {
console.log("数据监听失败", err)
}
})
};
// 启用低功耗蓝牙设备特征值变化时的notify功能
const startNotice = () => {
uni.notifyBLECharacteristicValueChange({
characteristicId: notify,
deviceId: deviceId,
serviceId: serviceId,
state: true,
success(res) {
// 监听低功耗蓝牙设备的特征值变化
uni.onBLECharacteristicValueChange(result => {
console.log("监听低功耗蓝牙设备的特征值变化", result);
if (result.value) {
let decoder = new TextDecoder('utf-8');
let data = decoder.decode(result.value);
console.log('帽子返回数据', data)
}
})
}
});
};
// 蓝牙发送数据
const writeData = (buffer) => {
return new Promise((resolve, reject) => {
uni.writeBLECharacteristicValue({
characteristicId: uni.getStorageSync("writeId"),
deviceId: deviceId,
serviceId: serviceId,
value: buffer,
success(res) {
console.log("writeBLECharacteristicValue success", res);
resolve();
},
fail(err) {
console.log("报错了", err);
reject();
}
});
});
};
export default {
getBluetoothState,
discoveryBluetooth,
stopDiscoveryBluetooth,
getBluetoothDevices,
connectBluetooth,
getServiceId,
getCharacteId,
startNotice,
writeData
};
使用案例:
vue
<template>
<view class="device_container">
</view>
</template>
<script>
import bluetooth from '../bluetooth.js';
export default {
data() {
return {
bluetoothStatus: false, // 蓝牙连接状态
}
},
methods: {
// 获取蓝牙和设备是否已连接
initBluetooth() {
let _this = this;
// 初始化蓝牙
bluetooth.getBluetoothState().then(() => {
// 搜索外围蓝牙设备
bluetooth.discoveryBluetooth().then(() => {
this.discoveryLoading = true;
// 获取蓝牙设备
bluetooth.getBluetoothDevices().then((isHaveDevice) => {
if (isHaveDevice) {
// 搜索到指定设备,连接蓝牙
bluetooth.connectBluetooth().then(() => {
_this.bluetoothStatus = true;
}, () => {
_this.bluetoothStatus = false;
});
} else {
// 未搜到设备
_this.bluetoothStatus = false;
}
}, () => {
// 蓝牙搜索失败
_this.bluetoothStatus = false;
});
});
}, () => {
// 未开启蓝牙
_this.bluetoothStatus = false;
});
},
// 向设备发送数据
writeBlueData() {
let obj = {
cmd: 3,
freq: 430125,
speakable: 1
};
let objStr = JSON.stringify(obj);
let buffer = new ArrayBuffer(objStr.length); // 每个字符占用2个字节
let bufView = new Uint8Array(buffer);
for (let i = 0; i < objStr.length; i++) {
bufView[i] = objStr.charCodeAt(i);
}
bluetooth.writeData(buffer);
}
},
onShow() {
// 获取蓝牙和设备连接状态
this.initBluetooth();
},
}
</script>
<style lang="scss">
page {
height: 100%;
}
</style>