4. GAP角色与多连接模型

好,咱们进入第四章。这一章我打算聊聊GAP角色和多连接模型。说实话,很多工程师做单点通信时觉得BLE挺简单,一上手多设备就懵了。为什么?因为没搞懂GAP角色到底在干什么。

GAP,全称Generic Access Profile,它定义了设备在蓝牙网络里扮演什么角色。说白了,就是谁在广播、谁在扫描、谁在连接、谁在被连。这四种角色,你搞清楚了,多连接模型自然就通了。

4.1 GAP角色定义

BLE一共定义了四种GAP角色。我习惯把它们分成两组:广播组和连接组。

角色 方向 典型行为 我常用的场景
Broadcaster 只发不收 周期性广播数据包 信标、温湿度传感器
Observer 只收不发 扫描广播包,不发起连接 扫描仪、网关监听
Peripheral 可被连接 广播并接受连接请求 手环、心率带、智能灯
Central 主动连接 扫描并发起连接 手机、网关、主控板

这里有个容易混淆的点:Broadcaster和Peripheral都在广播,但Peripheral允许别人连上来,Broadcaster不连。我在项目里见过有人把传感器配成Peripheral,结果手机连上去后传感器还要处理连接事件,功耗翻了一倍。其实如果只需要单向上报数据,用Broadcaster就够了。

4.1.1 Broadcaster

Broadcaster只管往外扔数据。它不扫描,不连接,不响应任何请求。你想想看,一个纽扣电池供电的温度标签,每隔1秒发一次温度值,发完就睡。这就是典型的Broadcaster。

它的优点很明显:功耗极低,实现简单。缺点也直接:数据单向,没法确认对方收到了没有。

我的习惯:做低功耗传感器时,优先考虑Broadcaster。如果应用层需要确认,再升级到Peripheral。别一上来就上Peripheral,白白浪费电池。

4.1.2 Observer

Observer是Broadcaster的镜像。它只扫描,不广播,不连接。我做过一个蓝牙网关项目,网关就是Observer角色,它同时扫描周围几十个传感器广播包,然后通过WiFi上报到云端。

Observer的扫描窗口和扫描间隔很关键。窗口太短会漏包,太长又费电。我记得调那个参数调了一整天,最后发现扫描窗口设30ms、间隔设100ms,在功耗和丢包率之间平衡得最好。

4.1.3 Peripheral

Peripheral是BLE里最常见的角色之一。它广播自己的存在,等待Central来连。连上之后,双方就可以双向通信了。

Peripheral的广播间隔直接影响被发现的速度。我建议:需要快速连接的场景(比如用户按了配对键),广播间隔可以短到20ms;普通场景100ms就够;省电场景可以拉到1秒以上。

注意:广播间隔越短,功耗越高。我曾经有个项目,广播间隔设了20ms,结果设备半天就没电了。后来改成200ms,电池撑了一周。这个取舍一定要想清楚。

4.1.4 Central

Central是BLE网络里的管理者。它扫描周围的Peripheral,主动发起连接,管理连接参数,甚至决定什么时候断开。

手机就是最典型的Central。但在嵌入式领域,我们经常用MCU做Central,比如一个网关同时连接多个传感器。这时候Central的资源管理能力就很重要了。

4.2 多连接场景分析

搞清楚了角色,咱们来看看多连接模型。实际项目中,最常见的就两种:一主多从、多主多从。

4.2.1 一主多从

一个Central连接多个Peripheral。这是最常见的模型。比如一个智能家居网关,同时连接温度传感器、门锁、灯光、窗帘电机。

我做过一个项目,一个网关同时连了8个传感器。每个传感器每5秒上报一次数据。刚开始一切正常,但加到第9个时,连接开始掉线。为什么?因为Central的处理能力到了极限。

一主多从的关键点:

  • 连接间隔要错开:不要让所有Peripheral在同一时刻上报数据
  • Central要有足够的缓冲区:每个连接至少需要2个ATT缓冲区
  • 调度要公平:别让某个Peripheral占用了太多带宽

核心原则:一主多从时,Central是瓶颈。CPU主频、RAM大小、蓝牙控制器的硬件连接数,都会限制你能连多少个设备。

4.2.2 多主多从

多主多从就复杂了。多个Central同时连接多个Peripheral,甚至Peripheral也可以同时被多个Central连接(虽然BLE 4.0/4.1不支持,但BLE 5.0+支持多角色并发)。

这种模型常见于工业场景。比如一个产线上有多个传感器(Peripheral),同时被多个数据采集器(Central)读取。或者一个可穿戴设备同时连接手机和手表。

多主多从的挑战:

  • 调度冲突:多个Central可能同时请求同一个Peripheral的数据
  • 连接参数协商:不同Central对连接间隔、延迟的要求可能不同
  • 角色切换:设备可能需要在Central和Peripheral之间切换

我记得有个项目,设备既要连手机又要连网关。手机要求低延迟(连接间隔30ms),网关要求低功耗(连接间隔200ms)。最后只能折中,设成100ms,两边都不太满意,但都能工作。

4.3 连接数量限制因素

很多初学者会问:BLE到底能连多少个设备?这个问题没有标准答案。我直接说结论:取决于你的硬件和软件。

限制因素主要有这几个:

因素 说明 我见过的极限
蓝牙控制器硬件 芯片内部硬件连接表大小 Nordic nRF52840最多20个连接
RAM大小 每个连接需要分配连接上下文、缓冲区 每个连接约2-4KB RAM
CPU处理能力 连接事件调度、协议栈处理 主频64MHz MCU通常支持8-10个
连接间隔 间隔越小,单位时间事件越多 30ms间隔下,8个连接就接近极限
协议栈实现 不同协议栈的连接管理效率不同 Zephyr比nRF5 SDK更省资源

我个人的经验:不要挑战芯片的极限。芯片标称支持20个连接,你最好只用到12-15个。留出余量,系统才稳定。

避坑指南:我曾经把nRF52840连到18个设备,看起来都连上了,但一跑业务就掉线。后来发现是连接事件调度不过来,CPU一直在处理中断,连主循环都进不去。最后降到12个,稳如老狗。

还有一个容易被忽略的因素:射频环境。多连接时,所有设备都在同一个2.4GHz频段上通信。连接越多,碰撞概率越大。重传率一高,实际吞吐量就下来了。

我建议的做法:

  • 先估算业务需要的连接数,然后乘以1.5作为设计目标
  • 选芯片时,看硬件连接表大小,而不是协议栈宣称的最大值
  • 做压力测试,连满目标数量跑24小时,看有没有掉线

4.4 多连接模型知识图谱

下面这张图是我自己总结的,把GAP角色和多连接模型的关系画清楚了。你一看就明白。

BLE GAP角色与多连接模型 BLE GAP角色与多连接模型 Broadcaster Observer Peripheral Central 只广播,不连接 只扫描,不连接 广播并接受连接 扫描并发起连接 广播包 多连接模型 一主多从模型 Central Peripheral 1 Peripheral 2 Peripheral N 连接 × N 多主多从模型 Central A Central B Peripheral 1 Peripheral 2 Peripheral N 限制因素:硬件连接表 | RAM | CPU主频 | 连接间隔 | 协议栈效率 | 射频环境

这张图把四种角色和两种多连接模型放在一起对比。左边是一主多从,一个Central管多个Peripheral;右边是多主多从,多个Central和多个Peripheral互相连接。底部列出了限制因素,你设计系统时对着这个清单检查一遍,基本不会出大问题。

好了,这一章就到这里。GAP角色是BLE多连接的基石,你把这个搞透了,后面讲连接参数、数据交互、调度策略,你听起来就会轻松很多。