This post describe FreeLace Pro specific configuration protocol notices.
Base protocol is the same as in HUAWEI FreeBuds 4i, so main information is available here. This page contains only differences from their.
Read commands difference
In all read commands, you should add empty parameters of fields which you want to get in response. For example, if you send Package(b"\x2b\x2a", [])
(read ANC mode request), you’ll got a empty response. So you must place (2, b"")
in parameters array to get values from device.
Commands that match with FreeBuds 4i
Except read request difference described above.
Commands that isn’t available
- In-ear state
- Their command ID is used to notify about ANC mode changes
- Preferred ANC mode options
- In this model, combined with long tap action
- Pause when plug-out option
- HW not supported, no in-ear sensor;
- Voice language get/set request
- Looks like not supported;
- Device logs
- Didn’t got on that device;
Commands that have some differences
Fetch battery info
Request: To get current battery level, build and send command with ID 0108
.
GET battery | Length | Value (Description) |
---|---|---|
Command ID | 2 | Constant HEX 0108 (1, 8) |
Parameter 2 | 0 | Empty string |
Playground example: Package(b"\x01\x08", [(2, b"")]).send()
.
Response: After that, you’ll got package like this. And the same package device will send if battery state will change while socket is connected.
Battery state | Length | Value (Description) |
---|---|---|
Command ID | 2 | 0108 (1, 8) — Response for request above;0127 (1, 39) — Battery changed notification |
Parameter 1 | 1 | Current battery level, one byte integer |
Parameter 2 | 1 | Same as parameter 1 |
Parameter 3 | 1 | Charging state for headphones, one byte. 0 — not charging, 1 — charging |
Noise-cancellation
Request: If you want to request current ANC mode, send command ID 2B2A
.
GET current mode | Length | Value (Description) |
---|---|---|
Command ID | 2 | Constant HEX 2B2A (43, 42) |
Parameter 1 | 0 | Empty string |
Playground example: Package(b"\x2b\x2a", [(1, b"")]).send()
.
Response: When you send that command, you’ll got a incoming package like that:
Current ANC mode | Length | Value (Description) |
---|---|---|
Command ID | 2 | Constant HEX 2B2A (43, 42) |
Parameter 1 | 2 | Current ANC mode, see table bellow |
Change detection: When ANC mode is changed with touch button on deivce, you’ll get this package. Yes, command ID is the same as in FreeBuds 4i in-ear state change event. Also, sometimes it drop’s a package with 2b2a
command ID and structure like above (response), but not all times…
Current ANC mode | Length | Value (Description) |
---|---|---|
Command ID | 2 | Constant HEX 2B03 (43, 3) |
Parameter 1 | 1 | New ANC mode (0-2) |
Write: To change ANC mode, build and send this package:
Change ANC mode | Length | Value (Description) |
---|---|---|
Command ID | 2 | Constant HEX 2B04 (43, 4) |
Parameter 1 | 2 | New mode, see bellow |
Playground example: Package(b"\x2b\x04", [(1, NEW_MODE)]).send()
, where NEW_MODE
should two byte string, eg b"\x01\x02"
.
Value (HEX) | Description |
---|---|
0000 |
No ANC |
01ff |
Cancellation, kept level |
0101 |
Cancellation, lowest |
0100 |
Cancellation, normal |
0102 |
Cancellation, ultra |
0202 |
Awareness |
Power button double tap action
Request: To fetch current option value, send package with command ID 0120
(command ID is the same as double tap in 4i).
GET double-tap | Length | Value (Description) |
---|---|---|
Command ID | 2 | Constant HEX 0120 (1, 32) |
Parameter 1 | 0 | Empty |
Parameter 2 | 0 | Empty |
Playground: Package(b"\x01\x20", [(1, b""),(2, b"")]).send()
.
Response:
Double-tap opt value | Length | Value (Description) |
---|---|---|
Command ID | 2 | Constant HEX 0120 (1, 32) |
Parameter 1 | 1 | Signed integer, tap action for power button (check table bellow for value description) |
Parameter 2 | 1 | Same as parameter 1 |
Write: To change this option, send package with command ID 011f
, and place new option value to parameters 1 AND 2
Set double-tap act | Length | Value (Description) |
---|---|---|
Command ID | 2 | Constant HEX 011f (1, 31) |
Parameter 1 | 1 | Signed integer, tap action for power button (check table bellow for value description) |
Parameter 2 | 1 | Same as parameter 1 |
Playground: Package(b"\x01\x1f", [(1, NEW_VALUE),(2, NEW_VALUE),]).send()
where NEW_VALUE
should be from table below.
Available options:
Value | Description |
---|---|
-1 | Do nothing |
12 | Switch device |
Long tap action option
Request: To fetch current option value, send package with command ID 2B17
.
GET long-tap | Length | Value (Description) |
---|---|---|
Command ID | 2 | Constant HEX 2B17 (43, 23) |
Parameter 1 | 0 | Empty |
Parameter 2 | 0 | Empty |
Playground: Package(b"\x2b\x17", []).send()
.
Response:
Long-tap opt value | Length | Value (Description) |
---|---|---|
Command ID | 2 | Constant HEX 2B17 (43, 23) |
Parameter 1 | 1 | Signed integer, long tap action for left headphone (check table bellow for value description) |
Parameter 2 | 1 | Same as parameter 1 |
Parameter 3 | 5 | ?? |
Write: Command ID is 2b16
.
Set double-tap act | Length | Value (Description) |
---|---|---|
Command ID | 2 | Constant HEX 2b16 (43, 22) |
Parameter 1 | 1 | Signed integer, double tap action for left headphone (check table bellow for value description) |
Parameter 2 | 1 | Same as parameter 1 |
Playground: Package(b"\x2b\x16", [(1, NEW_VALUE),(2, NEW_VALUE),]).send()
where NEW_VALUE
should be from table below.
Available options:
Value | Description |
---|---|
-1 | Do nothing |
3 | Switch ANC Off/Cancellation |
5 | Switch through all ANC modes |
6 | Switch ANC Cancellation/Awareness |
9 | Switch ANC Off/Awareness |