当前位置: 首页 > news >正文

小程序连接蓝牙

小程序 蓝牙功能

  • 1.授予蓝牙权限
  • 2.蓝牙初始化
  • 3.监听寻找新设备
  • 4.搜索新设备
  • 5.建立连接⭐⭐⭐⭐⭐⭐⭐
  • 6.监听蓝牙低功耗连接状态改变事件
  • 8.监听特征值变化
  • 9.发送数据

1.授予蓝牙权限

//1.蓝牙授权
const authBlue = (callback, initApp) => {app = initApp;//鉴定是否授权蓝牙wx.getSetting().then(res => {if (!res.authSetting['scope.bluetooth']) {//未授予蓝牙权限return wx.authorize({scope: 'scope.bluetooth',})} else {//已授予if (callback != null) {callback({blueAuth: true}) // init() //2.蓝牙初始化}return new Promise(() => {})}}).then(() => {if (callback != null) {callback({blueAuth: true}) //回调-app.js-蓝牙权限// init() //2.蓝牙初始化}return new Promise(() => {})}).catch(err => {if (callback != null)callback({blueAuth: false})console.err(err);})
}

2.蓝牙初始化

//2.蓝牙初始化
const init = (onFound) => {console.log("2.蓝牙初始化");//打开蓝牙适配器wx.openBluetoothAdapter({mode: 'central'}).then(res => {app.globalData.isOpenBleAdapter = true //蓝牙适配器已打开wx.onBluetoothAdapterStateChange((res) => { //回调---蓝牙适配器状态改变if (!res.available) { //蓝牙适配器是否可用wx.showModal({title: '温馨提示',content: '蓝牙蓝牙适配器不可用,请重新启动',showCancel: false})}})onFound(); //监听+寻找 新设备 -- 回调函数}).catch(() => {//失败wx.showToast({title: '请检查手机蓝牙是否打开',icon: 'none',})})
}

3.监听寻找新设备

//3.监听寻找新设备
const onDeviceFound = (addDevicesList) => {console.log("3.监听寻找新设备");wx.onBluetoothDeviceFound((res) => {const devicesList = []for (const item of res.devices) {if (!item.connectable) continue; //无法连接 --> 跳过//过滤设备,找出自己想连接的设备  filterDeviceslet device = Device.filterDevices(item)//addDevicesList 是一个回调函数,将数据更新到 Viewif (device && addDevicesList != null) {// 判断是否已经存在相同id的对象var existingObjIndex = devicesList.findIndex(function (obj) {return obj.deviceId === device.deviceId;});if (existingObjIndex !== -1) { // 存在相同id的对象// 更新对应位置上的对象属性值Object.assign(devicesList[existingObjIndex], device);} else { // 不存在相同id的对象// 将新对象添加到数组末尾devicesList.push(device);}}}//更新到设备列表addDevicesList(devicesList)})
}

4.搜索新设备

//4.搜索新设备
const startDevicesDiscovery = (obj) => {wx.startBluetoothDevicesDiscovery({allowDuplicatesKey: true, //允许上报同一台设备interval: 1000, //上报间隔时间success: (res) => {console.log("4.搜索新设备");// getBluetoothDevices()		// 获取蓝牙设备列表},fail: function (res) {wx.showToast({title: '搜索蓝牙外围设备失败,请重新初始化蓝牙!',icon: 'none',})}})
}

5.建立连接⭐⭐⭐⭐⭐⭐⭐

/** 5.建立连接 * @param {*} deviceId 要连接的设备MAC* @param {*} func 连接后要执行的命令* 1.建立连接* 2.设置MTU    setBLEMTU* 3.获取蓝牙服务 UUID  getBLEDeviceServices* 4.获取蓝牙服务列表 UUIDS   getBLEDeviceCharacteristics* 5.判断UUIDS中哪个服务可用于indicate | notify,使用该UUID订阅特征变化 notifyBLECharacteristicValueChange* 6.监听特征值变化:onBLECharacteristicValueChange* 7.func({isConnect: true}) //连接成功*/
const createConnect = (deviceId, func) => {let mtu = 209 //协商设置蓝牙低功耗的最大传输单元let serviceId = '0000FFE0-0000-1000-8000-00805F9B34FB';	//特定的UUIDlet characteristics;wx.createBLEConnection({deviceId}).then((res) => { //2.设置MTUif (res.errCode === 0 || res.errCode === -1) {console.log('1.连接成功');const systemInfo = wx.getSystemInfoSync();const platform = systemInfo.platform; //Android | IOSif (platform === 'android') {return wx.setBLEMTU({deviceId,mtu});} else if (platform === 'ios') {return {mtu}} else {return {mtu}}} else {console.log('连接失败');func({isConnect: false}) //连接失败return new Promise(() => {})}}, error => {console.log(error)func({ isConnect: false}) //连接失败return new Promise(() => {})}).then((res) => { //3.获取蓝牙服务console.log("2.MTU设置成功,协商MTU:", res.mtu, deviceId, serviceId);return wx.getBLEDeviceServices({deviceId});}, (res) => {console.log("2.MTU设置失败:", res);func({ isConnect: false}) //连接失败return new Promise(() => {})}).then((res) => {//4.获取蓝牙服务列表console.log("3.获取蓝牙服务成功", res);for (let i = 0; i < res.services.length; i++) {console.log("+++++++++发现服务:", res.services[i].uuid);if (res.services[i].uuid === '0000FFE0-0000-1000-8000-00805F9B34FB') {return wx.getBLEDeviceCharacteristics({deviceId,serviceId});}}},(err) => {console.error("3.获取蓝牙服务失败", err);func({ isConnect: false}) //连接失败return new Promise(() => {})}).then((res) => { //5.判断哪个服务可用于indicate | notifyconsole.log("4.获取UUIDS成功", res);characteristics = res.characteristicsfor (let i = 0; i < characteristics.length; i++) {const item = characteristics[i];if (item.properties.notify || item.properties.indicate) {return wx.notifyBLECharacteristicValueChange({deviceId: deviceId,serviceId: serviceId,characteristicId: item.uuid,state: true});}}}, (res) => {console.log("4.获取UUIDS失败", res);func({ isConnect: false}) //连接失败return new Promise(() => {})}).then((res) => { //6.监听特征值变化console.log('5.订阅特征变化成功', res);for (let i = 0; i < characteristics.length; i++) {let item = characteristics[i];if (item.uuid.substr(0, 8) == '0000FFE1') {app.globalData.characteristicId = item.uuidbreak;}}func({ isConnect: true}) //连接成功}, (err) => {console.log("5.订阅特征变化失败", res);func({ isConnect: false}) //连接失败return new Promise(() => {})}).catch((err) => {func({ isConnect: false}) //连接失败console.error(err);});
}

6.监听蓝牙低功耗连接状态改变事件

//6.监听蓝牙低功耗连接状态改变事件--主动连接或断开连接,设备丢失,连接异常断开
const onConnectionStateChange = (listenBleStatus) => {wx.onBLEConnectionStateChange(res => listenBleStatus(res))
}

8.监听特征值变化

//8.监听特征值变化   --  onBleValueChange  回调函数
const onCharacteristicValueChange = (onBleValueChange) => {wx.onBLECharacteristicValueChange(res => onBleValueChange(res))
}/*** 监听蓝牙设备传输的数据* @param {*} res deviceId、serviceId、characteristicId、【value	ArrayBuffer	特征最新的值】*/
function onBleValueChange(res) {console.log("监听到数据", res);//处理数据...
}

9.发送数据

/** 9.发送数据* @param {*} deviceId 设备ID* @param {*} command  命令*/
const writeCharacteristicValue = (deviceId, command) => {return wx.writeBLECharacteristicValue({characteristicId: app.globalData.characteristicId,deviceId: deviceId,serviceId: app.globalData.serviceId,value: command,})
}

相关文章:

小程序连接蓝牙

小程序 蓝牙功能 1.授予蓝牙权限2.蓝牙初始化3.监听寻找新设备4.搜索新设备5.建立连接⭐⭐⭐⭐⭐⭐⭐6.监听蓝牙低功耗连接状态改变事件8.监听特征值变化9.发送数据 1.授予蓝牙权限 //1.蓝牙授权 const authBlue (callback, initApp) > {app initApp;//鉴定是否授权蓝牙w…...

基于Python的pygame库的五子棋游戏

安装pygame pip install pygame五子棋游戏代码 """五子棋之人机对战"""import sys import random import pygame from pygame.locals import * import pygame.gfxdraw from collections import namedtupleChessman namedtuple(Chessman, Name…...

【Java基础】IO流(二)字符集知识

目录 字符集知识 1、GBK字符集 2、Unicode字符集&#xff08;万国码&#xff09; 3、乱码 4、Java中编码和解码的方法 字符集知识 字符&#xff08;Character&#xff09;&#xff1a;在计算机和电信技术中&#xff0c;一个字符是一个单位的字形、类字形单位或符号的基本信…...

TimescaleDB 开源时序数据库

文章目录 1.TimescaleDB介绍2.Hypertable 和 chunk3.Hypertable4.Hypertable操作 开源中间件 # TimescaleDBhttps://iothub.org.cn/docs/middleware/ https://iothub.org.cn/docs/middleware/timescale/timescale-summary/1.TimescaleDB介绍 TimescaleDB是基于PostgreSQL数据…...

如何保证Redis和数据库数据一致性

缓存可以提升性能&#xff0c;减轻数据库压力&#xff0c;在获取这部分好处的同时&#xff0c;它却带来了一些新的问题&#xff0c;缓存和数据库之间的数据一致性问题。 想必大家在工作中只要用了咱们缓存势必就会遇到过此类问题 首先我们来看看一致性&#xff1a; 强一致性…...

css3常见选择器

使用工具 Visual Studio Code 1.CSS3基础选择器 1.1 标签选择器 1.2.1 标签选择器的语法 一个完整的HTML5页面是由很多不同的标签组成的&#xff0c;而标签选择器则决定标签应采用的CSS样式&#xff0c;语法如下:标签名{ 属性1&#xff1a;属性值1&#xff1b; 属性2&…...

List(CS61B学习记录)

问题引入 上图中&#xff0c;赋给b海象的weight会改变a海象的weight&#xff0c;但x的赋值又不会改变y的赋值 Bits 要解释上图的问题&#xff0c;我们应该从Java的底层入手 相同的二进制编码&#xff0c;却因为数据类型不同&#xff0c;输出不同的值 变量的声明 基本类型…...

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 1、线条折线曲面

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 代码: import pandas as pd import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D from matplotlib.colors import ListedColor…...

2024年华为HCIA-DATACOM新增题库(H12-811)

801、[单选题]178/832、在系统视图下键入什么命令可以切换到用户视图? A quit B souter C system-view D user-view 试题答案&#xff1a;A 试题解析&#xff1a;在系统视图下键入quit命令退出到用户视图。因此答案选A。 802、[单选题]“网络管理员在三层交换机上创建了V…...

离线安装数据库 mysql 5.7 linux

离线安装数据库 mysql 5.7 linux 方法一 参考链接Linux(Debian10.2)安装MySQL5.7.24环境 赋予文件执行权限chmod x 文件名 使用root用户sudo su解压文件tar xvf mysql-5.7.42-linux-glibc2.12-x86_64.tar.gz重命名mv mysql-5.7.42-linux-glibc2.12-x86_64 mysql将桌面的mys…...

2024-03-14学习笔记(YoloV9)

1.认知越高的人&#xff0c;越敬畏因果 摘要&#xff1a;本文讲述了认知越高的人越敬畏因果的道理。通过故事和名人案例&#xff0c;阐述了敬畏因果对于个人成长和成功的重要性。文章强调了遵循规律、不走捷径、正向思维的重要性&#xff0c;以及思维、行动、习惯、性格和命运…...

Cookie和Session介绍

1、Cookie的一些重要结论&#xff08;令牌&#xff0c;类似就诊卡记住我们的信息&#xff09;&#xff1a; &#xff08;1&#xff09;Cookie从哪里来&#xff1a;服务器返回给浏览器的&#xff0c;通常是首次访问/登录成功之后&#xff08;cookie是在header中传输&#xff09…...

OpenCV 将rgb图像转化成字符图像

将RGB图像转换成字符图像&#xff08;ASCII art&#xff09;通常涉及到灰度化、降采样、映射字符等一系列步骤。以下是一个简化的OpenCVC实现示例&#xff1a; #include <opencv2/opencv.hpp> #include <iostream> #include <string>// 字符映射表&#xff…...

ios开发错误积累

1.xcode 下载模拟器报错 Could not download iOS 报错&#xff1a; 解决&#xff1a; 1、去官网下载自己需要 地址&#xff08;https://developer.apple.com/download/all&#xff09; 2、下载完成后&#xff0c;执行以下命令添加&#xff1a;xcrun simctl runtime add /路径…...

软件实际应用实例,物流打印用什么软件,佳易王物流货运快运单打印查询管理系统软件,可以在已经印刷好的单子上打印,也可直接打印

软件实际应用实例&#xff0c;物流打印用什么软件&#xff0c;佳易王物流货运快运单打印查询管理系统软件&#xff0c;可以在已经印刷好的单子上打印&#xff0c;也可直接打印 一、前言 以下软件教程以 佳易王物流单打印查询管理系统软件V17.0为例说明 软件文件下载可以点击…...

第六届上海国际垃圾焚烧发电展将于12月11-13日上海举办

第六届上海国际垃圾焚烧发电暨固废处理技术展览会 2024年12月11-13日 上海新国际博览中心 主办单位&#xff1a;中华环保联合会 废弃物发电专委会 支持单位&#xff1a;垃圾焚烧技术与装备国家工程实验室 承办单位&#xff1a;上海怡涵展览服务有限公司 展会介绍&#xff1a…...

pytorch(十)循环神经网络

文章目录 卷积神经网络与循环神经网络的区别RNN cell结构构造RNN例子 seq2seq 卷积神经网络与循环神经网络的区别 卷积神经网络&#xff1a;在卷积神经网络中&#xff0c;全连接层的参数占比是最多的。 卷积神经网络主要用语处理图像、语音等空间数据&#xff0c;它的特点是局部…...

【黑马程序员】Python文件、异常、模块、包

文章目录 文件操作文件编码什么是编码为什么要使用编码 文件的读取openmodel常用的三种基础访问模式读操作相关方法 文件的写入注意代码示例 异常定义异常捕获捕获指定异常捕获多个异常捕获所有异常异常else异常finally 异常的传递 python 模块定义模块的导入import模块名from …...

导入fetch_california_housing 加州房价数据集报错解决(HTTPError: HTTP Error 403: Forbidden)

报错 HTTPError Traceback (most recent call last) Cell In[3], line 52 from sklearn.datasets import fetch_california_housing3 from sklearn.model_selection import train_test_split ----> 5 X, Y fetch_california_housing(retu…...

后勤管理系统|基于SSM 框架+vue+ Mysql+Java+B/S架构技术的后勤管理系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

目录 文末获取源码 前台首页功能 员工注册、员工登录 个人中心 公寓信息 员工功能模块 员工积分管理 管理员登录 ​编辑管理员功能模块 个人信息 ​编辑员工管理 公寓户型管理 ​编辑公寓信息管理 系统结构设计 数据库设计 luwen参考 概述 源码获取 文末获取源…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...