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角色和多连接模型的关系画清楚了。你一看就明白。
这张图把四种角色和两种多连接模型放在一起对比。左边是一主多从,一个Central管多个Peripheral;右边是多主多从,多个Central和多个Peripheral互相连接。底部列出了限制因素,你设计系统时对着这个清单检查一遍,基本不会出大问题。
好了,这一章就到这里。GAP角色是BLE多连接的基石,你把这个搞透了,后面讲连接参数、数据交互、调度策略,你听起来就会轻松很多。