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);
	  }
	})
}
相关推荐
2501_915921439 小时前
iOS应用耗电测试:使用Energy Log、Keymob和Instruments进行性能监控与能源消耗分析
android·ios·小程序·https·uni-app·iphone·webview
行思理12 小时前
个推厂商应用开通指南
运维·服务器·uni-app·个推·uni-app push
郑州光合科技余经理14 小时前
同城商城源码:商品库和订单库怎么随包交付
android·java·开发语言·后端·uni-app·php·ai编程
肖老师xy14 小时前
uniapp实现带展开收起按钮文本多行省略
uni-app
Liu.77414 小时前
uniapp swiper 常见问题及修复
前端·uni-app
Liu.77416 小时前
uniapp scroll-view 常见问题及修复
uni-app
梦曦i18 小时前
Taro vs uni-app:技术路线与选型真相
uni-app·taro
多客:duokelijie18 小时前
婚恋交友小程序合规梳理:上线运营需要准备哪些资质与许可手续?
后端·mysql·微信小程序·前端框架·uni-app·php·持续部署
PedroQue992 天前
unix-utils v0.2.0 发布:modal 全端统一,自绘窗口解决输入框难题
前端·uni-app
2301_32241428044 天前
springboot学生课堂出勤统计系统15835-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·mysql·随机森林·微信小程序·uni-app·微信开发者工具·推荐算法