1、连接的控制
对连接的控制涉及到很多方面,而最直接的必然是连接的建立和连接的断开。
1.1 连接的建立
连接建立的过程如下图2-1所示:
图2-1 连接的建立
在page过程和一系列的信息交互之后就是连接的建立。master(paging的设备)就会发送LMP_host_connection_req来请求建立连接,slave可以回应LMP_accepted或者LMP_not_accepted来完成或者拒绝连接的建立。在这之间,其实还可能有一个role switch的过程,一般而言,是在slave收到LMP_host_conenction_req之后发送slot_offset和switch_req的PDU。若是role_switch失败,连接的建立仍然需要继续,除非paged一方不支持成为slave的角色,会回应low resource并断开连接。
1.2 连接的断开
蓝牙设备的断开是可以发生在任何时刻的,它可以由master发起也可以由slave发起。不过有一点,就是他必须有一个理由。因此断开连接的PDU——LMP_detach有一个error code的部分。
在断开连接之前,需要先把ACL-U的链路暂停,然后把LMP_detach放入到传输的队列中,紧接着发动断开的一端启动了一个6*Tpoll的timer,若是在这个timer超时前得到对方的ack,则启动一个3*Tpoll的timer,在3*Tpoll的timer超时后,LT_ADDR能够被re_use(发动断开端是master)。若是在6*Tpoll的timer超时后还没有得到ack,则丢弃link,启动一个新的Tlinksupervisiontimeout,这个timeout后LT_ADDR被re_use(发动断开端是master)。
至于在接收端,若是接收端是master,则启动一个6*Tpoll的timer,若是slave,则启动3*Tpoll的timer。这个timer超时后,连接断开,然后若接收端是master,则LT_ADDR能够被再次使用。
1.3 Power的控制
power的控制是link manager的另外一个重要的工作,虽然说power level是physical link的一个特性,而link manager是对逻辑链路的控制,因此这里的power控制是physical link上的特定logical link的power level,他不会影响同一physical link上别的logical link的power level。
Power的控制有两种策略,一种是legacy power control,另外一种是enhanced power control。支持enhanced的设备必须同时也支持legacy的控制策略。
legacy的power control所涉及的PDU如图2-2所示:
图2-2 legacy power control的PDU
很清楚地可以看到incr_power_req就是要求power level增加一格,decr_power_req就是要求power level减少一格。当对端处于max power的时候,你再发送incr_power_req的时候就会回复max_power,同样的道理若是处于min power的时候,也会回复min_power。还有一种情况就是对端不支持power control,则它也会对incr的req回复max power,而对decr的req回复min power,当然也有可能回复unsupported LMP feature的error code。
enhanced power control所涉及的PDU如图2-3所示:
图2-3 enhanced power control的PDU
毫无疑问,enhanced power control只有在两个设备都支持的情况下才会使用。在发送LMP_power_control_req之后,接收端会根据power_adjustment_request的内容来决定是提升一格的power level还是降低一格的power level或者就是直接max power。所以,这个参数有三个值:one step up,one step down或者all the way to the max power level。对应的response参数就比较简单了,它就是用来表示变化后的power level。
1.4 自适应跳频(AFH)
自适应跳频机制在蓝牙中特别重要,他可以降低同样ISM 2.4G的其它设备的干扰。AFH的PDU如下图2-4所示。
图2-4 AFH PDU
这个PDU的三个参数意义如下:
AFH_Instant: hopset 切换的时机,其实就是切换的间隔了。他至少要6*Tpoll的大小,且需是偶数。当然了,他的值还需要小于12小时。
AFH_Mode:表明AFH是使能还是不使能。
AFH_Channel_Map: 就是AFH使用的channel map。
在收到LMP_set_AFH的第一步就是查看AFH_Instant是否已经到了,若没有则立即启动一个定时器,若是已经到了就立即重设。当AFH_Mode是enable的时候,就是用来使能或者刷新AFH的。若是disable的时候,channel map参数的值就不再重要了。
1.5 通道的类别
AFH就是基于channel的一种机制,通俗地来讲我们希望一直在“干净”的通道上进行这些传输,那什么是“干净”的通道?除了所谓的“干净”的通道,还有别的什么通道呢?这里就是来说明通道都有哪些类型的。
通道类别的交互使用的PDU如下图2-5所示:
图2-5 通道类别的PDU
显然req就是请求通道类别的信息了,他有三个参数:
AFH_Reporting_Mode:用来确定slave是在AFH_reporting_enable还是AFH_reporting_disable的state。若是在disable的state,slave不会产生任何的channel classification。即使是enable的状态,若是channel classification没有改变,也无需回复LMP_channel_classification的PDU。
AFH_Min_Interval以及max interval用来定义以两次req command之间的时间间隔。
1.6 Link Supervision
这个就是我们通常所说的link supervision timeout了,这个timer就是用来探测物理链路是否丢失,而这个timer时间的设置就是通过如下PDU来实现的:
图2-6 设置supervision timeout的PDU
1.7 通道质量引起的数据速率的变化(CQDDR)
我们知道对于同一个packet type,数据传输的速率取决于RF通道的质量。当然,我们也可以根据不同的通道质量来传输不同的packet type以优化数据传输的速率。相关的PDU如下图2-7所示:
图2-7 通道质量导致的传输速率改变的PDU
设备A首先发送LMP_auto_rate PDU来通知设备B,这个功能是使能了,然后设备B就可以通过LMP_preferred_rate这个PDU来设置它所希望的packet type,当然设备A并不一定就要传输他希望的packet type,只要传输的packet type不比data rate所设置的值大即可。
1.8 服务质量(QoS)
Tpoll我们之前一直在谈,他就是master和一个特定slave之间传输的最大时间间隔。这个值设置就是通过如下图2-8所示的PDU来实现的。
图2-8 服务质量的PDU
这里有两种PDU,一个是LMP_quality_of_service,他是一个比较霸道的PDU,就是从master发出,通知slave,而slave不能拒绝,他必须得接受。另外一个则相对比较温和一点,quality_of_service_req,毕竟有个request,这个PDU可以有master发出也可以由slave发出。不同之处至于,slave发出的req的PDU中Nbc的值是无效的,直接忽略。但是master发出的req,slave是可以接受也可以拒绝的。这就可以形成一个协商的效果。
1.9 Paging Scheme Parameters
LMP还可以协商paging scheme参数。它使用的PDU如下图2-9所示:
图2-9 Paging Scheme请求的PDU
page_mode_req就是设备A告诉设备B,我page你的时候使用的paging scheme,设备B可以接收也可以拒绝,拒绝后就仍然使用原来的scheme。而page_scan_mode_req相比而言则多了一个设置,它不仅是A告诉B,Apage的时候使用的paging scheme,还设置了B page的时候使用的paing scheme。
1.10 多slot packet的控制
我们知道一个设备可以联系多个slot进行传输,不过这个连续的数目是有限制的。当然也是可以设置,设置这个数目的PDU如下图2-10所示。
图2-10 多个slot packet控制的PDU
这两个PDU和QoS中的两个PDU是一样的,就不多解释了。
1.11 Enhanced Data Rate
这个是用来改变packet type table的,同样的不同的type就意味着不同的调制模式可能会被选择。这个改变的是ACL logical传输,不会影响相应的SCO或eSCO链路。若想改变EDR的eSCO链路,在后面也会有介绍。这个PDU的格式如图2-11所示
图2-11 EDR PDU
1.12 封装的LMP PDUs
有时我们传输的LMP payload可能比16byte要长,那么就需要使用封装的LMP PDU来进行传输,他的格式如下:
图2-12 封装的LMP PDUs
当需要发送封装的LMP PDU的时候,我们会先发送LMP_encapsulated_header。对应这个header,若是major type和minor type,对端不能接收,就可以reject。若是accept,则会继续发送encapsulated_payload,对每一个payload都可以accept或者reject,每个payload的长度是16byte(最后一个用0填充)。
若您有任何关于蓝牙的问题都可以在底下留言提出,我会尽快回答的。
若您觉得该文章还不错,请按“顶”,哈哈~~