蓝牙BLE芯片PHY6222之提高吞吐量
蓝牙吞吐量简述
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
- 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
上面列出的计算值仍然是理论值,可能与实践和现实环境中的测量数据吞吐量不一致,环境干扰,距离,协议栈重传,频偏大等原因都有可能导致吞吐量下降