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>
182 lines
6.7 KiB
Bash
Executable File
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
|