BLE连接建立与断开

最后都变了- 提交于 2020-01-21 09:27:48

​本文涉及如下问题:

  • 如何建立连接

  • 如何提高传输速率

  • 异常时如何快速断开连接

  • 如何跳频

  • BLE data的PDU如何展开分析

 

 

初始化连接是在广播通道上建立的,参考 BLE:广播channel上的PDU分析,本文将重点介绍BLE连接

1. 连接建立

当设备收接收到可以连接的广播(ADV_IND或者ADV_DIRECT_IND)后,则可以发起建立连接请求,连接请求数据包是通过发送CONNECT_REQ的PDU来实现的,CONNECT_REQ的PDU如下所示

 

2 连接参数

建立连接后,两个设备会在相等的连接间隔之间交换数据,每一次的数据交换称之为连接事件(connectionevent),数据的发送和接收都是通过连接事件完成的,在连接事件之外,BLE设备处于休眠状态,因此进一步降低了功耗。

广播的设备以一定的广播间隔周期性的广播数据,类似的,设备建立连接后,两个设备会以相等的时间间隔交换数据,这个间隔成为连接间隔(Connectioninterval)。

LL Data中参数解释:

1. AA:AccessAddress,链路层的接入地址,参考3.2中介绍;

2. CRCInit:初始化CRC的值;

3. 和发送数据窗口相关的参数:WinSize和WinOffset

4. 连接参数:

Interval:

  •   Connection interval = sleep + connection event

  • master和slaver数据交换的间隔,当没有应用数据交互,两个设备链路层仍会交换数据(空PDU)来维持连接,当有应用数据时,数据通过连接间隔中的连接事件发送和接收.
  • 范围是,连接间隔是1.25ms的整数倍,范围是 6 -3200,即7.5ms– 4s

Latency:

  •  即Slave latency,

  • master每个tx数据,slave接到后都要回复,否则连接可能会被认为断开,Slave  latency则定义了slave在没有数据要发的情况下,可以跳过一定数目的连接事件(Connection events), 在这些连接事件中不必回复Master(主设备)的包(空包),而不会被认为连接断开

  • 取值范围是 0 - ((connSupervisionTimeout /(connInterval*2)) - 1),并且要小于500;

timeout:

·       即Connection supervision timeout,

·       如果双方设备在超过timeout时间后,没有数据交互,则连接被认为已断开。

·       常用于异常断开流程,由于链路异常,BLE设备之间没有了数据,则在timeout时间到后,连接被断开,而不会一直保持,

·       10ms的整数倍,取值范围是 10 – 3200,即100ms – 32s,并且要大于(1+ connSlaveLatency) * connInterval * 2

 

例如Slavelatency = 2的情况下,可以忽略master的两个包,但第三个包则必须回应,否则,连接有可能被断开

这三个参数都是由master在发起连接时设定的,在连接建立后,slave可以发起更新连接参数的请求。

 

这几个参数是BLE连接中重要参数,直接决定了速率和异常情况的处理:

·       Connection interval决定了传输速率,越小,发送数据越快,但功耗也会越大

·       Slave Latency为0,数据发送速度回提高,增大,则会减小功耗

·       Timeout:异常情况时能否尽快断开。

对与IOS设备的BLE相连接时,对这几个参数的设置有明确的要求:

https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdf

 

3. 跳频

在CONNECT_REQPDU包中,还有两个重要的字段ChM和Hop。

•       ChannelMap:指出了在连接中使用的数据通道

•       HopIncrement::用于通道选择算法的一个5-16的随机值

那么BLE的跳频就是根据这几个参数协商出来的。

可以看到广播数据在首先37/38/39通道上发送(由于sniffer只监听37通道,其他通道上的数据没有显示),当连接建立后,master和slave分别经历了0x0C,0x18,0x24,0x0B,0x17,0x23等几个通道,并且后续数据交互扔在不断切换通道,即跳频。(参考Version 4.2 [Vol 6, Part B] 4.5.8)

在建立连接时,master会在连接的PDU里,指出哪些通道使用的通道,用于连接,哪些通道是不用于连接的通道,这就是channel map。

slave在接到这样的数据包后,双方根据channel selection algorithm(蓝牙规范定义)计算出data channel,如下:

根据channelmap和hop的值,双方就可以协商出数据通道,在后续通信中,双方根据

channel = (curr_channel + hop) mod 37

继续实现跳频,可以看到当前hop是0x0D当前在0x1A通道上,则下一跳会到02通道上,再下一跳会跳到0x0F通道上。

Spec 5.0中增加了Channel Selection Algorithm #2通道选择算法。

 

4. 数据通道PDU包头(Header)

BLE的PDU分为两类,广播类型PDU和数据类型PDU,结构如下:

PDU的前两个字节的是header,通过header的内容,就可展开PDU类型,分析具体的payload,

 

数据通道的PDU是BLE设备连接建立以后在数据通道上发送和接收到的包,该PDU包展开如下:

数据通道PDU包括了16bit的头,一个变长的payload,以及一个可能的数据完整性检验码MIC(MessageIntegrity Check),将header进一步展开如下:

各个字段的含义为:

当LLID= 0x3时,数据类型是控制类型的包,表示为LL_CONTROL

当LLID=0x1或者0x2时,表示是L2CAP类型的包(L2CAP又分为ATT包或者SMP包,这里不过多展开),

Length包括了Payload和MIC(若有)的长度。

 

更多更新关注公众号

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!