ESP32 BLE 作为gatt_server 只能接收20字节数据吗?

luxianquan
Posts: 18
Joined: Tue Jul 13, 2021 12:23 pm

ESP32 BLE 作为gatt_server 只能接收20字节数据吗?

Postby luxianquan » Tue Oct 26, 2021 11:11 am

我使用例程修改功能,发现在修改MTU加上app 发送了MTU request (512)后,app 读特征值数据的时候可以一次性读入42个字节数据,但是app 向 ESP32 写入数据的时候不能大于20字节,起初我以为是app的问题,后来用sniffer 抓包发现app 确实写下了42字节,但是ESP32 没有回应,最后重发N次后判断超时,断开连接。
请问有哪位大神知道怎么设置接收数据也能接收大于20字节的办法。

ESP_XuLZ
Posts: 173
Joined: Fri Mar 26, 2021 6:04 am

Re: ESP32 BLE 作为gatt_server 只能接收20字节数据吗?

Postby ESP_XuLZ » Wed Oct 27, 2021 9:09 am

如果交换MTU 后能一次性读入 42个字节,那也可以一次性写入 超过 20 的字节,考虑是应用层上的问题
你可以提供下你修改后的例程代码或你抓取的包文件吗,我们来看下是什么问题
2021-10-27_17-07.png
2021-10-27_17-07.png (74.31 KiB) Viewed 10216 times

luxianquan
Posts: 18
Joined: Tue Jul 13, 2021 12:23 pm

Re: ESP32 BLE 作为gatt_server 只能接收20字节数据吗?

Postby luxianquan » Wed Oct 27, 2021 11:20 am

我的代码是基于ADF的wifi_bt_ble中的gatt_ble_module.c 来修改的,添加了一个service 和一些characteristic 。附件是代码和log。还有测试app的截图。现象是:设置MTU以后可以读出42Byte数据,但是向ESP32 写入的时候出现了问题,esp32最终断开连接。我用sniffer查看了发现:app 确实以大于20byte的方式写下数据,但是esp32没有回复,app重发N次以后断开连接。
Attachments
ble_gatts_module.c
(38.89 KiB) Downloaded 613 times
ble_gatts_module.h
(3.46 KiB) Downloaded 780 times
1635332926(1).png
1635332926(1).png (124.64 KiB) Viewed 10209 times

ESP_XuLZ
Posts: 173
Joined: Fri Mar 26, 2021 6:04 am

Re: ESP32 BLE 作为gatt_server 只能接收20字节数据吗?

Postby ESP_XuLZ » Thu Oct 28, 2021 4:05 am

我根据 gatt_ble_module.c 修改成了一个 demo, 在附件中,你可以测试下,交换 MTU 是500 时,是可以进行长数据写的

prepare write 和 execute_write 是 app 方决定的,有的 app 如 nrf connect 会根据 发送的数据长度 大于MTU 而采取prepare write 和 execute_write 的方式, 而有些软件是拆分成单包发送的

在 gatt_ble_module.c 里 BLE_GATT_control_datas_handler BLE_GATT_control_read_handler 不要有长时间的阻塞行为,可以把数据放到其他 task 中处理

prepare_write_env 不要放在 回调里面,否则每次 回调 prepare_write_env 都重新刷新,在释放 buffer 时会出现问题
2021-10-28_11-38.png
2021-10-28_11-38.png (137.33 KiB) Viewed 10180 times
Attachments
gatt_server_service_table_customs.zip
(108.73 KiB) Downloaded 799 times

luxianquan
Posts: 18
Joined: Tue Jul 13, 2021 12:23 pm

Re: ESP32 BLE 作为gatt_server 只能接收20字节数据吗?

Postby luxianquan » Thu Oct 28, 2021 12:31 pm

ESP_XuLZ 您好,非常感谢您的解答。
我用您帮我修改的例程编译后烧录测试,发现依然无法接收20Byte以上的数据,我也十分差异,我怀疑是我的编译环境 IDF版本的问题,或者库文件的问题。不知道您是否有什么建议。
测试步骤和现象:
1.使用您的例程直接idf.pyflash monitor
2.使用nrf connect,lightblue 测试,具体步骤和现象如下:
<1>连接 ;成功
<2> app发送大于20 bytes 数据 ;分包发送
<3> app 设置MTU 500 ;成功
<4> app 发送大于 20bytes 小于500 bytes 数据。 ;log 毫无反应 几秒钟后显示断连。
附件是log 图片和sniffer 的结果。

我昨晚上Google 了很多,发现使用esp32 arduino 的有人反馈一样的问题,就是peripheral 无法接收大于20byte数据。后来他把库从 1.0.6--->1.0.4 就解决了这个问题。
我测试了IDF BLE的几个例程,gatt_server bt_ble_coex wifi_bt_ble ,ble_compatibility 除了 ble_compatibility 以外都在设置MTU以后无法接收大于20bytes 数据。
Attachments
esp32-app-sent-more-20byte-issus.csv
(34.86 KiB) Downloaded 639 times
log.png
log.png (134.37 KiB) Viewed 10157 times

ESP_XuLZ
Posts: 173
Joined: Fri Mar 26, 2021 6:04 am

Re: ESP32 BLE 作为gatt_server 只能接收20字节数据吗?

Postby ESP_XuLZ » Fri Oct 29, 2021 1:57 am

你好,可以把你所使用的 IDF 版本号(git describe --tags )和上述 demo 编译的固件发我下吗
附件中是我在 v4.3 上编译的固件,请你来验证下,排除一些其他干扰
Attachments
v4.3.1-29-ge493a4c30e.zip
(473.44 KiB) Downloaded 531 times

luxianquan
Posts: 18
Joined: Tue Jul 13, 2021 12:23 pm

Re: ESP32 BLE 作为gatt_server 只能接收20字节数据吗?

Postby luxianquan » Fri Oct 29, 2021 3:04 am

您好我的IDF 是4.0.
附件是我用您给的code 编译的固件。
非常感谢!
Attachments
gatt_server_service_table_demo.zip
(305.05 KiB) Downloaded 789 times

luxianquan
Posts: 18
Joined: Tue Jul 13, 2021 12:23 pm

Re: ESP32 BLE 作为gatt_server 只能接收20字节数据吗?

Postby luxianquan » Fri Oct 29, 2021 7:05 am

附件为完整的固件包
Attachments
firmware.zip
(317.83 KiB) Downloaded 524 times

luxianquan
Posts: 18
Joined: Tue Jul 13, 2021 12:23 pm

Re: ESP32 BLE 作为gatt_server 只能接收20字节数据吗?

Postby luxianquan » Fri Oct 29, 2021 7:11 am

ESP_XuLZ 您好,非常感谢!我测试过了您的固件是没有这个问题的。不知道是否是我IDF版本有问题,麻烦您有时间帮忙分析一下,我也会更新IDF后再次进行测试,再次感谢。
Attachments
success_log.png
success_log.png (90.18 KiB) Viewed 10062 times

ESP_XuLZ
Posts: 173
Joined: Fri Mar 26, 2021 6:04 am

Re: ESP32 BLE 作为gatt_server 只能接收20字节数据吗?

Postby ESP_XuLZ » Mon Nov 01, 2021 3:13 am

我测试你发的 firmware.zip 中的固件也没有问题呀。我一直使用的安卓手机和 nrf connect, 关于这个 firmware.zip 你可以用其他手机多验证几次吗,这种交换 MTU 500后,每次发送超过20 个字节都会出现这个问题吗,少于 20 个字节都可以吗

从 断连的 log 和你抓包的数据来看,是连接超时,可能与周围环境相关,这个抓包文件 csv 的只能看到包的列表,你是用什么软件打开的,有可以用 wireshark 打开的原文件吗

Who is online

Users browsing this forum: No registered users and 33 guests