本文涉及如下问题:
-
如何建立连接
-
如何提高传输速率
-
异常时如何快速断开连接
-
如何跳频
-
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(若有)的长度。
更多更新关注公众号