4.8. BLE传输的影响因素及测速结果

概述 使用demo_ble进行设备收发数据测速

4.8.1. 操作说明

    1. 在手机端安装BLE测速工具[JL_RSSI_Test-V1.2.0-tool-debug.apk](SDK中sdk_tools目录下工具)

    1. 在app_config.h文件中,使能以下宏

#define TCFG_USER_BLE_ENABLE                      1     //BLE功能使能
#define TRANS_DATA_EN                             1     //从机 传输数据
    1. 在 le_trans_data.c 文件中,使能以下宏

#define TEST_SEND_DATA_RATE          1  //测试上行发送数据
#define TEST_TRANS_CHANNEL_DATA      1  /*测试记录接收数据速度*/
    1. 编译工程,烧录镜像,复位启动

    1. 如下图进行手机app端操作:(所需点击的按钮均在图中标注)

  • (1)在手机端运行 BLE 测速工具 APP,选择扫描界面中要连接的设备

  • (2)点击连接以后会跳转到参数设置界面,可以设置MTU大小(23-517),设置PHY,查看连接参数,修改主机端连接参数

  • (3)选择服务列表uuid:00ae30-0000-1000-8000-00805f9b34fb

  • (4)选择uuid:0XAE01,点击右侧盘装指针图案查看设备接收测速数据

  • (5)选择uuid:0XAE02,打开notify(点击三个向下箭头)之后value会自动更改为enable,点击最右测的盘状指针图案查看设备发送测速数据

../../_images/blespeedtest_scan.jpg
../../_images/blespeedtest_test.jpg
../../_images/blespeedtest_speed.jpg

4.8.2. ble传输要素说明

    1. BLE传输带宽主要跟两个要素有关: 通信周期和每个通信点可传输的数据量

  • (1)通信周期: 安卓手机一般可支持到10ms,苹果一般可支持到15ms

  • (2)每个通信点可传输的数据量: 就是指每包的长度以及可以传多少包

    1. BLE理论带宽传输计算如下

  • (1)按15毫秒通信周期,每次基本通信能发4包(发包个数取决于主机)

  • (2)若PDU长为27, 即payload长是 20 byte,那传输速度是 (1000/15)204 约= 5K byte 速度

  • (3)若PDU长为251,即payload长是 244 byte,那传输速度是 (1000/15)2444 约= 63K byte 速度(要双方同时支持DLE和2M属性)

4.8.3. ble传输速率影响的参数及功能

    1. 改大本地ATT协议MTU的大小和应用层cbuf的大小

  • 注意:实际使用的ATT_MTU大小,一般由主机进行与从机协商交换,取两者较小作为传输ATT_MTU大小,协商交换后可看打印”ATT MTU = xxx”

  • 传输速率与设备端设置的ATT_MTU大小与下列第四点中使用DLE配置中config_btctler_le_acl_packet_length长度配置也有关系,并不是ATT_MTU越大速率越快,测速时设备端设置最大517是因为测速软件在主机端可进行MTU修改设置

  • 传输速率与设备设置的ATT_MTU大小与下列第三点设置能收发到的最大包数有关,每包的ATT_MTU越大,每次通信能收发的实际包数可能越少

//ATT的包长,    note: 20 <=need >= MTU
#define ATT_LOCAL_MTU_SIZE    (517)
/*本地MTU的长度,范围range:23~517,会通过接口ble_vendor_set_default_att_mtu配置*/
//ATT缓存的buffer大小,  note: need >= 20,可修改
#define ATT_SEND_CBUF_SIZE  (ATT_LOCAL_MTU_SIZE*5)
/*cbuf是contoller发包的二级缓存*/

/*一般情况是client端主动发起MTU交换;但如果client没发起,server角色也可以使用接口发起MTU交换(ble_api.h)*/
void att_server_set_exchange_mtu(u16 con_handle);
  • 2.调整连接参数。改小蓝牙的通信周期interval的值,最小周期是7.5 ms。从机只请求,通信周期由主机决定。客户可以根据实际需求来修改连接参数、interval越小、功耗越高、BLE通信速度越快;latency越小、功耗越高、BLE通信速度越快。BLE连接参数是主机和从机通过协商的方式确定的。trans_connection_param_table数组中每一行代表一组连接参数分别代表interval_min、interval_max、latency、timeout。连接以后主机会拿从机中第一组连接参数,如果主机不支持改参数会自动拿第二组、如果三组都不支持则连接参数由手机确定。

  • 注意:传输速率有关连接周期与每次通信最多收发数据包个数有关。

  • 发送时当连接周期过短,每次通信发送数据包未达到设置最大发送包数,增加连接周期,可发包数越多,速率越快,当连接周期过大,已达到最大发送包数,传输速率开始下降。

  • 接收时当达到最大接收包数时,连接周期越短,单位时间内通信次数越多,速率越快。

  • (1)主从对传最小到6 slots(7.5ms)

  • (2)安卓最小到9 slots(11.25ms),不排除有些手机不支持9 slots

  • (3)苹果最小到12 slots(15ms)

struct conn_update_param_t {
    u16 interval_min;  //连接周期范围最小值(unit:1.25ms)
    u16 interval_max;  //连接周期范围最大值(unit:1.25ms)
    u16 latency;       //忽略通信次数(unit: interval)
    u16 timeout;       //(unit:10ms)
};

static const struct conn_update_param_t trans_connection_param_table[] = {
    {6, 9, 0, 400},  /*Android请求的连接参数*/
    {6, 12, 0, 400}, /*ios请求的连接参数*/
    {16, 24, 0, 400},/*ios请求的连接参数*/
};

/*客户可以根据实际需求来修改连接参数、interval越小、功耗越高、BLE通信速度越快;latency越小、功耗越高、BLE通信速度越快。*/
/*功耗优先*/
static const struct conn_update_param_t trans_connection_param_table[] = {
    {60, 80, 19, 2000},
    {40, 60, 19, 2000},
    {20, 40, 19, 1500},
};

/*兼容性优先*/
static const struct conn_update_param_t trans_connection_param_table[] = {
    {16, 24, 10, 600},
    {12, 28, 10, 600},
    {8,  20, 10, 600},
};

/*性能优先*/
static const struct conn_update_param_t trans_connection_param_table[] = {
    {6,  10, 0, 100},
    {10, 14, 0, 100},
    {14, 20, 0, 100},
};
    1. 修改每次通信最多收发数据包的个数,contoller的一级缓存。(建议<=10,能收发多少包最终由主机决定),当连接周期变长时,可发的包数越多,传输速率越大,当连接周期过长,收发包已达到设置最大数,传输速率会下降

const int config_btctler_le_rx_nums =10; /*空中1次通信可接收最多的数据包个数*/
const int config_btctler_le_acl_total_nums =10; /*空中1次通信可发送最多的数据包个数*/
    1. 开启 Data Length Extension supported (LE_DATA_PACKET_LENGTH_EXTENSION),简称DLE ,ACL层的每个数据包PDU的长度可配置范围 27~251 bytes(主机要支持蓝牙v4.2或以上版本)

/*蓝牙版本features*/
const uint64_t config_btctler_le_feature =  LE_ENCRYPTION|LE_DATA_PACKET_LENGTH_EXTENSION;
const int config_btctler_le_acl_packet_length = 251;/*数据包payload长度,range:27~251*/

/*主从机都可以发起DLE请求交换,一般是主机发起,可调用接口*/
int ble_comm_set_connection_data_length(u16 conn_handle, u16 tx_octets, u16 tx_time)
ble_comm_set_connection_data_length(conn_handle,config_btctler_le_acl_packet_length ,2120);
  • 注意:如果从设备支持DLE特性,一般手机可用的ATT MTU大小也会跟着变大。另外ATT_LOCAL_MTU_SIZE 和 config_btctler_le_acl_packet_length的配置关系,ATT层 MTU_SIZE 对应配置ATT_LOCAL_MTU_SIZE空中包PDU长度 对应配置 config_btctler_le_acl_packet_length

  • (1)ATT_LOCAL_MTU_SIZE 是配置ATT协议的最大包长,配置范围 23~517,实在应用最大的有效数据长度 PAYLOAD_SIZE = ATT_LOCAL_MTU_SIZE -3。

  • (2)config_btctler_le_acl_packet_length 是配置空中包的PDU长度,配置范围 27~251。

  • (3)ATT_LOCAL_MTU_SIZE 配置不受 config_btctler_le_acl_packet_length 配置影响。如果 ATT_LOCAL_MTU_SIZE > (config_btctler_le_acl_packet_length-4);ATT层传输过程就会根据 (config_btctler_le_acl_packet_length-4)的值来对ATT的包做拆包和组包的动作。

  • (4)改大 config_btctler_le_acl_packet_length 会提升空中传输包长,减少拆包和组包的耗时。理想状态是ATT_LOCAL_MTU_SIZE 是 (config_btctler_le_acl_packet_length-4) 的倍数关系,这样在发送最大payload数据的时候,效率就会最高,耗时较少。

    1. 开启2M包的支持,提升物理传输速率,配置feature属性LE_2M_PHY(主机要支持蓝牙v5.0或以上版本)

/*蓝牙版本features*/
const uint64_t config_btctler_le_features = LE_ENCRYPTION|LE_2M_PHY ;

/*主从机都可以发起2M包请求交换,一般是主机发起,可调用接口*/
int ble_comm_set_connection_data_phy(u16 conn_handle, u8 tx_phy, u8 rx_phy, u16 phy_options);
ble_comm_set_connection_data_phy(conn_handle,CONN_SET_2M_PHY,CONN_SET_2M_PHY,CONN_SET_PHY_OPTIONS_NONE);
    1. 可同时使用修改点4使用DLE和修改点5开启2M包支持,在config_btctler_le_features或上相应参数开启,DLE和2M包一般主机蓝牙版本支持都会进行主动发起

4.8.4. 设备ble发送测速结果

    1. 依照上一部分”ble传输速率影响的参数及功能”所给出的设置对SDK进行修改

/*1.设置ATT_SIZE*/
#define ATT_LOCAL_MTU_SIZE    (517)
#define ATT_SEND_CBUF_SIZE  (ATT_LOCAL_MTU_SIZE*5)

/*2.设置连接参数*/
static const struct conn_update_param_t trans_connection_param_table[] = {
    {6, 10, 0, 100},
    {10, 14, 0, 100},
    {14, 20, 0, 100},
    //{16, 24, 10, 600},
    //{60, 80, 19, 2000},
};

/*3.设置每次通信最多收发数据包个数*/
const int config_btctler_le_rx_nums =10; /*空中1次通信可接收最多的数据包个数*/
const int config_btctler_le_acl_total_nums =10; /*空中1次通信可发送最多的数据包个数*/

/*4&5.开启DLE和2M包支持*/
const uint64_t config_btctler_le_feature =  LE_ENCRYPTION | LE_DATA_PACKET_LENGTH_EXTENSION | LE_2M_PHY;
const int config_btctler_le_acl_packet_length = 251;/*数据包payload长度,range:27~251*/
    1. 主机(手机端)操作修改

  • (1)设置MTU_SIZE

  • (2)PHY设置成支持1M包或2M包测试(主机即手机要支持蓝牙v5.0)

    1. 测速结果

  • (1)以调整连接周期时间支持1M包进行测速结果:

  • (2)以调整连接周期时间支持2M包进行测速结果:

  • 说明:当连接周期变长,在达到可发送最大包数之前,可发送的包数越多,速率越快

  • (3)以调整ATT_MTU支持1M包进行测速结果:

  • (4)以调整ATT_MTU支持2M包进行测速结果:

  • (5)以上数据仅供参考,可根据需要对于影响因素”ble传输速率影响的参数及功能”中五个点进行调整测试所需速度,使用测速软件的手机不同、距离信号强度和干扰信号等也会带来测速差异

4.8.5. 设备ble接收测速结果

    1. 依照上一部分”ble传输速率影响的参数及功能”所给出的设置对SDK进行修改

/*1.设置ATT_SIZE*/
#define ATT_LOCAL_MTU_SIZE    (517)
#define ATT_SEND_CBUF_SIZE  (ATT_LOCAL_MTU_SIZE*5)

/*2.设置连接参数*/
static const struct conn_update_param_t trans_connection_param_table[] = {
    {6, 10, 0, 100},
    {10, 14, 0, 100},
    {14, 20, 0, 100},
    //{16, 24, 10, 600},
    //{60, 80, 19, 2000},
};

/*3.设置每次通信最多收发数据包个数*/
const int config_btctler_le_rx_nums =10; /*空中1次通信可接收最多的数据包个数*/
const int config_btctler_le_acl_total_nums =10; /*空中1次通信可发送最多的数据包个数*/

/*4&5.开启DLE和2M包支持*/
const uint64_t config_btctler_le_feature =  LE_ENCRYPTION | LE_DATA_PACKET_LENGTH_EXTENSION | LE_2M_PHY;
const int config_btctler_le_acl_packet_length = 251;/*数据包payload长度,range:27~251*/
    1. 主机(手机端)操作修改

  • (1)设置MTU_SIZE

  • (2)PHY设置成支持1M包或2M包测试(主机即手机要支持蓝牙v5.0)

  • (3)设置连接参数(连接参数主机决定可修改)

    1. 测速结果

  • (1)以调整连接周期时间支持1M包进行测速结果:

  • (2)以调整连接周期时间支持2M包进行测速结果:

  • 说明:当连接周期变长,查看蓝牙包,手机发的包数固定没变(与手机性质有关),连接周期越长,速率越慢

  • (3)以调整ATT_MTU支持1M包进行测速结果:

  • (4)以调整ATT_MTU支持2M包进行测速结果:

  • (5)以上数据仅供参考,可根据需要对于影响因素”ble传输速率影响的参数及功能”中五个点进行调整测试所需速度,使用测速软件的手机不同、距离信号强度和干扰信号等也会带来测速差异

  • 说明:以上设备发送和接收测速,另一端均为华为P40 pro

4.8.6. 参考

更多详细说明请点击参考 提升ble传输速率方法