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:
READNOTIFYWRITE- 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.