UNIAPP框架中使用BLE蓝牙连接

编程入门 行业动态 更新时间:2024-10-13 22:19:37

UNIAPP框架中使用BLE<a href=https://www.elefans.com/category/jswz/34/1768306.html style=蓝牙连接"/>

UNIAPP框架中使用BLE蓝牙连接

概述

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

搜索蓝牙设备

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

选择蓝牙设备

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

发送命令

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')) { // 帧结束标志位E9console.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 ArrayBufferreturn Array.prototype.map.call(new Uint8Array(buffer), x => ('00' + x.toString(16)).slice(-2)).join('');
}

关闭连接

function closeConn(deviceId){uni.closeBLEConnection({deviceId,success(res) {console.log('uni.closeBLEConnection success', res);},fail(res) {console.log('uni.closeBLEConnection fail', res);}})
}

更多推荐

UNIAPP框架中使用BLE蓝牙连接

本文发布于:2023-11-16 01:32:07,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1611065.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:蓝牙   框架   UNIAPP   BLE

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!