CN / EN
CN / EN

提问

获得支持

您的项目私密技术问题如需获得一对一支持,请点击下方联系我们。

蓝牙MTU设置不生效 GR551x

125****com

2023-02-15 19:53

我这边使用的SDK是1.6.09,使用ble_app_gatt_client与ble_app_gatt_server的例程,这双边通信最大字节数默认为23字节,

我通过ble_gatt_mtu_set,设置其中的MTU,双边都有设置,但是一直读出来的MTU还是23字节,设置没有生效,

请问这是什么原因?还是设置方法有错误,我这边想将字节数尽量加大。

0收藏

0赞成

zhongchengzhi

汇顶员工
2023-02-16 15:34

关于MTU设置:

1、不配置MTU时,协议栈使用的默认值是MTU支持的最大值512;

2、在广播,扫描前前用ble_gap_l2cap_params_set设置MTU的长度,调用ble_gatt_mtu_set无用。参考ble_app_uart MTU 的配置;

static void gap_params_init(void)
{
    sdk_err_t   error_code;

    error_code = ble_gap_device_name_set(BLE_GAP_WRITE_PERM_DISABLE, (uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));

    s_gap_adv_param.adv_intv_max = APP_ADV_SLOW_MAX_INTERVAL;
    s_gap_adv_param.adv_intv_min = APP_ADV_FAST_MIN_INTERVAL;
    s_gap_adv_param.adv_mode     = BLE_GAP_ADV_TYPE_ADV_IND;
    s_gap_adv_param.chnl_map     = BLE_GAP_ADV_CHANNEL_37_38_39;
    s_gap_adv_param.disc_mode    = BLE_GAP_DISC_MODE_GEN_DISCOVERABLE;
    s_gap_adv_param.filter_pol   = BLE_GAP_ADV_ALLOW_SCAN_ANY_CON_ANY;

    error_code = ble_gap_adv_param_set(0, BLE_GAP_OWN_ADDR_STATIC, &s_gap_adv_param);
    APP_ERROR_CHECK(error_code);

    error_code = ble_gap_adv_data_set(0, BLE_GAP_ADV_DATA_TYPE_DATA, s_adv_data_set, sizeof(s_adv_data_set));
    APP_ERROR_CHECK(error_code);

    error_code = ble_gap_adv_data_set(0, BLE_GAP_ADV_DATA_TYPE_SCAN_RSP, s_adv_rsp_data_set, sizeof(s_adv_rsp_data_set));
    APP_ERROR_CHECK(error_code);

    s_gap_adv_time_param.duration    = 0;
    s_gap_adv_time_param.max_adv_evt = 0;

    error_code = ble_gap_l2cap_params_set(MAX_MTU_DEFUALT, MAX_MPS_DEFUALT, MAX_NB_LECB_DEFUALT);
    APP_ERROR_CHECK(error_code);

    error_code = ble_gap_data_length_set(MAX_TX_OCTET_DEFUALT, MAX_TX_TIME_DEFUALT);
    APP_ERROR_CHECK(error_code);

    ble_gap_pref_phy_set(BLE_GAP_PHY_ANY, BLE_GAP_PHY_ANY);
}

3、在连接后,需要用下面两个函数配合,进行MTU的更改。注意,ble_gatt_mtu_set只是配置MTU的值,需要调用ble_gattc_mtu_exchange进行MTU交换才能生效;

sdk_err_t error_code = ble_gatt_mtu_set(mtu);
APP_ERROR_CHECK(error_code);

error_code = ble_gattc_mtu_exchange(conn_idx);
APP_ERROR_CHECK(error_code);

4、本端在调用ble_gap_l2cap_params_set和ble_gatt_mtu_set只是设置本端希望的MTU配置,不一定是最终的MTU,双方会协商出适合双方设备的MTU,最终协商的值会通过BLE_GATT_COMMON_EVT_MTU_EXCHANGE事件告知上层应用;

0条评论

0赞成

0收藏

您的评论

登录后可回答问题,请 注册

我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注