蓝牙的sniff mode

https://blog.csdn.net/z497544849/article/details/84143224
 

在解析蓝牙的sniff mode之前,我们先来回顾一下蓝牙有哪些连接状态。

一、 蓝牙的连接状态转换图如下:
     http://blog.chinaunix.net/attachment/201605/6/21411227_1462520395149C.png

Connection State:如上图所示,蓝牙的连接态有几个子状态,分别如下:

其中包含三种状态属于节能态,Sniff/Hold/Park Mode.

    Connectionless Slave Broadcast Mode:

用来传输特性广播数据(profile broadcast data)。

    Active Mode:(主动模式)

在此模式下,微微网内部所有的从设备都可以和主设备通信,当然按照Spec最多只能有七个从设备。所有的通信都有主设备来主导。微微网所有的从设备都会在主设备-> 从设备时隙上监听数据包。如果一个从设备没有被寻址,它将等待下一个数据传输。从设备能从主设备传输的包头获取传输占用的时隙,在此期间没有被寻址的设备将会等待传输时隙。具体可以参考下图,多从设备传输时序图:
http://blog.chinaunix.net/attachment/201605/6/21411227_1462520423hUQF.png

    Sniff Mode:(呼吸模式)

呼吸模式通过减少主设备发送数据的时隙数并相应减少从设备监听的时隙数,从而达到节省电源的目的。在sniff模式下主设备将每隔Tsniff向从设备发送数据包,所以从设备每隔Tsniff去监听主设备的数据包即可!slave就是只在sniff anchor point时监听。sniff mode只能应用于异步传输,不能应用于同步逻辑传输。后面会详细介绍这部分。

    Hold Mode:

保持模式是蓝牙节能模式中最简单的一种。主从设备将对从设备处于保持模式的时间进行协商 ,一旦连接处于保持模式,此连接就不再支持数据包,从而可以节省电源或参与到其它微微网(piconet)中。有一点非常重要,即当每次进入保持模式时都需要对保持周期进行协商。关于保持模式还有一个更加重要的方面,即一旦设备进入保持模式就不能取消,并且保持周期必须在通信恢复前结束。

从机和主机协商一个保持时间,在此期间从设备进入低功耗模式但仍然保持LT_ADDR。异步传输在此模式下,不响应当然微微网的任何数据包。但在同步传输模式下(SCO,eSCO)需要支持保留时隙的数据包。在此模式下的设备可以scanning, paging, inquiring, 或者加入其它的微微网。

    Park State:

暂停模式可以最大限度的节省电源。当一个从设备不需要一直参与微微网的信道,但是却需要保持跟信道的同步时,从设备可以进入Park state。

处于Park state状态下的从设备只有很少的活动,它会选择放弃它的逻辑传输地址 LT_ADDR,取而代之的是,它会使用两个新的地址:

PM_ADDR: 8-bit Parked Member Address

AR_ADDR: 8-bit Access Request Address

另外,为了达到低功耗的目的,在Park state下,一个master可以连接多于七个slaves. 在一时刻, 只有七个slaves可以开始连接状态。但是,通过交换active slave 和park slave, 在微微网中的slaves的数目可以达到更多(255 如果PM_ADDR被使用的时候,并且如果用了BD_ADDR,这个数目还可以随机大);

二、sniff mode及其参数的解释

    sniff mode干什么用的?

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

    sniff mode的基本概念

https://img-blog.csdn.net/20150215183400065?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdXRhZGFsaWdodA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

上面这张图说的就是前面讲得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怎么办呢?看下面这张图:

https://img-blog.csdn.net/20150215190226692?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdXRhZGFsaWdodA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

此图说明了多个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内保持监听状态。

https://img-blog.csdn.net/20150215191813317?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdXRhZGFsaWdodA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

几点说明:

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,它的作用在下图得到了较好的说明:

https://img-blog.csdn.net/20150215192927114?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdXRhZGFsaWdodA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

在上面这张图中,如果在Nsniff_attempt期间收到master的数据,那么slave还必须继续继续监听Nsniff_timeout数量的master-to-slave slot,以便两者继续交换data而不用等到下一个anchor point到来。注意,一旦收到数据,slave就必须重新等待Nsniff_timeout个slot,这个值不会改变。
---------------------  
作者:no输给现实  
来源:CSDN  
原文:https://blog.csdn.net/z497544849/article/details/84143224  
版权声明:本文为博主原创文章,转载请附上博文链接!

 

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Sniff mode(敏感模式)是蓝牙技术中的一种功耗管理模式。在蓝牙设备中,当设备不需要时时刻刻保持与其他设备的连接时,可以将设备设置为sniff mode以减少功耗。 在sniff mode下,蓝牙设备将进入一种低功耗状态,仍然可以维持与其他设备的连接,但是数据传输速率会降低,从而减少能耗。当然,在sniff mode下,设备对于数据的响应时间也会有所延长。 sniff mode是在蓝牙设备之间进行协商和切换的。当设备处于活跃状态时,设备将保持连接并传输数据。然而,当设备进入闲置状态时,设备可以请求进入sniff mode以减少电池消耗。 通过使用sniff mode蓝牙设备可以在不影响连接的情况下延长设备的电池寿命。这对于那些长时间使用蓝牙连接的设备,如耳机、键盘、鼠标等非常有用。sniff mode具有一定的灵活性,设备可以自行根据需要选择进入sniff mode的时间间隔和持续时间。 总结来说,sniff mode蓝牙设备中的一种低功耗模式,通过降低数据传输速率来减少设备的能耗。这种模式对于需要长时间保持蓝牙连接的设备非常有用,可以延长设备的电池寿命。 ### 回答2: Sniff Mode(嗅探模式)是蓝牙技术中的一种低功耗模式。蓝牙技术主要用于无线设备之间的通信,如智能手机、耳机、键盘等。在传统的蓝牙工作模式下,设备需要保持连续的通信连接,这会消耗较高的能量。 而Sniff Mode则是一种节能的操作模式,它在设备之间建立了一个离散的连接,设备可以定期地进入休眠状态,以减少能量的消耗。在Sniff Mode下,设备不需要保持连续的通信,而是定期唤醒以检查是否有需要传输的数据。 通过进入Sniff Mode,设备可以在不影响通信性能的前提下降低功耗。具体来说,设备在Sniff Mode下减少了无线射频传输的时间,从而节省了能量。这对于那些需要长时间运行的蓝牙设备尤为重要,例如蓝牙耳机、蓝牙键盘等。 Sniff Mode不仅可以延长蓝牙设备的续航时间,还可以减少对设备的充电需求,提升用户的使用体验。同时,它也有助于降低蓝牙设备的发热量,减轻了对设备的散热压力。 总之,Sniff Mode是一种低功耗的蓝牙工作模式,通过减少通信时间和设备功耗,延长了设备的电池续航时间,提高了蓝牙设备的使用效率和性能。 ### 回答3: Sniff mode是一种蓝牙设备的功耗控制模式,它可以使设备在空闲或者低活动状态下以较低的功耗工作。 在蓝牙通信过程中,设备通常需要保持运行以便能够接收和发送数据。然而,并非所有时刻都需要设备保持全职工作,有些时候设备可以进入低功耗模式,以节省电能。 Sniff mode就是一种低功耗模式,它允许设备在不频繁通信的情况下进入一种能够降低功耗的睡眠状态。当设备进入Sniff mode时,它会定期唤醒以检查是否有新的通信需求,如果没有,则继续保持在低功耗状态,以延长电池寿命。 通过使设备在低活动状态下降低功耗,Sniff mode可以在蓝牙通信中提供更长的续航时间。这对于一些低功耗设备如蓝牙耳机、智能手表等非常有用,因为它们通常需要长时间的待机和低功耗工作。 然而,值得注意的是,进入Sniff mode可能会延长设备的响应时间,因为设备需要在唤醒后再次建立通信连接。因此,在设备的功耗节省和实时响应之间需要进行权衡。 总而言之,Sniff mode是一种能够在低活动状态下降低蓝牙设备功耗的模式,旨在提供更长的续航时间。这对于低功耗设备的性能和电池寿命至关重要,但需要仔细权衡响应时间和功耗节省之间的平衡。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值