【uniapp 微信小程序蓝牙自我记录】

uniapp 微信小程序蓝牙自我记录

  • 一、蓝牙连接步骤
  • 二、向蓝牙低功耗设备特征值中写入二进制数据
  • 最后关闭设备
    • 异或加密记录

一、蓝牙连接步骤

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);
}

【uniapp 微信小程序蓝牙自我记录】_第1张图片

你可能感兴趣的:(uniapp,微信小程序,小程序)