当前位置: 首页 > article >正文

【实战】Python+Bluez BLE广播开发:从零构建可被发现的自定义设备

1. 为什么需要自定义BLE广播设备想象一下这样的场景你走进一家智能家居体验店手机立刻自动弹出了当前房间所有智能设备的控制面板。这种无感连接的体验背后核心就是BLE广播技术。作为开发者我们经常需要让硬件设备主动自我介绍而广播就是最轻量级的打招呼方式。我去年为一个智能手环项目开发固件时就深刻体会到广播的重要性。当时设备需要通过广播包传递电量状态和运动模式让手机App能在不建立连接的情况下获取关键信息。相比传统蓝牙BLE广播的功耗只有1/10不到这对可穿戴设备简直是救命稻草。广播包就像设备的电子名片通常包含三类关键信息基础标识设备名称、MAC地址能力声明支持的服务UUID比如心率监测0x180D自定义数据制造商数据、温度传感器读数等用PythonBluez实现广播的优势很明显开发速度快不用碰嵌入式C代码、调试方便直接print日志、跨平台运行同一套代码能在树莓派和服务器通用。我实测在Raspberry Pi 4上Python广播程序的内存占用不到10MB。2. 开发环境搭建指南2.1 硬件准备清单虽然最终目标是让代码跑在嵌入式设备上但开发阶段用普通电脑就够。这是我的实测兼容设备列表设备类型推荐型号备注开发板Raspberry Pi 4B自带蓝牙4.2性价比最高USB蓝牙适配器CSR8510芯片系列10元价位稳定之选测试手机安卓8.0或iOS 12需支持BLE扫描2.2 软件环境配置先来碗一键安装命令大全# Ubuntu/Debian系 sudo apt update sudo apt install -y bluez python3-dbus python3-gi libglib2.0-dev pip3 install pygobject # 验证BlueZ版本必须≥5.43 bluetoothd --version如果遇到No such interface之类的DBus错误八成是版本不匹配。我有次在Ubuntu 18.04上被老版本BlueZ坑了三小时最后升级到20.04才解决。建议直接用这个Docker开发环境FROM ubuntu:20.04 RUN apt update apt install -y bluez python3-pip pip3 install pygobject3. 解剖BLE广播协议3.1 广播包数据结构广播包其实是个TLVType-Length-Value结构序列。举个例子我们要广播设备名MySensor心率服务UUID0x180D自定义数据温度25℃对应的字节流会是这样的02 01 06 03 02 0D 18 08 09 4D 79 53 65 6E 73 6F 72 FF 11 25拆解说明02 01 06标志位表示普通可连接设备03 02 0D 1816位UUID 0x180D08 09 4D...8字节长度设备名MySensorFF 11 25制造商数据0xFF类型11是厂商ID25是温度值3.2 BlueZ中的广播接口BlueZ通过DBus暴露了两个关键接口LEAdvertisingManager1控制广播开关、参数LEAdvertisement1定义广播包内容用gdbus工具可以直观看到这些接口gdbus introspect -y -d org.bluez -o /org/bluez/hci0你会看到类似这样的输出interface org.bluez.LEAdvertisingManager1 { methods: RegisterAdvertisement(in o advertisement, in a{sv} options, out void); UnregisterAdvertisement(in o service); properties: readonly u8 ActiveInstances 1; readonly u8 SupportedInstances 4; };4. 手把手编码实战4.1 初始化DBus连接先建立与系统DBus的连接这是所有操作的基础import dbus import dbus.mainloop.glib from gi.repository import GLib # 初始化DBus主循环 dbus.mainloop.glib.DBusGMainLoop(set_as_defaultTrue) # 获取系统总线 bus dbus.SystemBus()注意这里有个坑如果在多线程环境下使用必须在主线程初始化DBus。我有次在Flask子线程里调DBus接口直接导致段错误。4.2 定义广播内容继承Advertisement类创建自定义广播包from bluez_peripheral.advert import Advertisement class SensorAdvertisement(Advertisement): def __init__(self, bus, index): super().__init__(bus, index, peripheral) # 添加标准心率服务UUID self.add_service_uuid(180D) # 添加制造商数据假设公司ID 0x1234 self.add_manufacturer_data(0x1234, [0x01, 0x02, 0x03]) # 自定义数据 # 设置设备名 self.add_local_name(EnvSensor01) # 包含发射功率方便距离估算 self.include_tx_power True实际项目中制造商数据通常会编码更多信息。比如我们可以用前两个字节表示固件版本后两个字节传传感器数据。4.3 启动广播最后一步注册广播并启动事件循环def main(): # 查找蓝牙适配器 adapter find_adapter(bus) if not adapter: raise Exception(蓝牙适配器未找到) # 获取广告管理器接口 ad_manager dbus.Interface( bus.get_object(org.bluez, adapter), org.bluez.LEAdvertisingManager1 ) # 创建广告实例 adv SensorAdvertisement(bus, 0) # 注册广告 ad_manager.RegisterAdvertisement( adv.get_path(), {}, reply_handlerlambda: print(广播注册成功), error_handlerlambda e: print(f注册失败: {e}) ) # 启动事件循环 mainloop GLib.MainLoop() try: mainloop.run() except KeyboardInterrupt: mainloop.quit()这里有个性能优化点RegisterAdvertisement的第二个参数可以设置广播间隔{ Interval: dbus.UInt32(200), # 单位0.625ms → 200×0.625125ms Type: peripheral }5. 调试与验证技巧5.1 使用nRF Connect分析广播安装nRF Connect后按这个流程验证扫描设备列表中找到EnvSensor01点击进入广播包解析页面检查关键字段设备名称是否正确服务UUID是否包含0x180D制造商数据是否匹配我习惯用这个工具检查广播包长度——BLE4.x最大31字节超了会被截断。曾经因为没注意这个限制导致温度数据后半截丢失。5.2 命令行调试三板斧当nRF Connect显示异常时先用这些命令定位问题# 查看蓝牙适配器状态 hciconfig -a # 实时监控DBus消息 dbus-monitor --system interfaceorg.bluez # 查看内核蓝牙日志 dmesg | grep Bluetooth特别是dbus-monitor它能显示底层通信细节。有次发现广播注册失败就是通过它看到Invalid Arguments错误最终发现是UUID格式不对。6. 生产环境注意事项6.1 广播间隔的权衡广播间隔直接影响设备发现速度和功耗间隔(ms)发现延迟平均电流201s2.1mA1001-3s0.8mA10005-10s0.2mA智能门锁这类对实时性要求高的设备建议用100ms间隔而温湿度传感器可以设到1秒以上。6.2 广播安全方案虽然广播数据是明文传输但仍有基本防护措施轮换设备名比如Thermo_0x12A3后四位随机数据混淆对温度值做简单异或加密白名单过滤在连接阶段验证设备合法性我曾帮一个客户排查BLE嗅探问题发现他们广播包里直接传了未加密的序列号导致能被轻松伪造。后来改成连接后加密传输安全性大幅提升。

相关文章:

【实战】Python+Bluez BLE广播开发:从零构建可被发现的自定义设备

1. 为什么需要自定义BLE广播设备 想象一下这样的场景:你走进一家智能家居体验店,手机立刻自动弹出了当前房间所有智能设备的控制面板。这种"无感连接"的体验背后,核心就是BLE广播技术。作为开发者,我们经常需要让硬件设…...

Step3-VL-10B-Base模型量化实战:GPU资源优化指南

Step3-VL-10B-Base模型量化实战:GPU资源优化指南 1. 量化技术入门:为什么我们需要模型量化? 当你面对一个像Step3-VL-10B-Base这样的大型视觉语言模型时,最直接的感受可能就是"吃资源"。模型越大,需要的GP…...

从像素到概念:如何用Python+OpenCV一步步提取图像的底层和高层特征

从像素到概念:PythonOpenCV实战图像特征提取全流程 引言:理解图像特征的层次性 当我们注视一张海滩照片时,视觉系统会经历从局部到整体的认知过程——首先捕捉海浪的纹理、沙粒的明暗,然后识别出遮阳伞、游泳者等独立物体&#xf…...

直播弹幕完整捕获:从实时互动到永久存档的技术实践

直播弹幕完整捕获:从实时互动到永久存档的技术实践 【免费下载链接】DouyinLiveRecorder 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveRecorder 当直播间的精彩瞬间转瞬即逝,那些充满灵感的弹幕互动也随之消失,你是否曾为…...

Linux 调度器中的远程抢占:smp_send_reschedule 的实现与应用

一、简介在现代多核处理器架构中,对称多处理(SMP, Symmetric Multi-Processing) 已成为服务器、桌面乃至移动设备的标准配置。Linux内核作为支持最广泛硬件平台的操作系统,其调度器必须高效地协调多个CPU核心上的任务分配&#xf…...

Subnautica Nitrox:在深海孤独中点亮协作的灯塔

Subnautica Nitrox:在深海孤独中点亮协作的灯塔 【免费下载链接】Nitrox An open-source, multiplayer modification for the game Subnautica. 项目地址: https://gitcode.com/gh_mirrors/ni/Nitrox 当450米深的幽暗海水包裹着你的潜水服,周围只…...

Windows Defender Remover终极指南:高效移除系统防护的完整方案

Windows Defender Remover终极指南:高效移除系统防护的完整方案 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mi…...

小白也能懂!ERNIE-4.5-0.3B-PT部署实战:从环境配置到Web界面调用

小白也能懂!ERNIE-4.5-0.3B-PT部署实战:从环境配置到Web界面调用 1. 为什么选择ERNIE-4.5-0.3B-PT 如果你正在寻找一个既轻量又强大的中文文本生成模型,ERNIE-4.5-0.3B-PT绝对值得考虑。这个只有3亿参数的模型,在中文理解和生成…...

别再只用编码器了!用ROS的robot_localization包融合IMU与Odom,让你的Cartographer建图精度翻倍

突破SLAM精度瓶颈:robot_localization包在Cartographer中的实战优化指南 当你的移动机器人在长走廊环境中反复建图却始终无法对齐首尾时,当激光匹配在特征稀疏区域频繁出现定位跳变时,这些现象很可能源于单一编码器里程计的累积误差。本文将带…...

Flink项目实战篇 基于Flink的智慧交通实时预警系统(上)

1. 项目背景与核心需求 想象一下早晚高峰时段的城市主干道,密密麻麻的车流像蜗牛一样缓慢移动。交警指挥中心的大屏幕上,红色拥堵区域不断扩散,却无法快速定位问题根源。这正是传统交通管理面临的痛点——数据滞后和响应迟缓。而我们的智慧交…...

postgresql QueryWrapper left join

原生的 MyBatis-Plus QueryWrapper 不支持 LEFT JOIN。QueryWrapper 的设计初衷是用于单表的 CRUD 操作。它生成的 SQL 结构固定为 SELECT ... FROM table WHERE ...,无法直接生成 JOIN 子句。但是,如果你需要在 MyBatis-Plus 中实现联查(特别…...

零基础入门《Natural Language Processing with PyTorch》中文翻译项目手把手教程

零基础入门《Natural Language Processing with PyTorch》中文翻译项目手把手教程 【免费下载链接】nlp-pytorch-zh 《Natural Language Processing with PyTorch》中文翻译 项目地址: https://gitcode.com/gh_mirrors/nl/nlp-pytorch-zh 《Natural Language Processing…...

漏洞扫描系统毕业设计:基于任务队列与异步调度的效率优化实践

在计算机安全领域,漏洞扫描系统是评估网络资产安全性的重要工具。对于计算机专业的同学来说,将其作为毕业设计选题,既能综合运用网络、数据库、并发编程等知识,又能接触到安全领域的核心实践。然而,一个初版的扫描系统…...

从检测到理解:构建基于YOLOv5、DeepSORT与SlowFast的智能视频行为分析引擎

1. 为什么需要智能视频行为分析? 想象一下这样的场景:超市保安需要盯着几十个监控屏幕,试图从人群中找出可疑行为;幼儿园老师要时刻关注每个孩子的活动,防止意外发生。传统监控完全依赖人力,不仅效率低下&a…...

Citrix敦促用户修补允许未认证数据泄露的关键NetScaler漏洞

Citrix已发布安全更新,修复NetScaler ADC和NetScaler Gateway中的两个漏洞,其中包括一个可能被利用泄露应用程序敏感数据的关键缺陷。漏洞详情如下:CVE-2026-3055(CVSS评分:9.3)- 输入验证不足导致内存越界…...

【技术实践解析】SAM-Adapter:如何让“分割一切”模型在特定场景下表现更佳

1. 为什么需要SAM-Adapter? 当你第一次听说"分割一切"的SAM模型时,可能会觉得这简直是计算机视觉领域的"万能钥匙"。确实,Meta发布的Segment Anything Model(SAM)在通用图像分割任务上表现惊艳&am…...

nli-distilroberta-base惊艳效果:中英文混合句子对推理准确率超89.2%

nli-distilroberta-base惊艳效果:中英文混合句子对推理准确率超89.2% 1. 项目概述 nli-distilroberta-base是基于DistilRoBERTa模型的自然语言推理(NLI)Web服务,专门用于判断两个句子之间的逻辑关系。这个轻量级模型在保持高性能的同时,大幅…...

告别手动转录烦恼:BiliBiliCCSubtitle智能工具让视频字幕高效提取成为现实

告别手动转录烦恼:BiliBiliCCSubtitle智能工具让视频字幕高效提取成为现实 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 你是否曾在学习B站教程时&a…...

SpringBoot仓库管理系统毕设实战:从需求建模到高可用部署

最近在帮学弟学妹们看毕业设计,发现很多“仓库管理系统”项目虽然功能齐全,但代码结构混乱,像是把各种技术简单堆砌在一起,离“工程化”和“真实可用”还有不小距离。刚好我之前参与过一个类似的实战项目,今天就来聊聊…...

Ubuntu 20.04 下 COLMAP 编译安装:从 CUDA 架构到依赖冲突的避坑指南

1. 为什么选择源码编译COLMAP? 很多刚接触三维重建的朋友可能会问:为什么不用apt直接安装COLMAP?我在实际项目中发现,Ubuntu官方仓库的版本往往落后于GitHub主线版本2-3个迭代。比如当前Ubuntu 20.04仓库提供的是3.6版&#xff0c…...

Paging3深度实战:如何构建高性能Android分页加载架构

Paging3深度实战:如何构建高性能Android分页加载架构 【免费下载链接】AndroidX-Jetpack-Practice 本仓库致力于建立最全、最新的的 AndroidX Jetpack 相关组件的实践项目 以及组件对应的分析文章(持续更新中)如果对你有帮助,请在…...

安卓 Androidstudio跑步俱乐部管理系统 足球俱乐部app

目录需求分析与功能规划技术选型与架构设计开发流程与里程碑测试与部署策略维护与迭代方向项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作需求分析与功能规划 目标用户:足球俱乐部管理员、教练、球员及家长&#x…...

CocosCreator对话系统实战:从零构建高可维护的剧情交互模块

在游戏开发中,剧情对话系统是连接玩家与游戏世界的重要桥梁。无论是RPG、AVG还是带有叙事元素的休闲游戏,一个流畅、灵活且易于维护的对话系统都至关重要。然而,很多开发者在初次尝试用CocosCreator构建对话系统时,往往会陷入一些…...

《风爆远征英雄年代怀旧服》官方网站:3月25日开服,老玩家直呼爷青回的经典国战

风爆远征英雄年代怀旧服终于定档3月25日开服,不少老玩家翻遍全网找攻略,就怕错过当年热血战场,也怕新版魔改丢了原味,这份走心攻略帮你快速吃透开服要点。《风爆远征英雄年代怀旧服》已正式开启全平台公测,由游昕官方运…...

Kaetram-Open:构建2D MMORPG的开源引擎框架 | 开发者的多人游戏开发解决方案

Kaetram-Open:构建2D MMORPG的开源引擎框架 | 开发者的多人游戏开发解决方案 【免费下载链接】Kaetram-Open Kaetram is an open-source 2D HTML5 MMORPG. It is an extended version of BrowserQuest (BQ). 项目地址: https://gitcode.com/gh_mirrors/ka/Kaetram…...

4步搞定RealSense SR300相机Ubuntu连接:Python深度相机开发终极指南

4步搞定RealSense SR300相机Ubuntu连接:Python深度相机开发终极指南 【免费下载链接】librealsense Intel RealSense™ SDK 项目地址: https://gitcode.com/GitHub_Trending/li/librealsense 你是否在Ubuntu 22.04系统上为RealSense SR300相机的Python连接而…...

如何用TileLang实现高性能GPU算子:从入门到精通的完整指南

如何用TileLang实现高性能GPU算子:从入门到精通的完整指南 【免费下载链接】tilelang Domain-specific language designed to streamline the development of high-performance GPU/CPU/Accelerators kernels 项目地址: https://gitcode.com/GitHub_Trending/ti/…...

若依框架深度定制实战:从模块设计到企业级应用优化

1. 若依框架企业级定制入门指南 第一次接触若依框架时,我就被它"开箱即用"的特性惊艳到了。这个基于Spring Boot和MyBatis的快速开发平台,确实能帮开发者节省大量重复劳动。但真正把它用进企业级项目时,我发现原版框架就像毛坯房&a…...

2024最新版QQNT防撤回插件技术指南:保护您的消息不被删除

2024最新版QQNT防撤回插件技术指南:保护您的消息不被删除 【免费下载链接】LiteLoaderQQNT-Anti-Recall LiteLoaderQQNT 插件 - QQNT 简易防撤回 项目地址: https://gitcode.com/gh_mirrors/li/LiteLoaderQQNT-Anti-Recall 在日常使用QQNT的过程中&#xff0…...

AI英语单词APP的开发

与口语APP强调“实时交互”不同,AI英语单词APP的核心逻辑在于“记忆科学与生成式内容的深度融合”。在2026年,开发重点已从单纯的“数字化单词书”转向“千人千面的动态语境构建”。1. 核心技术架构与链路语义向量引擎 (Vector Embeddings): …...