BLE 的连接与断开
Core_v5.4 参考目录
初始化连接是在广播通道上建立的
角色介绍
BLE设备双方通信按照状态机进行切换实现,被连接的一方按照Standby->Advertising->Connection状态顺序实现连接;主动连接的一方按照Standby->-Scanning->Initiating->Connection状态顺序实现连接。蓝牙发起广播的一方称为广播者,发起扫描的一方称为扫描者,双方连接成功后,分别变成Slave和Master两种角色。Master角色的设备称为Central设备,而Slave角色的设备称为Peripheral设备。由于Slave角色的设备一般提供服务,因此称为服务端;而Master角色的设备访问服务,因此称为客户端。
连接建立
当设备接收到可以连接的广播(ADV_IND或者ADV_DIRECT_IND)后,则可以发起建立连接请求,连接请求数据包是通过发送CONNECT_REQ的PDU来实现的,CONNECT_REQ的PDU如下所示
连接参数
建立连接后,两个设备会在相等的连接间隔之间交换数据,每一次的数据交换称之为连接事件(connection event),数据的发送和接收都是通过连接事件完成的,在连接事件之外,BLE设备处于休眠状态,因此进一步降低了功耗。
广播的设备以一定的广播间隔周期性的广播数据,类似的,设备建立连接后,两个设备会以相等的时间间隔交换数据,这个间隔成为连接间隔(Connection interval)。
LL Data中参数解释:
1. AA:AccessAddress,链路层的接入地址
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
例如 Slave latency = 2 的情况下,可以忽略master的两个包,但第三个包则必须回应,否则,连接有可能被断开
这三个参数都是由master在发起连接时设定的,在连接建立后,slave可以发起更新连接参数的请求。
这几个参数是BLE连接中重要参数,直接决定了速率和异常情况的处理:
- Connection interval决定了传输速率,越小,发送数据越快,但功耗也会越大
- Slave Latency为0,数据发送速度回提高,增大,则会减小功耗
- Timeout:异常情况时能否尽快断开。
6. 调频参数
在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通道选择算法。