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通道选择算法。

 

posted @ 2024-03-26 20:27  流水灯  阅读(93)  评论(0编辑  收藏  举报