从0到1认识ble
一 概要
GAP :广播
GAP(Generic Access Profile),主要作用:使设备可见,控制设备连接以及广播(相关应用:ibeacon)。
GATT:链接(GATT是基于GAP之上完成的 | 相关应用:消费电子类手环)
GATT(Generic Attribute Protocol)主要作用:定义s设备的service&characteristic 和 建立c/s 设备间的应用数据的交互。
二 GAP
ble stack的GAP层负责连接功能。处理access modes以及从上电到建立连接的一系列步骤:设备发现--->链路的建立--->链路的终止--->安全特性的初始化--->设备配置。(如下图)
(图片来自:TI官方网站)
上图中各状态的简单解释:
Standby:复位后设备所处的初始化空闲状态。
Advertiser:设备s将广播特定的数据,以通知任何初始化的设备c这里有一个可连接的设备s(广播消息包括设备地址以及一些附加信息,如设备名)。
Scanner: 当设备c收到广播消息,设备c将发送扫描请求给广播者(即设备s),随后广播者将会给予一个相应的扫描响应。该过程也叫设备发现。扫描设备主动发现广播设备并发起连接。
Initiator: 初始化时,发起者必须确定一个同等设备以待连接。如果接收到一个刚好匹配的同等设备的广播消息,发起者将会发送一个包含建立连接参数的连接请求消息以建立连接。
Slave/Master: 链接建立形成后,广播者将扮演slave角色,发起者将扮演master角色。
三 GATT
类同于GAP层处理连接相关的功能,ble的GATT层stack主要被用来完成两连接设备间数据通信的应用。以储存在ble设备内存中的characteristics形式访问与储存数据。站在GATT立场来说,连接的两个设备都可以同时扮演一种或两种角色(client/server).
The GATT server:
该设备包含一个可被client设备read/write的 characteristic database 。
The GATT client:
该设备可以read/write server设备端的数据。
下图简单说明了GATT client和server间的数据通信:
(图片来自:TI官方网站)
需要注意的是:
#GATT中的client&server角色是完全独立于GAP中的peripheral¢ral角色。也就是说一个peripheral既可以是GATT client,也可以是GATT server,一个central同样既可以是GATT client,也可以是GATT server。
#GATT 连接是独占的。也就是一个 BLE 外设同时只能被一个中心设备连接。一旦外设被连接,它就会马上停止广播,这样它就对其他设备不可见了。当设备断开,它又开始广播。
#一个外设只能连接一个中心设备,而一个中心设备可以连接多个外设。
GATT 事务
GATT 事务结构如图所示:
GATT 事务是建立在嵌套的Profiles, Services 和 Characteristics之上的。举一个简单的栗子将显得更加明了:
在GATT Profile 的列表中可以找到Heart Rate Profile:
UUID : 0x180D
包含 3 个 Characteristic:
Heart Rate Measurement,
Body Sensor Location(option) 和 Heart Rate Control Point(option)
update-time:rainy | Sunday | 12:56 | 15/4/2018