我们文章虽然叫连接,但实际上还是处于广播包的范畴,为什么呢?还记得我们介绍广播包的时候,广播的类型吗其中CONNECT_REQ也叫CONNECT_IND,发起者的连接请求。
广播包类型
CONNECT_IND包还记得这个头什么意思吗?
广播包头
广播包结构介绍广播的时候都会涉及到以下概念,有时候也是云里雾里的
连接请求包(Connect_Req)链路层数据部分CRCInit:crc校验初始值
WinSize:发送窗口大小,发送窗大小(transmitWindowSize)=窗大小( WinSize)x1.25ms;
WinOfset 域表示发送窗偏移(transmitWindowSize)的值,发送窗偏移(transmitWindowSize)=窗偏移( WinSize)x1.25ms;
Interval用来表明链路层链接事件时间间隔参数 connInterval的值,并且以 connInterval = Intervalx1.25ms的形式给出,且 Interval将会有一个数值,它的范围为8~24;
Latency用来表示从设备链接延迟(eonnSlaveLaten-cy)的值,从设备链接延迟(connSlaveLatency)=延迟(Lateney)
超时域指出链接监督超时(connSupervisionTimeout)的值,链接监督超时(connSupervisionTimeout)=超时(Timeout)x10ms;
Hop用来表明跳跃长度,这个长度被使用在数据信道选择中,且它将会有一个数值,它的范围为5~16;
SCA用来表明睡眠时钟精确性
来看下具体的数据
最多37字节长度的数据部分
CONNECT_IND数据中包含了接入地址、校验初始值,窗口大小1.25*5=6.25ms,窗口偏移,连接间隔,从机延迟,超时时间。直观的感受一下。信道地图ChM 包含了信道分布这个信道分布就表明了已经被使用的数据信道和未被使用的数据信道。每一个信道都由一个数据位所代表,这个数据位是按照数据信道索引被定位的。如果一个信道是被使用的信道,则它的数据位设置为1。如果某个数据位的值为0,就表明这个信道没有使用。第37、38、39数据位设置为0,并且在接收时将会被忽略。
在 连接(一)这篇中,我们也说了,connect_req其实是在告诉advertiser,手机将在Transmit Window期间发送第一个同步包(P1)给你,请在这段时间里把你的射频接收窗口打开。设备B收到P1后,T_IFS时间后将给手机回复数据包P2(ACK包)。一旦手机收到数据包P2,连接即可认为建立成功。连接成功后,master和slave在每一个connection interval开始的时候,都必须交互一次,即master给slave发一个包,slave再给master发一个包,整个交互过程称为一个连接事件。
空的数据包在每一个connection interval开始的时候,Master和Slave必须交互一次,哪怕两者之间交互的是empty packet(空包)。不知道通过理论和实践结合的讲解方式,有没有让你更清晰。 |