ESP32-S3-NIMBLE修改MTU长度
现象
NIMBLE单次发送数据过长,会丢数据,或者读取的时候读不到数据,连接后在手机端手动选修MTU的长度,则可以正常收到长一些的一帧数据,因此问题应该是MTU设置的问题
解决方式及问题
查看资料及源码后,默认发送长度为23,如果直接改源码的定义来实现加长,数据长度的话,会编译可通过,上机工作不能正常工作,或者找不到服务,原因未知
当然直接改源码这种解决方式是不可取的,只是奇怪为什么会出错,这里记录下
#define BLE_ATT_MTU_DFLT 23
修改MTU长度代码
需调用两个函数,且参数要调用正确
- ble_att_set_preferred_mtu
- 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字节


浙公网安备 33010602011771号