GAP分层负责设备建立连接相关功能,包括设备发现、数据链路建立、终止,初始化安全管理和设备配置,参见下图。
在Standby
状态,双方设备都处于未连接状态,Advertiser
尝试广播数据,Scanner
接收到广播数据后尝试进行扫描请求,并且得到扫描回复。此时Scanner
产生连接意图,转变成Initiator
发送连接请求,成功连接后发送广播的Advertiser
作为Master
,进行连接请求的Initiator
成为Slave
.
注意:对于GAP分层中的Master和Centeral以及Slave和Peripheral概念一致。
连接参数主要是用以Initiator通过 连接请求 建立连接时候的用到配置参数。
Connect Interval
对于蓝牙,采用跳频通信,连接的两个设备在某个固定时间切换到某个固定信道进行通信。链路层控制着这里的信道切换。建立连接后的通信数据被我们统一定义为Connection event
,如果这里没有应用数据发送或者接收,那么链路层也会继续交换数据维护着这个链接。连接间隔就是以1.25ms
为单位的两次Connection event
的时间总和,其值可以从6-3200,也就是7.5ms到4.0s。
不同的应用需要不同的连接间隔,主要是从功耗进行考虑。
Slave Latency
Slave Latency表在在没有数据发送的时候可以选择跳过connect event,一个连接时间的发生都是master发送一个通知,设备回复响应然后发送数据,但是没有数据的时候假设我们设置了Slave Latency = 3;那么当master发送通知的时候,slave可以3次不响应,一直保持在深度休眠状态,这样就不会产生Connect event事件,从而更加省电。
Supervision Time-out
Supervision Time-out就是两次成功的connect event之间的最长事件,如果超出改时间没有发生connect event,则双方设备终止连接,并进入到未连接状态。该参数可以设置在100ms到32S之间。但是需要注意的是,超时监控时间必须大于有效连接间隔。什么是有效连接间隔,其实就是两次成功的connect event之间的时间,假设Slave Latency = 0,connect interval = 5ms。我们设置的超时监控总不可能比5ms还小,这样就永远都处于超时状态。可以通过下面公式计算超时监控的时间。
Supervision Time-out > (Connection Interval) * (1 + [Slave Latency])
连接参数都是主机进行控制,从机并不能直接修改连接参数。但是当主机设置了一组不合适的连接参数,比如主机要求5ms进行一次connect event,但是从机是一个温度计,这样的参数对于从机来说并不合适,所以从机可以发送一个请求,通知主机修改连接参数。但是主机可以选择是否修改当前参数配置,主机可以选择拒绝修改参数。这个过程发生在建立连接之后,所以连接参数的更新可以发生在任意时刻。
#define DEFAULT_ENABLE_UPDATE_REQUEST GAPROLE_LINK_PARAM_UPDATE_INITIATE_BOTH_PARAMS
#define DEFAULT_DESIRED_MIN_CONN_INTERVAL 80
#define DEFAULT_DESIRED_MAX_CONN_INTERVAL 800
#define DEFAULT_DESIRED_SLAVE_LATENCY 0
#define DEFAULT_DESIRED_CONN_TIMEOUT 1000
#define DEFAULT_CONN_PAUSE_PERIPHERAL 6
在simple_peripheral工程中,我们可以在simple_peripheral.c文件里面找到上面宏定义,这组宏就是设置连接参数。其中DEFAULT_CONN_PAUSE_PERIPHERAL设置一个更新时间(秒为单位),这里设置的6秒,就是建立连接之后6秒外围设备就会发出更新参数请求,通过GAPRole_SendUpdateParam()或 GAPCentralRole_UpdateLink()命令异步发送。也可以更改DEFAULT_ENABLE_UPDATE_REQUEST宏来禁用参数更新,例如#define DEFAULT_ENABLE_UPDATE_REQUEST GAPROLE_LINK_PARAM_UPDATE_WAIT_REMOTE_PARAMS
连接参数直接决定设备的功耗,所以在产品的设计过程中这些参数一定要经过仔细考量,下面给出了连接参数设置的基本策略。
减少连接间隔如下:
增加连接间隔如下:
减少从机延迟(或将其设置为零)如下:
增加从机延迟如下:
连接终止的方式有两种,一种是前面提到的超时监控,比如我们设备距离过远的时候,就会发送主机一直收不到从机的响应,一旦超时就会发送连接终止。另一种就是主机或从机由任何原因都可以直接进行连接终止,任何一方发送连接终止的命令,双方就必须终止连接。
如下所示,应用层的绝大部分GAP相关时间都放在了GAPRoleTask进行处理,一部分可以直接调用GAP接口,例如广播和连接设置。
对于GAP事件、数据处理我们尽可能在放在GAPRoleTask,对于一些配置参数我们可以直接调用GAP接口。
GAP层几乎所有功能函数都封装在库文件中,API封装在gap.h
头文件,绝大部分功能已经在GAPRoleTask通过GAP函数直接调用方式处理,对于广播设置,连接配置这些参数设置我们可以通过通过GAP_SetParamValue()和GAP_GetParamValue()函数进行设置或获取。以下是simple_peripheral_init()中GAP层的配置:
//设置广告间隔 {
uint16_t advInt = DEFAULT_ADVERTISING_INTERVAL ;
GAP_SetParamValue (TGAP_LIM_DISC_ADV_INT_MIN , advInt );
GAP_SetParamValue (TGAP_LIM_DISC_ADV_INT_MAX , advInt );
GAP_SetParamValue (TGAP_GEN_DISC_ADV_INT_MIN , advInt );
GAP_SetParamValue (TGAP_GEN_DISC_ADV_INT_MAX , advInt );
}
上述代码设置了一般广播(General Advertisement)和和限制广播(Limited Advertisement),这里的限制广播的意义是广播启动之后再一定的时间内进行广播,一般我们都是用的Genneral advertisement。代码中两种广播的时间间隔都进行了设置。
文章所有代码、工具、文档开源。加入我们QQ群 591679055获取更多支持,共同研究CC2640R2F&BLE5.0。
© Copyright 2017, 成都乐控畅联科技有限公司.