4.8. BLE传输的影响因素及测速结果
概述 使用demo_ble进行设备收发数据测速
4.8.1. 操作说明
在手机端安装BLE测速工具[JL_RSSI_Test-V1.2.0-tool-debug.apk](SDK中sdk_tools目录下工具)
在app_config.h文件中,使能以下宏
#define TCFG_USER_BLE_ENABLE 1 //BLE功能使能
#define TRANS_DATA_EN 1 //从机 传输数据
在 le_trans_data.c 文件中,使能以下宏
#define TEST_SEND_DATA_RATE 1 //测试上行发送数据
#define TEST_TRANS_CHANNEL_DATA 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,点击最右测的盘状指针图案查看设备发送测速数据
4.8.2. ble传输要素说明
BLE传输带宽主要跟两个要素有关: 通信周期和每个通信点可传输的数据量
(1)通信周期: 安卓手机一般可支持到10ms,苹果一般可支持到15ms
(2)每个通信点可传输的数据量: 就是指每包的长度以及可以传多少包
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传输速率影响的参数及功能
改大本地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},
};
修改每次通信最多收发数据包的个数,contoller的一级缓存。(建议<=10,能收发多少包最终由主机决定),当连接周期变长时,可发的包数越多,传输速率越大,当连接周期过长,收发包已达到设置最大数,传输速率会下降
const int config_btctler_le_rx_nums =10; /*空中1次通信可接收最多的数据包个数*/
const int config_btctler_le_acl_total_nums =10; /*空中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数据的时候,效率就会最高,耗时较少。
开启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);
可同时使用修改点4使用DLE和修改点5开启2M包支持,在config_btctler_le_features或上相应参数开启,DLE和2M包一般主机蓝牙版本支持都会进行主动发起
4.8.4. 设备ble发送测速结果
依照上一部分”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)设置MTU_SIZE
(2)PHY设置成支持1M包或2M包测试(主机即手机要支持蓝牙v5.0)
测速结果
(1)以调整连接周期时间支持1M包进行测速结果:
(2)以调整连接周期时间支持2M包进行测速结果:
说明:当连接周期变长,在达到可发送最大包数之前,可发送的包数越多,速率越快
(3)以调整ATT_MTU支持1M包进行测速结果:
(4)以调整ATT_MTU支持2M包进行测速结果:
(5)以上数据仅供参考,可根据需要对于影响因素”ble传输速率影响的参数及功能”中五个点进行调整测试所需速度,使用测速软件的手机不同、距离信号强度和干扰信号等也会带来测速差异
4.8.5. 设备ble接收测速结果
依照上一部分”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)设置MTU_SIZE
(2)PHY设置成支持1M包或2M包测试(主机即手机要支持蓝牙v5.0)
(3)设置连接参数(连接参数主机决定可修改)
测速结果
(1)以调整连接周期时间支持1M包进行测速结果:
(2)以调整连接周期时间支持2M包进行测速结果:
说明:当连接周期变长,查看蓝牙包,手机发的包数固定没变(与手机性质有关),连接周期越长,速率越慢
(3)以调整ATT_MTU支持1M包进行测速结果:
(4)以调整ATT_MTU支持2M包进行测速结果:
(5)以上数据仅供参考,可根据需要对于影响因素”ble传输速率影响的参数及功能”中五个点进行调整测试所需速度,使用测速软件的手机不同、距离信号强度和干扰信号等也会带来测速差异
说明:以上设备发送和接收测速,另一端均为华为P40 pro
4.8.6. 参考
更多详细说明请点击参考 提升ble传输速率方法