ESP32 Bluetooth: Error code "OSError: -18" when advertising with a too long payload
MicroPython v1.15 on 2021-04-18; ESP32 module with ESP32
When trying to advertising with a long payload(longer than 31 bytes) using bluetooth lib on esp32, Micropython would give an unclear error code " OSError: -18 ".
import bluetooth
esp32_ble = bluetooth.BLE()
esp32_ble.active(True)
payload = b'\x02\x01\x06\n\taLongName\x11\x07\x9e\xca\xdc$\x0e\xe5\xa9\xe0\x93\xf3\xa3\xb5\x01\x00@n'
esp32_ble.gap_advertise(interval_us=200000, adv_data=payload)
# Traceback (most recent call last):
# File "<stdin>", line 6, in <module>
# OSError: -18
A payload longer than 31 bytes might be generated with a 128bit Service UUID and a long name(len>8).
from ble_advertising import advertising_payload #example in /micropython/example/bluetooth
ServiceUUID = bluetooth.UUID("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")
payload = advertising_payload(name="muchTooLong", services=[ServiceUUID])
A short name would work just fine.
The error code is not helpful for debugging, but I'm not sure how to improve this.
I opened this issue to notify who have met the same problem.
examples/bluetooth/ble_advertising.py: Error when advertising payload is too large instead of silently failing
When adverting a name + _UART_SERVICE using the bluetooth module, I ran into an issue where a name longer than 8 characters would not be advertising the data I set, It would instead be advertising as if no other data was set. After debugging and looking into the BLE docs I finally figured out that the maximum size of the advertising payload is 31 bytes and I was exceeding it.
To prevent others from running into this issue I've modified the examples to warn when the payload is too large and show that you can send any other data using resp_data.