Bleak 实战:用 Python 三分钟读取第一个蓝牙低功耗设备数据
Bleak 实战用 Python 三分钟读取第一个蓝牙低功耗设备数据【免费下载链接】bleakA cross platform Bluetooth Low Energy Client for Python using asyncio项目地址: https://gitcode.com/gh_mirrors/bl/bleak你新买了一块支持蓝牙的温湿度传感器或者一只带心率的运动手环兴冲冲地打开编辑器准备用 Python 把数据抓下来。结果一查协议文档满屏的 GATT、UUID、特征值、句柄扑面而来配套示例还全是 C 语言和 ObjC——那一刻你是不是又默默合上了电脑别急这篇文章要介绍的 Bleak就是专门把这条陡峭的学习曲线铲平的 Python 蓝牙低功耗BLE客户端库。它到底是什么又适合谁Bleak 是 Bluetooth Low Energy platform Agnostic Klient 的缩写翻译过来就是与平台无关的 BLE 客户端。它基于 asyncio 构建让你能用纯 Python、用几行 await去连接附近的 BLE 设备、读写 GATT 特征值、订阅通知。适合的场景很典型物联网原型开发、传感器数据采集、智能家居设备调试以及任何想快速和蓝牙硬件对话的 Python 项目。如果你只是想在树莓派上读一个传感器的值而不是花两周啃完蓝牙协议栈Bleak 就是为你准备的。它凭什么值得你选一套代码四个系统通吃这是 Bleak 最值钱的一点。原生开发时Linux 上你要面对 BlueZ 的 D-Bus 接口macOS 上得写 CoreBluetooth 的委托方法Windows 上又是一套 WinRT 的异步模型——三个平台三种语法换一次系统就要重写一遍。Bleak 把这些差异全部封装在bleak/backends/下bluezdbus、corebluetooth、winrt、p4android 四个后端各司其职对外暴露的永远是同一套接口。你写的业务代码不用关心底层是 D-Bus 还是 CoreBluetooth同一份脚本在 Windows、macOS、Linux 上都能跑。异步模型天生适合 BLEBLE 设备的数据是流式的传感器不停推送、通知频繁触发。用同步写法去阻塞等待程序一卡就是好几百毫秒多个设备同时接入时更是一场灾难。Bleak 基于 asyncio 设计所有操作都是非阻塞的协程天然支持并发处理多个通知、多台设备代码写起来却和顺序执行一样直观。上手成本几乎为零全库的核心就两个类BleakScanner负责扫描发现BleakClient负责连接通信。再加一个async with上下文管理器帮你自动处理连接和断开异常时也不会把句柄泄漏在系统里。没有复杂的配置没有继承关系要维护。三步跑通你的第一行结果第一步安装和装任何 Python 包一样简单$ pip install bleak想尝鲜开发分支的话也可以直接安装 develop 分支版本。在 iOS 的 Pythonista 上则记得用pip install bleak[pythonista]。第二步扫描找到你的设备先看看周围有哪些 BLE 设备在广播。BleakScanner.discover()会扫描几秒并返回设备列表import asyncio from bleak import BleakScanner async def main(): devices await BleakScanner.discover() for d in devices: print(d) asyncio.run(main())每台设备会打印出名称、MAC 地址和广播数据。你也可以用find_device_by_name()或find_device_by_address()精准定位某台设备这在设备很多时非常有用。第三步连接并读取数据拿到设备的地址后连接和读取只需一个上下文管理器。以读设备型号为例——型号这个特征值是 BLE 标准定义的UUID 固定为2A24import asyncio from bleak import BleakClient MODEL_NBR_UUID 2A24 async def main(address): async with BleakClient(address) as client: model_number await client.read_gatt_char(MODEL_NBR_UUID) print(fModel Number: {model_number.decode()}) asyncio.run(main(24:71:89:cc:09:05))read_gatt_char返回的是字节串解码后就是设备返回的型号文本。到这里你已经完成了扫描 → 连接 → 读取的最小闭环整个过程不到二十行代码。新手最容易踩的三个坑坑一反复调用 asyncio.run()这是出现频率最高的错误。Bleak 要求整个程序共享同一个事件循环而每次asyncio.run()都会新建一个循环用完即毁。分段调用会导致后续连接报错或行为诡异。错误写法device asyncio.run(scan()) asyncio.run(connect(device))**正确写法**把流程串进一个协程只调用一次async def main(): device await scan() await connect(device) asyncio.run(main())坑二把脚本命名为 bleak.py这点写在 README 的开头加粗警告过千万别把你的脚本命名成bleak.py否则会触发循环导入错误。因为 Python 会优先在当前目录找到你这份山寨 bleak而不是真正的库。随便起个别的名字比如my_ble.py问题立刻消失。坑三树莓派上蓝牙连不上在 Raspberry Pi 这类板子上如果 Wi-Fi 和蓝牙同时开启内置无线模块的相互干扰可能导致连接时断时续。快速验证方法是用sudo rfkill block wlan临时关掉 Wi-Fi若问题消失就该考虑外接一个 USB 蓝牙适配器了。另外如果你在开发自己的 BLE 设备并频繁改动服务结构操作系统可能缓存旧的服务信息。Linux 上可用bluetoothctl -- remove XX:XX:XX:XX:XX:XX清除更早的 BlueZ 版本还需手动删掉/var/lib/bluetooth/下的 GATT 缓存文件。进阶玩法让设备主动给你发消息读数据是你问它答而很多传感器是主动汇报的——比如心率带每秒钟推送一次数据。这时就该用通知Notify机制了def handler(characteristic, data): print(f{characteristic.description}: {data}) async with BleakClient(device) as client: await client.start_notify(UUID, handler) await asyncio.sleep(5.0) await client.stop_notify(UUID)start_notify订阅某个特征值的通知后设备每次推送数据都会调用你的回调函数。配合asyncio的队列机制你还可以把数据暂存起来异步处理避免回调阻塞。完整的可运行示例见 examples/enable_notifications.py。如果你需要同时维护多台设备原理也类似为每台设备创建一个BleakClient协程在同一个事件循环里并发运行即可参考 examples/two_devices.py。各平台的针对性小贴士macOS首次运行会弹出蓝牙权限请求请务必允许。若之后发现扫描不到设备去系统设置 → 隐私与安全性 → 蓝牙里确认你的终端应用Terminal、iTerm 等已被勾选授权如下图所示Windows普通读写无需特殊权限但如果你要做蓝牙数据包级别的抓包调试必须右键以管理员身份运行命令提示符否则部分操作会因权限不足而失败Linux要求系统装有 BlueZ 5.55 及以上版本。可以用bluetoothctl排查适配器状态遇到权限问题记得给用户加上bluetooth组。去哪里继续深入项目仓库里已经备好了不少现成资源完整的 API 说明在 docs/api/ 目录客户端、扫描器、参数文档齐全examples/ 下躺着大量可直接运行的示例从服务探索、UART 通信到 SensorTag 连接应有尽有遇到怪问题时docs/troubleshooting.rst 里汇总了社区常见问题的处理办法。想从源码层面理解后端的实现差异可以翻一翻bleak/backends/下的四个后端目录。现在轮到你动手了从pip install bleak到读出手环的型号整个过程可能不到十分钟。找一台身边的蓝牙设备把上面的扫描代码跑起来你会发现自己离蓝牙开发其实只差一个 Bleak 的距离。【免费下载链接】bleakA cross platform Bluetooth Low Energy Client for Python using asyncio项目地址: https://gitcode.com/gh_mirrors/bl/bleak创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

OpenClaw环境变量配置全攻略:从API Key获取到多平台部署

OpenClaw环境变量配置全攻略:从API Key获取到多平台部署

1. 项目概述:从零到一搞定OpenClaw环境变量 最近在折腾OpenClaw,想把DeepSeek或者阿里云的模型接进去,结果第一步就卡在了环境变量上。这玩意儿看着简单,不就是填几个Key吗?但真操作起来,各种报错能把人整懵…

2026/10/1 20:26:49 阅读更多 →
基于OpenClaw构建AI Agent军团,实现多平台自媒体全自动运营

基于OpenClaw构建AI Agent军团,实现多平台自媒体全自动运营

1. 从“手动肝”到“自动跑”:一个自媒体人的效率革命如果你和我一样,曾经同时运营超过10个自媒体平台,那你一定对那种“不是在写稿,就是在发稿”的窒息感深有体会。每天醒来,面对的是十几个待更新的后台,从…

2026/9/25 22:30:07 阅读更多 →
Win11重装系统格式化硬盘全攻略:从原理到实战解决系统顽疾

Win11重装系统格式化硬盘全攻略:从原理到实战解决系统顽疾

1. 项目概述:为什么重装Win11格式化硬盘是“大扫除”的第一步最近帮朋友处理一台用了四五年的旧电脑,开机慢、软件卡顿、C盘常年飘红,典型的“电子垃圾”症状。他问我有没有什么办法能让它“起死回生”,我的回答很直接&#xff1a…

2026/9/28 18:12:42 阅读更多 →

最新新闻

DeepSeek Harness桌面端实战:30分钟搭建AI工作流与插件配置指南

DeepSeek Harness桌面端实战:30分钟搭建AI工作流与插件配置指南

1. 为什么我决定花30分钟试一把 DSH 桌面端第一次看到 DeepSeek Harness 这个名字,我下意识以为又是一个套壳聊天客户端。真正让我动手的原因,是那段时间我手头同时压着三件事:一份要整理成结构化笔记的 PDF 技术白皮书、一批需要批量改写的产…

2026/10/2 22:03:11 阅读更多 →
Git提交提示fatal: unable to detect current identity?三步定位配置冲突与身份修复

Git提交提示fatal: unable to detect current identity?三步定位配置冲突与身份修复

我前阵子在一台刚装完Git的笔记本上克隆公司仓库,改完代码准备提交,结果终端直接甩给我一个带fatal字样的报错。认真一看,就是那句经典的“Please tell me who you are... fatal: unable to detect current identity”,后面还跟着…

2026/10/2 22:03:11 阅读更多 →
MySQL锁机制与事务实战:从原理到死锁排查与优化

MySQL锁机制与事务实战:从原理到死锁排查与优化

1. 为什么一聊MySQL性能,绕不开锁和事务做后端这几年,遇到最多的线上事故其实不是代码崩了,而是数据库先扛不住了。尤其是当你负责的系统从单机小流量慢慢涨到千万级、亿级数据量,MySQL的锁和事务就成了你迟早要正面硬刚的东西。M…

2026/10/2 22:03:11 阅读更多 →
eNSP中交换机IP配置本质:VLANIF接口与管理地址原理

eNSP中交换机IP配置本质:VLANIF接口与管理地址原理

1. 为什么在eNSP里给交换机配IP,不是为了“上网”,而是为了“被管理”很多人第一次打开eNSP,拖出一台S5700交换机,点开CLI界面敲下system-view,接着就卡在了“下一步该干啥”——尤其是看到搜索热词里反复出现的“以太…

2026/10/2 22:03:11 阅读更多 →
从单模型到LLM推理平台:部署框架设计与vLLM/Triton实战

从单模型到LLM推理平台:部署框架设计与vLLM/Triton实战

1. 从单模型到推理平台:部署这件事到底在解决什么问题模型部署这个词,听起来像是运维的活儿,但真正做过的人都知道,它其实是算法、工程、硬件三者的交叉地带。你训练出一个模型,准确率再高,如果推不出去、跑…

2026/10/2 22:03:10 阅读更多 →
基于深度学习的课堂专注度分析与作弊检测系统:Python实现与调优指南

基于深度学习的课堂专注度分析与作弊检测系统:Python实现与调优指南

简介:这份资源是一套基于深度学习实现的课堂专注度分析与考试作弊检测系统,包含完整Python源码与配套文档说明,面向计算机相关专业正在做毕业设计的学生,以及需要项目实战练习的学习者。项目经导师指导并通过评审,难度…

2026/10/2 22:02:09 阅读更多 →

日新闻

从零搭建AI工程化:模型之外的完整闭环

从零搭建AI工程化:模型之外的完整闭环

先搞清楚一件事:从零开始做 AI 工程化,难的从来不是调模型、写提示词,而是把一套原型 Demo 变成长得像是“正经系统”的东西。你手里可能已经有了能跑通的代码,也可能刚读完一些概念,但真到了要把它变成可维护、可观测…

2026/10/2 0:00:20 阅读更多 →
大模型训练显存估计与混合精度训练实战指南

大模型训练显存估计与混合精度训练实战指南

1. 大模型训练显存估计与混合精度训练详解显存不够用,几乎是每个做大模型训练的人都会撞上的第一堵墙。你可能也经历过:模型代码写完了,数据管道跑通了,满心欢喜地按下训练启动脚本,结果几秒钟后终端弹出一行红字——C…

2026/10/2 0:00:20 阅读更多 →
小样本学习数据集选型指南:27个真正可用的高质量数据集

小样本学习数据集选型指南:27个真正可用的高质量数据集

1. 小样本学习的“弹药库”:为什么你总在找数据集,却总找不到真正能用的? 小样本、数据集——这两个词最近半年在我处理的200多个AI项目咨询里,出现频率排进前三。不是模型调不好,不是代码写不对,而是卡在…

2026/10/2 0:00:20 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/1 19:40:48 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/1 19:41:40 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/1 20:05:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 5:26:06 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 6:09:11 阅读更多 →