openBluetoothAdapter() {
uni.openBluetoothAdapter({ //打开蓝牙适配器接口
success: (res) => { //已打开
},
fail: err => { //未打开
uni.showToast({
icon: 'none',
title: '查看手机蓝牙是否打开'
});
}
})
}
startBluetoothDeviceDiscovery() {
uni.startBluetoothDevicesDiscovery({
success: (res) => {
// 发现外围设备
this.onBluetoothDeviceFound()
},
fail: err => {
console.log(err, '开始搜索蓝牙设备备错误信息')
}
})
}
onBluetoothDeviceFound() {
uni.onBluetoothDeviceFound((res) => {
// res.devices 是所有的设备
})
}
// item 是要连接的设备数据
createBLEConnection(item) {
let that = this;
uni.showLoading({
title: "连接中,请稍等",
mask: true,
});
uni.createBLEConnection({
deviceId: item.deviceId,
success(res) {
that.stopBluetoothDevicesDiscovery(); // 停止搜索蓝牙
that.getBLEDeviceServices(item); // 获取蓝牙的服务
},
fail(res) {
uni.showToast({
title: item.name + "蓝牙连接失败",
icon: "none",
});
uni.hideLoading()
}
});
}
stopBluetoothDevicesDiscovery() {
uni.stopBluetoothDevicesDiscovery({
success: e => {
this.loading = false
console.log('停止搜索蓝牙设备:' + e.errMsg);
},
fail: e => {
console.log('停止搜索蓝牙设备失败,错误码:' + e.errCode);
}
});
}
getBLEDeviceServices(item) {
setTimeout(() => {
uni.getBLEDeviceServices({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId: item.deviceId,
success: (res) => {
// 可以和做硬件的沟通 他会直接给你一个 也可以自己从res里取值
// res.services 是所有的服务
item["serviceId"] = '0000AE30-0000-1000-8000-00805F9B34FB';
// //进入特征
this.getBLEDeviceCharacteristics(item);
},
});
}, 2000);
}
getBLEDeviceCharacteristics(item) {
let that = this
setTimeout(() => {
uni.getBLEDeviceCharacteristics({
deviceId: item.deviceId,
serviceId: item.serviceId,
success: (res) => {
// res.characteristics 特征值列表
// 读写都需要用到特征值
},
fail: (res) => {
console.log(res);
},
});
}, 1000);
}
注意:必须设备的特征值支持 notify 或者 indicate 才可以成功调用。
notifyBLECharacteristicValueChange() {
let that = this
uni.notifyBLECharacteristicValueChange({
state: true, // 启用 notify 功能
// 下面三个都是上面获取到的,也可以由硬件工作人员直接提供
deviceId: ,
serviceId: ,
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
characteristicId: ,
success: (res) => {
this.listenValueChange()
},
fail: (res) => {
console.log("启用 notify 功能失败", res);
uni.hideLoading();
},
});
},
必须先启用 notifyBLECharacteristicValueChange 接口才能接收到设备推送的 notification。
listenValueChange() {
uni.onBLECharacteristicValueChange(res => {
let resHex = this.ab2hex(res.value);
let result = this.hexCharCodeToStr(resHex);
// result 硬件返回值
})
},
ab2hex(buffer, split='') {
var hexArr = Array.prototype.map.call(new Uint8Array(buffer), function(bit) {
return ('00' + bit.toString(16)).slice(-2)
})
return hexArr.join(split)
},
write(hexadecimal){
const buf = new ArrayBuffer(hexadecimal.length)
const dataView = new DataView(buf)
// 有字母的必须转16进制
// 例如 ["FF", "AA", "03", "00", "40", "02", "00", "45", "FE"]
// ['06', '01', '01', '01', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00', '00','00'] 这种不转也能识别
for (var i = 0; i < hexadecimal.length; ++i) {
dataView.setUint8(i,parseInt(hexadecimal[i],16) )
}
return new Promise((resolve, reject) => {
uni.writeBLECharacteristicValue({
// 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
deviceId: ,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId: ,
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
characteristicId: ,
// 这里的value是ArrayBuffer类型
value: buf,
success(res) {
console.log('writeBLECharacteristicValue success', res)
},
fail(res) {
console.log('失败', res)
},
})
})
},