Chrome浏览器读取蓝牙设备数据

news2024/12/28 21:00:11

蓝牙协议已经发展到5.3版本了,应用蓝牙的设备也越来越多,特别是随着传感器和智能硬件时代的到来,现在除了常见的蓝牙耳机还有一大批设备应用蓝牙进行通信,例如手环、手表、温度计、体重秤。

蓝牙协议的数据读写我一直很头疼,可以参考的代码较少,而且大多是安卓平台的代码,Windows平台不能说完全没有,也就那么几个,代码读起来还很奇怪。

最近发现浏览器也能读蓝牙设备了,用js语言,而且代码清晰简单,经过一天的学习取得了一点进度,分享一下。

先上代码,这个代码改了uuid直接就能跑起来。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=100, initial-scale=1.0">
    <title>测试</title>
    
</head>
<body>
    <button onclick="clickme()" class="btn">点击</button>
    <div id="data"></div>
    <script type="text/javascript" >
    function clickme(){
        readbluetooth()
        .then(v => console.log(v))
        .catch(e => console.log(e));
    }
    async function readbluetooth(){
        let device = await navigator.bluetooth.requestDevice({    
            optionalServices: ['48093801-1a48-11e9-ab14-d663bd873d93']
            , acceptAllDevices: true//设置acceptAllDevices代表查询所有蓝牙设备 也是必须配置optionalServices
        });
        device.addEventListener('gattserverdisconnected', onDisconnected);//监听设备断开连接
        let server = await device.gatt.connect();
        let service = await server.getPrimaryService('48093801-1a48-11e9-ab14-d663bd873d93');//这里需要服务UUID 还是可以提供完整的蓝牙UUID或简短的16位或32位形式
        let services = await server.getPrimaryServices();
        let characteristics = await service.getCharacteristics();//获取设备所有信息特征值
        let characteristic = await service.getCharacteristic('48090001-1a48-11e9-ab14-d663bd873d93');//这里需要读的特征值UUID 还是可以提供完整的蓝牙UUID或简短的16位或32位形式
        characteristic.startNotifications();//开始监听
        characteristic.addEventListener(
            'characteristicvaluechanged', e => {
                //监听设备端的操作 获取到值之后再解析
                console.log('e.target.value:',ab2hex(e.target.value.buffer));
                document.getElementById('data').InnerText=ab2hex(e.target.value.buffer);
            }
        );

    }

function onDisconnected(event) {
    const device = event.target;
    console.log(`设备: ${device.name} 已经断开连接`);
}
function string2buffer(str) {
    let val = "";
    if (!str) return;
    let length = str.length;
    let index = 0;
    let array = [];
    while (index < length) {
        array.push(str.substring(index, index + 2));
        index = index + 2;
    }
    val = array.join(",");
    // 将16进制转化为ArrayBuffer
    return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function (h) {
    return parseInt(h, 16);
    })).buffer
}
function ab2hex(buffer) {
    const hexArr = Array.prototype.map.call(
        new Uint8Array(buffer),
        function (bit) {
            return ('00' + bit.toString(16)).slice(-2);
        }
    )
    return hexArr.join('');
}    </script>
</body>
</html>

这个是参考了别人的一些代码写出来的,调整了一下格式,满足了一点强迫症。参考链接在最下面

重点

  1. service的uuid一定要有。这里不对代码没法往后跑,

  1. characteristic的uuid最好也直接写死,虽然可以读取所有可用的characteristic,但是每个uuid对应的功能是固定的,除非你不知道都对应什么功能,应该找蓝牙设备的开发者或开发文档,而不是读出来挨个猜挨个试。

  1. service的uuid有一些是固定的,参考https://blog.csdn.net/chy555chy/article/details/52230651,这时可以用服务名代替uuid,我查到的代码很多都是用的服务名,可我的设备不是标准设备,没有服务名,给我很大困扰。直接用uuid就可以

  1. chrome://bluetooth-internals/,这个地址是浏览器自带的蓝牙调试地址,比常见的手机蓝牙助手还好用。缺点是还处在实验阶段,有些设备可能扫描不出来,有些功能可能会部分支持,例如我的设备只能扫描别人,不能被人扫描。

参考文献

https://huaweicloud.csdn.net/63a55e7fb878a54545945571.html?spm=1001.2101.3001.6650.7&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~activity-7-126708168-blog-87890418.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~activity-7-126708168-blog-87890418.pc_relevant_default&utm_relevant_index=13

https://web.dev/i18n/zh/bluetooth/

https://blog.csdn.net/qq_45797421/article/details/123552735?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-13-123552735-blog-87890418.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-13-123552735-blog-87890418.pc_relevant_default&utm_relevant_index=19

https://github.com/WebBluetoothCG/demos/tree/gh-pages/heart-rate-sensor

https://blog.csdn.net/qq_31968791/article/details/124097703

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

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

相关文章

文件写入函数write和fwrite对SRS的DVR性能影响的比较

概述 在linux环境中&#xff0c;对于文件进行读写操作的时候&#xff0c;我们可以采用libc提供的fread/fwrite系列的一套函数&#xff0c;也可以采用操作系统提供的read/write系列的一套系统api函数。 对于libc提供的文件读写函数&#xff0c;首先它可移植性比较好&#xff0c;…

C语言实现插入排序和希尔排序(动态图演示过程)

插入和希尔插入排序时间和空间复杂度分析希尔排序时间和空间复杂度分析本篇文章将插入排序和希尔排序放在一起讲解&#xff0c;是因为后者可以说是前者的排序方式的一种优化&#xff0c;思路上大体一样&#xff0c;插入和希尔在整个排序的大章节中&#xff0c;算是比较简单的&a…

java食堂库存管理系统源码

简介 Java基于sprinboot开发的食堂库存管理系统&#xff0c;用于统计食堂库存的&#xff0c;包含采购、入库、出库、折损等功能。 演示视频 https://www.bilibili.com/video/BV1Jf4y1C7vq/?share_sourcecopy_web&vd_sourceed0f04fbb713154db5cc611225d92156 调试 https…

php宝塔搭建部署实战响应式儿童益智玩具网站模板源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套php开发的响应式儿童益智玩具网站模板源码&#xff0c;感兴趣的朋友可以自行下载学习。 技术架构 PHP7.2 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板 文字搭建教程 下载源码&am…

java基于ssm空气质量检测系统源码网站空气质量监测源码

简介 Java基于ssm的空气质量检测系统&#xff0c;检测设备检测一定范围内的企业空气指数&#xff0c;如果有污染则地图显示红色标记。 演示视频 https://www.bilibili.com/video/BV1GK4y1W7JB/?share_sourcecopy_web&vd_sourceed0f04fbb713154db5cc611225d92156 技术 …

67、NeRF-Editing: Geometry Editing of Neural Radiance Fields

简介 允许用户对场景的隐表示进行可控的形状变形&#xff0c;在不重新训练网络的情况下合成编辑过的场景的新视图图像。在提取的显式网格表示(Mesh)和目标场景的隐式神经表示之间建立了对应关系&#xff0c;利用基于网格的变形方法&#xff08;ARAP&#xff09;对场景的网格表…

CAN 协议及标准规格

文章目录CAN协议对应ISO/OSI 基本参照模型ISO 标准化的 CAN 协议通信速度和最大总线长度的关系根据协议不同选择对应IC其他标准规格CAN协议对应ISO/OSI 基本参照模型 CAN 协议中关于 ISO/OSI 基本参照模型中的传输层、数据链路层及物理层 数据链路层分为 MAC 子层和 LLC 子层…

Vue3基础知识,看这篇文章就够啦~

0 前言整理了一下自己在学Vue3的时候的笔记&#xff0c;如果有错误的地方还望指正~1 setup函数1.1 参数 setup(props,context)props&#xff1a;父组件传递过来的属性context&#xff1a;SetupContext&#xff0c;即是setup函数的上下文1.1.1 参数1 props如果想在setup函数中使…

脑电项目探索和实现(EEG) (上):研究数据集选取和介绍SEED

数据集介绍&#xff1a; 使用上海交大的SEED数据集1 SEED数据集包含12名受试者的脑电图和眼动数据以及另外3名受试者的脑电图数据。数据是在他们观看电影片段时收集的。电影片段是精心挑选的&#xff0c;以诱导不同类型的情绪&#xff0c;积极的&#xff0c;消极的&#xff0…

BI技巧丨子类Top及其他

BOSS&#xff1a;白茶&#xff0c;能不能在展示产品销量的时候&#xff0c;前三的展示&#xff0c;其他的都归为“其他”啊&#xff1f; 白茶&#xff1a;可以啊&#xff01;安排&#xff01; 在实际项目中&#xff0c;一张Dashboard看板的设计&#xff0c;既要考虑逻辑的准确无…

Spring中@Conditional注解详解

文章目录Conditional是Spring4新提供的注解&#xff0c;它的作用是按照一定的条件进行判断&#xff0c;满足条件给容器注册bean。首先创建Dog类然后创建MyCondition类定义两个Bean测试方法AnnotationConfigApplicationContext测试ConditionalOnBean和ConditionalOnMissingBean注…

51单片机学习笔记_8 IICAT24C02 芯片的应用

I2C EEPROM I2C I2C&#xff08;Inter&#xff0d;Integrated Circuit&#xff09;总线是由 PHILIPS 公司开发的两线式 串行总线&#xff0c;用于连接微控制器及其外围设备。 I2C 结构 I2C 只有两根双向信号线&#xff0c;一根是 SDA 数据线&#xff0c;一根是 SCL 时钟线。…

2-选择题练手

1.HASH函数冲突处理方式不包括以下哪一项 A.开放定址法 B.链地址法 C.插入排序法 D.公共溢出区发 答&#xff1a;C 析&#xff1a; HASH函数冲突处理方式有&#xff1a; 开放定址法&#xff1a;&#xff08;线性探测再散列&#xff0c;二次探测再散列&#xff0c;伪随机…

Netty进阶——粘包与半包(固定分隔符方式解决粘包问题)

目录一、固定分隔符方式解决粘包问题&#xff08;代码示例&#xff09;1.1、固定分隔符解决粘包问题的服务端代码示例1.2、固定分隔符方式解决粘包问题的客户端代码示例1.3、分别启动服务端&#xff0c;客户端&#xff0c;查看服务端结果输出一、固定分隔符方式解决粘包问题&am…

vitepress(四):引入vue组件

这节课的内容需要有前置的良好的Vue基础&#xff0c;如果你仅仅想搭建一个存放md文件的网站的话&#xff0c;可以不必学习后面的内容&#xff0c;当然如果你想个性化自己的站点&#xff0c;那么推荐你学习一下引用的方式和注意点&#xff0c;开始你的个性化之旅 编写VUE组件 …

ARES Map地理信息系统(GIS)

ARES Map地理信息系统(GIS) ARES地图是GRAEBERT的地理信息系统(GIS)产品。该软件是一个复合解决方案&#xff0c;它将GIS的知识和内容放在一个CAD丰富的DWG系统上&#xff0c;并允许您同时使用它们。该软件的地图和设计将以DWG格式自然存储&#xff0c;但它们也可以包含GIS信息…

【阶段三】Python机器学习02篇:机器学习项目流程

本篇的思维导图: 机器学习项目流程 大致分为以下6个环节: (1)项目背景(问题定义) (2)数据收集 (3) 数据预处理与探索性数据分析 (4) 特征工程 (5)构建模型:机器学习模型(算法)的选择

TCP 慢启动突发丢包

TCP 慢启动会导致持续突发丢包。 慢启动以 y2xy2^xy2x 增加窗口&#xff0c;在 BDP 已经填满时&#xff0c;后续的慢启动过程如下&#xff1a; ​每一个 ACK 触发 2 个 报文&#xff0c;最终至少丢掉 1 个 BDP 的数据后 sender 才能检测到丢包而退出慢启动并进行重传。 这是…

C语言蓝桥杯刷题:明码

题目链接 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 汉字的字形存在于字库中&#xff0c;即便在今天&#xff0c;16*16 点阵的字库也仍然使用广泛。 16*16 点阵的字库把每个汉字看成是 1616 个像素信息。并把这些信息记…

电子书销售是一种可以躺赚的商业模式么?

文章目录前言电子书销售市场规模到底有多大&#xff1f;电子书产业链电子书阅读平台电子书销售平台国外国内其它销售模式探讨创建电子书创建电子书的工具电子书下载好去处相关法规前言 不知何时&#xff0c;有了网赚一词&#xff0c;例如去各大平台撸羊毛薅羊毛&#xff0c;利…