1、初始化蓝牙模块。iOS 上开启主机/从机(外围设备)模式时需分别调用一次,并指定对应的 mode。
2、假如初始蓝牙报错errCode=10001 表示蓝牙功能不可用。
wx.openBluetoothAdapter({
success(res) {
console.log('调用成功接口回调函数。')
},
fail: (res) => {
console.log('返回失败接口,可根据返回错误的code码进行查看错误详情')
if(res.errCode === 10001){
console.log('未打开手机蓝牙,请打开手机蓝牙')
}
}
})
3、开始监听蓝牙适配器状态变化,查看手机蓝牙是否能正常进行通信
wx.onBluetoothAdapterStateChange(function(res) {
res.available //蓝牙适配器是否可用 返回类型为布尔值
res.discovering //蓝牙适配器是否处于搜索状态 返回类型为布尔值
})
4、开始获取本机蓝牙适配器状态
wx.getBluetoothAdapterState({
success(res)=>{
res.available //蓝牙适配器是否可用 返回类型为布尔值
res.discovering //是否正在搜索设备 返回类型为布尔值
}
})
5、上述都成功之后,开始搜索蓝牙
wx.startBluetoothDevicesDiscovery({
success(res) {
console.log('成功搜索到蓝牙', res)
},
fail: (res) => {
console.log(res, '搜索蓝牙失败')
}
})
6、搜索蓝牙成功后进行开始获取搜索到的蓝牙设备列表
wx.onBluetoothDeviceFound((res)=>{
// 将结果进行深拷贝(别问为什么,问就是坑出来的经验)
let re = JSON.parse(JSON.stringify(res))
let array=[] // 展示在页面上的列表
array.push({
name:re.name // 设备的名字
deviceId:re.deviceId // 设备的蓝牙id(点击列表连接蓝牙用的设备ID)
RSSI:re.RSSI // 当前蓝牙设备的信号强度,单位 dBm
connectable:re.connectable // 当前蓝牙设备是否可连接( Android 8.0 以下不支持返回该值 )
})
// 另外还有advertisData、advertisServiceUUIDs、localName、serviceData为蓝牙广播数据段中的数据不做介绍,没用过
***最后记得做去重处理,因为每搜索到一个设备就会执行一遍onBluetoothDeviceFound
***要是用push方法的话在结尾应添加去重处理
7、开始连接蓝牙
wx.createBLEConnection({
deviceId:deviceId //必填参数,蓝牙设备ID
success(res){
if(res.errMsg == "createBLEConnection:ok") {
console.log('连接成功')
setTimeout(() => {
// 执行连接后的操作,将deviceId带入 getBLEDeviceServices(deviceId)
},500)
}
},
fail(res){}
})
8、连接成功后进行获取所有设备的service(服务)并获取蓝牙低功耗设备某个服务中所有特征
//获取所有设备的service⬇️
wx.getBLEDeviceServices({
deviceId:deviceId //必填参数,蓝牙设备 id。需要已经通过 wx.createBLEConnection 建立连接
success:(res)=>{
res.services // 设备服务列表数组Array
res.services[i].uuid //蓝牙设备服务的 UUID
res.services[i].isPrimary //该服务是否为主服务
// 由于返回多个服务,不知道用哪个,进行循环挨个查看应该使用哪个服务⬇️获取蓝牙服务中所有特征
for(let i = 0; i<res.services.length; i++){
wx.getBLEDeviceCharacteristics({
deviceId: deviceId,
serviceId: res.services[i].uuid, // 每一项蓝牙设备服务的 UUID
success:(results)=>{
// 进行深拷贝
var re = JSON.parse(JSON.stringify(results));
// 返回示例,根据自己需求把其中需要的进行过滤
re={
// 设备的特征列表
characteristics:[{
uuid:String, // 蓝牙设备特征的 UUID
properties:{// 该特征支持的操作类型
read:Boolean,// 该特征是否支持 read(读) 操作
write:Boolean,// 该特征是否支持 write(写) 操作
notify:Boolean,// 该特征是否支持 notify(通知) 操作
indicate:Boolean,// 该特征是否支持 indicate 操作
writeNoResponse:Boolean,// 该特征是否支持无回复写操作
writeDefault:Boolean,// 该特征是否支持有回复写操作
},
}]
}
}
}
})
}
}
})
9、启用蓝牙低功耗设备特征值变化时的 notify 功能,订阅特征。
*** 注意:必须设备的特征支持 notify 或者 indicate 才可以成功调用。
wx.notifyBLECharacteristicValueChange({
state:true,// 是否启用 notify 必须是true 才可以获取信息
deviceId: deviceId, // 蓝牙设备 id
serviceId:String,// 蓝牙特征对应服务的 UUID 从8获取
characteristicId:String // 蓝牙特征的 UUID 从8获取
seccess:(res)=>{
// 成功之后进监听蓝牙设备的特征值变化,⬇️接收notifyBLECharacteristicValueChange推送的notification
wx.onBLECharacteristicValueChange((characteristic)=>{
//此时可以拿到蓝牙设备返回来的数据是一个ArrayBuffer类型数据
//假如蓝牙协议没有加密等要求直接转换⬇️
let nonce = this.ab2hex(characteristic.value)
})
}
})
// ArrayBuffer转16进制字符串示例
function ab2hex(buffer) {
let hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function(bit) {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('');
}
注意:必须设备的特征支持 write 才可以成功调用。
wx.writeBLECharacteristicValue({
deviceId: deviceId, // 蓝牙设备 id
serviceId:String, // 蓝牙特征对应服务的 UUID 必须支持 write
characteristicId:String, // 蓝牙特征的 UUID 必须支持 write
value:ArrayBuffer, // 蓝牙设备特征对应的二进制值
success: function(res) {},
fail: function(err) {}
})
// 转换为ArrayBuffer方法
arrBuffer(){
let buffer = new ArrayBuffer(4) // 定义一共多少个字节
let dataBuffer = new DataView(buffer) // new一个buffer实例
dataView.setUint8(0, 0)// 传入的十进制转换为ArrayBuffer格式
dataView.setUint8(0, 0)
dataView.setUint8(0, 0)
dataView.setUint8(0, 0)
return dataBuffer
}
注意:关闭蓝牙连接,也要关闭蓝牙设备,否则安卓下再次进入会搜索不到设备,除非关闭小程序进程再进才可以,IOS不受影响
// 断开与蓝牙低功耗设备的连接
wx.closeBLEConnection({
deviceId: deviceId,
success(res) {
console.log(res, '断开与蓝牙低功耗设备的连接。成功')
},
fail(res) {
console.log(res, '断开与蓝牙低功耗设备的连接。失败')
}
})
// 关闭蓝牙模块。调用该方法将断开所有已建立的连接并释放系统资源
wx.closeBluetoothAdapter({
success(res) {
console.log(res, '关闭蓝牙模块。成功')
},
fail(res) {
console.log(res, '关闭蓝牙模块。失败')
}
})
语法:result = expression1 ^ expression2
按位异或 是对两个表达式执行 按位异或,先将两个数据转化为二进制数,然后进行 按位异或运算,只要位不同结果为 1,否则结果为 0
例如:
let a = 5;
let b = 8;
let c = a ^ b;
console.log(c) // 13
解析:
a 转二进制数为:0101
b 转二进制数为:1000
那么按照 按位异或 运算之后得到:1101(相同为 0,不同为 1),得到 c 的值就是 13
也可以用于找出一个数组内的只出现一次的元素
let arr = [1, 3, 1, 2, 2, 7, 3, 6, 7]
// es5 解决方案
function fnc(arr){
let result = 0;
for(let i = 0; i < arr.length; i++){
result = result ^ arr[i];
}
return result;
}
// es6 解决方案
function fnc(arr){
return arr.reduce((a, b) => a ^ b, 0);
}