GAP - ShenYj/ShenYj.github.io GitHub Wiki
Generic Access Profile (GAP)通用访问规范层算是BLE协议栈中最顶部的一层,它定义了设备如何广播、扫描、发现和建立连接,以及配置工作角色(Role)、可发现性、广播数据内容和安全相关的参数。
从编程角度来看, GAP中的内容就像是一个config文件,BLE协议栈其它层的工作,都要从GAP中获取初始化参数和配置信息。
GAP中定义了一系列模式(Mode)和规程(Procedure),二者相互配合,完成广播和连接的工作。
有以下几种GAP角色
- Central: 中央设备
- Peripheral: 外围设备
- Broadcaster: 广播者
- Observer: 观察者
- Central & Peripheral
第五种Central & Peripheral
,在内部是两种角色进行按需转换,并非一种独立的角色
中央设备是向外围发起连接的设备,连接起来后就称为主设备(Master),Peripheral是向外部广播的设备,连接起来后称为从设备(Slace)。因为建立连接需要进行数据收发,所以无论是Central还是Peripheral,它们都必须具有数据接收和发送的能力。
广播者是一个纯广播设备,观察者是一个纯扫描设备。假如功能需求极其简单,这两种角色可以是只接收或只发送的设备。
iBeacon设备就可以设置为一个广播者角色。
与GAP角色相似的还有一个GATT角色概念。GATT角色包括以下三种:
- GATT Server
- GATT Client
- GATT Server & Client
GATT Server是指数据服务器,有发送数据的需求,GATT Client指数据客户端,有接收数据的需求。 GATT Server的特征值有Read/Write/Indicate等属性,配置后可以收发处理数据;而GATT Client的特征值是没有这些属性的,仅能够扫描读取GATT Server的特征值,针对Server的特征值进行读写。
比如Alert Notification Profile,它是一个主机,提供扫描功能,但是连接后它是数据源,向外部提供数据,承担Server责任,因而它是GAP Central + GATT Server。
总而言之,GAP角色决定了谁广播谁扫描,GATT角色决定了数据从哪里出发。
BLE设备地址为6字节,分两部分,前半部分为公司部分,后半部分为设备部分。
一个典型的BLE设备地址为:00A050-123456, 00A050表示Cypress,123456表示设备序号
BLE广播时候会携带设备地址,扫描时候也会记录设备地址,如果两个设备使用相同的地址,则会产生冲突,所以BLE的设备地址应该保证唯一。
后半部分3个字节总共6个字符空间,总的可用地址数:16^6 = 16777216,这个数字对于一个普通的应用已经足够使用了。
为了保证地址唯一性,有以下2个方法:
- 根据芯片的随机信息生成随机地址
- 在量产时用上位机累加或随机算法避免重复
第一个方法在PSoC BLE中很常用,它利用芯片的Silicon ID等信息,生成一个3字节的随机数。Silicon ID是一个芯片唯一信息,加上一些算法处理,获得的3字节数在10年遇到重复的几率极小,所以可以在普通的应用中使用。
第二个方法,是在量产的时候,将地址信息写入SFlash,每次地址都不相同,BLE程序启动时候,先从SFlash中读出地址信息并设置自身设备地址。
注意这里的随机地址,只是两种设备相互之间不同,对于某个设备,一旦写入,就是确定了的。这些地址都属于public address.
关于地址类型,可以查看BLE地址类型了解
设置不同的图标,可以在手机APP上显示出来
这两个词(Mode, Procedure)都可以描述设备在一段时间内以一种状态或方式运行,但是在GAP层的描述中被重点区分。
- 模式强调设备在一段时间内被设置为某种状态
- 规程强调设备在某种模式下去执行某种动作
举个例子
- Discovery Mode表示发现模式,有
可被发现
和不可被发现
等模式,这个参数适用于丛集(Peripheral),描述从机的运行状态; - 而Discovery Procedure表示发现规程,有
普通发现
和受限发现
等规程,这个参数适用于主机(Central),描述主机怎么去发现从机。 类似的,从机有绑定模式,主机执行绑定规程等。
模式和规程大致相互对应,从机有某种模式,主机就有响应的规程
-
Connectable undirected advertising
可连接+无定向广播,最常用的广播,他的广播数据可以被周边主机发现, 可以携带扫描响应数据,同时可以被连接
-
Scannable undirected advertising
可扫描+无定向广播,指可以携带扫描响应数据,大不能被连接
-
Non-connectable undirected advertising
不可连接+无定向广播,不能携带扫描响应数据,也不能被连接
-
Connectable directed advertising
可连接+定向广播,只能被指定的主机发现和连接
这几个概念其实属于链路层(Link Layer)
-
Active: 主动扫描
主动扫描是指Central设备发出SCAN_REQ,从机收到后返回SCAN_RSP。于是从机可以在扫描响应(scan response)数据中加入一些数据,等待主机主动扫描。
-
Passive: 被动扫描
绝大多数Central设备都是主动扫描
-
Non-discoverable mode(不可发现模式)
这里的不被发现是指不被执行
普通发现规程
的Central设备发现,如果Central设备执行观察规程(Obverving Procedure),仍然能够看到广播信号。二手机App等软件默认为观察规程,所以加入使用手机BLE扫描App来测试,依旧可以看到设为不可发现模式
的广播设备。正确的测试方法是使用CySmart(PC),将主机的扫描规程设置为普通
或受限
,而不是观察者
,就能够观察到正确的现象 -
Limited discoverable mode(受限发现模式)
这里的
受限
是指受时间限制。与普通发现模式相比,这个模式好像只是强制要求广播超时参数,其他相同。但是二者的含义不同,一个受限发现的设备,即有超时限制的设备,给Central传达一个消息,我很快就不行了,要连接应赶紧。所以Central设备如果发现了多个广播设备,在显示设备列表的时候,应该有意识的将受限发现模式的设备放在前面,而普通发现模式的设备放在后面 -
General discoverable mode(普通发现模式)
可以选择任意的广播模式,然后自由处理各项参数
-
Broadcast mode(广播器模式)
发现模式与广播模式相互关联,不可发现模式
下,只能选择Scannable undirected advertising和Non-connectable undirected advertising两种广播模式,即这种发现模式下,BLE设备不可以被连接。广播器模式
下也只能选择不可被连接的广播模式。受限发现模式
和普通发现模式
下,可以任意萱蕚广播模式。
广播数据中有两个标志位:LE General Discovery Mode
和LE Limited Discovery Mode
,分别设置这两个标志位即可设置发现模式。
- Limited discovery(受限发现规程)
- General discovery(普通发现规程)
- Observation discovery(观察器规程)
前两个发现规程,基本上是为了匹配上面前三种发现模式而设计的
如果Central使用普通发现规程,则能够发现受限发现模式
和普通发现模式
的设备,不能发现不可发现模式
设备。
如果Central使用受限发现规程,则仅能够发现受限发现模式
的设备
如果Central使用观察期规程,则能发现各种发现模式下的广播设备
- Non-connectable mode(无连接模式)
- Directed connectable mode(定向连接模式)
- Undirected connectable mode(无定向连接模式)
-
Auto connection establishment procedure(自动连接规程)
需要白名单(white list)的配合,即只能自动连接白名单中的设备,不是毫无限制的自动连接
-
General connection establishment procedure(普通连接规程)
最常用的连接方式
-
Selective connection establishment procedure(选择连接规程)
这个选择是选择合适的连接参数。Central周边有很多个广播设备,从机的连接参数各不相同,主机设备可以选择期望的连接参数设备进行连接。
-
Direct connection establishment procedure(定向连接规程)
与定向广播模式相对应
选择连接规程与自动连接规程都用于一拖多的场景,一对一的场景,他们俩几乎功能一样
与连接相关的规程,还有连接参数更新规程
、连接终止规程
- Bonding 可绑定
- No Bonding 不可绑定
就是将配对过程中的秘钥保存起来
-
LE security mode 1
进行加密形式的配对
-
LE security mode 2
进行签名形式的配对
-
LE security mode 3
LE security mode 1
下有四种安全等级
-
No Security(No authentication and no encryption)
不认证不加密
-
Unauthenticated pairing with encryption
不认证,加密 将使用Just Works配对方式
-
Authenticated pairing with encryption
认证,加密
-
Authenticated LE Secure Connections pairing with encryption using a 128- bit strength encryption key.
通过身份验证的LE安全连接与使用128位强度加密密钥的加密配对,BLE v4.2下新增的一个选项,配对的时候传输PassKey有被窃听的风险,而这种等级使用特殊算法避免传输PassKey被窃听
LE security mode 2
下有两种安全等级
- Unauthenticated pairing with data signing
- Authenticated pairing with data signing
LE security mode 3
下有三种安全等级
- No security (no authentication and no encryption)
- Use of unauthenticated Broadcast_Code
- Use of authenticated Broadcast_Code
广播包最大长度为31字节,广播包中可以包含多种元素,各个元素的格式是确定的