转自:http://blog.csdn.net/augusdi/article/details/25887631
三、物理链路
物理链路是用来表示设备之间的物理连接的,它和对应的物理通道是相关联的。
Q1:物理链路是否有检测通路状态的机制
这个问题很好,无线传输在其便捷性的对面总是存在不可避免的问题。而通路的异常断开就是我们经常遇到的问题,而且可以说这可能是没有任何征兆的断开。物理链路层对这种情况是有处理的方法的,它引入了所谓的supervision timeout机制,在connected的状态下,若是收到一个有效的包就会重新计时,当这个计时的时间到了,还没有收到任何的包,我们就认为链路已经断开了。有一个需要注意的是,在低功耗的模式下,比如sniff mode等,本身他们的包发送和接收的间隔就比较长,我们的supervision timeout一定要大于这个间隔才是合理,否则就是有问题的。
四、逻辑传输
逻辑传输是位于物理链路之上的一层,同样的物理链路上可以有多条逻辑传输通道。
Q1:逻辑传输都有哪些类型
目前来看一共有5种类型的逻辑传输层位于物理链路上。他们分别是:
1)SCO: Synchronous Connection-Oriented 即面向连接的同步逻辑传输。
2)eSCO: Extended Synchronous Connection-Oriented扩展的面向连接的同步逻辑传输。
3)ACL: Asynchronous Connection-Oriented 面向连接的异步逻辑传输
4)ASB: Active Slave Broadcast活跃的slave 广播逻辑传输
5)PSB: ParkedSlave Broadcast休眠的slave关闭逻辑传输
总得来说,同步的逻辑传输是用来传输语音等对时间比较敏感的数据信息的,他有一些reserved的slot用来进行同步,在eSCO中,就是通过这些reserved的slot进行重传的。而异步传输中每个slot都是对应,没有reserved的slot。
Q2:同样的物理通道是如何在逻辑层区分不同的slave的
由于蓝牙网络结构的限制,一个master在同一个物理通道上是可以对应多个slave的。在逻辑层,是通过一个称之为“逻辑传输地址”(LT_ADDR)来进行区分各个slave的。它的长度是3个bit,全0是用来广播的。因为是用来区分slave的,所以只有slave才有这个地址,master是没有的。需要注意的是这个地址只有在slave活跃的时候才有效,当他断开或者parked的时候,这个地址就立即没有了哦。他产生于连接的建立或者role switch的过程中,因为unpark并不会重新建立连接,所以它还必须在unpark的包中包含。
Q3:同步传输是否会重传啊?同时存在的链路数目是否有限制?异步传输呢
对于SCO而言,是不会进行重传的。所以对于只支持sco的耳机来说,我们可能会发现在较远距离的通话过程中就会产生杂音,这是无法避免的,这也是esco存在的原因所在,esco是支持重传的。
SCO中对master而言,同时存在的链路最大数目为3条。而对slave而言,对同样的master可以有最多3条链路存在,对不同的master则最多只有2条链路存在。
对异步的ACL而言,重传一般是在packet层次。master和slave之间只能有一条链路存在。
Q4:能否简单介绍一下逻辑通路内部的传输机理
我们从TX(发送)和RX(接收)两个方面来分析这个问题。对于TX而言,master端若是异步,则对每一个slave都有一个tx buffer。若是同步,则可能会有一个或多个buffer,这取决于SCO和eSCO是否使用同样的buffer。每个buffer都有两个FIFO,一个是current一个是next,两者并不是绝对的,而是交替变换的,如下图4-1
所示。
图4-1 TXbuffer的功能编程
对于异步传输而言,tx会把数据准备到nextdata FIFO。而packet composer总是从current data FIFO中去取packet,他们是不能同时在指向同一个FIFO的。在发送完了packet之后,收到了对方的ACK,就会进行S1的切换,也就是说S1a指向current data FIFO,而S2a则同时指向next data FIFO,进而完成数据的传输,若是没有收到pacekt ACK,则S1的切换不会进行,他们继续指向之前的FIFO,也就有了数据的重传。对于重传的packet就是有时效性的,若是一段时间还是没有重传出去,则会被flush命令刷掉。这里强调一下,异步传输是packet为指向进行切换的。
对于SCO/eSCO而言,数据的准备和传输和异步是类似的,不同之处在于S2的切换不是packet为指向的,而是一段时间的interval为指向进行的,他有一个T值,这个T值是两边协商出来的,没隔这个T值就进行S2的切换。
对于data和voice混合的packet,因为切换机制的不同,则有可能会出现voice已经更新了,而data还在重传的现象。这一点要注意。
对于RX而言,机制是比较类似的。他的切换示意图见图4-2。
图4-2 RXbuffer的功能编程
和TX一个不同点在于,在异步传输中,对所有的slave而言,master这端可能只有一个共同的rx buffer。而同步传输,不同的逻辑链路就是通过不同的buffer来进行区分的。从图中可以明显地看出RX buffer和TX buffer是类似的,就不多做解释。在异步传输中,若是RX buffer还没有读空就有新的packet来了,则会产生一个stop到下一个tx packet的头中,这样对端就会暂停发送,当rx buffer空了之后,这个stop就会在tx packet的头中移除掉,从而可以继续。
Q5:逻辑传输的过程中是否有流控
其实在上面解释RX的机制的时候,我们就发现了流控的影子,是的,流控是存在的。流控的实现就是通过packet头的FLOW域来实现的。需要注意的是,master和一个slave之间的流控并不会影响它和另外的slave之间数据的交互,同样流控也是双向独立的。