UNIAPP框架中使用BLE蓝牙连接

概述

  1. 蓝牙连接包括搜索蓝牙设备,选择蓝牙设备,监听设备特征值,发送命令,断开蓝牙连接5种基础方法。
  2. Uni-App BLE 文档地址
  3. 搜索设备时

搜索蓝牙设备

javascript 复制代码
function discoveryDevices(pushDevice){
	console.log('enter search ble bluetooth func');
	// 初始化蓝牙模块
	uni.openBluetoothAdapter({
	  success(res) {
	    // console.log("uni.openBluetoothAdapter success:", res);
		if (res && res.errMsg && res.errMsg === 'openBluetoothAdapter:ok') {
			startScanDevice();
			startListenDeviceFound(pushDevice);
		}
	  },
	  fail(res) {
		console.log("uni.openBluetoothAdapter fail:", res);
		switch (res.errCode) {
			case 10001:
				console.log("uni.openBluetoothAdapter faile:当前蓝牙适配器不可用");break;
			default:
		}
	  }
	})
}

function startScanDevice() {
	uni.startBluetoothDevicesDiscovery({
	  success(res) {
	    // console.log("uni.startBluetoothDevicesDiscovery success:", res);
	  },
	  fail(res) {
		console.log("uni.startBluetoothDevicesDiscovery fail:", res);
	  }
	})
}

function startListenDeviceFound(pushDevice) {
	uni.onBluetoothDeviceFound(function (res) {
	  // console.log('new device list has founded', res);
	  let devices = res.devices.map(item => {
		  return {
			  name: item.localName || item.name,
			  value: item.deviceId
		  }
	  }).filter(item => {return item.name});
	  devices.forEach(item => {
		  let vaildArray = deviceListXianXY.filter(item2 => {
			  return item2.value === item.value;
		  })
		  if (vaildArray.length === 0) {
			  deviceListXianXY.push(item);
			  pushDevice(item);
		  }
	  });
	})
}

选择蓝牙设备

javascript 复制代码
function connDevice(deviceId){
	console.log("choosed deviceId: ", deviceId);

	uni.createBLEConnection({
	  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
	  deviceId,
	  success(res) {
		// console.log("uni.createBLEConnection success:", res);
		setTimeout(() => {
			getDeviceService(deviceId, () => {
				startNotify(deviceId);
			})
		}, 1000) // 这里设置延时是因为连接完成后立即获取不到服务信息
		stopScanDevice();
	  },
	  fail(res) {
		console.log("uni.createBLEConnection fail:", res);
	  }
	})
}

// 关闭扫描
function stopScanDevice(){
	uni.stopBluetoothDevicesDiscovery({
		success(res) {
		  console.log("uni.stopBluetoothDevicesDiscovery success:", res);
		}
	})
}

function getDeviceService(deviceId, callback) {
	uni.getBLEDeviceServices({
	  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
	  deviceId,
	  success(res) {
	    // console.log("uni.getBLEDeviceServices success:", res);
		setTimeout(() => {
			getDeviceServcieCharacteristics(deviceId, callback);
		}, 20);
	  },
	  fail(res) {
		console.log("uni.getBLEDeviceServices fail:", res);
	  }
	})
}

function getDeviceServcieCharacteristics(deviceId, callback) {
	uni.getBLEDeviceCharacteristics({
	  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
	  deviceId,
	  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
	  serviceId,
	  success(res) {
	    // console.log("uni.getDeviceServcieCharacteristics success:", res);
		if (callback) {
			callback();
		}
	  },
	  fail(res) {
		console.log("uni.getDeviceServcieCharacteristics fail:", res);
	  }
	})
}

function startNotify(deviceId) {
	console.log("enter startNotify");
	uni.notifyBLECharacteristicValueChange({
	  state: true, // 启用 notify 功能
	  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
	  deviceId,
	  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
	  serviceId,
	  // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
	  characteristicId: characteristicIdNotify,
	  success(res) {
		// console.log("uni.notifyBLECharacteristicValueChange success:", res);
	  },
	  fail(res) {
		console.log("uni.notifyBLECharacteristicValueChange fail:", res);
	  }
	})
}

发送命令

javascript 复制代码
function writeCommand(deviceId,command,ck,failfun){
	//监听
	startListenble(function (buf) {
		ck(buf)
	});
	console.log("command===",command,"长度",command.length);
	const subCommandArray = splitArr(command, 20); //安卓系统中默认每包最大字节数为20,现在版本已经支持设置mtu,但有些框架不支持,所以还是使用这种方式。
	sendCommand(deviceId, serviceId, characteristicId2, subCommandArray, 0);
}

function sendCommand(deviceId, serviceId, characteristicId2, commands, index, callback) {
	uni.writeBLECharacteristicValue({
	  // 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
	  deviceId,
	  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
	  serviceId,
	  // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
	  characteristicId: characteristicId2,
	  // 这里的value是ArrayBuffer类型
	  value: commands[index],
	  success(res) {
	    // console.log('uni.writeBLECharacteristicValue success', res.errMsg);
		if (index >= commands.length - 1) {
			if (callback) {
				callback();
			}
		} else {
			// 这里使用递归是因为使用循环可能出现发送数据错误的情况
			sendCommand(deviceId, serviceId, characteristicId2, commands, ++index, callback);
		}
	  },
	  fail(res) {
		console.log('uni.writeBLECharacteristicValue fail', res.errMsg);
	  }
	})
}

function startListenble(callback){
	let resultBuf = "";
	uni.onBLECharacteristicValueChange(function (res) {
	  // console.log(`characteristic ${res.characteristicId} has changed, now is ${res.value}`)
	  const buf = buf2hex(res.value)
	  console.log("buf", buf);
	  resultBuf += buf;
	  if (resultBuf.endsWith('e9')) { // 帧结束标志位E9
		console.log("响应帧",resultBuf);
		callback(resultBuf);
	  }
	})
}

function splitArr(ar, size = 1) {
	let index = 0;
	let res = [];
	while (index < ar.length) {
		res.push(ar.slice(index, (index+size)));
		index += size;
	}
	return res;
}

function buf2hex(buffer) {// buffer is an ArrayBuffer
	return Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}

关闭连接

javascript 复制代码
function closeConn(deviceId){
	uni.closeBLEConnection({
	  deviceId,
	  success(res) {
	    console.log('uni.closeBLEConnection success', res);
	  },
	  fail(res) {
		console.log('uni.closeBLEConnection fail', res);
	  }
	})
}
相关推荐
new出一个对象13 小时前
uniapp接入BMapGL百度地图
javascript·百度·uni-app
new出一个对象13 小时前
uniapp接入高德地图
uni-app
dccose15 小时前
vue3 uniapp 扫普通链接或二维码打开小程序并获取携带参数
小程序·uni-app
上优20 小时前
uniapp 选择 省市区 省市 以及 回显
大数据·elasticsearch·uni-app
耶啵奶膘1 天前
uniapp+vue2全局监听退出小程序清除缓存
小程序·uni-app
我开心就好o2 天前
uniapp点左上角返回键, 重复来回跳转的问题 解决方案
前端·javascript·uni-app
Random_index2 天前
#Uniapp篇:支持纯血鸿蒙&发布&适配&UIUI
uni-app·harmonyos
初遇你时动了情2 天前
uniapp 城市选择插件
开发语言·javascript·uni-app
小小黑0072 天前
uniapp+vue3+ts H5端使用Quill富文本插件以及解决上传图片反显的问题
uni-app·vue
草字2 天前
uniapp input限制输入负数,以及保留小数点两位.
java·前端·uni-app