Files
linux-on-android-without-root/provision/adb-wireless.sh
T
StefanandClaude Opus 5 b34074f48e adb-wireless: erst verbinden, dann erst koppeln
Bisher begann jeder Aufruf beim Koppeln. Wer bereits gekoppelt war, wurde deshalb
erneut nach einem Code gefragt — und weil die Kopplung ja schon bestand, führte
das zu nichts. Von außen sah es wie eine Schleife aus.

Der Fehler war eine falsche Annahme im Ablauf: die Kopplung bleibt dauerhaft
bestehen, nur die Verbindung geht verloren und der Port wechselt bei jedem
Einschalten. Ein zweiter Code wird also nie gebraucht.

Der Ablauf prüft jetzt in dieser Reihenfolge:
  1. steht schon eine Verbindung?
  2. lässt sich per mDNS verbinden? (dann bestand die Kopplung bereits)
  3. erst dann koppeln — und danach direkt wieder verbinden

Nach dem Koppeln wird zusätzlich kurz gewartet: neuere adb-Fassungen verbinden
von selbst über mDNS, dann ist der Rest überflüssig.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-09 18:01:29 +02:00

182 lines
6.7 KiB
Bash
Executable File

#!/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 _ </dev/tty
# ── Kopplung ─────────────────────────────────────────────────────────────────
kopf "Kopplungsdienst suchen"
printf ' Suche per mDNS '
if PAIR_ZIEL=$(suche_dienst _adb-tls-pairing._tcp 25); then
printf '\n'; ok "gefunden: $PAIR_ZIEL"
else
printf '\n'; warn "Nichts per mDNS gefunden."
hinweis "Manche Netze blockieren Multicast, dann klappt die automatische Suche nicht."
printf ' Adresse aus dem Kopplungsfenster eintippen (IP:PORT) > '
read -r PAIR_ZIEL </dev/tty
[ -n "$PAIR_ZIEL" ] || { fehl "Ohne Adresse geht es nicht."; exit 1; }
fi
printf ' Sechsstelligen Kopplungscode eingeben > '
read -r CODE </dev/tty
kopf "Koppeln"
if adb pair "$PAIR_ZIEL" "$CODE"; then
ok "Kopplung erfolgreich"
else
fehl "Kopplung fehlgeschlagen."
hinweis "Häufigste Ursachen: Code abgelaufen (er gilt nur kurz),"
hinweis "Fenster zu früh geschlossen, oder Telefon in einem anderen Netz."
exit 1
fi
# ── Verbinden ────────────────────────────────────────────────────────────────
# Der Verbindungsport ist ein ANDERER als der Kopplungsport. Er steht auf der
# Hauptseite von "Drahtloses Debugging" unter "IP-Adresse und Port".
kopf "Verbinden"
hinweis "Das Kopplungsfenster kann jetzt geschlossen werden."
# Neuere adb-Fassungen verbinden nach dem Koppeln von selbst über mDNS.
sleep 3
if ist_verbunden; then
ok "Verbindung stand bereits nach dem Koppeln"
weiter_mit_provision
exit 0
fi
if verbinden_versuchen 20; then
ok "Verbunden"
weiter_mit_provision
exit 0
fi
warn "Nichts per mDNS gefunden."
hinweis "Manche Netze blockieren Multicast. Die Adresse steht auf der Hauptseite"
hinweis "von 'Drahtloses Debugging' unter 'IP-Adresse und Port'."
hinweis "Achtung: das ist ein ANDERER Port als der aus dem Kopplungsfenster."
printf ' Adresse eintippen (IP:PORT) > '
read -r CONNECT_ZIEL </dev/tty
[ -n "$CONNECT_ZIEL" ] || { fehl "Ohne Adresse geht es nicht."; exit 1; }
if adb connect "$CONNECT_ZIEL"; then
sleep 2
if ist_verbunden; then
ok "Verbunden"
weiter_mit_provision
exit 0
else
fehl "Verbindung kam nicht zustande."
adb devices | sed 's/^/ /'
hinweis "Steht dort 'unauthorized', den Dialog auf dem Telefon bestätigen."
exit 1
fi
else
fehl "adb connect fehlgeschlagen."
exit 1
fi