小程序操作蓝牙进行读写
本文讲述小程序使用蓝牙进行数据的读写。
这篇将是全代码,但关键地方都会有注释。
一、打开适配器
javascript
initBLE:function(back) {
wx.openBluetoothAdapter({ success(res){
// ===== 打开成功 =====
this.searchBLE(); // 开始搜索蓝牙外设
// 在蓝牙打开的情况下突然关闭
wx.onBluetoothAdapterStateChange(function (res) {
if (!res.available) { //蓝牙适配器是否可用
this.setData({
tipsBox: "tipsBox",
tipsTitle: "温馨提示",
tipsContent: "蓝牙未打开,请重新打开蓝牙"
})
}
})
},fail(err) {
wx.showToast({
title: '请检查手机蓝牙是否打开',
icon: 'none',
})
}
})
},
二、搜索蓝牙外设
javascript
// 开始搜索
searchBLE() {
let that =this;
BLEMag.bluetoothMag.startMonitorBluetoothSearch({
success(res) {
that.monitorSearchDevice(); // 监听蓝牙搜索回调
that.searchDevice(); // 开始蓝牙搜索
}
});
},
// 监听蓝牙搜索回调
monitorSearchDevice() {
var that = this;
wx.startBluetoothDevicesDiscovery({
allowDuplicatesKey: true,
interval: 0,
// ===== 搜索打开成功 =====
success: function () {
that.setData({
showProgress: false
})
},
// ===== 搜索打开失败 =====
fail: function (res) {
that.failCallback('蓝牙设备服务发现失败')
that.printLog("蓝牙设备服务发现失败: " + res.errMsg);
}
})
},
// 搜索蓝牙
searchDevice:function(back) {
var that = this;
var deviceArr = [];
wx.onBluetoothDeviceFound(function (res) {
res.devices.forEach(device => {
// TODO
// 做搜索到设备的处理
wx.stopBluetoothDevicesDiscovery(); // 停止搜索设备
})
})
},
三、连接蓝牙
javascript
// 先关闭再连接蓝牙
createBLE: function (deviceID) {
var that = this;
// 先断开设备连接
wx.closeBLEConnection({ deviceId: deviceID, success: function (res) {
console.log('断开设备成功 = ', res)
that.connectionBluetooth(deviceID);
},fail: function (error) {
if (error.errCode === 10006 && error.errMsg === "closeBLEConnection:fail:no connection"){
console.log('断开设备失败1 = ', error)
}else{
console.log('断开设备失败2 = ', error)
}
console.log('断开设备失败 = ', error)
}})
},
// 连接蓝牙
connectionBluetooth:function(deviceID, deviceType, back) {
var that = this;
console.log(' 正在连接设备ID = ',deviceID);
wx.createBLEConnection({ deviceId: deviceID, success: function (res) {
console.log(' ============== 连接成功 ============== ',res);
if (BLE_state === "关") { return }
// 这里可以申请MTU
wx.setBLEMTU({ deviceId: deviceID, mtu: 135, success: function (res){
console.log(' ============== 申请MTU成功 ============== ',res);
back.success("连接成功");
that.getBLEServiceId(deviceID); // 连接设备后获取蓝牙设备服务
},fail: function (error){
console.log(' ============== 申请MTU失败 ============== ',error);
back.success("连接失败");
}});
},fail: function (error) {
if (BLE_state === "关") { return }
if (error.errMsg === "closeBLEConnection:fail:no connection") {
console.log(' ============== 连接失败 ============== ', error);
}
}})
},
四、获取服务和特征
javascript
// 获取蓝牙服务
getBLEServiceId: function (deviceID) {
var that = this;
that.printLog("获取设备[" + deviceID + "]服务列表")
wx.getBLEDeviceServices({
deviceId: deviceID,
// ===== 获取服务成功 =====
success: function (res) {
var services = res.services;
that.printLog('找到设备服务列表个数: ' + services.length);
if (services.length <= 0) {
that.printLog("未找到主服务列表")
return;
}
if (services.length == 1) {
var service = services[0];
that.printLog("服务UUID:[" + service.uuid + "]");
that.printLog("Primary:" + service.isPrimary);
that.setData({currServiceID: service.uuid})
that.getBLECharactedId(deviceID, service.uuid); // 获取服务特征值
} else { // 多个主服务
// TODO 如果有多个主服务,可以硬编码比对 ServiceUUID
var service = null;
for (var i = 0; i < services.length; i++) {
if (services[i].uuid == '服务uuid') {
service = services[i];
break;
}
}
if (service == null) {
service = services[0];
}
that.printLog("服务UUID:[" + service.uuid + "]");
that.printLog("Primary:" + service.isPrimary);
that.getBLECharactedId(deviceID, service.uuid); // 获取服务特征值
}
},
// ===== 获取服务失败 =====
fail: function (res) {
that.failCallback('获取设备蓝牙服务列表失败,请重试')
that.printLog("获取设备服务列表失败" + res.errMsg);
}
})
},
// 获取服务特征
getBLECharactedId: function (deviceID, serviceId) {
var that = this;
that.printLog("获取设备特征值")
wx.getBLEDeviceCharacteristics({
deviceId: deviceID,
serviceId: serviceId,
// ===== 获取特征值成功 =====
success: function (res) {
console.log(res);
var chars = res.characteristics;
if (chars.length <= 0) {
that.printLog("未找到设备特征值")
return;
}
that.printLog("找到设备特征值个数:" + chars.length);
var char = chars[0];
that.printLog("特征值[" + char.uuid + "]")
var prop = char.properties;
// 这里会获取到两个特征值,一个用来写,一个用来读
for (var i = 0; i < chars.length; i++) {
var char = chars[i];
// 这里可以对特征值的uuid进行判断,具体看实际情况
if(char.uuid=='特征的uuid值'){
var prop = char.properties;
if (prop.notify == true) { // 读
that.printLog("该特征值属性: Notify");
that.recvBLECharacterNotice(deviceID, serviceId, char.uuid);
} else if (prop.write == true) { // 写
that.printLog("该特征值属性: Write");
that.setData({currCharId: char.uuid})
that.sendBLEData(deviceID, serviceId, char.uuid);
} else {
that.printLog("该特征值属性: 其他");
}
}
}
},
// ===== 获取特征值失败 =====
fail: function (res) {
console.log('获取设备特征值失败,', res);
}
})
},
五、数据读写
javascript
// 蓝牙特征值变化通知
recvBLECharacterNotice: function (deviceId, serviceId, charId) {
var that = this;
that.printLog("注册Notice 回调函数");
// state:true 启用Notify功能
wx.notifyBLECharacteristicValueChange({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: charId,
state: true,
// ===== 蓝牙特征值监听成功 =====
success: function (res) {
that.printLog("启用低功耗蓝牙设备特征值变化时的 notify 功能 success");
// 监听低功耗蓝牙设备的特征值变化 characteristic
wx.onBLECharacteristicValueChange(function (res) { // 监听回调
console.log(res);
that.printLog("收到Notify数据: " + plugin.ab2hex(res.value));
});
},
// ===== 蓝牙特征值监听失败 =====
fail: function (res) {
// console.log(res);
// that.printLog("特征值Notice 接收数据失败: " + res.errMsg);
// that.failCallback('设备蓝牙特征值接收数据失败,请重试')
// 这里需要注意,这样写是因为会报一个错但是还是能监听到数据
wx.onBLECharacteristicValueChange(function (res) { // 监听回调
console.log(res);
that.printLog("收到Notify数据: " + plugin.ab2hex(res.value));
});
}
})
},
// 发送数据
sendBLEData(deviceId, serviceId, charId){
// 这里我举例发个数据(注意最后发送的是个十进制数组)
let array = [];
for (var i = 0; i < data.length; i++) {
array.push(data.charAt(i).charCodeAt())
}
var buffer = new Uint8Array(array).buffer;
var that = this;
wx.writeBLECharacteristicValue({
deviceId: deviceId,
serviceId: serviceId,
characteristicId: charId,
value: buffer,
success: function (res) {
that.printLog("向蓝牙发送数据");
},
fail: function (res) {
console.log(res);
},
complete: function () {
}
})
},