Skip to content

Transport

Discovery

The advertised device name is:

Reaction_XXXXXX

XXXXXX is derived from the last three bytes of the Bluetooth MAC address in uppercase hex.

The name does not change while pairing mode is active.

Custom Service

Item UUID
Service 42d2b91c-5335-4053-a1fb-ae7801eec528
Protocol characteristic 62c07a6b-1449-4a8b-af6b-2d740977b8cc
OTA data characteristic 8f20d6c6-f1f1-4d9f-9f8f-0f2a0e91f9c8

Protocol Characteristic

Properties implemented by the firmware:

  • READ
  • NOTIFY
  • WRITE
  • encrypted write requirement

The initial read value is currently Hello World. Client applications should not treat that value as protocol state.

All protocol writes use Reaction protobuf messages wrapped in SLIP frames.

OTA Data Characteristic

Properties implemented by the firmware:

  • write without response
  • encrypted write requirement

Payload:

uint32_le block_index
raw firmware bytes

This characteristic is only for firmware block data. Do not send protobuf or SLIP data here.

Standard Device Information Service

The firmware creates Bluetooth SIG service 0x180A with these characteristics:

Characteristic UUID Current firmware value
Manufacturer Name String 0x2A29 Embedded Solutions LLC
System ID 0x2A23 populated with 0x0EB7 by current firmware
Model Number String 0x2A24 rev 2.0
Firmware Revision String 0x2A26 1.0.0

The protobuf DeviceInfo query is separate from the standard Device Information service and includes additional runtime values such as IDF version and MAC address.

MTU And Chunking

The device sets preferred MTU to 247.

For notifications, the firmware chunks outgoing SLIP frames per connected peer using:

payload_mtu = negotiated_mtu - 3

Clients must buffer notifications until a SLIP END byte is received, then decode the complete frame.

For raw OTA writes:

firmware_bytes_per_write = negotiated_mtu - 3 - 4

At MTU 247, that is 240 firmware bytes per OTA data write.