ESP32-S3-NIMBLE修改MTU长度

现象

NIMBLE单次发送数据过长,会丢数据,或者读取的时候读不到数据,连接后在手机端手动选修MTU的长度,则可以正常收到长一些的一帧数据,因此问题应该是MTU设置的问题

解决方式及问题

查看资料及源码后,默认发送长度为23,如果直接改源码的定义来实现加长,数据长度的话,会编译可通过,上机工作不能正常工作,或者找不到服务,原因未知
当然直接改源码这种解决方式是不可取的,只是奇怪为什么会出错,这里记录下

#define BLE_ATT_MTU_DFLT                    23

修改MTU长度代码

需调用两个函数,且参数要调用正确

  1. ble_att_set_preferred_mtu
  2. ble_gattc_exchange_mtu
//初始化中设置期望的长度
ble_att_set_preferred_mtu(100);

连接成功后 ,可以在GAP服务的响应函数里调用,执行int ble_gattc_exchange_mtu(uint16_t conn_handle, ble_gatt_mtu_fn *cb, void *cb_arg)这个函数才能实现修改MTU长度。

static int ble_server_gap_event(struct ble_gap_event *event, void *arg)
{
    struct ble_gap_conn_desc desc;
    int rc;

    switch (event->type) {
    case BLE_GAP_EVENT_CONNECT:
        is_ble_connected = 1;
        ble_gattc_exchange_mtu(event->connect.conn_handle, NULL, NULL);//可以在这里调用,再别的地方调用应该也可以,发送前应该就可以
        current_conn_handle = event->connect.conn_handle;
        ble_gap_adv_stop();
        return 0;
    case BLE_GAP_EVENT_DISCONNECT:
        is_ble_connected = 0;
        ble_app_on_sync();
        return 0;

    case BLE_GAP_EVENT_CONN_UPDATE:
        return 0;

    case BLE_GAP_EVENT_ADV_COMPLETE:
        return 0;
    case BLE_GAP_EVENT_MTU:
        ESP_LOGI("BLE", "MTU update: conn_handle=%d mtu=%d",
                    event->mtu.conn_handle,
                    event->mtu.value);
        return 0;
    default:
        return 0;
    }
}

如下图,可一次正常接收超23字节

71db6ca0328465ac516ee2ba9fd8691c

posted @ 2025-10-28 09:06  cau_par  阅读(12)  评论(0)    收藏  举报