BLE 包结构及传输速率

蓝牙BLE的最大特点就是低功耗,而低速率和简单的交互协议是降低功耗的重要组成部分。因此BLE一般应用于低速率的近场控制和数据交互,如智能家电、运动手环等等,小数量的控制和交互对传输速度没有要求,每秒1K字节就可以了,有时为了功耗可能会更低。但在某些场景下,可能要求BLE尽可能提高传输速率,如无线空中升级OTA、无线对讲语音传输等等。接下来,我们来分析如何提高BLE的速率来满足需求,并探讨BLE连接的稳定性。

一、BLE数据包分析

BLE包的结构是:



preamble(1 Byte)+ AccessAddress(4 Bytes)+ PDU + CRC(3 Bytes)

1)preamble = 10101010 or 01010101

2)Access Address = 0x8e89bedd6

3)连接以后的数据传输的PDU是:Header(2 Bytes)+ Payload (27 Bytes max)+MIC(4bytes),所以传输一个包的   最大长度是1+4+33+3=41字节,有效数据最大是27字节。

二、自定义characteristic的最大长度

   从上面分析可见,通过WRITE或者NOTIFY characteristic发送一个包的最大长度是27字节。但是这个27字节指的是BLE底层的协议包格式。对于profile层的characteristic,其最大的长度是20字节,也即是每个包最大的长度是20字节。

   这是因为profile所用的characteristic处于GATT协议层,而GATT到ATT层需要增加一个字节的op code,两个自己的attribute handle。然后ATT到L2CAP适配层需要增加4个字节的L2CAP头。所以从GATT到底层需要封装7个字节的额外协议数据,因此GATT层最大是20字节。

   其实,按照蓝牙BLE的协议,L2CAP协议层自动对数据包进行拆包和封装,理论上是支持ATT/GATT层更大的数据包的。但一般SDK默认ATT_MTU=23,这样L2CAP的工作会变得很简单,事实上,BLE的应用场景也不需要定义太长的数据包,20个字节足够了。

三、BLE的传输速率分析

   根据蓝牙BLE协议, 物理层physical layer的传输速率是1Mbps,相当于每秒125K字节。事实上,其只是基准传输速率,协议规定BLE不能连续不断地传输数据包,否则就不能称为低功耗蓝牙了。连续传输自然会带来高功耗。所以,蓝牙的最高传输速率并不由物理层的工作频率决定的。

在实际的操作过程中,如果主机连线不断地发送数据包,要么丢包严重要么连接出现异常而断开。

在BLE里面,传输速度受其连接参数所影响。连接参数定义如下:

1)连接间隔。蓝牙基带是跳频工作的,主机和从机会商定多长时间进行跳频连接,连接上才能进行数据传输。这个连接和广播状态和连接状态的连接不是一样的意思。主机在从机广播时进行连接是应用层的主动软件行为。而跳频过程中的连接是蓝牙基带协议的规定,完全由硬件控制,对应用层透明。明显,如果这个连接间隔时间越短,那么传输的速度就增大。连接上传完数据后,蓝牙基带即进入休眠状态,保证低功耗。其是1.25毫秒一个单位。

2)连接延迟。其是为了低功耗考虑,允许从机在跳频过程中不理会主机的跳频指令,继续睡眠一段时间。而主机不能因为从机睡眠而认为其断开连接了。其是1.25毫秒一个单位。明显,这个数值越小,传输速度也高。

蓝牙BLE协议规定连接参数最小是5,即7.25毫秒;而Android手机规定连接参数最小是8,即10毫秒。iOS规定是16,即20毫秒。

连接参数完全由主机决定,但从机可以发出更新参数申请,主机可以接受也可以拒绝。Android手机一部接受,而ios比较严格,拒绝的概率比较高。

一般场景,连接参数设置16,即20毫秒,一般的传输速率是50* 20 = 1000字节/每秒。如果每个连接事件传输更多的包,可以获得更高的传输速率。

四、BLE高速传输的应用场景和技术实践

   降低连接间隔,提高每个连接事件的发包数能够显著地提高速率,但是两者往往是矛盾的。因为一个连接事件的传送时间总是有限的。从实践来看,BLE的传输速率不仅跟连接参数有关,还跟CPU的处理能力有关[CC2541的51核要比DA14580的M0逊色不少]。此外还要对发送和接收流程进行优化处理,这个非常重要。需要注意的是,高速率也会带来稳定性问题,需要优化profile的数据交互场景和一些参数。

   高速率传输会带来更高的功耗,但是这个功耗应该是远比经典蓝牙的功耗低的。语音传输以往一般使用经典蓝牙芯片,功耗一般在毫安级别。便携式电子产品对功耗要求很高,对于单纯的语音对讲场景来说,BLE是可以满足需求的。语音使用8K采样率,16位量化,一秒即是16K字节/每秒。如果使用ADPCM编码压缩,可以压缩四分之一,即4K字节每秒。对于BLE来说,这个速度是完全可以达到的。如果是8bit量化,不压缩也是8K字节每秒。TI官方宣称CC2541的最大的传输速率是5.9K字节每秒。而DA14580则可以达到8K字节/每秒的速率。嵌入式企鹅圈基于目前最低功耗蓝牙单芯片DA14580已经demo通过,距离超过10米,稳定性也有保证。

根据Bluetooth 4.0 BLE部分协议:
BLE中物理层physical layer的传输速率是1Mbps,除了这个外,数据传输速率与包大小、CPU处理时间相关。
包结构:
1.总体结构:
preamble(1 Byte)+ Access Address(4 Bytes)+ PDU + CRC(3 Bytes)
preamble = 10101010 or 01010101
Access Address = 0x8e89bedd6
2. 广播包
PDU = Header(2 Bytes)+ Payload (37 Bytes max.)
Header: 1)0000 - connected undirected advertising event 可连接非定向广播事件
2)0001 - connected directed advertising event 可连接定向广播事件
3)0010 - non-connected undirected advertising event 不可连接非定向广播事件
4)0011 - response to scan request form scanner扫描请求响应
5)0101 - connect request by initiator连接请求
6)0110 -connected directed advertising event 可发现非定向广播事件
非定向广播包(Undirected advertising packets)
Payload = AdvA (6 Bytes) + AdvData (31 Bytes max.) ;
// AdvA contains advertiser‘s public address if TxAdd = 1, or a random address if TxAdd = 0;
// AdvData advertising data;
定向广播包(Directed advertising packets)
Payload = AdvA (6 Bytes) + InitA(6 Bytes) ;
// AdvA contains advertiser‘s public address if TxAdd = 1, or a random address if TxAdd = 0;
// InitA contains initiator’s address if RxAdd = 1, or a random address if RxAdd = 0;

  1. 扫描请求及扫描响应
    PDU = Header(2 Bytes)+ Payload (37 Bytes max.)
    Header: 1)0011 - scan request for further information from advertiser 扫描请求
    2)0100 - response to scan request from scanner 扫描响应
    扫描请求
    Payload = ScanA (6 Bytes) + AdvA(6 Bytes) ;
    // ScanA contains Scanner’s public address if TxAdd = 1, or a random address if TxAdd = 0;
    // AdvA contains advertiser‘s public address if TxAdd = 1, or a random address if TxAdd = 0;
    扫描响应
    Payload = AdvA(6 Bytes) + ScanRspData(0~31Bytes);
    // ScanRspData data from advertiser’s host;
    // AdvA contains advertiser‘s public address if TxAdd = 1, or a random address if TxAdd = 0;

  2. 连接请求
    PDU = Header(2 Bytes)+ Payload (34 Bytes)
    Header:0101 - connect request by initiator
    Payload =InitA(6 Bytes)+ AdvA(6bytes)+ LLData(22 Bytes)
    LLData 包含连接信息,详细结构参考bluetooth 4.0 协议。

  3. LL 数据通道及控制包
    PDU = Header(2 Bytes)+ Payload (27 Bytes max.)
    Header:详细说明参考bluetooth 4.0 协议;
    LL 数据通道
    Payload = 0~27 bytes
    LL 控制包
    Payload = 1~23 Bytes

若只考虑蓝牙设备连接之后,评估数据传输速率
最大包长度:preamble(1 Byte)+ Access Address(4 Bytes)+ PDU(29 Bytes) + CRC(3 Bytes)= 41 Bytes
射频PHY传输速率 1Mbps
则传输有效payload 27字节耗时:41*8/1 = 328 us
一个27字节的传输周期 :328 + 150 + 80 + 150 = 708 us,若能持续传输,即传输速度:38KB/s,这样显然功耗不会低,也不符合BLE协议规范,真正的传输速度受连接事件间隔和间隔内能传输数据包数目相关。
如果连接时间间隔设置到7.5ms(协议规定最小值),一个连接事件传输3个包,则传输速率大约是10.8kB/s,一个连接事件能传输几个包与连接设备密切相关,看到很多CC2540实测数据,时间间隔7.5ms和一个传输时间3个包以上很多都达不到,51内核是其重要原因之一,在 http://processors.wiki.ti.com/index.php/CC2540_Data_Throughput有5.9KB/s,也有在论坛看到有40ms间隔,2个包,即1.4KB/s成功的案例,以后有时间我再实测下速度。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值