#!/usr/bin/env bash # HPOS — ADB über WLAN verbinden, ohne USB-Kabel. # # Android 11 und neuer bringen "Wireless Debugging" mit: einmal per sechsstelligem # Code koppeln, danach verbindet sich adb über das Netz. Ein Kabel wird nie gebraucht. # # Die Ports vergibt Android bei jedem Einschalten neu — deshalb werden sie hier per # mDNS gesucht statt abgetippt. Wichtig: Kopplungs- und Verbindungsport sind zwei # verschiedene Dinge, das ist die häufigste Verwechslung. # # Aufruf: ./provision/adb-wireless.sh set -uo pipefail source "$(dirname "$0")/lib.sh" kopf "Werkzeug" if adb_einrichten; then ok "adb $(adb_version "$ADB_BIN") — kann WLAN-Kopplung" hinweis "$ADB_BIN" else fehl "Ohne 'adb pair' ist eine Kopplung über WLAN nicht möglich." hinweis "Entweder aktuelle platform-tools installieren, oder doch ein Kabel besorgen." exit 1 fi adb start-server >/dev/null 2>&1 # Sucht einen mDNS-Dienst und gibt HOST:PORT zurück. Der Kopplungsdienst wird nur # angekündigt, solange der Kopplungsdialog auf dem Telefon offen ist — deshalb wird # wiederholt gesucht statt einmal. suche_dienst() { local typ="$1" versuche="${2:-20}" i zeile for ((i = 1; i <= versuche; i++)); do zeile=$(adb mdns services 2>/dev/null | awk -v t="$typ" '$2 == t {print $3; exit}') if [ -n "$zeile" ]; then printf '%s' "$zeile"; return 0; fi printf '.' >&2 sleep 1 done return 1 } ist_verbunden() { adb devices | grep -qw 'device$'; } weiter_mit_provision() { adb devices | grep -w 'device$' | sed 's/^/ /' kopf "Fertig" cat <<'TEXT' Weiter mit: ./provision/provision.sh Gut zu wissen: ADB wird in diesem Projekt nur für die Ersteinrichtung gebraucht. Im Dauerbetrieb kommt HPOS ohne Privilegienkanal aus. Trennen mit: adb disconnect TEXT } # Versucht zu verbinden und meldet Erfolg. Die Adresse kommt per mDNS oder, # wenn das Netz kein Multicast durchlässt, von Hand. verbinden_versuchen() { local wartezeit="${1:-8}" ziel printf ' Suche Verbindungsdienst ' >&2 if ziel=$(suche_dienst _adb-tls-connect._tcp "$wartezeit"); then printf '\n' >&2 ok "gefunden: $ziel" else printf '\n' >&2 return 1 fi adb connect "$ziel" >/dev/null 2>&1 sleep 2 ist_verbunden } # ── Schon verbunden? ───────────────────────────────────────────────────────── kopf "Aktueller Stand" if ist_verbunden; then ok "Es ist bereits ein Gerät verbunden." weiter_mit_provision exit 0 fi # ── Erst verbinden, dann erst koppeln ──────────────────────────────────────── # Die Kopplung bleibt dauerhaft bestehen — nur die Verbindung geht verloren, und # der Port ändert sich bei jedem Einschalten. Wer schon einmal gekoppelt hat, # braucht deshalb keinen neuen Code, sondern nur ein neues connect. Ohne diesen # Schritt landet man bei jedem Aufruf wieder im Kopplungsdialog. hinweis "Kein Gerät verbunden. Prüfe zuerst, ob schon eine Kopplung besteht …" if verbinden_versuchen 8; then ok "Bereits gekoppelt — es war nur die Verbindung weg." weiter_mit_provision exit 0 fi hinweis "Keine bestehende Kopplung nutzbar — richte eine neue ein." # ── Anleitung ──────────────────────────────────────────────────────────────── kopf "Auf dem Telefon" cat <<'TEXT' 1. Sicherstellen, dass Telefon und dieser Rechner im SELBEN WLAN sind. Ein Gäste-WLAN oder eine aktive Client-Isolierung verhindert die Verbindung. 2. Einstellungen → System → Entwickleroptionen → "Drahtloses Debugging" EIN 3. Dort auf "Gerät mit Kopplungscode koppeln" tippen. Es erscheint ein sechsstelliger Code und eine Adresse. Dieses Fenster BITTE OFFEN LASSEN, bis die Kopplung durch ist — der Kopplungsdienst verschwindet sonst sofort wieder. TEXT printf '\n Wenn das Fenster mit dem Code offen ist, hier Enter drücken > ' read -r _ ' read -r PAIR_ZIEL ' read -r CODE ' read -r CONNECT_ZIEL