建议:写之前先在uniapp官网中看一下蓝牙的流程,帮助你更好的理解低功耗蓝牙
第一步你要想用蓝牙连接你就得先打开蓝牙吧
openPhoneBluetooth() {
var main, BluetoothAdapter, BAdapter;
switch (uni.getSystemInfoSync().platform) {
case "android":
// Android平台: plus.android.*
main = plus.android.runtimeMainActivity();
BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");
BAdapter = BluetoothAdapter.getDefaultAdapter()
if (!BAdapter.isEnabled()) {
this.IsBluetoothOpen = BAdapter.enable()
} else {
this.IsBluetoothOpen = BAdapter.enable()
};
console.log(this.IsBluetoothOpen)
uni.setStorageSync("IsBluetoothOpen", this.IsBluetoothOpen)
// uni.setStorageSync("IsBluetoothOpen", this.IsBluetoothOpen)
// console.log(this.IsBluetoothOpen);
if (this.IsBluetoothOpen) {
// console.log(this.IsBluetoothOpen);
this.initBlue()
}
break;
case "ios":
// iOS平台: plus.ios.*
console.log("运行在ios")
break;
default:
// 其它平台
console.log("运行在其他平台")
break;
}
},
我建议你把蓝牙的状态保存下来
如果蓝牙打开就调用initBlue方法(初始化蓝牙)
第二步
uni.startBluetoothDevicesDiscovery({
success: res => {
},
fail: err => {
}
})
第三步
uni.onBluetoothDeviceFound(res => {
//不重复,有名称,就添加到devicesList中
if (
res.devices[0].name &&
!devicesList.some(item => {
return item.deviceId === res.devices[0].deviceId;
})
) {
devicesList.push(res.devices[0]);
}
});
前三步你就可以把附近的蓝牙都找到了
第四步 手动连接蓝牙
createBLEConnection(deviceId) {
return new Promise((resolve, reject) => {
uni.createBLEConnection({
deviceId,
success: async res => {
},
fail: err => {
}
})
});
}
接着你需要获取uuid
getBLEDeviceServices(deviceId, serviceId) {
let self = this;
return new Promise((resolve, reject) => {
setTimeout(() => {
uni.getBLEDeviceServices({
deviceId,
success: async res => {
// 未传则直接返回所有服务
if (!serviceId) {
return resolve(res.services)
}
let sure = false;
for (let i = 0; i < res.services.length; i++) {
if (res.services[i].uuid.toUpperCase().indexOf(serviceId) !=
-1) {
sure = true
break;
}
}
sure ? resolve(true) : reject({
errMsg: '设备功能不匹配'
})
},
fail: err => {
reject(err);
},
})
}, 1000)
});
}
连接成功后你要启动notify功能
notifyBLECharacteristicValueChange(deviceId, serviceId, characteristicId) {
return new Promise((resolve, reject) => {
uni.notifyBLECharacteristicValueChange({
state: true, // 启用 notify 功能
deviceId,
serviceId,
characteristicId,
success: async res => {
},
fail(err) {
}
});
})
}
成功后你要接收设备传来的消息
onBLECharacteristicValueChange() {
let receivedDataArray = []; // 用于存储接收到的数据的数组
uni.onBLECharacteristicValueChange((res) => {
let resHex = this.ab2hex(res.value);
let result = this.hexCharCodeToStr(resHex);
console.log(result);
项目要求 我这边转十六进制了
});
},
ab2hex(buffer) {
const hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('');
},
hexCharCodeToStr(hexCharCodeStr) {
var trimedStr = hexCharCodeStr.trim();
var rawStr = trimedStr.substr(0, 2).toLowerCase() === "0x" ? trimedStr.substr(2) : trimedStr;
var len = rawStr.length;
if (len % 2 !== 0) {
console.log("存在非法字符!");
return "";
}
var curCharCode;
var resultStr = [];
for (var i = 0; i < len; i = i + 2) {
curCharCode = parseInt(rawStr.substr(i, 2), 16);
resultStr.push(String.fromCharCode(curCharCode));
}
return resultStr.join("");
},
当连接成功后最好关闭搜索,要不然太耗性能了
stopBluetoothDevicesDiscovery() {
return new Promise((resolve, reject) => {
uni.stopBluetoothDevicesDiscovery({
success: res => {
},
fail: err => {
}
})
});
}
然后你如何给设备发指令呢
// 写入数据,16进制的
writeBLECharacteristicValue(_message) {
console.log("写入的数据:", _message);
// 向蓝牙设备发送一个0x00的16进制数据
let msg = _message;
const buffer = new ArrayBuffer(msg.length);
const dataView = new DataView(buffer);
console.log(msg);
// dataView.setUint8(0, 0)
for (var i = 0; i < msg.length; i++) {
dataView.setUint8(i, msg.charAt(i).charCodeAt())
}
uni.writeBLECharacteristicValue({
deviceId
serviceId
characteristicId
value: buffer,
success(res) {
console.log('writeBLECharacteristicValue success', res.errMsg);
},
fail(res) {
console.log("写入失败", res)
}
})
},
然后设备给你会回消息在 onBLECharacteristicValueChange方法中可以看到
低功耗蓝牙就是这样,不明白的可以私信我
请各位观众老爷,看完不要白嫖 收藏!!!!点赞!!!!关注!!!!