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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/136856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

02-PostgreSQL的基本使用

一、数据库操作 ①: 登录到数据库 psql -U postgres -d postgres -h 127.0.0.1②:查看所有数据库 \l③: 创建数据库 # 创建一个名为 mydb 的数据库 create database mydb;④:切换数据库 # \c 数据库名 \c mydb⑤:删除数据库 # 删除前 先确保数据库没有被连接 drop databa…

Linux学习笔记之五(父子进程、孤儿进程、僵尸进程、守护进程)

Linux 1、进程1.1、进程的六种状态1.2、创建子进程1.3、添加子进程任务1.4、孤儿进程、僵尸进程、守护进程1.4.1、避免僵尸进程1.4.2、创建守护进程1.4.3、杀死守护进程 1.5、综合练习 1、进程 进程可以简单的理解为一个正在执行的程序&#xff0c;它是计算机系统中拥有资源和…

小红书母婴博主投放技巧是什么,怎么避免无用功

如今&#xff0c;随着互联网的发展&#xff0c;母婴博主和社交媒体成为了很多妈妈们&#xff0c;获取育儿知识和建立社交圈的重要途径。今天为大家分享下小红书母婴博主投放技巧是什么&#xff0c;怎么避免无用功&#xff01; 一、优质的母婴博主在哪里 我们都知道&#xff0c;…

数据中台之数据分析

效果界面 技术方案 Notebook集成 在您的数据平台上,创建一个能够与Jupyter Notebook通讯的服务。通过Jupyter Notebook的HTTP API与Notebook实例进行交互,执行代码、获取输出等。用户界面 在数据开发/数据分析的代码框右上方,添加一个机器人样式的图标,用户点击后可以调起…

verdi如何打开时可以加载配置比如字体

打开tcl使能 找到配置字体的命令 其实其他有需要的文件配置都可以在这里找到对应的指令 存储文件 新建verdi001.tcl文件 输入想要调整的字体以及大小 verdiSetFont -font "Bitstream Vera Sans" -size "18" verdiSetFont -monoFont "Courier&q…

CPU眼里的 class vs struct

转自微信公众号《阿布编程》 “我们能用C语言实现C的&#xff1a;继承、成员函数、虚函数吗&#xff1f;不仅可以&#xff0c;而且还一摸一样&#xff01;” 01 — 提出问题 说到C和C的差别&#xff0c;大家很容易联想到面向对象和面向过程的差异。毕竟类&#xff0c;也就是…

Java @NotBlank反射校验

在实际项目中&#xff0c;遇到了导入数据校验是否为空的情况&#xff0c;只使用Javax的NotBlank注解并没有什么用&#xff0c;还需要使用工具类校验&#xff0c;具体代码如下&#xff1a; pojo代码如下&#xff1a; import com.alibaba.excel.annotation.ExcelIgnore; import …

多篇论文介绍-摘要

论文地址https://arxiv.org/pdf/2301.10051.pdf 目录 01CIEFRNet&#xff1a;面向高速公路的抛洒物检测算法 02改进 YOLOv5 的 PDC 钻头复合片缺损识别 03 基于SimAM注意力机制的DCN-YOLOv5水下目标检测 04 基于改进YOLOv7-tiny 算法的输电线路螺栓缺销检测 ​编辑05 基于改进Y…

亚马逊鲲鹏系统能做什么

亚马逊鲲鹏系统是一款能绕过亚马逊智能检测&#xff0c;完全模拟人类真实行为&#xff0c;通过模拟真实的人流量来帮助你提升你的产品排名&#xff0c;让你的产品出现在搜索首页&#xff0c;从而快速提高你的销售业绩的营销工具&#xff01; 主要的功能有批量注册买家号、AI智能…

【原创学位论文】基于python和定向爬虫的商品比价系统.docx

基于python和定向爬虫的商品比价系统 Price Comparison System for Products Based on Python and Targeted Web Crawling 目录 目录 2 摘要 3 关键词 3 第一章 绪论 4 1.1 研究背景 4 1.2 研究意义 5 1.3 国内外研究现状 7 1.4 本文主要工作和章节安排 8 第二章 Python基础…

新生儿疝气:原因、科普和注意事项

引言&#xff1a; 新生儿疝气是一种在婴儿中相对较常见的状况&#xff0c;很多新父母可能对这一现象感到困惑和焦虑。疝气发生时&#xff0c;内腹腔的一部分可能穿过腹壁的弱点&#xff0c;导致腹部出现凸起。本文将科普新生儿疝气的原因&#xff0c;提供相关信息&#xff0c;…

计算机基础知识48

web应用程序 # Django框架是一款专门用来开发web应用的框架 # Web应用程序是一种可以通过浏览器访问的应用程序, B/S架构 案例&#xff1a;淘宝网、京东网... # 应用程序有两种模式: C/S&#xff1a;客户端/服务器端程序&#xff0c;这类程序一般独立运行 B/S&#xff1…

C++跨DLL内存所有权问题探幽(二)CRT中MT和MD混用导致的所有权问题

0xC0000374: 堆已损坏。 (参数: 0x00007FFA1E9787F0)。 _Mem 是 nullptr 我在开发的过程中有遇到上面两个东西的bug&#xff0c;百思不得其解&#xff0c;最后才发现这个和两个DLL中的MT和 MD选项有关系。 具体情境时&#xff1a;我在一个MT编译的DLL A中引用了一个MD编译的D…

数据结构与算法C语言版学习笔记(5)-串,匹配算法、KMP算法

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、串的定义二、串的存储结构1.顺序结构2.链式结构 三、串的朴素的模式匹配算法&#xff08;暴力匹配算法&#xff09;1.背景2.假设我们要从下面的主串 S"…

“最强”机器学习辅助!利用自然语言让机器人更好地理解开放性世界

原创 | 文 BFT机器人 想象一下&#xff0c;你正在国外拜访朋友&#xff0c;打开他的冰箱看看有没有能够制作一顿美味早餐的食材。最初&#xff0c;冰箱里的许多物品对你来说都很陌生&#xff0c;每个物品的包装都是你不熟悉的。你开始试图理解每个物品的用途&#xff0c;并根据…

重温设计模式之什么是设计模式?

设计面向对象软件比较困难&#xff0c;而设计可复用的面向对象软件就更加困难。你必须找到相关的对象&#xff0c;以适当的粒度将它们归类&#xff0c;再定义类的接口和继承层次&#xff0c;建立对象之间的基本关系。你的设计应该对手头的问题有针对性&#xff0c;同时对将来的…

万界星空科技MES系统软件体系架构及应用

MES系统是数字化车间的核心。MES通过数字化生产过程控制&#xff0c;借助自动化和智能化技术手段&#xff0c;实现车间制造控制智能化、生产过程透明化、制造装备数控化和生产信息集成化。生产管理MES系统主要包括车间管理系统、质量管理系统、资源管理系统及数据采集和分析系统…

go语言相关bug

第一个bug itcastitcast:/home/jian/share/src/go-test/homeweb-client$ go mod tidy go: finding module for package github.com/micro/go-grpc go: found github.com/micro/go-grpc in github.com/micro/go-grpc v1.0.1 go: homeweb-client/handler importsgithub.com/micr…

Ubuntu开机无法进入系统,文件根系统目录空间不足导致?

前言&#xff1a; 自己电脑上装的是Win11和Ubuntu20双系统&#xff0c;平时就是切换着用。 偶然有次&#xff0c;Ubuntu提示文件根系统目录空间不足&#xff0c;自己没在意。 结果下次开机进入Ubuntu时候&#xff0c;芭比Q了。。进不了系统 这样的事情发生很多次了&#xff0c;…

学者观察 | 数字经济中长期发展中的区块链影响力——清华大学柴跃廷

导语 区块链是一种全新的分布式基础架构与计算范式&#xff0c;既能利用非对称加密和冗余分布存储实现信息不可篡改&#xff0c;又可以利用链式数据结构实现数据信息可溯源。当前&#xff0c;区块链技术已成为全球数据交易、金融结算、国际贸易、政务民生等领域的信息基础设施…