ble协议栈从零开始六(linklayer 之 连接)

SIG BLE MESH 视频 教程https://edu.csdn.net/course/detail/27321​​​​​​​

一、前言:

前面已经陆续写了linklayer的上中下三篇文章,本来以为再加一片完结篇就能写完,后面发现内容还是很多。本章主要写和连接状态相关的内容。这一章很重要!!!思前想后,决定从3个维度来描述linklayer 的连接相关的内容。

1)连接开始创建的过程

2)连接建立的过程

3)连接建立后的状态

 

 

二、连接的创建过程

advertising 设备发送 adv,initiator 设备发送 connect_req的pdu的报文,这个就是创建连接的过程。我们来分析这个过程,initiator 设备发送 connect_req的pdu的报文时,advertising 设备一定能收到这个 connect_req请求(除非收到干扰,多设备抢占的连接)。at this moment(就是这个点),双方都会结束advertising event(不明白概念的查看上一张的解释),双方建立一条数据的链路,同时确定了双方的角色。advertising 设备是slave角色,initiator 设备是master角色。注意此时连接还没有establish,只是创建了。

如上图我们已经走到了红色的线的地方了,双方都关闭 adv event。后面进行上图标2的过程了,在这儿我们需要明白上图的

transmitwindowoffset、transmitwindowsize等概念。

疑问1:slave和master(发送connect_req就决定了双方的身份)完全可以约定一个时间比如10ms后,建立数据包的交互啊?为什么要有transmitwindowoffset、transmitwindowsize这些东西呢?

疑问1:双方既然已经切换成了数据的链路,那么他们的物理的通道怎么决定了,比如第一次数据包的交互,实际的物理通道是37个数据的物理通道哪一个呢?

先看看connect_req的pdu,包含那些信息

AA:是access address,master 和 slave 会使用这个值,来表示他们唯一的连接的逻辑链路。 什么意思呢,比如一个master连接多个slave,那么如何确定那个这些slave呢?就是通过这个地址。

winsize:就是扫描窗口

winoffer:就是扫描前的偏移。这个你们看上面的图就很一目了然

interval:就是建立连接过后,多长时间进入一次 connection event,进入  connection event后,MASTE先发送数据个SLAVE,然后SLAVE 发送数据给 MASER。

latency:是对slave的延迟,就是可以在latency时间内connection event,master给slave发送数据包交互的时候,slave不予理财,这样减少slave的功耗。

timnout:由于网路问题,或者连接的设备的移除。我们不得不判断对方设备还在不在piconet中,为此添加超时机制。

chm:channel map标识那些通道将会用作,后面的数据链路的通信

hop:调频的递增的值,默认是5到16的随机值。

2.1现在来回答一些疑问吧?

为什么要有winsize和winoffer呢?其实都是因为支持多连接给闹的,多连接是不是可以通过winsize和winoffer,找到一个比较合适的位置,让他们交替的进行。

疑问二,简单的说一下,就是通过channel map和hop就能确定一个伪随机的序列,这伪随机的序列后面会在连接过后解释。这儿我们就明白了为什么我们的dongo,必须完整的抓去建立连接的过程后面才能抓去建立连接后的通信。

 

 

 

三、连接建立的过程

 

如上图,如果在第一个transmit window 没有建立连接,那么会在这transmit window的start的地方,间隔一个conninterval的位置继续发起来连接,尝试建立6次,如果失败也会抛出超时的时间。

 

一旦建立数据包交互,以M->S的时候为锚点(achor point),后面都是在这个时间点加上 connect intervl进行交互。

 

 

 

四、连接建立的过后

 

正常情况下都是,在一次connecting event,进行一组 M->S,S->M的交互。T_IFS是150us(这个概论在上一章已经详细解释了)。

如果pdu_header的MDbit,more data满足下面的情况,可能会进行N组M->S,S->M的交互的交互,知道传完数据。more data对应的PDU最大为257个字节

4.1、跳频策略的解析

看上图,我们先建立一个used channel table,这个根据connect_req的channel map就能确定。

 

1)lastUnmappedChannel 建立连接后被初始化成0

        //hopincrement 在connect_req已经确定了是一个5到16的随机值

2 )  然后执行unmappedChannel = (lastUnmappedChannel + hopIncrement) mod 37

 

3 )  判断unmappedChannel在不在used channel table中,

4 )   如果在,就选择这个通道进行通道,同时把lastUnmappedChannel设成unmappedChannel的值,

5 )   如果不在执行 emappingIndex = unmappedChannel mod numUsedChannels 

 

           //numUsedChannels  是 used channel table的通道的个数

6)      选择used channel table[remappingIndex]进行通信,

7)      同时把lastUnmappedChannel设成used channel table[remappingIndex]

这个算法很简单吧

 

五、附录参数的限制

 

The connSupervisionTimeout shall be a multiple
of 10 ms in the range of 100 ms to 32.0 s and it shall be larger than
(1 + connSlaveLatency) * connInterval * 2.

The transmitWindowOffset shall be a multiple of 1.25 ms in the range of 0 ms
to connInterval. The transmitWindowSize shall be a multiple of 1.25 ms in the
range of 1.25 ms to the lesser of 10 ms and (connInterval - 1.25 ms).

The connInterval shall be a multiple of 1.25 ms in the range of 7.5 ms to 4.0 s.
The connInterval is set by the Initiator’s Link Layer in the CONNNECT_REQ
PDU from the range given by the Host.

connSlaveLatency shall be an integer in the range of 0 to
((connSupervisionTimeout / (connInterval*2)) - 1). The connSlaveLatency
parameter shall also be less than 500

这些参数的限制直接贴英文吧

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XG_2013

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值