electron 蓝牙通信功能 BLE 带案例代码

Electron与BLE的跨平台适配:从驱动替换到实战避坑指南 本文详细探讨了Electron与BLE(蓝牙低功耗)技术的跨平台适配方案,从Windows驱动替换到实战避坑指南。通过具体案例代码和优化策略,帮助开发者解决不同操作系统下的蓝牙通信兼容性问题,提升工业控制、医疗设备等物联网应用的开发效率。 阅读详情
AI摘要

本文介绍了在Windows 10上使用 Electron 进行蓝牙低能耗(BLE)通信的步骤,包括依赖安装,特别是针对Window 10的特殊处理,如替换USB蓝牙适配器驱动,并提供了相关工具Zadig的使用指南,以及关键库noble和node-bluetooth-hci-socket的安装方法。

依赖安装

     noble 在 Linux 和 MacOS 上的安装还是比较简单的,所以可以参考 noble/github 上的介绍就可以了。以下着重演示以下 Window10 下的依赖安装和驱动替换。

      首先,我们需要安装的是 node-gyp / github。
在 WIndow 下安装,需要先使用管理员权限打开 powershell 或者 CMD命令行工具,这里推荐使用 powershell。打开后,输入以下命令:
 

npm install --global --production windows-build-tools

等待安装完成后即可。

      然后,我们需要继续安装 (node-bluetooth-hci-socket / github)[https://github.com/noble/node-bluetooth-hci-socket#windows] 库,在安装之前,我们需要先替换我们的 USB蓝牙适配器驱动。这里要注意的是,当我们替换掉驱动以后,我们就不能在 Window 设置里面使用蓝牙了,如果想要恢复,可以通过 设备管理器-打开设备-更新驱动 把驱动替换回来。
替换驱动我们需要使用一个 Zadig 的工具,下载后,打开软件,然后选择 Option - List All Devices ,再在下拉菜单中选中我们的设备,我这款绿联的USB蓝牙适配器的名称是 CSR8510 A10,关于这个蓝牙的名称,可以在 设置 - 蓝牙和其他设备 中查看。
选择好以后,选择 Reinstall Diver ,等待片刻即可。

 

 

完成上面的替换驱动操作后,再使用下面的代码安装 node-bluetooth-hci-socket 即可:

 

npm install bluetooth-hci-socket

 

最后,我们再把 (noble / github)[https://github.com/noble/noble] 安装好即可:

 

npm install noble
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Ble Hello World!</title>
  </head>
  <style>
    #bleList button{
      margin-right: 5px; 
    }
    .ble {
      display: flex;
    }
    .ble button {
      margin-left: 10px; 
    }
    .char button {
      margin-left: 10px; 
    }
  </style>
  <body>
  
    <script>
      window.onload = function () {
        var noble = require('noble');
        var peripherals = {};
        var _characteristics = {};
        // 扫描
        function scan(state){
            if (state === 'poweredOn') {
              noble.startScanning();
              console.log("Started scanning");
            } else {
              noble.stopScanning();
              console.log("Is Bluetooth on?");
            }
        }

        // 连接
        function connects(e) {
          console.log('======开始连接=======');
          var name = this.getAttribute('id');
          var keys = Object.keys(peripherals);
          var services = {};

          keys.forEach(v => {
            if (v === name){

              // 连接成功后
              peripherals[v].connect(function (err) {
                  peripherals[v].discoverAllServicesAndCharacteristics(function (error, services, characteristics){
                 
                  services.forEach((v, k) => {
                    var characteristicsNames = [];
                    
                    v.characteristics.forEach((char, kf) => {
                        var properties = char.properties;
                        _characteristics['uuid_'+char.uuid] = char;
                        console.log(char);

                        var div = document.createElement("div");
                        div.setAttribute('id', char.name);
                        div.setAttribute('class', 'char');
                        div.innerHTML = `${char.name}`;
                      
                        var readBut = document.createElement("button");
                        readBut.addEventListener('click', read);
                        readBut.setAttribute('id', char.uuid);
                        readBut.innerHTML='read';

                        var writeBut = document.createElement("button");
                        writeBut.addEventListener('click', write);
                        writeBut.setAttribute('id', char.uuid);
                        writeBut.innerHTML='write';

                        if (char.properties.includes('read')) div.appendChild(readBut);
                        if (char.properties.includes('write')) div.appendChild(writeBut); 
                              
                       
                        // if 
                        characteristicsNames.push(div);
                    })

                    var service = document.getElementById('service');
                    var div = document.createElement("div");
                    div.setAttribute('id', v.name)
                    div.innerHTML = `
                      <h5>name: ${v.name}</h5>
                    `;

                    characteristicsNames.forEach((v, k) => {
                      div.appendChild(v);
                    });
                    service.appendChild(div);
                  })
                });      
              })
            }
          });
        
          console.log('======开始断开=======');
        }

      // 读取
      function read(){
        var uuid = this.getAttribute('id');
        var char = _characteristics['uuid_'+uuid];
       
        console.log(char);
        console.log('读取成功');
        char.read(function(error, data) {
          console.log(data.toString());
        })
      }

      // 写入
      function write() {
        console.log('写入成功');
      }
  
      // 断开
      function dis(name){
          console.log(name);
          console.log('连接成功');
      }

        // 扫描到之后
      function foundPeripheral (peripheral) {

            var name = peripheral.advertisement.localName;
            var bleList = document.getElementById('bleList');
            // console.log(peripheral);
            // bleList.innerHTML = `<button>${name}</button>`;
            var ble = document.createElement("div");
            var connectBtn = document.createElement("button");
            var disconBtn = document.createElement("button");

            ble.className = 'ble';
            connectBtn.innerHTML = '连接';
            disconBtn.innerHTML = '断开';

            connectBtn.setAttribute('id', name);
            disconBtn.setAttribute('id', name);
            connectBtn.addEventListener('click', connects);
            disconBtn.addEventListener('click', dis);

            ble.innerHTML = `
              <div class='name' >${name}</div>             
            `;

            ble.appendChild(connectBtn);
            ble.appendChild(disconBtn);
            bleList.appendChild(ble);

            peripherals[name] = peripheral;

            };
   

        var discover = document.getElementById("discover");
        // var connect = document.getElementById("connect");


        discover.addEventListener("click", function () {
        
            noble.on('stateChange', scan);
            // for every peripheral we discover, run this callback function
            console.log('开始扫描');
            noble.on('discover', foundPeripheral);
        })


      }
   
    </script>

<br>
<h2>BLE Server</h2>
<br>
<button id="discover">开始扫描蓝牙</button>
<h3>蓝牙列表</h3>
<div id="bleList">
</div>
<h4>Server操作</h4>
<div id='service'>

  
</div>
  </body>
</html>

运行效果:

 

参考资料

tigoe/BluetoothLE-Examples
noble/noble
nodejs/node-gyp
noble/node-bluetooth-hci-socket

 

 

参考 : noble 

Electron桌面应用集成蓝牙通信:用noble-winrt搞定Windows BLE开发(附完整避坑指南) 本文详细介绍了如何在Electron桌面应用中集成Windows蓝牙通信,使用noble-winrt库解决Windows BLE开发中的常见问题。从环境配置到核心API实战,再到避坑指南和进阶技巧,提供了一套完整的开发方案,帮助开发者高效实现蓝牙低功耗通信功能。 阅读详情

相关推荐

从零构建Electron蓝牙调试工具:可视化交互与特征值操作实战

本文详细介绍了如何从零开始构建基于Electron的蓝牙调试工具,涵盖BLE通信、可视化交互与特征值操作等核心功能。通过案例代码演示设备扫描、服务发现、数据监控等关键模块实现,帮助开发者快速掌握跨平台蓝牙应用开发技巧,提升物联网设备调试效率。

weixin_29172963的博客 1017

连接蓝牙设备

当蓝牙SIG(特别兴趣组,由爱立信等厂商组成)成立的时候,其发起者曾经指出,当蓝牙能够被集成入单芯片之中、成本下降到5美元的时候,将得到极大地普及。而今,小小的一个五号电池大小的几十块人民币的东西就可以提供这个功能了,蓝牙也真的进入了我们的生活。利用蓝牙在手机之间传送图片不是什么新鲜事,现在做的是要连接Linux主机和蓝牙手机。15.2.1  蓝牙技术概述蓝牙最早由瑞典的爱立信公司提出,其

baozhongchao的专栏 6755

Electron跨平台BLE开发实战:从驱动配置到设备交互全流程解析

本文详细解析了使用Electron进行跨平台BLE开发的完整流程,从驱动配置到设备交互的全方位实践指南。重点介绍了Windows平台驱动配置避坑技巧、noble库的核心使用方法以及多平台兼容性解决方案,帮助开发者高效实现蓝牙设备管理应用。

weixin_29192365的博客 680

electron-quick-start-ble 蓝牙

electron-quick-start-ble 蓝牙

u013040887的博客 1818

告别驱动烦恼:在Windows上用Electron + noble-winrt搞定蓝牙通信(保姆级避坑指南)

本文详细介绍了在Windows平台上使用Electron和noble-winrt实现蓝牙通信的实战指南。通过noble-winrt这一免驱解决方案,开发者可以避免传统蓝牙开发的驱动依赖问题,快速集成蓝牙功能到Electron应用中。文章涵盖了环境配置、核心API使用、常见问题排查及性能优化等关键内容,特别适合需要在Windows 10/11上进行蓝牙开发的工程师参考。

weixin_29197051的博客 430

Electron + Vite 集成 noble-winrt 蓝牙开发:从零到一构建跨平台桌面应用

本文详细介绍了如何使用Electron + Vite + noble-winrt技术栈开发跨平台桌面蓝牙应用。从环境配置、项目初始化到蓝牙模块集成,提供了完整的开发指南和实战代码示例,特别适合需要快速开发Windows平台蓝牙应用的开发者。noble-winrt的免驱动特性显著简化了部署流程,是Windows蓝牙开发的理想选择。

weixin_29251337的博客 158

《Electron + Vite 集成 Node 蓝牙开发实战》

使用electron egg v4版本开发,集成node蓝牙的demo

Jadeite2的博客 1534

electron-web-bluetooth

带有Chrome WebBluetooth API的Electron 这是Electron和Chrome Web-Bluetooth API的基本集成,具体来说,实现1) ,2)从蓝牙设备获取值,以及3)将值设置为蓝牙设备。 安装 # Go into the repository cd electron-web-bluetooth # Install dependencies npm install # Run the app npm start 为了获取心率数据,我使用了从App Store下载的名为LightBlue的蓝牙Prephiral Simulator应用程序。 在那里,为心率创建虚拟的前期服务。 转到“心率控制点”特征,添加读取和写入功能。 您还可以设置默认的十六进制值。 您需要此功能才能从“获取心率”按钮获取结果。 资源

ElectronBot低功耗蓝牙模块开发:BLE通信与数据传输实现

你是否在开发ElectronBot时遇到过蓝牙连接不稳定、功耗过高的问题?本文将从硬件连接、固件配置到数据传输协议,手把手教你实现稳定的低功耗蓝牙(BLE)通信功能,让机器人在保持长时间续航的同时实现流畅的数据交互。 读完本文你将掌握: - BLE模块与STM32微控制器的硬件连接方法 - 基于HAL库的蓝牙通信固件开发流程 - 关节角度数据的无线传输实现 - 低功耗优化的关键配置项 ## 二...

gitblog_00139的博客 974

electron_ble_example:带有Electron 6.n,LEGO WeDo 2.0 BLE协议的Bluetooth-LE测试项目

电子快速启动 克隆并运行以快速查看Electron的运行情况。 这是基于Electron文档中的《的最小的Electron应用程序。 将此应用程序与应用程序结合使用以获取API代码示例,以帮助您入门。 基本的Electron应用程序仅需要以下文件: package.json指向应用程序的主文件,并列出其详细信息和依赖项。 main.js启动应用程序并创建一个浏览器窗口以呈现HTML。 这是应用程序的主要过程。 index.html要呈现的网页。 这是应用程序的渲染过程。 您可以在《了解有关这些组件的更多信息。 使用 要克隆和运行此存储库,您需要在计算机上安装和 ( 随附)。 在您的命令行中: # Clone this repository git clone https://github.com/electron/electron-quick-start # Go int

electron-quick-start-ble.rar

electron-quick-start-ble 蓝牙功能使用,调用的是谷歌的蓝牙功能electron-quick-start-ble 蓝牙功能使用,调用的是谷歌的蓝牙功能electron-quick-start-ble 蓝牙功能使用,调用的是谷歌的蓝牙功能

《Electron 跨平台应用开发:蓝牙模块实战(一套代码Windows/macOS/Linux 适配)》

本文介绍了在Electron项目中实现跨系统蓝牙开发的方法,使用@abandonware/noble模块兼容Windows、Linux和macOS系统。主要内容包括:1. 环境配置要求(Node.js 20.x、Python 3.11.9、node-gyp等);2. 项目目录结构说明;3. 蓝牙调试准备步骤;4. 核心API使用方法(设备扫描、连接、服务/特征发现、数据收发);5. macOS系统的权限配置解决方案。文章提供了完整的代码示例和调试方法,重点讲解了noble模块的事件监听、设备操作等关键流程,

Jadeite2的博客 649

一步步教你获取ADNI影像数据:从搜索到下载全流程解析

本文详细解析了从ADNI数据库获取阿尔茨海默病影像数据的全流程,包括账号注册、数据检索技巧、高效下载策略及常见问题解决方案。特别介绍了高级搜索的黄金组合和智能数据集管理方法,帮助研究者快速获取T1加权MRI、PET等多模态影像数据,提升科研效率。

weixin_29061465的博客 321

介绍Node.js+Electron框架下和常用(HID 串口 BLE)硬件通信方法

可以让我们使用纯 JavaScript 调用丰富的原生 API 来创建桌面应用。可以内嵌react vue等前端框架,直接将web页面转换成桌面客户端程序。Node.js® 是一个开源的、跨平台的 JavaScript 运行时环境。能通过node插件直接js调用c++(内置v8)Node.js提供的napi,实现快速开发原生node插件的且面向对象的Api。我想说这个优快云的编辑器,太烂了,写了10多次。实现Node.js访问USB HID设备。实现Node.js访问串口设备。

GUMU12345的专栏 4585

记一次完整的RPG Maker MV游戏逆向过程(思路一)

了解RPG Maker MV的文件建构 上一篇文章,我们已经成功在PC上运行了游戏,那我们如何对游戏进行逆向呢? 首先要了解正常的RPG Maker MV制作的游戏应该具有哪些文件,以及他的结构 那如何了解他的结构呢,很简单,我们只需要用RPG Maker MV创建一个默认工程,来看看一个游戏的最简结构是怎么样的 创建新项目 项目创建完成 查看项目目录结构 是不是和之前解包出来的很像呢? 通...

Ciiiiiing的博客 1万+

取证实战:当嫌疑人电脑已关机,如何利用EFDD从休眠文件提取BitLocker密钥?

本文详细介绍了如何利用Elcomsoft Forensic Disk Decryptor(EFDD)从休眠文件(hiberfil.sys)中提取BitLocker密钥的实战技术。通过分析休眠文件中的内存快照,取证人员可以突破已关机加密设备的防线,获取关键解密信息。文章涵盖了工具配置、镜像获取、密钥提取及验证等完整流程,并提供了疑难问题解决方案和法律合规建议。

weixin_29315091的博客 342

Electron + Vite 集成 noble-winrt 蓝牙开发避坑指南

本文是一份针对在Electron + Vite项目中集成noble-winrt库进行Windows蓝牙开发的详细避坑指南。文章深入剖析了noble-winrt的优缺点,提供了从环境搭建、项目初始化、API详解到实战调试与打包分发的完整流程,重点解决了因文档缺失带来的挑战,帮助开发者高效实现蓝牙设备连接与数据交互。

python9snake的博客 392

爬虫-Playwright逆向小红书

【代码】爬虫-Playwright逆向小红书。

weixin_44201223的博客 2429

All-in-One串口终端:融合USB串口、蓝牙SPP/BLE与网络Socket的调试实践

串口调试是嵌入式开发中最基础的通信验证手段,贯穿硬件联调、固件开发和协议测试全程。然而USB串口、蓝牙SPP/BLE和网络Socket各自依赖不同的协议栈与连接方式,分散的调试工具常常割裂工作流、拖累效率。通过统一抽象Transport接口,将多通道数据收发、日志解析与脚本自动化整合进同一个界面,既能复用成熟的串口调试经验,又能降低多协议联调的学习成本。在UART外设调试、蓝牙模组验证、WiFi透传测试等场景中,开发者可无缝切换连接方式,配合时间戳与Hex/ASCII视图快速定位异常。一个All-in-On

weixin_26821003的博客 330

银河麒麟服务器操作系统V10SP2实战:基于vsftpd构建多角色精细化权限FTP服务

本文详细介绍了在银河麒麟服务器操作系统V10SP2上基于vsftpd构建多角色精细化权限FTP服务的实战指南。从环境准备、核心配置到多角色用户权限管理,全面解析了FTP服务的部署与优化技巧,特别针对企业级应用场景提供了安全加固和故障排查方案。

weixin_30312563的博客 357

YOLOV8改进:添加Wiseiou,有效涨点

【代码】YOLOV8改进:添加Wiseiou,有效涨点。

AIcurator的博客 2391

突破Web限制:用Nativefier打造BLE设备通信桌面应用

你是否曾想让网页应用直接控制智能手环、传感器或其他蓝牙低功耗(Bluetooth Low Energy, BLE)设备?传统网页受限于浏览器安全沙箱,无法直接访问硬件设备。本文将展示如何用Nativefier将Web应用转化为桌面应用,轻松实现Web Bluetooth API与BLE设备的通信,无需复杂的原生开发。 ## 为什么需要Nativefier? Web Bluetooth API允...

gitblog_00595的博客 386

YOLOv8架构革命:通过EfficientViT融合实现精度-速度的帕累托突破

目标检测领域长期存在精度与速度的权衡难题。视觉Transformer(ViT)的引入解决了长距离依赖问题,但其巨大的计算复杂度制约了实时应用。最新研究表明,将轻量级ViT与YOLO架构融合,可在几乎不损失推理速度的前提下,将mAP提升3-8个百分点。这种架构改进方案已在工业检测、自动驾驶、安防监控等多个领域得到验证,在保持实时性的同时显著提升了复杂场景下的检测可靠性。通过模块化设计,可以灵活适配不同规模的YOLOv8模型,为实际应用提供精度-速度的帕累托最优解。

FJN110的博客 148

uniapp串口通信实战:跨端原生桥接与BLE透传方案

串口通信是嵌入式设备与前端交互的基础能力,其核心在于物理层协议(如RS232/TTL)的电平控制、波特率配置及帧格式解析。Web Serial API虽提供浏览器端访问能力,但受限于Chrome/Edge单端支持、iOS/Safari完全不兼容、微信X5内核拦截等现实约束,无法满足工业、医疗、IoT等多端统一调试需求。因此,工程实践中普遍采用‘uniapp UI层 + 原生模块桥接’的混合架构:Android端依托UsbSerialDriver实现USB串口稳定通信,iOS端通过CoreBluetooth模

weixin_33859231的博客 186

项目模块提取生成jar包上传到nexus供其他项目使用

项目场景: 微服务项目当中的某一个模块其他项目进行复用,资源管理搭建的有私服 nexus。 问题描述: 如果把功能用到其他项目,代码重复量太大,不想些重复的代码。 原因分析: 如果把这个模块单独提取出来进行复用,至于操作数据库的功能,使用远程调用进行数据库操作,这样就能解决相同模块重复编写的工作。量。 解决方案: 首先对模块代码进行封装提取,把一些用到的参数提取出来,以传参的形式来对参数进行传递。这个需要根据具体的情况进行代码提取,提取之后把这个模块的代码进行打包,打包可以借助开发工具进行打包(记得使用 d

lierjun 的专栏 450

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

工业蓝牙落地指南:从BLE协议选型到预测性维护实操

蓝牙技术远不止连接耳机和手机,在工业物联网领域,它以低功耗、低成本、易部署的特性,成为传感器与云平台之间可靠的“最后一公里”通信方案。低功耗蓝牙(BLE)凭借极低的运行功耗和灵活的数据交互机制,在设备状态监测、资产追踪和预测性维护等场景中扮演关键角色。从BLE协议栈的分层原理、GATT服务的数据映射,到ESP32等硬件平台的选型与网关架构设计,蓝牙为工业现场提供了从数据采集到边缘处理的一体化链路。本文围绕工业监测、追踪与预测性维护三大方向,分享蓝牙技术落地中的协议选择、现场调试经验及完整链路设计思路,为同类

weixin_33910191的博客 330

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: python合并大量ts文件成mp4格式
下一篇: block动画仿真方案
IT有钱人
博客等级 码龄13年 269粉丝 68原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值