sniff mode及其参数的解释

 偶然发现bluetooth的whitepaper,虽然描述的东西很细小,但是很具体形象。比如下面要说的sniff mode中的几个参数。这里纯粹是简单翻译,做个记录。


1.sniff mode干甚用的?

        简单来说,他就是为了省电用的。在active mode,slave必须在每个master-to-slave的slot中监听master的数据,看看有没有发给自己的;而一旦进入sniff mode,slave就不必每个master-to-slave slot都去监听。这样slave就可以更加省电了,没事儿的时候就可以睡下去。但是它必须定期醒过来,看看master是否有消息传过来。


2.sniff mode的基本概念

sniff mode及其参数的解释_第1张图片

        

        上面这张图说的就是前面讲得sniff mode。首先是sniff interval,也就是slave定期(醒来)监听master数据的时间周期。图中用Tsniff来表示这个参数。其实它是以slot为单位的,具体的周期还得乘以0.625ms。假如某个slave请求的sniff mode的interval为18个slot,则它的Tsniff为18,周期为18*0.625=11.25ms。其次是sniff anchor point,也就是所谓的sniff锚点。从这个锚点开始,slave会监听一段时间master的报文(从而锚点必然是某个master-to-slave slot的开始)。如果没有消息,那么slave可能就要休息去了。具体slave监听多久,有几个参数来决定。Wait,我们等会再讨论它们。上面这张图说的是一个slave的情况,那要是有多个slave怎么办呢?看下面这张图:

sniff mode及其参数的解释_第2张图片

此图说明了多个slave的情况。当遇到多个slave请求进入sniff mode时,slave必须在sniff interval的基础上通过设置一个偏移量来决定自己实际的anchor point。这一点是通过下面这个等式来实现的:

                                     Dsniff = Clock_Value (bits 26-1) mod Tsniff

这里的Dsniff就是前面提到的offset。它必须为偶数,因为master只会在偶数slot给slave发包。slave在请求进入sniff mode时,通过Dsniff这个参数就可以与其他处在sniff mode的设备区分开,获得不同时间的anchor point。(有没有觉得以上的两张图风格不一样?前一个是core spec的,后一个则是whitepaper中的)。


下面来看看剩下的两个参数——Nsniff_attempt和Nsniff_timeout。先说说Nsniff attempt,它表示slave在每个sniff interval中监听的master-to-slave的slot数量。下图说明了Nsniff_attempts为3的情况,slave必须在anchor point到来后的3个slot内保持监听状态。

sniff mode及其参数的解释_第3张图片

几点说明:

        1)由于master-to-slave和slave-to-master的slot是交叉出现的,因此图中Nsniff_attempt的持续时间为3+2=5个slot,包含3个master-to-slave slot;

        2)由于包含anchor point开始的第一个slot,因此Nsniff_attempt的值必须至少为1;

        3)Nsniff_attempt的最大不得超过Tsniff/2;

        4)在Nsniff_attempt中的每个master-to-slave slot,slave都必须处在监听状态;

        5)如果在Nsniff_attempt期间slave没有收到master的数据,那么slave就可以睡下去了。


最后一个参数是Nsniff_timeout,它的作用在下图得到了较好的说明:

sniff mode及其参数的解释_第4张图片

在上面这张图中,如果在Nsniff_attempt期间收到master的数据,那么slave还必须继续继续监听Nsniff_timeout数量的master-to-slave slot,以便两者继续交换data而不用等到下一个anchor point到来。注意,一旦收到数据,slave就必须重新等待Nsniff_timeout个slot,这个值不会改变。


题外话——sniff mode在HID中的应用

        HID devices使用interrupt channel来传送HID data,由于通常它们并不会一直有数据需要传输(比如鼠标,只在用户晃动或者点击按键时才会有有效HID data传送),使用bluetooth的sniff mode可以很好的达到省电的目的,毕竟这些HID devices大多是使用电池供电的。

        一般而言,HID devices会使用一组参数来请求进入sniff mode。HID spec中建议sniff mode的interval最好不要少于12,.5ms,以免影响page scan mode。另外在实际应用中,处在sniff mode的HID devices会等到anchor point到来时master发送的pull packet后,才开始向master发送自己的HID data。


你可能感兴趣的:(bluedroid)