连接建立
应付比广播更为复杂的数据传输,或者要在设备之间实现可靠的数据交付,这些都要依赖于连接。连接使用数据信道在两个设备之间可靠地发送信息。它采取了自适应跳频增强鲁棒性,同时使用了非常低的占空比,尽可能地降低功率消耗。
设备创建连接的过程如下图所示。简言之,设备首先广播可连接广播事件,其他设备收到之后即可发起连接。在此过程中,广播者发送的事件类型要么是通用广播事件,要么是直接广播事件。发起者收到正确的广播报文时,将向广播者发送一个连接请求,其中包括了连接开始时需要的所有信息。
下面来了解连接过程中涉及到的一些主要知识点:
1.连接中使用的接入地址
2.CRC初始值
3.发送窗口
4.连接事件和连接参数
5.自适应跳频信道图
6.睡眠时钟精度
一旦收到或发出连接请求报文,设备即建立了连接,数据交换随之开始。
连接中使用的接入地址
连接使用的接入地址总是由主设备来提供。地址通过随机生成,但是需要遵循一些规则。如果主设备有多个从设备,它会为每个从设备选择不同的随机接入地址。地址的随机性确保了在不同的主从设备之间发生的碰撞概率会很低。随机性也增强了隐私,扫描者无法得知是哪两个设备正在通信。
CRC初始值
CRC初始值是另一个由主设备提供的随机数。随机的意义在于,如果在同一个区域有两个主设备正在和不同从设备通信,那么使用相同的接入地址的概率将会很低。如果确实发生了这种情况,从设备会从错误的主设备收到干扰数据包。因此,为每个从设备设置随机的CRC初始值,主从设备既有相同的接入地址又有相同的CRC初始值的概率就会变得微乎其微。
发送窗口
从设备可以自行决定广播的时间,它们是最需要保存电量的设备,这样的设计并无不妥。但是,如果主设备已经在做其他事情,也许是一些更重要的事情,那么它必须让低功耗蓝牙错开当前的活动。在连接建立期间,有两个参数用来传递上述信息:窗口大小和窗口间隔。
当连接请求数据包发送完毕,存在一个1.25ms的强制时延,紧接着是发送窗口偏移和发送窗口。发送窗口偏移可以是0到连接间隔之间的任意值,但必须为1.25ms的整数倍。从发送窗口开始,从设备打开其接收器,并等待来自主设备的数据包。如果到发送窗口结束时仍未收到数据包,从设备终止侦听,并会在一个连接的间隔后再次尝试。
关于连接过程,最有趣的一个地方是,一旦发送了连接请求,主设备便认为自身有了连接;该连接已经创建(created),但还不能算是完全确立(established)。当从设备收到连接请求时,它也认为自己已经处在连接之中;连接已经创建,但不能证明完全确立。
出于效率的考虑,连接已经创建,主机就会立即收到通知。连接可能不会成功,从设备也许收不到连接请求,或者两个设备的距离很远。这些情况如果发生,连接失败的概率将变得很高。然而,由于主机收到了连接已创建的通知,它可以开始将数据发给控制器从而为首个无线数据包的传输做好准备,并且节约时间和能量。因为第一个数据包的发送至少会在1.25ms延迟之后,主机堆栈应该有足够的时间向控制器提供数据,以便在第一时间发送出去。这种强制性的延迟为设备提供了喘息的机会:在繁重的广播规程与连接正式确立之间,电池获得了宝贵的恢复时间。
只有收到了数据包确认,连接才能视为正式确立。确立不改变连接的工作方式,但它改变了链路监控超时的时间从之前的6个连接间隔,变为了在连接请求中设定的值。这样一来,如果连接不能迅速确立的话将会立即终止。
连接事件和连接参数
这部分是重点内容,所以下一篇博文来详细阐述。
博文地址:点击打开链接
自适应跳频信道图
自适应跳频信道图是数据信道的位掩码,用来标记信道的好坏。由于共有37个数据信道,信道图的长度于是设为37位。如果某一位被设置为1,表明该信道良好,可用于数据通信;如果该位为0,表明该信道很糟,不可用于数据通信。
跳频算法的跳数值是在5 ~ 16之间的一个随机数。跳数值被用在自适应重映射之前的跳频算法中。显然,跳数值不能为0,否则频率永远不会改变。
非常低的跳数也是不可取的,因为大多数的干扰一般会占据好几兆带宽,使用非常小的跳数值将不会快速地将传输带离干扰源,可能造成持续干扰。同样的逻辑也适用于17或更高的值。试想,如果增量为17,由于跳频算法中要对37个信道取模,每两个频率之间的差距将紧紧只有3个信道。
睡眠时钟精度
最后,主设备发往从设备的信息中还包括睡眠时间精度值。该值定义了时钟能够保证的精度范围。如果时钟由晶振提供,晶振有一个根据温度变化的精度范围,比如在室温下为 20ppm,在 0℃ 或 85℃ 时为 50ppm 。如此一来,设备可以声明其时钟精度达到 50ppm 。
时钟精度可以帮助从设备消除连接事件的不稳定性。如果从设备与主设备的不同步时间达到 1s,而这两个设备的定时精度均为 500ppm,那么,将合并的不确定性 1000ppm 乘以上述时间,就得到一个 1ms 的不确定窗口。也就是说,从设备必须提早 1ms醒来,并在这额外的 1ms 内保持侦听,以仿主设备和从设备的时钟在不同的方向发生了最大漂移。
更精确的时钟可以降低功耗。还是以使用晶振的设备为例,如果两个设备的时钟精度分别为 50ppm 和 150ppm ,二者合并后的精度只有 200ppm 。一秒钟之后,从设备只需要提前 200μs 醒来并保持侦听。如果设备被唤醒的频率不高,他们的可用工作时间将 5 倍于两个使用 500ppm 晶振的设备。因此,如果对降低功耗有特别的要求,建议在设备中使用高精度的晶振。