微信小程序使用蓝牙连接硬件

目录

一、蓝牙官方api文档

二、蓝牙重要参数介绍

三、案例教程

1. 获取蓝牙权限(openBluetoothAdapter)

 2. 开始搜索蓝牙设备(startBluetoothDevicesDiscovery)

3. 监听搜索到新设备的事件(onBluetoothDeviceFound)

4.连接蓝牙设备(createBLEConnection)

5.获取蓝牙设备服务(getBLEDeviceServices) 

6.获取某个蓝牙服务特征(getBLEDeviceCharacteristics)

7.启动蓝牙服务值变化监听及监听特征值变化(notifyBLECharacteristicValueChange、onBLECharacteristicValueChange)

8.向蓝牙写入数据(writeBLECharacteristicValue)

9.string2buffer函数

四、扩展


一、蓝牙官方api文档

wx.startBluetoothDevicesDiscovery(Object object) | 微信开放文档微信开发者平台文档icon-default.png?t=N7T8https://developers.weixin.qq.com/miniprogram/dev/api/device/bluetooth/wx.startBluetoothDevicesDiscovery.html

二、蓝牙重要参数介绍

1

deviceid

蓝牙设备的id这个参数是蓝牙设备的唯一id
2

uuid

服务的id这个是通过deviceid获取到的这个设备服务的uuid
3

characteristic

特性值这个是通过deviceid、uuid获取到的特性值

重点:辅助理解这几个值的意思 

首先deviceid是比较清楚的,它是蓝牙设备的唯一标识它只有一个,它的用途在于找到蓝牙之后进行匹配蓝牙。其次是uuid它是通过deviced获得得到的,通过deviced就可以获取到它蓝牙的所有服务,服务就是蓝牙设置支持的某个能力例如开关led灯。还有服务嘛就是有很多,所以uuid不止有一个,使用哪个服务uuid看自己。下来就是特征值他是由devided和uuid得到的,它相当于是一个里面的功能而uuid是这个功能的门牌码,功能当然也有很多个,所以特性值也有好多个,一般使用写功能,遍历出来之后拿到写的特性值就行了。

三、案例教程

1. 获取蓝牙权限(openBluetoothAdapter)

initBlue:function(){var that = this;wx.openBluetoothAdapter({success: function (res) {wx.showToast({title: '初始化成功',icon: 'success',duration: 800})that.findBlue();//2.0},fail: function (res) {//如果手机上的蓝牙没有打开,可以提醒用户wx.showToast({title: '请开启蓝牙',icon: 'fails',duration: 1000})}})
},

 2. 开始搜索蓝牙设备(startBluetoothDevicesDiscovery)

findBlue(){var that = thiswx.startBluetoothDevicesDiscovery({allowDuplicatesKey: true,interval: 0,powerLevel: 'high',success: function (res) {that.getBlue()//3.0}})
},

3. 监听搜索到新设备的事件(onBluetoothDeviceFound)

getBlue(){var that = this;wx.onBluetoothDeviceFound(function (devices) {if (devices.devices) {if(devices.devices[0].name=="这个要自己修改看要怎样的设备"){that.setData({deviceid: devices.devices[0].deviceId,})that.connetBlue();}}})
},

4.连接蓝牙设备(createBLEConnection)

connetBlue(){                    var that = this;var deviceid = that.data.deviceid;wx.createBLEConnection({// 这里的 deviceid 需要已经通过 createBLEConnection 与对应设备建立链接deviceId: deviceid,//设备idtimeout: 10000, // 10s连接超时success: function (res) wx.showToast({title: '连接成功',icon: 'fails',duration: 800})wx.stopBluetoothDevicesDiscovery()that.getServiceId()//5.0}})
},

5.获取蓝牙设备服务(getBLEDeviceServices) 

getServiceId(){var that = thiswx.getBLEDeviceServices({// 这里的 deviceid 需要已经通过 createBLEConnection 与对应设备建立链接deviceId: that.data.deviceid,success: function (res) {var model = res.services[0].uuidthat.getCharacteId()//6.0}})
},

6.获取某个蓝牙服务特征(getBLEDeviceCharacteristics)

getCharacteId(){var that = this wx.getBLEDeviceCharacteristics({deviceId: that.data.deviceid,serviceId: that.data.services,success: function (res) {// 遍历特征值列表for (let i = 0; i < res.characteristics.length; i++) {let characteristic = res.characteristics[i];// 检查特征值是否具有 read 属性为 falseif (!characteristic.properties.read) {// 当找到 read 属性为 false 的特征值时,设置 writeId 为该特征值的 UUIDthat.setData({writeId: characteristic.uuid});break; // 找到符合条件的特征值后,结束循环}}},fail: function (res) {// 处理获取特征值失败的情况console.log("失败的原因",res);}})
},

7.启动蓝牙服务值变化监听及监听特征值变化(notifyBLECharacteristicValueChange、onBLECharacteristicValueChange)

启用蓝牙低功耗设备特征值变化时的 notify 功能,订阅特征。注意:必须设备的特征支持 notify 或者 indicate 才可以成功调用。

另外,必须先启用 wx.notifyBLECharacteristicValueChange 才能监听到设备 characteristicValueChange 事件

startNotice(uuid){var that = this;wx.notifyBLECharacteristicValueChange({state: true, // 启用 notify 功能deviceId: that.data.deviceid,serviceId: that.data.services,characteristicId: uuid,  //第一步 开启监听 notityid  第二步发送指令 writesuccess: function (res) {wx.onBLECharacteristicValueChange(function (res) {// 这里面需要把回你的数据下转换格式})}})
},

8.向蓝牙写入数据(writeBLECharacteristicValue)

数据不能大于20字节,直接用就行,大于20字节则进行轮训发送(string2buffer函数在下面)

 sendmmm:function(sendData){var that = this;//向蓝牙发送数据
let buffer = that.string2buffer(sendData);//转16进制
let pos = 0;
let bytes = buffer.byteLength;
var result = ''
let tmpBuffer;
var sdtim= setInterval(function(){if (bytes > 20) {tmpBuffer = buffer.slice(pos, pos + 20);console.log('字节:');console.log(tmpBuffer);pos += 20;bytes -= 20;wx.writeBLECharacteristicValue({deviceId: that.data.deviceid,serviceId: that.data.services,characteristicId: that.data.writeId,//第二步写入的特征值value: tmpBuffer,success(res) {console.log('发送成功!', res)}})} else {tmpBuffer = buffer.slice(pos, pos + bytes);console.log('字节:');console.log(tmpBuffer);pos += bytes;bytes -= bytes;wx.writeBLECharacteristicValue({deviceId: that.data.deviceid,serviceId: that.data.services,characteristicId: that.data.writeId,//第二步写入的特征值value: tmpBuffer,success(res) {console.log('最后次发送', res)})clearInterval(sdtim);},fail: function (res) {console.log('发送失败', res)}})}
}, 30);
},

9.string2buffer函数

 string2buffer(str) {let buffer = new ArrayBuffer(str.length * 2); // 每个字符占2个字节let bufferView = new Uint16Array(buffer);for (let i = 0; i < str.length; i++) {bufferView[i] = str.charCodeAt(i);}return buffer;},

四、扩展

蓝牙 (Bluetooth) | 微信开放文档

只能连接蓝牙4.0以上低功耗,就是手机啥的蓝牙检测不到,耳机什么的可以检测到

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

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

相关文章

SpringData JPA - ORM 框架下,打造高效数据访问层

目录 一、SpringData JPA 概述 1.1、什么是 JPA 1.2、什么是 ORM 1.3、什么是 Hibernate 1.4、JPA 和 Hibernate 的关系 1.5、JPA 的优势 二、SpringData JPA 实战开发 2.1、依赖 2.2、配置文件 2.3、启动类 2.4、创建实体 2.5、基于 JpaRepository 的 CRUD 三、…

网络安全审计

一、什么叫网络安全审计 网络安全审计是按照一定的安全策略&#xff0c;利用记录、系统活动和用户活动等信息&#xff0c;检查、审查和检验操作时间的环境及活动&#xff0c;从而发现系统漏洞、入侵行为或改善系统性能的过程&#xff0c;它是提高系统安全性的重要手段。 系统…

数据结构:时间复杂度/空间复杂度

目录 一、时间复杂度 定义 常见的时间复杂度 如何计算时间复杂度 计算方法 三、实例分析 二、空间复杂度 定义 重要性 常见的空间复杂度 二、空间复杂度 定义 重要性 常见的空间复杂度 计算方法 三、实例分析 大O的渐进表示法 最好情况&#xff08;Best Case…

spring框架学习记录(1)

前半个月一直在应付期中考试&#xff0c;快被折磨似了orz 文章目录 SpringIoC(Inversion of Control) 控制反转与DI(Dependency Injection)依赖注入bean相关bean配置bean实例化bean的生命周期 依赖注入相关依赖注入方式依赖自动装配 容器创建容器获取bean Spring IoC(Inversi…

leetcode295. 数据流的中位数

class MedianFinder {//A为小根堆&#xff0c;B为大根堆List<Integer> A,B;public MedianFinder() {A new ArrayList<Integer>();B new ArrayList<Integer>();}public void addNum(int num) {int m A.size(),n B.size();if(m n){insert(B,num);int top …

BeanFactory 源码浅析

BeanFactory 功能介绍 BeanFactory 是核心容器&#xff0c;负责管理 Bean 对象 BeanFactory 接口的功能只有一个 getBean() 方法BeanFactory 的实现类&#xff08;DefaultListableBeanFactory&#xff09;包含&#xff1a;控制反转、基本的依赖注入、Bean 生命周期的各种功能…

从浏览器输入url到页面加载(八)你的web网站有几台服务器?

你有没有想过一个问题&#xff0c;做为一名前端开发&#xff0c;你的网站上线后&#xff0c;准备了几台服务器&#xff1f;前端静态资源用了几台&#xff0c;你调接口的那个后端部署了几台&#xff1f; 目录 1 没接触过这个问题很正常 2 当访问量上升的时候 2.1 提升带宽 …

绝了!这是我见过最详细的HashMap源码解析

1 概述 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只适用于单线程环境,多线程环境可以采用并发包下的concurrentHashMap HashMap 实现了Serializable接口&#x…

ArmSoM-Sige5 RK3576开发板 正式发布!

简介​ ArmSoM-Sige5 采用Rockchip RK3576第二代8nm高性能AIOT平台&#xff0c;6 TOPS算力NPU&#xff0c;最大可配16GB大内存。支持8K视频编解码&#xff0c;拥有丰富的接口&#xff0c;支持双千兆网口&#xff0c;WiFi6 & BT5和多种视频输出。支持多种操作系统&#xff…

HTML5实用大全(Part.2)

引言&#xff1a; 哈喽&#xff0c;各位小伙伴们大家好呀&#xff0c;学习了上一篇关于HTML5的文章后&#xff0c;你是否对于入门HTML5有了一定的基础了呢&#xff0c;本篇博客我们将继续学习HTML5的不同标签&#xff0c;跟上队伍&#xff0c;准备出发咯&#xff01; 1.标签之…

2024五一杯数学建模竞赛A题完整成品论文和代码分析:建立钢板切割的工艺路径动态规划、贪心与分层优化模型

2024五一杯数学建模竞赛A题&#xff1a;建立钢板切割的工艺路径动态规划、贪心与分层优化模型 2024五一数学建模A题完整代码和成品论文获取↓↓↓↓↓ https://www.yuque.com/u42168770/qv6z0d/gyoz9ou5upvkv6nx?singleDoc# 本文文章较长&#xff0c;建议先目录。经过不懈的…

三星一季度利润飙涨932%!AI引爆存储热,未来研发狠砸AI

⏩三星一季度利润飙涨932%&#xff01;AI引爆存储热&#xff0c;未来研发狠砸AI 三星电子公布了第一季度财报数据&#xff0c;显示其利润飙涨932.8%。得益于AI拉动的广泛支出&#xff0c;三星电子一季度利润激增。三星表示&#xff0c;预计第二季度业务将主要由生成式人工智能…

算法学习系列(五十四):单源最短路的综合应用

目录 引言一、新年好二、通信线路三、道路与航线四、最优贸易 引言 关于这个单源最短路的综合应用&#xff0c;其实最短路问题最简单的就是模板了&#xff0c;这是一个基础&#xff0c;然后会与各种算法结合到一块&#xff0c;就是不再考察单个知识点了&#xff0c;而是各种知…

ASP.NET图书馆管理信息系统

摘  要 本文首先阐述了基于.NET Framework平台的图书馆管理信息系统的开发背景以及其实践意义&#xff0c;其次说明了图书馆管理信息系统的功能以及相比同类软件的创新之处。然后就图书馆管理系统开发中所使用的一些的技术进行研究探讨。主要针对数据库的设计技术、存储过程…

Copilot Venture Studio創始合伙人楊林苑確認出席“邊緣智能2024 - AI開發者峰會”

隨著AI技術的迅猛發展&#xff0c;全球正逐步進入邊緣計算智能化與分布式AI深度融合的新時代&#xff0c;共同書寫著分布式智能創新應用的壯麗篇章。邊緣智能&#xff0c;作為融合邊緣計算和智能技術的新興領域&#xff0c;正逐漸成為推動AI發展的關鍵力量。借助分布式和去中心…

Docker——部署LNMP架构

目录 一、LNMP架构概述 1.项目环境 2.服务器环境 3.需求 二、搭建Linux系统基础镜像 三、部署Nginx 1.建立工作目录 2.编写Dockerfile脚本 3.准备Nginx.conf配置文件 4.生成镜像 5.创建自定义网络 6.启动镜像容器 7.验证Nginx 三、部署Mysql 1.建立工作目录 2.编…

【Docker第一课】docker的基本命令和试启动容器(详细图解)

目录 知识梗概 docker的初步了解 了解docker常用命令 试开启容器&#xff08;这里演示nginx、python3和mysql&#xff09; 1、nginx容器的启动 2、python3容器的启动 docker的作用 虚拟机与容器的区别 写在前面&#xff1a; 本专栏你将了解docker一些入门知识&#xff…

如何使用 ArcGIS Pro 查找小区最近的地铁站

学习 GIS 除了可以用在工作上之外&#xff0c;还可以将其运用到生活之中&#xff0c;比如查找距离小区最近的地铁站&#xff0c;这里为大家介绍一下查找的方法&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的POI数据&#xff0c;除了POI数据…

a-table 控制列的展示和隐藏

一、业务场景&#xff1a; 最近在使用 Antd-vue 组件库的时候&#xff0c;a-table需要根据不同角色的权限显示和隐藏 columns的列 为了避免大家走弯路&#xff0c;为大家整理了一下&#xff0c;粘走可以直接用的那种 二、具体实现步骤&#xff1a; 1.在需要显示与隐藏的列增加一…

Git客户端(TortoiseGit)使用详解

1.概述 使用TortoiseGit比直接使用git 客户端和命令实现代码版本管理更为方便&#xff0c;本文根据实际使用情况作一些记录&#xff0c;特别是对于解决冲突的处理。 2.Git安装与配置 下载 Git - Downloads&#xff0c; 可参考Git安装步骤完成Git的安装与配置。 3.TortoiseG…