欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!

news2025/7/27 9:22:36

多连接 BLE 怎么设计服务不会乱?分层思维来救场!

作者按
你是不是也遇到过 BLE 多连接时,调试现场像网吧“掉线风暴”?
温度传感器连上了,心率带丢了;一边 OTA 更新,一边通知卡壳。
别怕!今天我们用“分层思维”帮你搞清楚多连接服务设计怎么不乱套!


在这里插入图片描述

🧩 一、多连接 BLE 是怎么回事?

默认 BLE 连接是“一对一”——一个 Central 连接一个 Peripheral。
但现代芯片(如 EFR32、nRF52、ESP32)支持一个 Central 同时连接多个 Peripheral,甚至多个连接角色共存(Dual Role)。

想象一下你的手机开了蓝牙:

  • 连了手表看心率;
  • 又连了温湿度节点采集环境;
  • 还偷偷在和智能秤同步数据…

🤯 全连上后就像开了场 BLE 群聊大会,每个设备讲自己的故事,还要求你听得清楚不混音。


🧠 二、为啥多连接时服务容易“打架”?

常见多连接混乱现象:

问题原因
收到数据却不知道谁发的?Service/Characteristic UUID 设计不唯一或缺上下文
通知消息乱入?不同设备使用相同 Characteristic UUID
连接后发现不了服务?GATT 服务过多,服务发现冲突或阻塞
连接后丢数据?每个连接没有独立处理缓冲或事件优先级不对

BLE 的 GATT 是每个连接独立的,但如果你不做逻辑分层,把多个设备的数据全塞进一个“锅”里炖——那当然锅就炸了!


🧱 三、分层思维结构图解

来,用个生活化的比喻:

多连接 BLE = 多个客户来饭店点菜

层级BLE 模型饭店比喻
连接层(Link)每个 Peripheral 的连接每个客户坐在不同桌子
服务层(GATT)设备功能模块,如温湿度/OTA每桌菜单内容
特征层(Characteristic)每项服务的读写项菜单中每道菜
应用层(处理逻辑)数据处理与路由厨师做菜并上菜到指定桌号

所以要解决多连接混乱的根本就是:

✅ 每桌(连接)独立菜单
✅ 每菜(数据)明确属于哪桌
✅ 厨房(处理模块)有序出菜不串单

在这里插入图片描述


🧪 四、分层设计策略:开发实战指南

1. 每个连接独立维护 connection_handle

// GATT 回调里根据连接 ID 分流
void on_characteristic_changed(uint16_t conn_handle, uint16_t char_handle, uint8_t* data) {
    if (conn_handle == SENSOR_NODE_1) {
        handle_sensor_data_1(data);
    } else if (conn_handle == HR_MONITOR) {
        handle_heart_rate(data);
    }
}

2. 为不同设备定义独立的 Service UUID

// 温湿度服务 UUID
#define UUID_SERVICE_ENV     "181A"

// 心率服务 UUID
#define UUID_SERVICE_HRM     "180D"

// OTA 升级服务 UUID
#define UUID_SERVICE_OTA     "FE59"

避免“所有设备都叫 0xFFF0”,那是 BLE 世界的“张三李四”!


3. 把每个设备逻辑封装成模块

typedef struct {
  uint16_t conn_handle;
  uint8_t  sensor_buffer[64];
  bool     notify_enabled;
} sensor_node_t;

sensor_node_t sensor_nodes[MAX_CONN];

void process_env_sensor(sensor_node_t* node, uint8_t* data);

每个设备一个“房间”,互不打扰,有状态、有缓冲。


4. 合理规划事件优先级 & 超时

避免某个设备持续发送通知“霸占总线”。设置每个连接的 timeout / interval / notification rate。


5. 用调试日志打印设备来源

printf("[DEVICE-%d] Received characteristic value: %02X", conn_handle, data[0]);

眼睛看得见,问题好排查。
在这里插入图片描述


🎯 五、小结:多连接不乱,全靠分层“强迫症”

如果 BLE 多连接是一场多人演出,分层设计就是你作为导演维稳现场的剧本:

  • 每人有台词(UUID 唯一)
  • 每句台词标记角色(conn_handle 分发)
  • 每段剧情不混线(逻辑模块封装)

📌 附:服务分层结构示意图

┌────────────────────────────┐
│        Central (主控)       │
├──────┬────────┬────────────┤
│设备1 │ 设备2  │ 设备3       │
├──────┼────────┼────────────┤
│UUIDA │ UUIDB  │ UUIDC       │
│数据处理A│处理B │ 处理C     │
└──────┴────────┴────────────┘
每个连接独立服务 / 特征 / 数据处理逻辑

📚 延伸阅读推荐

  • 《GATT 协议全解:蓝牙传数据到底怎么传?》
  • 《BLE 是怎么省电的?核心机制全解析》
  • 《用 STM32 或 EFR32 实现 BLE 通信模块》

喜欢的盆友点赞加关注,欢乐熊将持续为您更新内容

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

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

相关文章

Element-Plus:popconfirm与tooltip一起使用不生效?

你们好&#xff0c;我是金金金。 场景 我正在使用Element-plus组件库当中的el-popconfirm和el-tooltip&#xff0c;产品要求是两个需要结合一起使用&#xff0c;也就是鼠标悬浮上去有提示文字&#xff0c;并且点击之后需要出现气泡确认框 代码 <el-popconfirm title"是…

Selenium 查找页面元素的方式

Selenium 查找页面元素的方式 Selenium 提供了多种方法来查找网页中的元素&#xff0c;以下是主要的定位方式&#xff1a; 基本定位方式 通过ID定位 driver.find_element(By.ID, "element_id")通过Name定位 driver.find_element(By.NAME, "element_name"…

OPENCV图形计算面积、弧长API讲解(1)

一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积&#xff0c;这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能&#xff0c;常用的API…

spring boot使用HttpServletResponse实现sse后端流式输出消息

1.以前只是看过SSE的相关文章&#xff0c;没有具体实践&#xff0c;这次接入AI大模型使用到了流式输出&#xff0c;涉及到给前端流式返回&#xff0c;所以记录一下。 2.resp要设置为text/event-stream resp.setContentType("text/event-stream"); resp.setCharacter…

二叉树-144.二叉树的前序遍历-力扣(LeetCode)

一、题目解析 对于递归方法的前序遍历十分简单&#xff0c;但对于一位合格的程序猿而言&#xff0c;需要掌握将递归转化为非递归的能力&#xff0c;毕竟递归调用的时候会调用大量的栈帧&#xff0c;存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧&#xff0c;而非…

【技巧】dify前端源代码修改第一弹-增加tab页

回到目录 【技巧】dify前端源代码修改第一弹-增加tab页 尝试修改dify的前端源代码&#xff0c;在知识库增加一个tab页"HELLO WORLD"&#xff0c;完成后的效果如下 [gif01] 1. 前端代码进入调试模式 参考 【部署】win10的wsl环境下启动dify的web前端服务 启动调试…

Java设计模式:责任链模式

一、什么是责任链模式&#xff1f; 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09; 是一种 行为型设计模式&#xff0c;它通过将请求沿着一条处理链传递&#xff0c;直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者&#xff0c;…

初探用uniapp写微信小程序遇到的问题及解决(vue3+ts)

零、关于开发思路 (一)拿到工作任务,先理清楚需求 1.逻辑部分 不放过原型里说的每一句话,有疑惑的部分该问产品/测试/之前的开发就问 2.页面部分(含国际化) 整体看过需要开发页面的原型后,分类一下哪些组件/样式可以复用,直接提取出来使用 (时间充分的前提下,不…

云原生时代的系统设计:架构转型的战略支点

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、云原生的崛起&#xff1a;技术趋势与现实需求的交汇 随着企业业务的互联网化、全球化、智能化持续加深&#xff0c;传统的 I…

python可视化:俄乌战争时间线关键节点与深层原因

俄乌战争时间线可视化分析&#xff1a;关键节点与深层原因 俄乌战争是21世纪欧洲最具影响力的地缘政治冲突之一&#xff0c;自2022年2月爆发以来已持续超过3年。 本文将通过Python可视化工具&#xff0c;系统分析这场战争的时间线、关键节点及其背后的深层原因&#xff0c;全面…

C# WPF 左右布局实现学习笔记(1)

开发流程视频&#xff1a; https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码&#xff1a; GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用&#xff08;.NET Framework) 2.…

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql

安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了&#xff0c;系统很多命…

【QT控件】显示类控件

目录 一、Label 二、LCD Number 三、ProgressBar 四、Calendar Widget QT专栏&#xff1a;QT_uyeonashi的博客-CSDN博客 一、Label QLabel 可以用来显示文本和图片. 核心属性如下 代码示例: 显示不同格式的文本 1) 在界面上创建三个 QLabel 尺寸放大一些. objectName 分别…

npm安装electron下载太慢,导致报错

npm安装electron下载太慢&#xff0c;导致报错 背景 想学习electron框架做个桌面应用&#xff0c;卡在了安装依赖&#xff08;无语了&#xff09;。。。一开始以为node版本或者npm版本太低问题&#xff0c;调整版本后还是报错。偶尔执行install命令后&#xff0c;可以开始下载…

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路&#xff0c;其核心流程可归纳为四大模块&#xff1a;感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性&#xff0c;例如传感器选型需平衡精度与…

【工具教程】多个条形码识别用条码内容对图片重命名,批量PDF条形码识别后用条码内容批量改名,使用教程及注意事项

一、条形码识别改名使用教程 打开软件并选择处理模式&#xff1a;打开软件后&#xff0c;根据要处理的文件类型&#xff0c;选择 “图片识别模式” 或 “PDF 识别模式”。如果是处理包含条形码的 PDF 文件&#xff0c;就选择 “PDF 识别模式”&#xff1b;若是处理图片文件&…

英国云服务器上安装宝塔面板(BT Panel)

在英国云服务器上安装宝塔面板&#xff08;BT Panel&#xff09; 是完全可行的&#xff0c;尤其适合需要远程管理Linux服务器、快速部署网站、数据库、FTP、SSL证书等服务的用户。宝塔面板以其可视化操作界面和强大的功能广受国内用户欢迎&#xff0c;虽然官方主要面向中国大陆…

数据挖掘是什么?数据挖掘技术有哪些?

目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…

简约商务通用宣传年终总结12套PPT模版分享

IOS风格企业宣传PPT模版&#xff0c;年终工作总结PPT模版&#xff0c;简约精致扁平化商务通用动画PPT模版&#xff0c;素雅商务PPT模版 简约商务通用宣传年终总结12套PPT模版分享:商务通用年终总结类PPT模版https://pan.quark.cn/s/ece1e252d7df

【Qt】控件 QWidget

控件 QWidget 一. 控件概述二. QWidget 的核心属性可用状态&#xff1a;enabled几何&#xff1a;geometrywindows frame 窗口框架的影响 窗口标题&#xff1a;windowTitle窗口图标&#xff1a;windowIconqrc 机制 窗口不透明度&#xff1a;windowOpacity光标&#xff1a;cursor…