【NCS随笔】NCS如何更改MTU大小

NCS更改MTU大小

一、 什么是MTU

MTU(Maximum Transmission Unit)即最大传输单元,它定义了蓝牙网络层协议一次能传输的最大数据量。在蓝牙低功耗(BLE)通信中,MTU的大小直接影响到数据传输的效率和性能

MTU过小的影响

当MTU设置过小时,会导致以下问题:

  • 数据分片增加:数据需要被分成更小的片段进行传输,增加了传输的次数和复杂性。
  • 传输效率降低:频繁的数据分片和重组会消耗更多的带宽和时间。
  • 连接稳定性下降:过小的MTU可能导致数据包丢失或传输错误,影响连接的稳定性

所以为了能够单包发送更大的数据,服务器和客户端都需要更新它们的MTU。MTU需要满足主机和从机之间允许的最小值,必须支持更大的MTU的迁就支持更小的

MTU

在Zephyr里面CONFIG_BT_BUF_ACL_RX_SIZE CONFIG_BT_L2CAP_TX_MTU这两个宏决定了ZephyrMTU的大小,下图是MTU的关系已经Kconfig对应表
在这里插入图片描述

调用这个发送函数会报-128错误在这里插入图片描述

二、如何修改MTU大小

1、增加主机向从机配置的MTU大小

在prj.conf添加如下几个宏:

CONFIG_BT_L2CAP_TX_MTU=247
CONFIG_BT_BUF_ACL_RX_SIZE=251
CONFIG_BT_BUF_ACL_TX_SIZE=251

添加如上几个宏,从机就支持支持最大的247的MTU了,但是这个是初始化协议栈的时候设置的,而MTU交换是主机和从机建立连接之后进行协商,所以主机可以在连接之后,主动设置从机的MTU大小了,那么怎么设置从机主动发起MTU请求和请求的大小呢:

有两个办法

1.1 第一个办法:固定MTU大小

再上面的宏里面,再添加一个宏就可以实现连接后自动更新NTU大小了

CONFIG_BT_GATT_AUTO_UPDATE_MTU=y

在这里插入图片描述

使用Kconfig search 查询MTU,可以看到下面的描述连接后自动申请MTU大小,为什么我要多此一举呢,因为有些客户不需要申请这么大的MTU,需要动态去修改MTU大小或者自己随着在某个操作里面修改MTU大小,

2、第二个办法:使用函数从机主动向主机申请增加MTU大小

2.1 添加宏

CONFIG_BT_GATT_CLIENT

2.2 在函数里面添加如下代码,然后再connect回调时间里面调用

/*MTU exchange*/
static struct bt_gatt_exchange_params mtu_exchange_params[CONFIG_BT_MAX_CONN];

static void mtu_exchange_cb(struct bt_conn *conn, uint8_t err,
			    struct bt_gatt_exchange_params *params)
{
    LOG_INF("MTU exchange %u %s (%u)", bt_conn_index(conn),
	       err == 0U ? "successful" : "failed", bt_gatt_get_mtu(conn));
}



static int mtu_exchange(struct bt_conn *conn)
{
    uint8_t conn_index;
    int err;

    conn_index = bt_conn_index(conn);

    LOG_INF("MTU (%u): %u", conn_index, bt_gatt_get_mtu(conn));

    mtu_exchange_params[conn_index].func = mtu_exchange_cb;

    err = bt_gatt_exchange_mtu(conn, &mtu_exchange_params[conn_index]);
    if (err) LOG_INF("MTU exchange failed (err %d)", err);
    else LOG_INF("Exchange pending...");

    return err;
}

在connect回调调用:
在这里插入图片描述

三、测试

我们使用nrf下面的串口服务例程进行测试,具体怎么编译程序和烧录可以看我之前写的博客

3.1 添加LOG
void mtu_updated(struct bt_conn *conn, uint16_t tx, uint16_t rx)
{
	LOG_INF("Updated MTU: TX: %d RX: %d bytes\n", tx, rx);
}

static struct bt_gatt_cb gatt_callbacks = {
	.att_mtu_updated = mtu_updated,
};

随后在main函数注册回调:

在这里插入图片描述

3.2 可以看到,默认例程的MTU大小只有23字节大小,每包数据发送超过了这个大小就会报错,

在这里插入图片描述

3.3、在手机上面申请

两个都是一样的,可以看到,连接之后,通过主机更新或者从机和主机申请交换MTU大小也会改变,

在这里插入图片描述

3.4 添加自动连接更新MTU的宏&自己在连接添加MTU更换的宏

在这里插入图片描述

最后一如既往的到了死不要脸环节,作为一名菜鸟FAE,你的点赞、收藏和评论是对我最大的支持,有问题多多指教,如果有需要Nordic开发板或者Nordic的芯片的可以在个人资料联系我,感谢读者支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值