125****com
我这边使用的SDK是1.6.09,使用ble_app_gatt_client与ble_app_gatt_server的例程,这双边通信最大字节数默认为23字节,
我通过ble_gatt_mtu_set,设置其中的MTU,双边都有设置,但是一直读出来的MTU还是23字节,设置没有生效,
请问这是什么原因?还是设置方法有错误,我这边想将字节数尽量加大。
zhongchengzhi
关于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事件告知上层应用;
打开微信,使用“扫一扫”即可关注