qzed / pbpctrl

Control Google Pixel Buds Pro from the Linux command line.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Doesn't work on A-Series

bgiesing opened this issue · comments

"Might or might not work on other Pixel Buds devices."

I own a Pixel Buds A-Series and the device isn't auto detected. Trying manually by providing the Bluetooth address and running any command throws a connection error:

pbpctrl --device 0C:C4:13:0B:39:11 show hardware
2023-08-01T12:36:55.947792Z  WARN pbpctrl::bt: connecting to profile failed, trying again (1/3) error=Error { kind: NotAvailable, message: "br-connection-profile-unavailable" }
2023-08-01T12:36:56.949647Z  WARN pbpctrl::bt: connecting to profile failed, trying again (2/3) error=Error { kind: NotAvailable, message: "br-connection-profile-unavailable" }
2023-08-01T12:36:57.951226Z  WARN pbpctrl::bt: connecting to profile failed, trying again (3/3) error=Error { kind: NotAvailable, message: "br-connection-profile-unavailable" }
Error: Bluetooth operation not available: br-connection-profile-unavailable

Anything I can provide to try and make A-Series work?

The error means that it can't find the maestro bluetooth profile on the device. It might be possible that it uses another profile, or it might use another communication protocol. Can you run through the following steps and post the output (note: this assumes that you've already paired the buds)?

  • Run bluetoothctl. This will open an interactive shell.
  • If you have already connected your pixel buds via bluetooth, it should show their name in brackets, e.g. something like [Your Pixel Buds Series A]. If it doesn't show that, run connect 0C:C4:13:0B:39:11 (i.e. connect <your-buds-address>).
  • Then run info and post the output.

In particular, it should output some UUIDs, one for each supported profile.

[Brandon's Pixel Buds]# info
Device 0C:C4:13:0B:39:11 (public)
	Name: Brandon's Pixel Buds
	Alias: Brandon's Pixel Buds
	Class: 0x00240404
	Icon: audio-headset
	Paired: yes
	Trusted: yes
	Blocked: no
	Connected: yes
	LegacyPairing: no
	UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
	UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
	UUID: Advanced Audio Distribu.. (0000110d-0000-1000-8000-00805f9b34fb)
	UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
	UUID: Handsfree                 (0000111e-0000-1000-8000-00805f9b34fb)
	UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
	UUID: Vendor specific           (3a046f6d-24d2-7655-6534-0d7ecb759709)
	UUID: Vendor specific           (81c2e72a-0591-443e-a1ff-05f988593351)
	UUID: Vendor specific           (df21fe2c-2515-4fdb-8886-f12c4d67927c)
	UUID: Vendor specific           (f8d1fbe4-7966-4334-8024-ff96c9330e15)
	Modalias: bluetooth:v00E0p3003d0001
	Battery Percentage: 0x64 (100)

Sorry for the delay. From what I can tell it looks like it uses a slightly different protocol.

Here are the vendor-specific UUIDs that I'm seeing on my device:

  • 25e97ff7-24ce-4c4c-8951-f764a708f7b5: MAESTRO APP (App/Settings)
  • 74c34f02-a774-4f6d-ae2e-dab5030b5842: BTIS (unknown)
  • 81c2e72a-0591-443e-a1ff-05f988593351: GSND AUDIO (unknown)
  • df21fe2c-2515-4fdb-8886-f12c4d67927c: GFPS RFCOMM (Fast Pair protocol)
  • f8d1fbe4-7966-4334-8024-ff96c9330e15: GSND CONTROL (unknown)

And unfortunately, the MAESTRO APP one is the only one this program currently supports, whereas I guess that the A-Series ones use UUID 3a046f6d-24d2-7655-6534-0d7ecb759709 for settings. You could try replacing the UUID with that one here, but I assume that this isn't going to work (IIRC it looks like it doesn't use pigweed rpc).

If that doesn't work, you'd have to reverse-engineer the protocol. I haven't looked in detail, but if I remember correctly at least some parts (structs and enums for the setting data) seemed to be the same (or largely the same) across protocols. So I guess you should be able to at least reuse some parts.

Just tried swapping the UUID and yeah, every command seems to throw an error that it can't read the data so likely it's a different protocol:

WARN maestro::hdlc::codec: error decoding data: UnexpectedData

Correct, that means that it doesn't understand the data being received. You could try to log the data it receives and see if you can make some sense of that. You can also pull the settings app from your device and decompile it (see e.g. https://www.ragingrock.com/AndroidAppRE/, I've used jadx for that) and see if you can figure something out with both the app and the data.