4.7 KiB
Samsung control protocol notes
These original interoperability notes describe observations from an MX-T40 and analysis of the Android Sound Tower app version 0.0.80. Vendor application code and firmware are not included. The working desktop transport is BLE; the iOS app's internal transport/framework has not been established.
BLE endpoints
| Role | UUID |
|---|---|
| Samsung service | 0000ffa0-0000-1000-8000-00805f9b34fb |
| Write, with response | 0000ffa1-0000-1000-8000-00805f9b34fb |
| Notify | 0000ffa2-0000-1000-8000-00805f9b34fb |
Subscribe before sending the connection request. Commands currently exposed by
the GUI fit within 20 bytes; no larger-command fragmentation scheme is claimed.
The speaker also exposes a separate Qualcomm service with UUID
00001100-d102-11e1-9b23-00025b00a5a5, which this controller does not use.
MX-T40 model advertisements include FE40/FF40; the Android discovery code also maps FE41/FF41 to T40 names. An advertisement UUID identifies discovery, not necessarily a writable control service.
Framing
00 BB TYPE SEQUENCE LENGTH_HI LENGTH_LO PAYLOAD... CHECKSUM
Type 0 is an acknowledgment; type 1 carries data. Length counts payload bytes only, in big-endian order. Outgoing sequence numbers cycle 1–127, matching the Android app's signed-byte rollover. Incoming notifications use a separate sequence counter, observed above 127 as well.
Outgoing checksums sum type, sequence, both length bytes, and payload, modulo 256. Incoming packets have several observed checksum variants:
- Connection/source reports: sum excluding type.
- Sound reports: sum including type.
- Lighting reports
51 03 MODE: captured packets match a checksum calculated as though MODE were 1, across Ambient/Dance/Star/Lover/Off observations. - Play/pause echoes
70 11: the two captured replies similarly match a key slot of 1. This compatibility rule is scoped to that specific payload.
Why the firmware emits these variants is unknown. Strict decoding recognizes these observed rules. BLE uses advisory mode, retaining structurally framed packets with unfamiliar checksums and flagging them in the activity log. This is compatibility behavior, not a cryptographic integrity guarantee.
Handshake
- Send payload
01. - Receive ACK and connection information beginning
02. - Send payload
04(link complete). - Receive the ACK matching that outgoing sequence; only then enable controls.
- Query source (
32) and EQ (42 03).
The captured connection info contains model byte 34 and source IDs
01 02 04 05: Bluetooth, USB 1, AUX 1, AUX 2. The two bytes following the initial
02 are interpreted by the Android app as protocol version.
Payloads
Numbers below are hexadecimal unless explicitly called decimal.
| Action | Payload |
|---|---|
| Remote key | 70 KEY |
| Select source | 30 SOURCE |
| Query source | 32 |
| Set sound option | 40 TYPE OPTION VALUE EXTRA |
| Query sound option | 42 TYPE |
| Set system option | 50 TYPE VALUE |
| Query system option | 52 TYPE |
| Set RGB color | 60 02 RED GREEN BLUE |
Sound TYPE: volume=1, subwoofer=2, EQ=3, bass=4, DJ=5, tempo=6, mute=7.
For the implemented EQ/bass controls OPTION and EXTRA are zero.
Sound replies use 41 TYPE VALUE VALUE2, a different layout from writes.
EQ values (decimal): Party=1, Standard=2, Hip-hop=3, EDM=4, Rock=5, Latin=6, House=7, Reggae=8. Bass values: on=0, off=1. Mute reports: on=1, off=2.
System TYPE=3 controls lighting. Mode values (decimal): Off=0, Ambient=1,
Party=2, Dance=3, Thunder=4, Star=5, Lover=6, Color=7. Reply: 51 03 MODE.
The speaker displays COLOR when the owner chooses an RGB color. The desktop
queries lighting mode after RGB writes rather than treating ACK as mode proof.
Remote keys: volume up=0F, volume down=10, play/pause=11, mute=14.
A reply 70 11 is a button-event echo, not an absolute playing/paused state.
Additional app commands, untested here
The app defines grouping 05 TYPE CONTROL, USB playback/browsing/status and
repeat controls, DJ selection/levels, tempo, and Bluetooth multi-connect state.
See FEATURES.md for the distinction between discovered and verified behavior.
Do not infer arbitrary EQ-band access from the firmware configuration schema.
Evidence and limits
Tests contain small, independently captured packet fixtures: connection info, ACKs, source/EQ replies, lighting checksum variants, and play/pause echoes. Real Bluetooth addresses are replaced with synthetic ones. Physical verification covers one MX-T40 on Windows; other models, firmware versions, and platforms remain unverified. RFCOMM channel 1 worked initially but later failed repeatedly; no general explanation or guaranteed workaround has been established.