【uniapp蓝牙】基于native.js链接ble和非ble蓝牙
【uniapp蓝牙】基于native.js链接ble和非ble蓝牙
uniapp不是仅支持低功耗蓝牙(基础蓝牙通讯不支持),有些可能需要基础蓝牙。我现在同步我的手机蓝牙列表低功耗,基础蓝牙都支持
/*** @author wzj* 通用蓝牙模块封装* 搜索 ble 和非 ble 蓝牙设备*/
class Ble {constructor() {// false 蓝牙关闭, true 蓝牙打开this.bluetooth = falsethis.systemPlatform = uni.$uv.os()this.context = plus.android.importClass('android.content.Context')this.locationManager = plus.android.importClass('android.location.LocationManager')this.main = plus.android.runtimeMainActivity()this.mainSvr = this.main.getSystemService(this.context.LOCATION_SERVICE)this.Intent = plus.android.importClass('android.content.Intent')this.Settings = plus.android.importClass('android.provider.Settings')this.IntentFilter = plus.android.importClass('android.content.IntentFilter')this.BluetoothAdapter = plus.android.importClass('android.bluetooth.BluetoothAdapter')this.BluetoothDevice = plus.android.importClass('android.bluetooth.BluetoothDevice')this.UUID = plus.android.importClass('java.util.UUID')// 未配对蓝牙设备列表this.unpairedList = []// 已配对蓝牙设备列表this.pairedList = []}// 监听蓝牙状态改变listenerConnection() {plus.bluetooth.onBLEConnectionStateChange(function (e) {console.log('connection state changed: ' + JSON.stringify(e))})}// 提示框showToast(title, options = {}) {uni.showToast({title,...options})}// 初始化蓝牙模块openBluetoothAdapter() {this.getBluetoothState()if (!this.bluetooth) {this.showToast('请先打开蓝牙!', {icon: 'error',duration: 2000})return false}if (this.systemPlatform !== 'android') {this.showToast('蓝牙功能只支持Android系统!', {icon: 'error',duration: 2000})return false}// 定位检测this.checkLocation()}// gps是否开启isProviderEnabled() {return this.mainSvr.isProviderEnabled(this.locationManager.GPS_PROVIDER)}// 建立连接createBLEConnection(mac_address) {const that = thisvar BAdapter = this.BluetoothAdapter.getDefaultAdapter()let device = BAdapter.getRemoteDevice(mac_address)plus.android.importClass(device)let bdevice = new this.BluetoothDevice()// 判断是否配对const getBondState = device.getBondState() === bdevice.BOND_NONEif (!getBondState) {console.log('已配对蓝牙设备')return true}// 参数如果跟取得的mac地址一样就配对const addressSame = device.getAddress() === mac_addressif (!addressSame) return false// 配对命令const createBond = device.createBond()if (!createBond) return falselet cha = setInterval(() => {if (device.getBondState() === bdevice.BOND_BONDED) {clearInterval(cha)// 删除未配对蓝牙,添加到已配对that.unpairedList.map((item, i) => {if (item.address === mac_address) {that.pairedList.push(item)that.unpairedList.splice(i, 1)}})}}, 1000)}// 执行蓝牙打印blueToothPrint(mac_address, dataToSend) {if (!mac_address) {this.showToast('请选择蓝牙打印机', {icon: 'error',})return false}let uuid = this.UUID.fromString('00001101-0000-1000-8000-00805f9b34fb')let BAdapter = this.BluetoothAdapter.getDefaultAdapter()let device = BAdapter.getRemoteDevice(mac_address)plus.android.importClass(device)let bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid)plus.android.importClass(bluetoothSocket)if (bluetoothSocket.isConnected()) {let outputStream = bluetoothSocket.getOutputStream()plus.android.importClass(outputStream)let bytes = plus.android.invoke(dataToSend, 'getBytes', 'gbk')console.log('发送数据完成', bytes)outputStream.write(bytes)outputStream.flush()// 这里关键device = null// 必须关闭蓝牙连接否则意外断开的话打印错误bluetoothSocket.close()} else {console.log('检测到设备未连接,尝试连接....')bluetoothSocket.connect()}}// 定位检测checkLocation() {const GPS_PROVIDER = this.isProviderEnabled()if (GPS_PROVIDER) {this.searchDevices()return true}uni.showModal({title: "提示",content: "请打开定位服务功能",showCancel: false, // 不显示取消按钮success() {if (GPS_PROVIDER) {this.showToast('GPS功能已开启!', {icon: 'success',})return true}const intent = new this.Intent(this.Settings.ACTION_LOCATION_SOURCE_SETTINGS)// 打开系统设置GPS服务页面this.main.startActivity(intent)}})return false}// 开始搜寻附近的蓝牙外围设备startBluetoothDevicesDiscovery() {const that = thislet main = this.mainlet BluetoothAdapter = this.BluetoothAdapteruni.startBluetoothDevicesDiscovery({success: (res) => {let BAdapter = BluetoothAdapter.getDefaultAdapter()const isEnabled = BAdapter !== null && !BAdapter.isEnabled()if (isEnabled) {const intent = new this.Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)main.startActivityForResult(intent, 200)}uni.showLoading({title: "开始搜索设备",})let filter = new this.IntentFilter()let bdevice = new this.BluetoothDevice()let BluetoothDevice = this.BluetoothDevice// 开启搜索BAdapter.startDiscovery()// 获取配得和未配对蓝牙回调let receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {//实现onReceiver回调函数onReceive: function (context, intent) {// 通过 intent 实例引入 intent 类,方便以后的‘.’操作plus.android.importClass(intent)let BleDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE)// 获取已经配对的蓝牙设备const getBondState = BleDevice.getBondState() !== bdevice.BOND_NONEif (getBondState) {// 已配对蓝牙设备const addressLen = that.unpairedList.filter(item => item.address === BleDevice.getAddress())if (addressLen.length > 0) returnthat.unpairedList.push({name: BleDevice.getName(),address: BleDevice.getAddress(),})}const action = intent.getAction() === "android.bluetooth.adapter.action.DISCOVERY_FINISHED"if (action) {// 取消监听main.unregisterReceiver(receiver)uni.hideLoading()return false}const isBondState = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE).getBondState() === 10if (isBondState) {const name = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE).getName()const address = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE).getAddress()var y = 0const unpairedListLength = that.unpairedList.lengthfor (let x = 0; x < unpairedListLength; x++) {let isAddress = that.unpairedList[x].address === addressif (isAddress) {y++}}if (y > 0) {return y = 0}if (!name) {return}that.unpairedList.push({name,address,})}}})filter.addAction(bdevice.ACTION_FOUND)filter.addAction(BAdapter.ACTION_DISCOVERY_STARTED)filter.addAction(BAdapter.ACTION_DISCOVERY_FINISHED)filter.addAction(BAdapter.ACTION_STATE_CHANGED)main.registerReceiver(receiver, filter)},fail: (res) => {console.log('startBluetoothDevicesDiscovery fail', res)},})}// 搜索蓝牙设备searchDevices() {this.openBluetooth(() => {if (!this.bluetooth) {return false}this.startBluetoothDevicesDiscovery()})}// 打开蓝牙模块openBluetooth(callBack) {const that = thisuni.openBluetoothAdapter({success(res) {uni.getBluetoothAdapterState({success(res) {that.bluetooth = res.availablecallBack && callBack()}})},fail(res) {console.log('openBluetoothAdapter fail', res)}})}// 获取蓝牙状态getBluetoothState() {/* 判断是否打开蓝牙 */this.openBluetooth()}
}export default Ble
相关文章:
【uniapp蓝牙】基于native.js链接ble和非ble蓝牙
【uniapp蓝牙】基于native.js链接ble和非ble蓝牙 uniapp不是仅支持低功耗蓝牙(基础蓝牙通讯不支持),有些可能需要基础蓝牙。我现在同步我的手机蓝牙列表低功耗,基础蓝牙都支持 /*** author wzj* 通用蓝牙模块封装* 搜索 ble 和非…...
.NET Core 各版本特点、差异及适用场景详解
随着 .NET Core 的不断发展,微软推出了一系列版本来满足不同场景下的开发需求。这些版本随着时间的推移逐渐演变为统一的 .NET 平台(从 .NET 5 开始)。本文将详细说明每个版本的特点、差异以及适用场景,帮助开发者更好地选择和使用…...
Linux中自动检测并定时关闭KDialog程序
自动检测并关闭对话框的程序示例 创建并打开KDialog的脚本自动检测并定时关闭KDialog的脚本 创建并打开KDialog的脚本 #!/bin/bash kdialog --msgbox "demo"自动检测并定时关闭KDialog的脚本 #!/bin/bash# Continuously check for kdialog dialog while true; do# …...
CSS学习记录12
CSS浮动 CSSfloat属性规定元素如何浮动 CSSclear属性规定哪些元素可以在清除的元素旁边以及在哪一侧浮动。 float属性 float属性用于定位和格式化内容,例如让图像向左浮动到容器的文本那里。 float属性可以设置以下值之一: left - 元素浮动到其容器…...
【Java基础面试题016】JavaObject类中有什么主要方法,作用是什么?
equals() 作用:用于比较两个对象是否相等。默认实现比较对象的内存地址,即判断两个引用是否指向同一个对象 使用:通常会重写此方法来比较对象的内容 hashCode() 作用:返回对象的哈希值,用整数表示对象。 使用&…...
实践环境-docker安装mysql8.0.40步骤
一、docker安装mysql 8.0.40版本 1、检索镜像版本 docker search mysql:8.0.40 NAME DESCRIPTION STARS OFFICIAL mysql MySQL is a widely used, open-source relation… …...
边缘智能创新应用大赛获奖作品系列一:智能边缘计算✖软硬件一体化,开启全场景效能革命新征程
边缘智能技术快速迭代,并与行业深度融合。它正重塑产业格局,催生新产品、新体验,带动终端需求增长。为促进边缘智能技术的进步与发展,拓展开发者的思路与能力,挖掘边缘智能应用的创新与潜能,高通技术公司联…...
决策树的生成与剪枝
决策树的生成与剪枝 决策树的生成生成决策树的过程决策树的生成算法 决策树的剪枝决策树的损失函数决策树的剪枝算法 代码 决策树的生成 生成决策树的过程 为了方便分析描述,我们对上节课中的训练样本进行编号,每个样本加一个ID值,如图所示…...
蓝桥杯算法训练 黑色星期五
题目描述 有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又是星期五的情形&am…...
MySQL存储引擎-存储结构
Innodb存储结构 Buffer Pool(缓冲池):BP以Page页为单位,页默认大小16K,BP的底层采用链表数据结构管理Page。在InnoDB访问表记录和索引时会在Page页中缓存,以后使用可以减少磁盘IO操作,提升效率。 ○ Page根据状态可以分…...
理解torch函数bmm
基本信息 功能描述 torch.bmm 是 PyTorch 中的一个函数,用于执行批量矩阵乘法(Batch Matrix Multiplication)。它适用于处理一批矩阵的乘法操作,特别适合于深度学习任务中的场景,比如卷积神经网络中的某些层。 参数…...
2024 年的科技趋势
2024 年在科技领域有着诸多重大进展与突破。从人工智能、量子计算到基因组医学、可再生能源以及新兴技术重塑了众多行业。随着元宇宙等趋势的兴起以及太空探索取得的进步,未来在接下来的岁月里有望继续取得进展与突破。让我们来探讨一下定义 2024 年的一些关键趋势&…...
win服务器的架设、windows server 2012 R2 系统的下载与安装使用
文章目录 windows server 2012 R2 系统的下载与安装使用1 windows server 2012 的下载2 打开 VMware 虚拟机软件(1)新建虚拟机(2)设置虚拟机(3)打开虚拟机 windows server 2012(4)进…...
leetcode45.跳跃游戏II
标签:动态规划 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处:返回到达 nums[n - 1] 的最小跳跃次数。…...
边缘智能创新应用大赛获奖作品系列三:边缘智能强力驱动,机器人天团花式整活赋能千行百业
边缘智能技术快速迭代,并与行业深度融合。它正重塑产业格局,催生新产品、新体验,带动终端需求增长。为促进边缘智能技术的进步与发展,拓展开发者的思路与能力,挖掘边缘智能应用的创新与潜能,高通技术公司联…...
基于语义的NLP任务去重:大语言模型应用与实践
引言 在自然语言处理(NLP)任务中,数据质量是模型性能的关键因素之一。重复或冗余的数据会导致模型过度拟合或浪费计算资源,特别是在大语言模型(如 BERT、GPT 系列等)训练和推理阶段。传统的基于字符匹配的…...
使用阿里云Certbot-DNS-Aliyun插件自动获取并更新免费SSL泛域名(通配符)证书
进入nginx docker,一般是Alpine Linux系统 1. 依次执行命令: sudo docker-compose exec nginx bashapk updateapk add certbot apk add --no-cache python3 python3-dev build-baseapk add python3 py3-pippip3 install --upgrade pippip3 install certbot-dns-ali…...
Node.js安装配置+Vue环境配置+创建一个VUE项目
目录 安装Node.js搭建VUE环境 安装Node.js 下载 测试是否安装成功 在目录下新建两个文件夹 管理员打开cmd npm config set prefix "D:\Software\nodejs\node_global" npm config set cache "D:\Software\nodejs\node_cache"将默认的 C 盘下【 AppData\…...
“TA”说|表数据备份还原:SQLark 百灵连接助力项目部署验收
💬 南飞雁|应用开发工程师 有些重要项目的部署验收,会在生产环境完成,验收完成后,又需要把这部分数据清空。这时就需要对数据表进行备份和还原,虽然可以通过命令直接实现,但是有一些操作门槛&am…...
【FFmpeg】解封装 ① ( 封装与解封装流程 | 解封装函数简介 | 查找码流标号和码流参数信息 | 使用 MediaInfo 分析视频文件 )
文章目录 一、解封装1、封装与解封装流程2、解封装 常用函数 二、解封装函数简介1、avformat_alloc_context 函数2、avformat_free_context 函数3、avformat_open_input 函数4、avformat_close_input 函数5、avformat_find_stream_info 函数6、av_read_frame 函数7、avformat_s…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
