蓝牙BLE芯片PHY6222之提高吞吐量

本文围绕蓝牙吞吐量展开,简述其为蓝牙无线传输的空中速率,介绍了在不同蓝牙版本下ATT有效负载情况。通过PHY6222开发板等进行测试,得出一分钟内平均吞吐量约100KB/s。还分析了影响BLE吞吐量的常见因素,最后给出吞吐量理论计算方式,指出理论值与实际可能有差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蓝牙吞吐量简述

BLE throughput 即为蓝牙无线传输的空中速率,速率越快传输的数据耗时越短,反之越长;同样的功耗也会随之上升,毕竟鱼和熊掌不可兼得,还是要调试适合自己应用的范围;
在蓝牙4.2版本以前,ATT Payload为20字节;
在4.2以后,ATT有效负载最多支持发送244字节的数据。

测试数据

SDK路径:SDK313\example\ble_peripheral\simpleBlePeripheral
测试硬件:PHY6222开发板
测试仪器:Ellisys Bluetooth
测试方法:使用安卓手机APP nRF connect连上PHY6222,然后使能notify,PHY6222就会开始发送数据到nRF connect,使用抓包器即可抓到在一段时间内的平均速率。
测试结果:一分钟内PHY6222 notify数据的平均吞吐量约为 100KB/s
在这里插入图片描述

影响BLE吞吐量的常见因素

以下我将实现最大吞吐量的操作情况进行分享,应用可以根据自身需求进行适当配置
1.物理层的带宽
PHY LE 2M ,PHY LE 1M ,PHY LE编码(S=2 500kbps或S=8 125kbps) ),PHY 的选择直接影响可以实现的最大数据吞吐量
2.是否支持Data Length Extension (DLE)

    {	
    	//在任务初始化中
        uint8_t mtuSet = 247;
        llInitFeatureSet2MPHY(TRUE);//支持2M  PHY
        llInitFeatureSetDLE(TRUE);	//支持DLE
        ATT_SetMTUSizeMax(mtuSet);	//支持247字节的长包数据
        LOG("[2Mbps | DLE | MTU %d] \n", mtuSet);
    }

3.连接间隔–connection interval
连接间隔目前设置12.5ms,因为手机不支持最小的连接间隔7.5ms

#define DEFAULT_DESIRED_MIN_CONN_INTERVAL     6//32//80

// Maximum connection interval (units of 1.25ms, 800=1000ms) if automatic parameter update request is enabled
#define DEFAULT_DESIRED_MAX_CONN_INTERVAL     10//48//800

// Slave latency to use if automatic parameter update request is enabled
#define DEFAULT_DESIRED_SLAVE_LATENCY         0

// Supervision timeout value (units of 10ms, 1000=10s) if automatic parameter update request is enabled
#define DEFAULT_DESIRED_CONN_TIMEOUT          500//1000

// Whether to enable automatic parameter update request when a connection is formed
#define DEFAULT_ENABLE_UPDATE_REQUEST         TRUE//FALSE

4.每个连接间隔的最大数据包数
PHY6222每个连接间隔支持发送的最大是6个包,每个连接事件发送的数据包数量可能达不到协议栈允许的最大数量,会根据协议栈的调度机制,以及在iOS和Android之间是不同的,也会根据设备上运行的操作系统版本而变化

#define   BLE_MAX_ALLOW_PKT_PER_EVENT_TX        6
#define   BLE_MAX_ALLOW_PKT_PER_EVENT_RX        3

#define     LL_LINKBUF_CFG_NUM                6
  1. MTU size—最大传输单元
    支持一包的有效负载244字节,要在连接成功的时候从机主动去更新该参数(主机主动去更新也可以)

在这里插入图片描述
6.操作类型
write response ,write response ,indicate和notify。本测试使用的是notify,带回复的交互数据吞吐量应该是会下降很多。

    if ( events & SBP_ADD_RL_EVT )
    {
        bStatus_t status = SUCCESS;
        static  int cnt = 0;

        uint16 value;

        if(cnt == 244) {
            cnt = 0;
        } else {
            my_ntf_test.value[0] = cnt++;
        }
        my_ntf_test.handle = 0x14;
        my_ntf_test.len = sizeof(my_ntf_test.value);
        status |= GATT_Notification( 0, &my_ntf_test, FALSE );

//        LOG("ntf_status=%d\n", status);
   
            osal_set_event( simpleBLEPeripheral_TaskID, SBP_ADD_RL_EVT);
        return ( events ^ SBP_ADD_RL_EVT );
    }

7.提高吞吐量是比较耗SRAM资源的,所以相应的堆栈可以适当的增加一些

#define     LARGE_HEAP_SIZE  (6*1024)
Stack_Size      EQU     0x00000800

总结

demo传送门
提取码:j4ny
吞吐量有效负载的理论计算方式,以本参数为例:
吞吐量(KB/s)=单位时间/连接间隔包个数MTU size/1024
1000(ms)/12.56244/1024=114KB/s

上面列出的计算值仍然是理论值,可能与实践和现实环境中的测量数据吞吐量不一致,环境干扰,距离,协议栈重传,频偏大等原因都有可能导致吞吐量下降

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值