蓝牙低能耗(Bluetooth Low Energy,或称Bluetooth LE、BLE,旧商标Bluetooth Smart)也称低功耗蓝牙,是蓝牙技术联盟设计和销售的一种个人局域网技术,旨在用于医疗保健 笔者前段时间做了一个功能,需要对接一个蓝牙设备,该蓝牙设备使用的就是BLE蓝牙。这里给大家分享一下我的实现。这篇文章主要是实现程序与BLE蓝牙设备的连接,交互和设置、测试工具等请期待下一篇文章。 bluetoothLeScanner = bluetoothAdapter.bluetoothLeScanner // Android5.0新增的扫描API,扫描返回的结果更友好,比如BLE 我们首先利用它去检测设备是否有蓝牙驱动,设备蓝牙是否打开等信息,并优化用户体验。满足以上条件后,我们可以开始扫描附近的蓝牙设备。 到此,我们就获取到了附近所有的使用BLE蓝牙的设备的设备信息。至于如何交互?如何筛选BLE蓝牙设备的指定权限服务?笔者会在下篇一一道来,并且会上传一个笔者做的蓝牙测试工具。
你周围不止一副蓝牙设备掏出手机扫一下蓝牙,列表里几十个设备。耳机、手环、车间里的蓝牙网关、隔壁工位的手机——Rokid AI 眼镜就混在里面。 问题是,眼镜的 BLE 广播名有时候是空的,有时候显示为乱码,你不能只靠名字来认。我们把扫描过滤做成了两级:第一级是 Android 系统层的 BLE 扫描配置。 上层的代码通过 StateFlow 拿到设备列表后直接绑定到 UI,每次新设备进来自动排序: 打个比方:普通蓝牙设备像是标准快递,手机操作系统认识这个快递单,帮你签收了。 这篇文章其实就想说一件事:蓝牙扫描不是搜一下就行,设备过滤、排序、连接建立,每个环节的细节决定了工业现场的体验。把 BLE 扫描的五秒变成一秒,把"连不上"变成"三秒重连",就是这些细节堆出来的。
Ble蓝牙App(二)连接与发现服务 前言 在上一篇中我们进行扫描设备的处理,本文中进行连接和发现服务的数据处理,运行效果图如下所示: 正文 现在我们在ScanSlice扫描设备,选中一个设备进入 ,在onStart()方法中进行BleCore的赋值,然后设置Ble的回调,实现BleCallback接口,重写里面的函数,当连接成功之后会通过回调deviceInfo()得到设备状态,因为是子线程所以在 四、发现服务 连接写好了,下面可以写发现服务了,我们可以在连接成功的处理中进行发现服务,下面我们修改一下BleDeviceCallback中的connectionStateChangeEvent() 方法中的代码,如下图所示: 通过mDevice.discoverServices()进行发现服务的动作,在此之前通过deviceInfo()设置当前的动作状态,发现服务执行会触发servicesDiscoveredEvent 在蓝牙通信中,设备使用UUID来发布和查找服务以及识别特性。UUID是蓝牙设备之间进行通信时的重要标识,确保了设备和服务的唯一性。
前言 在上一篇中我们进行扫描设备的处理,本文中进行连接和发现服务的数据处理,运行效果图如下所示: 正文 现在我们从MainActivity进入到ScanActivity,选中一个设备返回到 ,在onCreate()函数中进行BleCore的赋值,然后设置Ble的回调,实现BleCallback接口,重写里面的函数,当连接成功之后会通过回调deviceInfo()得到设备状态,因为是子线程所以在 四、发现服务 连接写好了,下面可以写发现服务了,我们可以在连接成功的处理中进行发现服务,下面我们修改一下BleGattCallback中的onConnectionStateChange()函数中的代码 ,如下图所示: 通过gatt.discoverServices()进行发现服务的动作,在此之前通过deviceInfo设置当前的动作状态,发现服务执行会触发onServicesDiscovered() 在蓝牙通信中,设备使用UUID来发布和查找服务以及识别特性。UUID是蓝牙设备之间进行通信时的重要标识,确保了设备和服务的唯一性。
为避免包冲突, 建议通过系统包管理器安装root@rpi-cm0:~# apt updateroot@rpi-cm0:~# apt install python3-bleakBLE 设备发现与连接扫描周围 BLE设备代码以下脚本将扫描并列出附近所有 BLE 设备及其信号强度 (RSSI)import asynciofrom bleak import BleakScannerasync def main() 设置足够的扫描时间 (如上面的5秒) 可以覆盖多个广播周期, 提高设备发现率.列出指定BLE设备服务与特征列表方式一: 通过MAC地址指定设备 (推荐, 大多数情况下MAC地址唯一)import asynciofrom 方法来扫描和连接BLE设备, 区别在于筛选条件不同.BLE的设备名称不唯一, 因此通过名称指定设备时可能会出现多个设备同时被找到的情况. 设备的特征值有读取(Read), 写入(Write), 通知(Notify)等属性, 一个特征值可以有多个属性.特征值的属性可以用上一节列出指定BLE设备服务与特征列表提供的代码来查看.写入指定BLE设备指定特征数据代码尝试写入数据
针对低功耗蓝牙通讯,Android 4.3(API 18)开始引入了 BLE 库。我们可以直接使用 Android SDK 中的蓝牙 BLE 库,而不用额外导入依赖库。 而使用BLE库,我们可以直接通过蓝牙设备的UUID进行连接(通过GATT服务),在当前应用内就能直接连接了。而不用通过系统设置。 那么我们将会无法发现蓝牙设备。 也就是执行蓝牙扫描 API 无法得到任何结果(PS::Logcat 中的错误日志会告诉你,要开启位置权限,否则无法扫描发现蓝牙设备)。 <! 3.8 写数据到蓝牙设备中 我们如果想将内容推送到蓝牙设备中,在发现服务的时候onServicesDiscovered 遍历特性中,确保是用于写消息的特性对象后。 同时一个蓝牙设备对象,可能有多种服务功能。 如果不想自己写线程变量轮询设备发送过来的消息,就通过注册消息监听。让BLE框架帮我们进行轮询之后,再通知到我们。
如何开发一个 标准的 BLE MIDI 设备 , 该设备可以被 Android / iOS / Mac / Windows / Linux 等操作系统平台识别为标准 MIDI 设备 , 并从该设备中接收 标准的 BLE-MIDI 硬件设备开发成的乐器 , 要兼容以下平台的如下软件 : Windows : Cubase Mac : Logic Pro iOS : 库乐队 ( Garage Band 服务设置为 : 03B80E5A-EDE8-4B33-A751-6CE34EC4C700 BLE 特性设置为 : 7772E5DB-3868-4112-A1A9-F2669D106BF3 该特性的属性设置为 功能 , 验证 硬件设备 是否开发成功 ; BLE 测试相关 : 四、单片机制作电子乐器 ---- 参考 我是鹏老师 发表的几篇博客 : 【PCB授课笔记】51单片机制作一个【卡林巴】【电子琴】 ((len(name) + 1, 0x09)) + name , resp_data = b'\x11\x07\x00\xC7\xC4\x4E\xE3\x6C\x51\xA7\x33
之前做 Ble 开发都是在 Android 6.0 系统以下的版本中进行测试]的,今天使用 Android 6.0 的设备测试的时候,发现扫描不到周围的 Ble 设备。 后来发现 6.0 需要在应用运行过程中请求位置权限,并且还要打开位置。 设备"); } //请求权限 ActivityCompat.requestPermissions(this, new String 做完上面你以为就 OK 了,但是可能你会发现,并没有什么卵用,依然不能搜索到周围的 Ble 设备,原因是可能的你的位置服务(定位 GPS)没有打开。 设备;如果定位没有打开,则需要用户去打开,像下面这样: private static final int REQUEST_CODE_LOCATION_SETTINGS = 2; ... private
最近项目有个需求,手机设备连接多个蓝牙4.0 设备 并获取这些设备的数据。 查询了很多资料终于实现,现进行总结。 3、结束扫描按钮 4、完成选择按钮,将选择的设备MAC地址传回 ? 包含: 1、选择需要连接的传感器设备 按钮 2、开始连接 按钮 3、数据展示 ? 布局文件代码: <? xqx * @email djlxqx@163.com * blog:http://www.cnblogs.com/xqxacm/ * createAt 2017/9/6 * description: ble '、跳转新界面 2、点击'开始扫描'按钮,会出现很多设备的mac地址 ,以列表的新式展现 3、对列表item操作,更改状态'已选择'or'未选择' 4、点击按钮'完成选择设备'按钮,将列表中状态为'已选择
一、请求MTU的概念 在 Android 的 BLE(Bluetooth Low Energy)开发中,requestMtu 是一个用于请求修改 BLE 连接的最大传输单元(MTU)的方法。 通过调用 requestMtu 方法,你可以请求增加或减少 BLE 连接中的 MTU 大小。较大的 MTU 可以提高数据传输效率,因为每个数据包可以携带更多的数据。 而在传输的时候你还需要-3,也就是244。单次传输的最大字节数据为244个字节。 layout_constraintTop_toBottomOf="@+id/data_layout" /> </androidx.constraintlayout.widget.ConstraintLayout> 你会发现这个布局内容和写数据弹窗如出一辙 六、显示设备信息 先说说为什么要显示设备操作信息,因为这可以方便我们测试一些功能,虽然我们可以在控制台看到所有内容,不过终究不是时时刻刻都是调试的,也有直接使用的情况,那么针对这个需求,我们可以在主页面中点击设备信息是显示一个设备信息列表弹窗
BLE安全之配对流程剖析(3) 上一章介绍了配对流程的第二阶段,剖析了配对第二阶段的配对算法的选择和鉴权方式的选择。 接下来就进入了ble配对的阶段三,在该阶段双方会根据生成的STK或LTK来生成其他的密钥,就是配对的密钥分配阶段。 1. 通过这个可以将BLE配对产生的配对密钥转化成经典蓝牙的密钥。 link key = h6(ILK, “lebr”) 如果两端的CT2都设置为1,则: ILK = h7(SALT, LTK) BR/EDR link key = h6(ILK, “lebr”) 3. MAC地址,一旦MAC地址的设备在配对后连接上了设备。
这些命令对于BLE设备的基本功能和性能优化至关重要。 一、LE Controller命令概述 LE Controller命令是BLE技术中,由链路层发出的、用于指导BLE设备执行特定操作的一组指令。 LE Controller命令集是BLE设备中用于管理蓝牙连接和广播数据的关键工具。通过合理使用这些命令集,可以实现BLE设备的发现、连接和数据传输等功能。 关闭连接(可选) 断开连接:在完成所有操作后,如果不再需要与BLE设备进行通信,主机软件可以断开与BLE设备的连接。 // 连接后的操作(如:服务发现、读写特征值等)在此处进行 // ... // 清理和关闭BLE栈 ble_stack_deinit(); 仔细核对参数值和范围,以符合设备的要求和规范。 3. 错误处理: 接收命令响应后,检查状态码以确定命令是否成功执行。 根据错误类型采取适当的错误处理措施,如重新设置参数或重启设备。 4.
在本文中我们将讨论Project Zero发现的第666个漏洞:FireEye设备可通过被动监控接口进行利用的漏洞。 FireEye已经发布了针对该漏洞的补丁,请用户立即应用该补丁! [1]FireEye设备可以在IPS模式下进行配置,这么做可以修改监控流量 [2]该问题刚刚好是Project Zero发现的第666个漏洞 常见问答 Q:如何检查是否我的FireEye设备存在该漏洞? FireEye被动监控接口(也被称作pether3)连接到中心(类似于镜像端口)的第三个接口,所以它可以在测试机器上用来观察两个接口之间流量间的交换。 额外的接口作为FireEye的管理接口,以及LAN访问: 这是一个棘手的路由配置,特别是从两个本地接口(eth2, eth3)流向中心的流量中截获流量。 lookup 101 ip route add local 192.168.2.1 dev eth3 table 101 访问管理接口,通过ttyS0在正确的子网中给FireEye设备的ether1接口配置一个静态地址
什么是 MAC 地址 媒体访问控制也称为 MAC 地址,是实际属于设备本身并由其供应商分配的物理地址。 MAC地址本身实际上由两部分组成: 前三个八位字节被称为 OUI 或组织唯一标识符,它告诉我们该设备的供应商实际上是谁。 然而,最后三个八位字节通常被称为供应商分配的 ID,这将允许供应商识别该特定设备。
初始化设备标志 设备对象中有两个标志位需要在AddDevice中初始化,并且它们在以后也不会改变,它们是DO_BUFFERED_IO和DO_DIRECT_IO标志。 DO_POWER_INRUSH意味着你的设备在上电时将汲取大量电流,因此,电源管理器将确保没有其它INRUSH设备同时上电。 设置初始电源状态 大部分设备一开始就进入全供电状态。 建立设备堆 每个过滤器驱动程序和功能驱动程序都有责任把设备对象放到设备堆栈上,从PDO开始一直向上。 返回值是紧接着你下面的任何设备对象的地址,它可以是PDO,也可以是其它低级过滤器设备对象。 ; 当这个标志设置时,I/O管理器将拒绝任何打开该设备句柄的请求或向该设备对象上附着其它设备对象的请求。
OpenClaw 采用 Bonjour (mDNS/DNS-SD) 作为核心发现协议,并深度集成 Tailscale 以实现跨网络的广域发现。 核心设计原则 便利性优先:自动发现减少手动 IP 配置。 安全不妥协:发现信息仅用于 UI 提示,绝不作为权威路由或信任依据。 { discovery: { mdns: { mode: "minimal" } } } 模式二:完全功能 (家庭/开发环境) 广播所有辅助信息,方便多设备无缝连接。 3. 广域发现:跨越网络边界 (Wide-Area Bonjour) 标准 mDNS 无法跨越路由器。 典型部署场景 场景 A:家庭多设备 (LAN) 目标:手机、平板、电脑自动发现。
并通过实地测试,证明了这种方式能够识别日常生活中的大多数设备(94.6%),同时发现其中部分设备(7.4%)存在潜在问题。 第二步,在实际场地上对BLE设备广播进行嗅探,验证实际发现的设备能否与App中提取出来的UUID关联上,从而实现BLE设备的精确识别。 表 2 BLESCOPE关注的BLE设备通信API ? 表 3 BLESCOPE关注的加解密、哈希算法API ? 通信参数硬编码的检测,也是对表 2中函数调用的参数进行分析。 通过对Google商店1.8万个支持BLE通信的App进行分析,BLESCOPE发现其中61.3%的应用使用了Just Works方式配对,15.8%的应用的BLE连接过程存在上述两种漏洞。 ? 图 3 BLE设备分布热力图 BLE设备的广播包中包含设备的基本信息,这其中包含供应商的vendor ID,在Bluetooth SIG的数据库中能够查到供应商ID对应的公司名称。
而Web Bluetooth API的出现,直接赋予了网页与低功耗蓝牙(BLE)设备对话的能力,从智能手环的健康数据同步,到智能家居设备的远程控制,再到工业场景中的传感器数据采集,其应用边界正不断拓宽。 随着HTML5标准的普及和Web技术栈的成熟,浏览器厂商开始探索将更多硬件交互能力开放给网页,Web Bluetooth API正是在这一背景下,由W3C(万维网联盟)牵头制定的技术规范。 而设备发现流程作为API规范中的关键模块,其设计既遵循了蓝牙技术联盟(SIG)制定的BLE协议标准,又充分考虑了Web环境的安全性与用户体验,形成了一套兼顾技术合规性与实践易用性的逻辑体系。 从蓝牙通信的角色划分来看,BLE设备主要分为中央设备与外围设备两类:中央设备具备主动发起扫描、建立连接的能力,而外围设备则通过周期性发送广播数据包的方式,向周围环境宣告自身存在,并等待中央设备的连接请求 GATT(通用属性配置文件)是BLE协议中定义数据交互规范的核心部分,它将设备的功能抽象为“服务”(Service)与“特征”(Characteristic):服务是功能的逻辑分组(如“心率监测服务”包含与心率相关的所有功能
字符设备驱动中的 read接口的使用,简单实例 驱动部分代码 #include <linux/module.h> #include <linux/slab.h> #include
服务发现 在配置中定义上游群集时,Envoy需要知道如何解析群集的成员。这被称为服务发现。 支持的服务发现类型 静态的 静态是最简单的服务发现类型。 原始目标服务发现必须与原始目标负载均衡器一起使用。 服务发现服务(SDS) 服务发现服务是Envoy用来获取集群成员的通用REST API。 Lyft通过Python发现服务提供了一个参考实现。 对于每个SDS群集,Envoy将定期从发现服务中获取群集成员。 通常,主动健康检查与最终一致的服务发现服务数据结合使用,以进行负载平衡和路由决策。这将在下一节进一步讨论。 最终一致的服务发现 许多现有的RPC系统将服务发现视为完全一致的过程。 当发现服务再次正常运行时,数据将最终重新收敛。 Host discovered / health check FAIL Envoy不会路由到目标主机。 假设健康检查数据比发现数据更准确。