esp-at
esp-at copied to clipboard
Writing GATT characteristic with variable size will result in characteristic being truncated
Answers checklist
- [X] I have read the documentation ESP-AT Programming Guide and the issue is not addressed there.
- [X] I have used the latest released firmware or have updated my ESP-AT branch (master or release) to the latest version and checked that the issue is present there.
- [X] I have searched the issue tracker for a similar issue and not found a similar issue.
AT+GMR
AT+GMR AT version:4.1.0.0-dev(6eebeb4 - ESP32C6 - Mar 20 2024 12:32:44) SDK version:v5.1.2-dirty compile time(77e1c56):Mar 27 2024 07:39:19 Bin version:v4.1.0.0-dev(ESP32C6-4MB)
ESP-AT Firmware Source
Download from Github Actions
Hardware Information
ESP32-C6-MINI1
Power Supply used
External 3.3V
What is the expected behavior?
I am writing characteristics from an Android app. The characteristic size may be of variable length for successive writes. With ESP-AT 2.4.0 and ESP32C3 it was working all correctly. With ESP32C6 and firmware 4.0.0 I was expecting it to behave the same way
What is the actual behavior?
With the ESP432C6 and Firmware 4.0.0 (also 4.1.0.0-dev) the behavior is changed. Apparently the firmware will limit some internal buffer to match the initial chararacteristic length. So when writing the characteristc with 14 bytes, then subsequent writes will have the bytes after the 14th byte corrupted, even though the +WRITE message still indiciates the longer size.
Probability of recurrence
appears under all conditions
AT+SYSRAM?
AT+SYSRAM? +SYSRAM:259140,250072 OK
Steps to reproduce
- Initialize BLE server and start advertising
- connect nrfConnect
- from nrfConnect, write Characteristic 0xC04 a first time with one length (e.g. "ABCDEFGHIJKL")
- from nrfConnect, write Characteristic 0xC04 a second time with a larger length (e.g. "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
- RESULT -> the second time the characteristic is limited to the length established in the first write
AT command port output
AT+GMR
AT version:4.1.0.0-dev(6eebeb4 - ESP32C6 - Mar 20 2024 12:32:44)
SDK version:v5.1.2-dirty
compile time(77e1c56):Mar 27 2024 07:39:19
Bin version:v4.1.0.0-dev(ESP32C6-4MB)
OK
AT+BLEINIT=2
OK
AT+BLEADVPARAM=50,50,0,0,7,0,,
OK
AT+BLEADVDATA="0201060A0954696d6544726f7073030302A0"
OK
AT+BLEADVSTART
OK
+BLECONN:0,"4d:ad:0d:10:66:5e"
+BLECONNPARAM:0,6,6,6,0,500
+BLECONNPARAM:0,39,39,39,0,500
+WRITE:0,1,5,,12,ABCDEFGHIJKL
+WRITE:0,1,5,,26,ABCDEFGHIJKL
first write was ABCDEFGHIJKL. After the first write the characteristic length is fixed
second write is ABCDEFGHIJKLMNOPQRSTUVWXYZ -> the output is now truncated to the size set in the first write
AT log port output
SP-ROM:esp32c6-20220919
Build:Sep 19 2022
rst:0x1 (POWERON),boot:0x2c (SPI_FAST_FLASH_BOOT)
SPIWP:0xee
mode:DIO, clock div:1
load:0x4086c410,len:0xd2c
load:0x4086e610,len:0x2df0
load:0x40875728,len:0x17d8
SHA-256 comparison failed:
Calculated: 85f0055e03bfbcec6e4e4d7bc6633d633c657adbbf1ddca7cda08884786bb456
Expected: 6ab41946cb756454c0775c40e8b847bbc6cee25427b3c1738bbdf1969062d567
Attempting to boot anyway...
entry 0x4086c410
[0;32mI (42) boot: ESP-IDF v5.1.2-dirty 2nd stage bootloader[0m
[0;32mI (42) boot: compile time Mar 27 2024 07:38:53[0m
[0;32mI (43) boot: chip revision: v0.0[0m
[0;32mI (45) boot.esp32c6: SPI Speed : 80MHz[0m
[0;32mI (50) boot.esp32c6: SPI Mode : DIO[0m
[0;32mI (55) boot.esp32c6: SPI Flash Size : 4MB[0m
[0;32mI (60) boot: Enabling RNG early entropy source...[0m
[0;32mI (65) boot: Partition Table:[0m
[0;32mI (69) boot: ## Label Usage Type ST Offset Length[0m
[0;32mI (76) boot: 0 otadata OTA data 01 00 0000d000 00002000[0m
[0;32mI (83) boot: 1 phy_init RF data 01 01 0000f000 00001000[0m
[0;32mI (91) boot: 2 nvs WiFi data 01 02 00010000 0000e000[0m
[0;32mI (98) boot: 3 at_customize unknown 40 00 0001e000 00042000[0m
[0;32mI (106) boot: 4 ota_0 OTA app 00 10 00060000 001d0000[0m
[0;32mI (113) boot: 5 ota_1 OTA app 00 11 00230000 001d0000[0m
[0;32mI (121) boot: End of partition table[0m
[0;32mI (125) esp_image: segment 0: paddr=00060020 vaddr=42150020 size=30498h (197784) map[0m
[0;32mI (175) esp_image: segment 1: paddr=000904c0 vaddr=40800000 size=0fb58h ( 64344) load[0m
[0;32mI (190) esp_image: segment 2: paddr=000a0020 vaddr=42000020 size=146450h (1336400) map[0m
[0;32mI (466) esp_image: segment 3: paddr=001e6478 vaddr=4080fb58 size=09ed4h ( 40660) load[0m
[0;32mI (476) esp_image: segment 4: paddr=001f0354 vaddr=40819a30 size=03bc4h ( 15300) load[0m
[0;32mI (481) esp_image: segment 5: paddr=001f3f20 vaddr=50000000 size=00068h ( 104) load[0m
[0;32mI (488) boot: Loaded app from partition at offset 0x60000[0m
[0;32mI (488) boot: Disabling RNG early entropy source...[0m
no external 32k oscillator, disable it now.
at param mode: 1
AT cmd port:uart1 tx:7 rx:6 cts:5 rts:4 baudrate:115200
module_name: ESP32C6-4MB
max tx power=78, ret=0
v4.1.0.0-dev
controller lib commit: [77d09ce]
ble attribute[2] 16
ble attribute[3] 2800
ble attribute[7] A002
ble attribute[2] 16
ble attribute[3] 2803
ble attribute[7] 02
ble attribute[2] 16
ble attribute[3] C300
ble attribute[2] 16
ble attribute[3] 2901
ble attribute[4] 11
ble attribute[2] 16
ble attribute[3] 2803
ble attribute[7] 02
ble attribute[2] 16
ble attribute[3] C301
ble attribute[2] 16
ble attribute[3] 2901
ble attribute[4] 11
ble attribute[2] 16
ble attribute[3] 2803
ble attribute[7] 08
ble attribute[2] 16
ble attribute[3] C302
ble attribute[2] 16
ble attribute[3] 2901
ble attribute[4] 01
ble attribute[2] 16
ble attribute[3] 2803
ble attribute[7] 04
ble attribute[2] 16
ble attribute[3] C303
ble attribute[2] 16
ble attribute[3] 2901
ble attribute[4] 10
ble attribute[2] 16
ble attribute[3] 2803
ble attribute[7] 08
ble attribute[2] 16
ble attribute[3] C304
ble attribute[2] 16
ble attribute[3] 2803
ble attribute[7] 10
ble attribute[2] 16
ble attribute[3] C305
ble attribute[2] 16
ble attribute[3] 2902
ble attribute[2] 16
ble attribute[3] 2803
ble attribute[7] 20
ble attribute[2] 16
ble attribute[3] C306
ble attribute[2] 16
ble attribute[3] 2902
ble attribute[2] 16
ble attribute[3] 2803
ble attribute[7] 02
ble attribute[2] 16
ble attribute[3] C307
ble attribute[2] 16
ble attribute[3] 2901
ble attribute[4] 11
ble attribute[2] 16
ble attribute[3] 2800
ble attribute[7] A003
ble attribute[2] 16
ble attribute[3] 2803
ble attribute[7] 02
ble attribute[2] 16
ble attribute[3] C400
ble attribute[2] 16
ble attribute[3] 2901
ble attribute[4] 11
ble attribute[2] 16
ble attribute[3] 2803
ble attribute[7] 02
ble attribute[2] 16
ble attribute[3] C401
ble attribute[2] 16
ble attribute[3] 2901
ble attribute[4] 11
registered service 0x1800 with handle=1
registering characteristic 0x2a00 with def_handle=2 val_handle=3
registering characteristic 0x2a01 with def_handle=4 val_handle=5
registered service 0x1801 with handle=6
registering characteristic 0x2a05 with def_handle=7 val_handle=8
registered service 0xa002 with handle=10
registering characteristic 0xc300 with def_handle=11 val_handle=12
registering descriptor 0x2901 with handle=13
registering characteristic 0xc301 with def_handle=14 val_handle=15
registering descriptor 0x2901 with handle=16
registering characteristic 0xc302 with def_handle=17 val_handle=18
registering descriptor 0x2901 with handle=19
registering characteristic 0xc303 with def_handle=20 val_handle=21
registering descriptor 0x2901 with handle=22
registering characteristic 0xc304 with def_handle=23 val_handle=24
registering characteristic 0xc305 with def_handle=25 val_handle=26
registering characteristic 0xc306 with def_handle=28 val_handle=29
registering characteristic 0xc307 with def_handle=31 val_handle=32
registering descriptor 0x2901 with handle=33
registered service 0xa003 with handle=34
registering characteristic 0xc400 with def_handle=35 val_handle=36
registering descriptor 0x2901 with handle=37
registering characteristic 0xc401 with def_handle=38 val_handle=39
registering descriptor 0x2901 with handle=40
reset reason=0
connection established; status=0 handle=1 our_ota_addr_type=0 our_ota_addr=4084b47f:00:15:40828000:00:4217d198
our_id_addr_type=0 our_id_addr=4084b471:00:15:40828000:00:4217d198
peer_ota_addr_type=1 peer_ota_addr=4084b486:00:15:40828000:00:4217d198
peer_id_addr_type=1 peer_id_addr=4084b478:00:15:40828000:00:4217d198
conn_itvl=39 conn_latency=0 supervision_timeout=500 encrypted=0 authenticated=0 bonded=0
advertise complete; reason=0connection updated; status=0 handle=1 our_ota_addr_type=0 our_ota_addr=4084b42f:00:15:40828000:00:4217d198
our_id_addr_type=0 our_id_addr=4084b421:00:15:40828000:00:4217d198
peer_ota_addr_type=1 peer_ota_addr=4084b436:00:15:40828000:00:4217d198
peer_id_addr_type=1 peer_id_addr=4084b428:00:15:40828000:00:4217d198
conn_itvl=6 conn_latency=0 supervision_timeout=500 encrypted=0 authenticated=0 bonded=0
connection updated; status=0 handle=1 our_ota_addr_type=0 our_ota_addr=4084b42f:00:15:40828000:00:4217d198
our_id_addr_type=0 our_id_addr=4084b421:00:15:40828000:00:4217d198
peer_ota_addr_type=1 peer_ota_addr=4084b436:00:15:40828000:00:4217d198
peer_id_addr_type=1 peer_id_addr=4084b428:00:15:40828000:00:4217d198
conn_itvl=39 conn_latency=0 supervision_timeout=500 encrypted=0 authenticated=0 bonded=0
More Information.
The workaround is to pad the characteristc for each write to a fixed (maximum length) value. However this is using significantly more bandwidht