149 lines
6.6 KiB
Markdown
149 lines
6.6 KiB
Markdown
# BTD 700 Control für Linux
|
||
|
||
Native GTK-4-App zur Steuerung des **Sennheiser BTD 700**, mit einem Menü im
|
||
Infobereich von GNOME/KDE. Eigenständige Implementierung des HID-Steuerprotokolls,
|
||
analysiert anhand der offiziellen Windows-Anwendung **Dongle Control 1.0.5**.
|
||
|
||
**Keine Firmware-Updates, Firmware-Downloads oder Update-Schnittstellen.** Die App
|
||
benötigt weder Windows/Wine noch eine Netzwerkverbindung. Sennheiser-Programmcode,
|
||
Logos und Firmware werden nicht mitgeliefert. Dies ist ein unabhängiges Projekt.
|
||
|
||
## Starten
|
||
|
||
```bash
|
||
./run.sh
|
||
```
|
||
|
||
Das Fenster zeigt den echten Dongle-Status. Beim Schließen bleibt die App im
|
||
Infobereich aktiv. „Beenden“ im Symbolmenü oder das Beenden-Symbol im Fenster
|
||
beendet die App vollständig. Wenn der Desktop keinen Infobereich anbietet,
|
||
beendet das Schließen des Fensters die App.
|
||
|
||
```bash
|
||
python3 install.py # Anwendungsmenü-Eintrag für diesen Projektordner
|
||
./run.sh --background # Nur im Infobereich starten
|
||
./run.sh --demo # Simulierter Dongle, keinerlei USB-Zugriff
|
||
```
|
||
|
||
Den Projektordner nach der Installation behalten. „Beim Anmelden starten“ in der
|
||
App aktiviert bei Bedarf den Autostart im Infobereich. Er ist standardmäßig aus.
|
||
|
||
## Steuerung
|
||
|
||
- **Standard / Gaming / Auracast** direkt im Fenster oder Symbolmenü wählen.
|
||
- Aktiven **Codec, Auflösung, Abtastrate und Verbindungsstatus** ablesen.
|
||
- **Codecs** auswählen, die der Dongle für die aktuelle Verbindung meldet.
|
||
Die Auswahl steht im Standard-Modus zur Verfügung; Gaming setzt seinen Codec selbst.
|
||
- **Bluetooth Classic / LE Audio / Automatisch** auswählen, entsprechend den
|
||
vom angeschlossenen Kopfhörer gemeldeten Möglichkeiten.
|
||
- Bereits gekoppelte Kopfhörer **verbinden / trennen**.
|
||
- **Auracast:** Name, Passwortschutz, öffentliche Auffindbarkeit und Qualität.
|
||
Das Symbolmenü bietet Schalter und Untermenüs; für Name/Passwort öffnet es die Eingabe im Fenster.
|
||
- **Werkseinstellungen** nur nach ausdrücklicher Bestätigung im Dialog. Dabei
|
||
werden die Kopplungen gelöscht. Die App führt niemals automatisch einen Reset aus.
|
||
|
||
Das Passwort wird verdeckt eingegeben und weder gespeichert noch protokolliert.
|
||
Ein leeres Passwortfeld behält das bisherige Passwort; „Passwortschutz“ ausschalten
|
||
sendet ohne Passwortschutz. Der Name erlaubt 4–16 ASCII-Buchstaben/Ziffern mit
|
||
inneren Leerzeichen; ein leerer Name stellt den Gerätenamen wieder her. Passwörter
|
||
verwenden 4–16 ASCII-Buchstaben/Ziffern, entsprechend den Original-Eingabegrenzen.
|
||
|
||
**„Öffentlich auffindbar“ ist die Auracast-Ankündigung, kein Ein/Aus-Schalter für
|
||
Audio.** Zum Starten/Beenden der Übertragung den Audiomodus umstellen.
|
||
Die angezeigten Bit-/kHz-Werte stammen vom Dongle. Die USB-Abtastrate wird vom
|
||
Audiosystem (z. B. PipeWire) bestimmt und ist kein hier nachgewiesener Stellbefehl.
|
||
Koppeln erfolgt über die Taste am Dongle; „Verbinden“ versucht die bestehende Kopplung.
|
||
|
||
## Voraussetzungen
|
||
|
||
Python ≥ 3.10, PyGObject, GTK ≥ 4.10, libadwaita ≥ 1.5 und libdbusmenu mit
|
||
GObject-Introspection. Auf dem hier verwendeten Bazzite sind die benötigten
|
||
Bibliotheken bereits vorhanden; keine zusätzlichen Pakete waren erforderlich.
|
||
|
||
Für andere Systeme typischerweise:
|
||
|
||
```bash
|
||
# Fedora (klassisch, veränderliches System)
|
||
sudo dnf install python3-gobject gtk4 libadwaita libdbusmenu
|
||
|
||
# Debian / Ubuntu
|
||
sudo apt install python3-gi gir1.2-gtk-4.0 gir1.2-adw-1 gir1.2-dbusmenu-glib-0.4
|
||
```
|
||
|
||
Auf GNOME muss der Desktop StatusNotifier/AppIndicator-Symbole unterstützen;
|
||
beispielsweise mit „AppIndicator and KStatusNotifierItem Support“. Auf dem
|
||
getesteten GNOME ist derselbe Dienst bereits für JetBrains Toolbox und andere Apps aktiv.
|
||
KDE stellt diese Schnittstelle über seinen Infobereich bereit.
|
||
|
||
Fehlt die Menü-Bibliothek, bleibt das Fenster nutzbar. Das Terminalinterface
|
||
benötigt ausschließlich die Python-Standardbibliothek.
|
||
|
||
## USB-Zugriff
|
||
|
||
Es wird ausschließlich die passende HID-Steuerschnittstelle des Geräts
|
||
`3542:3001` geöffnet, identifiziert über ihren Report-Deskriptor. Die zweite
|
||
Schnittstelle für Updates bleibt geschlossen. Audiotreiber werden nicht getrennt.
|
||
|
||
Falls die App fehlende Berechtigungen meldet:
|
||
|
||
```bash
|
||
sudo install -m 0644 packaging/70-btd700-control.rules /etc/udev/rules.d/70-btd700-control.rules
|
||
sudo udevadm control --reload-rules
|
||
```
|
||
|
||
Anschließend den Dongle aus- und wieder einstecken. Die Regel beschränkt den Zugriff
|
||
auf die Steuerungsschnittstelle und den aktiven lokalen Benutzer. Die App nicht
|
||
als root starten. Auf dem getesteten System ist bereits Zugriff vorhanden.
|
||
|
||
## Terminal
|
||
|
||
```bash
|
||
./run.sh devices
|
||
./run.sh status
|
||
./run.sh mode standard
|
||
./run.sh mode gaming
|
||
./run.sh mode standard --transport auto
|
||
./run.sh codec adaptive
|
||
./run.sh disconnect
|
||
./run.sh connect
|
||
./run.sh auracast --name 'Wohnzimmer' --quality high --public on
|
||
./run.sh auracast --password --encryption on # Passwort verdeckt abfragen
|
||
./run.sh mode auracast
|
||
```
|
||
|
||
`status` gibt JSON aus und liest kein Passwort. Nur eine Instanz darf den Dongle
|
||
halten: Vor CLI-Befehlen eine laufende GUI über „Beenden“ schließen. Mehrere Dongles
|
||
lassen sich mit `--device /dev/hidrawN` vor dem Unterbefehl auswählen.
|
||
|
||
## Verifikation
|
||
|
||
```bash
|
||
python3 -m unittest discover -s tests -v
|
||
python3 tools/check_gui.py
|
||
```
|
||
|
||
`check_gui.py` verwendet **ausschließlich einen simulierten Dongle**, öffnet eine
|
||
Demo-Oberfläche in der bestehenden Sitzung und prüft die Menüaktionen über den
|
||
echten D-Bus-Menüexport. Es speichert Fensterbilder unter `/tmp/btd700-gui-test*.png`.
|
||
|
||
Nachgewiesen am angeschlossenen BTD 700 mit Firmware **3.11.0**:
|
||
|
||
- Erkennung und Öffnen der korrekten HID-Schnittstelle ohne Treiberwechsel.
|
||
- Echte Antworten auf Status-, Modus-, Codec-, Audioqualitäts-, LE-Zustands-,
|
||
Transport-, Auracast-Konfigurations-, Namens- und Firmwareversionsabfragen.
|
||
- Anzeige im GTK-Fenster und Registrierung im GNOME-Infobereich.
|
||
|
||
Schreibbefehle wurden aus der Originalsoftware rekonstruiert und in Simulation
|
||
geprüft. Der Nutzer hat die Funktion der App am eigenen Dongle bestätigt. Eine
|
||
Aufschlüsselung aller dabei getesteten Funktionen liegt nicht vor; der automatisierte
|
||
Hardware-Umschalttest wurde bisher nicht ausgeführt.
|
||
|
||
Das vorbereitete `tools/check_hardware.py --run` schaltet Modi und Codec um,
|
||
prüft Auracast-Werte und versucht anschließend die gesicherten Originalwerte
|
||
wiederherzustellen. Es führt weder Firmware-Updates noch einen Werksreset aus.
|
||
Den Hardwaretest nur bewusst starten: Er unterbricht kurz die Audiowiedergabe
|
||
und verändert vorübergehend gespeicherte Einstellungen einschließlich des Passworts. Bei USB-Trennung während
|
||
einer Änderung ist eine Wiederherstellung nicht garantiert.
|
||
|
||
Protokoll, Herkunft und bekannte Grenzen: [docs/PROTOCOL.md](docs/PROTOCOL.md).
|