ESP32 BLE如何发送大于20字节的数据

carsonche
Posts: 10
Joined: Tue May 25, 2021 2:21 pm

ESP32 BLE如何发送大于20字节的数据

Postby carsonche » Wed May 26, 2021 6:55 pm

我在开发蓝牙透传数据,目前只能发送20个字节大小的数据包,请问大家是如何实现发送大于20字节的数据包的。我尝试过将数据包才开每隔80ms发送一次20字节的数据包,虽然数据可以发送,但是间隔太长了,影响接收端判断,和模块效率。请问大家用什么办法实现的?

chzfmx
Posts: 11
Joined: Tue Jun 12, 2018 4:40 am

Re: ESP32 BLE如何发送大于20字节的数据

Postby chzfmx » Thu May 27, 2021 3:27 am

BLE 4.2以上支持大数据包,你可以设置MTU来修改每包数据最多支持多少字节,主从机都要设置,因为在连接时主从机会协商MTU的大小。
以Bluedroid协议栈为例:
在建立连接之前调用esp_ble_gatt_set_local_mtu()设置本地MTU值,连接成功后调用esp_ble_gattc_send_mtu_req()发起MTU更新请求

carsonche
Posts: 10
Joined: Tue May 25, 2021 2:21 pm

Re: ESP32 BLE如何发送大于20字节的数据

Postby carsonche » Thu May 27, 2021 3:56 am

很感谢你的回复。我是用手机app连接ESP32蓝牙,我尝试过用上述的函数设置,用BLE调试工具设置MTU确实是可以发送大数据包,但是如果客户的app没有设置,默认的20个字节,那我要怎么分包发送?

chzfmx
Posts: 11
Joined: Tue Jun 12, 2018 4:40 am

Re: ESP32 BLE如何发送大于20字节的数据

Postby chzfmx » Thu May 27, 2021 4:58 am

如果MTU使用默认的20个字节,要提高数据速率,那就只有通过将连接间隔改小一点,最小应该是7.5ms,然后ESP32用Notify的方式往APP发数据,发送数据的间隔只要比连接间隔大就可以,比如,连接间隔设置成7.5ms,应用层10ms发送一包数据;
但是既然APP和ESP32都支持大数据包,要提高数据速率,最好还是设置MTU,一般BLE调试APP都会根据从机支持的MTU来更新MTU的,如果是自己写APP更不是问题

carsonche
Posts: 10
Joined: Tue May 25, 2021 2:21 pm

Re: ESP32 BLE如何发送大于20字节的数据

Postby carsonche » Thu May 27, 2021 3:41 pm

请原谅我这个小白,请问如何设置连接时间间隔呢?用哪个函数设置? :D

chzfmx
Posts: 11
Joined: Tue Jun 12, 2018 4:40 am

Re: ESP32 BLE如何发送大于20字节的数据

Postby chzfmx » Fri May 28, 2021 12:37 am

bluedriod协议栈:
连接成功后更新连接参数:esp_ble_gap_update_conn_params()
读取当前连接参数:esp_ble_get_current_conn_params()

ESP_Gargamel
Posts: 786
Joined: Wed Nov 14, 2018 8:45 am

Re: ESP32 BLE如何发送大于20字节的数据

Postby ESP_Gargamel » Fri May 28, 2021 1:03 am

感谢 @chzfmx 的细心回答 :lol:

carsonche
Posts: 10
Joined: Tue May 25, 2021 2:21 pm

Re: ESP32 BLE如何发送大于20字节的数据

Postby carsonche » Fri May 28, 2021 3:25 pm

是的,非常感谢chzfmx 的帮助。问题终于解决了。
1. 将adv_data中的min_interval 和max_interval设成了0
static esp_ble_adv_data_t adv_data = {
.set_scan_rsp = false,
.include_name = true,
.include_txpower = false,
.min_interval = 0x0000, //slave connection min interval, Time = min_interval * 1.25 msec
.max_interval = 0x0000, //slave connection max interval, Time = max_interval * 1.25 msec
.appearance = 0x00,
.manufacturer_len = TEST_MANUFACTURER_DATA_LEN,
.p_manufacturer_data = test_manufacturer,
.service_data_len = 0,
.p_service_data = NULL,
.service_uuid_len = sizeof(adv_service_uuid128),
.p_service_uuid = adv_service_uuid128,
.flag = (ESP_BLE_ADV_FLAG_GEN_DISC | ESP_BLE_ADV_FLAG_BREDR_NOT_SPT),
};
2. 连接事件中也将conn_params.max_int和conn_params.min_int设成了0
esp_ble_conn_update_params_t conn_params = {0};
memcpy(conn_params.bda, param->connect.remote_bda, sizeof(esp_bd_addr_t));
conn_params.latency = 0;
conn_params.max_int = 0x0; // max_int = 0x20*1.25ms = 40ms
conn_params.min_int = 0x0; // min_int = 0x10*1.25ms = 20ms
conn_params.timeout = 400; // timeout = 400*10ms = 4000ms
esp_ble_gap_update_conn_params(&conn_params);
3. 发送时使用esp_ble_gatts_send_indicate进行发送,大于20字节则每隔10ms分包进行发送。
问题解决,在此在此感谢chzfmx 的帮助

Who is online

Users browsing this forum: No registered users and 165 guests