蓝牙协议之GAP协议

GAP 全称是 Generic Access Profile,通用访问配置文件

严格说,GAP 不是专门用来传业务数据的协议,它主要负责:

设备怎么被发现、怎么建立连接、连接角色是什么、广播怎么发、扫描怎么扫、连接参数怎么管理。

你可以把 GAP 理解成 BLE 里面的:

"找设备 + 连设备 + 管连接状态"的管理层。


1. GAP 在 BLE 协议栈中的位置

text 复制代码
应用层
  │
GATT        ← 负责:数据长什么样,怎么读写特征值
  │
ATT         ← 负责:Read / Write / Notify 这些属性传输
  │
GAP         ← 负责:广播、扫描、发现、连接、角色
SMP         ← 负责:配对、绑定、加密
  │
L2CAP
  │
Link Layer
  │
PHY

简单说:

text 复制代码
GAP:管"能不能找到你、怎么连接你"
GATT:管"连接后传什么数据"

2. GAP 主要干这几件事

① 设备发现:Advertising / Scanning

BLE 设备要让别人发现自己,就要发广播包。

比如你的温湿度传感器:

text 复制代码
温湿度传感器  →  一直广播:我是一个 BLE 设备,我叫 TempSensor

手机或者另一个 MCU 扫描:

text 复制代码
手机 / ESP32 Central  →  扫描附近 BLE 广播包

这个过程就是 GAP 管的。

text 复制代码
Peripheral 设备发广播
        ↓
Central 设备扫描
        ↓
Central 发现目标设备

② 广播数据管理

BLE 广播包里面可以放一些基础信息,例如:

text 复制代码
设备名称
设备地址
服务 UUID
厂商自定义数据
是否可连接
发射功率

例如一个 BLE 设备广播出来:

text 复制代码
Device Name: ESP32_BLE_SENSOR
Service UUID: 0x180F
Manufacturer Data: 01 02 03 04
Connectable: Yes

这些都是 GAP 负责配置和管理的。


③ 设备角色管理

GAP 里面有几个重要角色。

最常见的是:

text 复制代码
Peripheral 外设
Central 中心设备

比如:

text 复制代码
手环 / 传感器 / 蓝牙灯 / 蓝牙体温计  → Peripheral
手机 / 平板 / 网关 / 主控 ESP32      → Central

关系大概是:

text 复制代码
Peripheral:负责广播,等别人连接
Central:负责扫描,主动连接别人

举例:

text 复制代码
温湿度传感器 Peripheral
        ↑
        │  广播
        │
手机 Central 扫描并连接

④ 建立连接

当 Central 扫描到目标 Peripheral 后,可以发起连接。

流程大概是:

text 复制代码
Peripheral 开始广播
        ↓
Central 扫描到广播
        ↓
Central 判断是目标设备
        ↓
Central 发起连接请求
        ↓
BLE 连接建立成功

这个连接建立过程,也是 GAP 的核心职责。


⑤ 连接参数管理

BLE 为啥省电?一个关键点就是连接不是一直连续传输,而是按 连接事件 间隔传输。

GAP 会涉及这些连接参数:

text 复制代码
Connection Interval   连接间隔
Slave Latency         从机延迟
Supervision Timeout   连接超时时间

比如:

text 复制代码
连接间隔 30ms:响应快,但功耗高
连接间隔 500ms:响应慢,但功耗低

对于低功耗设备,比如手环、传感器,经常会把连接间隔调大一点。


3. GAP 和 GATT 的区别

这个非常重要。

很多新手容易把 GAP 和 GATT 搞混。

text 复制代码
GAP:负责发现和连接
GATT:负责连接后的数据交互

举个温湿度传感器例子。

GAP 做的事:

text 复制代码
设备名:ESP32_TEMP_SENSOR
开始广播
等待手机扫描
手机发现设备
手机连接设备

GATT 做的事:

text 复制代码
定义温度 Service
定义温度 Characteristic
手机读取温度
设备 Notify 温度变化

可以这样记:

text 复制代码
GAP = 先让别人找到你,并连上你
GATT = 连上之后,真正传业务数据

4. 用生活例子理解 GAP

假设你开了一家店。

text 复制代码
GAP 就像:
店铺招牌
店铺地址
开门营业
顾客找店
顾客进店
确认顾客能不能进来
text 复制代码
GATT 就像:
顾客进店后
货架怎么摆
商品叫什么
价格是多少
顾客怎么拿商品

所以:

text 复制代码
GAP 管"进门之前和建立连接"
GATT 管"进门之后的数据访问"

5. BLE 通信完整流程中 GAP 的位置

一个 BLE 温湿度传感器完整流程:

text 复制代码
1. 设备初始化 BLE 协议栈
        ↓
2. 配置 GAP 广播参数
        ↓
3. 设置广播数据:设备名、服务 UUID 等
        ↓
4. 开始广播
        ↓
5. 手机扫描到设备
        ↓
6. 手机发起连接
        ↓
7. GAP 连接建立成功
        ↓
8. 手机发现 GATT 服务
        ↓
9. 手机读取 / 订阅 Characteristic
        ↓
10. 设备通过 Notify 上报温湿度

其中:

text 复制代码
1 ~ 7 主要是 GAP
8 ~ 10 主要是 GATT / ATT

6. GAP 常见动作总结

GAP 动作 作用
Advertising 广播,让别人发现自己
Scanning 扫描,发现附近设备
Connection 建立 BLE 连接
Role 管理 Peripheral / Central 角色
Device Name 设置设备名称
Advertising Data 设置广播包内容
Connection Parameter 设置连接间隔、超时等参数
Pairing 触发 参与配对流程,但真正安全细节通常由 SMP 负责

7. 嵌入式开发里你一般怎么接触 GAP?

比如 ESP32 BLE 开发中,你经常会看到类似这些东西:

c 复制代码
esp_ble_gap_set_device_name("ESP32_BLE_SENSOR");
esp_ble_gap_config_adv_data(&adv_data);
esp_ble_gap_start_advertising(&adv_params);

这些就是 GAP 相关接口。

它们分别表示:

text 复制代码
设置 BLE 设备名
配置广播数据
开始广播

还有 GAP 事件回调,比如:

text 复制代码
广播数据设置完成
广播开始成功
有设备连接
有设备断开
连接参数更新
扫描到设备

8. 一句话总结

GAP 负责 BLE 设备的"发现、广播、扫描、连接、角色和连接参数管理"。

你可以这样记:

text 复制代码
GAP:管连接前后的管理流程
GATT:管连接后的数据读写
ATT:管底层属性读写命令
SMP:管配对、绑定、加密

最重要的一句话:

BLE 设备能不能被手机发现、手机怎么连上它,这一套主要就是 GAP 在管。

相关推荐
mixboot37 分钟前
Linux 进程工作目录查看利器:pwdx 命令详解
linux·运维·服务器
星恒讯工业路由器1 小时前
Wi‑Fi DCM 双载波调制解析
网络·信息与通信·wifi7·wifi6·wi‑fi dcm 双载波调制
旺仔来了2 小时前
不联网的Linux下部署python环境
linux·开发语言·python
IP搭子来一个2 小时前
爬虫采集大量返回 403、429,到底卡在哪一环?
网络·爬虫·python
之歆2 小时前
Day16_JavaScript 轮播图与事件工程实战(下篇)
服务器·开发语言·前端·javascript·网络·性能优化
IT大白鼠2 小时前
ICMP协议详解:从基础原理到网络应用实践
网络
Irene19913 小时前
WSL 切换磁盘后验证完整性(MobaXterm、Powershell、WSL 的区别)
linux·wsl·mobaxterm
云登指纹浏览器3 小时前
静态IP和动态IP哪个好:跨境电商代理选型指南
网络·网络协议·tcp/ip
zhz52144 小时前
服务器等保加固实施报告
运维·服务器·信创·国密·等保
扛枪的书生4 小时前
Keepalived 学习总结
linux