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.
BLE/ESP32: limit to number of services?
It seems to me that the number of advertised services is limited to three.
This:
self._payload = advertising_payload(name=name, services=([0x1800,0x180F,0x181A,]), appearance=_ADV_APPEARANCE_GENERIC_WEIGHT_SCALE)
works. While this:
self._payload = advertising_payload(name=name, services=([0x1800,0x180F,0x181A,0x181D,]), appearance=_ADV_APPEARANCE_GENERIC_WEIGHT_SCALE)
won't.
Fault message is:
File "main.py", line 100, in _advertise OSError: [Errno 5] EIO MicroPython v1.11-427-gd5cbee3cf-dirty on 2019-10-14; ESP32 module (spiram) with ESP32
I found nothing about a limit in the documentation.
Is this a hardware limit or something that can be configured?