原文:http://www.informit.com/articles/article.aspx?p=21325
译者按:本文主要翻译给需要在L2CAP和RFCOMM上开发应用的同学,了解怎样评估蓝牙速率是否满足需求以及曾样进行优化。原文发表2001,不涉及Bluetooth 3.0+HS。本质上HS的数据传输过程已经和蓝牙无关了,而是通过802.11进行传输,蓝牙只是完成了握手。
也许你已经听说过了蓝牙的数据速率范围可以从每秒1兆字节到每秒几千比特。为什么会有如此大的差距呢? 在影响蓝牙数据速率的因素这个问题上,Jennifer Bray会给你一个直截了当的回答。
Packet的选择:Single-Slot与Multislot
影响蓝牙数据速率的一个大的因素是packet类型。Single-Slot packets只使用一个625微秒slot,可以承载27个字节。这可以在每个方向上提供每秒108.8千比特的数据速率。Five-Slot packets可以在3125微秒内提供高达339字节的传输能力。这可以提高数据速率到每秒433.9千比特。数据传输几乎快了4倍,这是因为设备花了更多的时间来发送packets和较少的时间来重新调整数据包之间的radio。
为了获得更高的数据速率,采用非对称信道是可能的方法。如果较多的数据是从一个方向传输到另一个方向,那么可以在这个方向采用大packets而在另一个上采用小packets。图1显示了两种信道之间的差异:第一个,双向采用single-slot的对称信道;第二个,master到slave采用three-slot packets而反向采用single-slot的非对称信道。
图1 对称与非对称信道
当采用非对称信道和multislot packets时,牢记两点:
- 非对称信道可以在一个方向上给你更高的速率,但是在相反的方向上你会得到更低的数据速率。
- Multislot packets只能在合适的无差错信道上提供更高的数据速率;当有差错时,他们是没有效率的,因为一个packet被毁坏了,会有更多的数据需要重传。
图2给出了最大空口数据速率。当考虑应用层的数据速率时,牢记像L2CAP和RFCOMM这些较上层的协议会使用部分信道容量来传输header和framing信息。
图2 对称与非对称信道的最大空口数据速率
中速率与高速率Packets
除single-slot, three-slot和multislot pakcets之外,图2显示了中速率(DM)和高速率(DH)packets。中速率packets携带了额外的错误保护信息:这种信息和CRC bits以2/3-rate FEC编码,即每个10-bit segment增加5个parity bits。在噪声环境中,DM packets是一个好的选择,尽管FEC的花费要求你把较少的数据打包进每个packet。
用户并不需要选择packet类型,因为Bluetooth Link Manages会自动地选择packet类型来适应当前环境中的错误率。
高层协议的损耗
图2向我们展示了基带数据速率的变化可以从每秒57.6千比特到每秒723.3千比特,这依赖于所使用的packet类型。但是,应用层看到的数据速率不仅是受到基带packets的影响。Host protocol层,比如L2CAP和RFCOMM,为header和framing信息消耗了带宽。举个例子,如果我们假定一个由20-byte packets构成的恒定数据流,通过RFCOMM, L2CAP和HCI来发送,以下将是会发生的事情:
RFCOMM增加1字节的address信息,1字节的control信息,1字节的length indicator信息和1字节的Frame Check Sequence(FCS)信息。加上这些额外的4字节,L2CAP收到了24-byte packet。RFCOMM忽视了一些characters,所以数据速率可能会更低,这依赖于发送的data patterns。
L2CAP增加了2字节的length信息和2字节的channel ID到packet里面。所以,算上已经从RFCOMM收到的24字节,L2CAP传输了28字节给HCI。
如果Link使用DH1 packets,其paylaod是27字节,那么这个L2CAP packet将会被分割成2个DH1 packets。在每个slot pair,一个DH1 packet可被传输一次,即最多每1350微秒一次,所以每秒钟可以有800个packets被传输。每个packet可以携带27字节,那最大数据速率为每秒21.6千字节或者每秒172.8千比特。但是,在实际中,每对packets携带28字节,那最大数据速率为每秒11.2千字节或者每秒89.6千比特。数据速率降低了几乎一半,只有52%。
每秒400个20字节的packets可以被发送给RFCOMM,所以在RFCOMM的上层,数据速率仅有每秒8千字节或者每秒64千比特。现在数据速率降到了最大空口速率的37%。
如果我们重复这些计算,看看在RFCOMM之上传输20-byte packets能达到多少传输速率,那么我们可以得到图3中的图表。随着packet大小的增加,传输小RFCOMM packets变得越来越低效,所以数据速率的降低代替了增长。
图3 Maximum data rates on air compared to example rates at RFCOMM
这个例子特意被选择来阐明这个观点,所以图表中的数据特别的差,但是你应该在脑子里记住:引自蓝牙规范文档中的蓝牙信道速率数据不会转化为相同的应用层数据速率。
其他损耗
在真实的系统中,重传导致的损耗和signaling packets对数据流的干扰也会减少数据速率。一些设备,比如LAN接入点,可能花费时间来做inquiry scanning和page scanning,以便允许更多的设备连接。这将消耗时间,降低数据传输的可用带宽。
那些仅仅想连接,传输数据,然后断开的应用,在他们可以开始使用链路带宽传输数据之前,会花费大量时间inquiring, paging, performing service discovery和configuring links。
当Bluetooth正在传输的时候,符号速率(symbol rate)是每秒1兆比特,但是如我们已经看到的,在应用层的实际数据速率远低于这个值。数据速率被许多因素影响。这些因素在不同的应用之间各不相同,取决于距离,传播和干扰条件。这解释了为什么你会看到被报出许多不同的蓝牙数据速率的数据。