直接回答:BLE 协议里,链路层负责广播、扫描和连接这些底层动作,GAP 管设备怎么被发现和配对,GATT 管连上之后数据按 Service 和 Characteristic 怎么组织,是面向应用的那一层。

Link Layer 链路层的几个状态
1、待机 2、广播 3、监听/扫描 4、初始化 5、连接
GATT 负责向上和 软件打交道
GAP 安全配置文件 GATT Profiles
CC2540芯片 包含8051MCU

而广播的状态可以分为四种:
- ADV_IND:常见的广播状态,表示可以被连接,可以被扫描。
- ADV_DIRECT_IND:表示只能被特定的设备进行连接。
- ADV_NONCONN_IND:表示既不可以被连接也不可以被扫描
- ADV_SCAN_IND:表示只允许被扫描,不可以连接。
当中心设备接收到广播中周边设备的广播信号时,就会发送一个SCAN_REQ信号,中文直译就是发了一个扫描请求包,如果周边当前设备可以被扫描,并且接收到了这个扫描请求包之后,就会向扫描请求包的发送方返回一个SCAN_RSP包,这个包里面一般是含有设备的生产厂商、版本号这类设备信息。中心设备接收到这些信息后会大概判断,比如如果中心设备使用的是米家的APP,接收到周边设备返回的厂家信息发现是华为的设备可能就会忽视掉这个广播信息,而如果周边设备返回的信息显示是小米生态链中的设备就会发送一个CONNECT_REQ包,向周边设备发起连接,连接成功后,周边设备在与主设备断开连接之前不再发起广播连接其他设备。此时中心设备被称为主设备,被连接的周边设备称为从设备。
这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。