Debians Paket android-tools-adb liefert Version 29 und kennt kein 'adb pair' — das kam erst mit platform-tools 30. Wer beides installiert hat, bekommt je nach PATH-Reihenfolge und Alter der Terminalsitzung mal das eine und mal das andere, und die WLAN-Kopplung scheitert scheinbar grundlos. provision/lib.sh sucht deshalb gezielt eine Fassung, die 'pair' beherrscht, und schiebt eine Shell-Funktion 'adb' davor, sodass die Aufrufstellen unverändert bleiben. Eine ausdrücklich gesetzte Vorgabe ADB= gilt absolut, auch wenn sie kein pair kann — stillschweigend etwas anderes zu nehmen wäre die unangenehmere Überraschung. Fehlt pair, läuft provision.sh mit einer Warnung weiter (für USB reicht es), adb-wireless.sh bricht sauber ab. Die Prüfung kommt bewusst ohne Pipe aus: 'adb pair' ohne Argumente endet mit Code 1, weil es ein Aufruffehler ist. Unter 'set -o pipefail' hätte das die gesamte Pipeline als fehlgeschlagen gelten lassen, obwohl grep den Hilfetext gefunden hatte — die Erkennung meldete dadurch selbst adb 36 als zu alt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
143 lines
5.9 KiB
Bash
Executable File
143 lines
5.9 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
|
|
}
|
|
|
|
# ── Schon verbunden? ─────────────────────────────────────────────────────────
|
|
kopf "Aktueller Stand"
|
|
VERBUNDEN=$(adb devices | grep -w 'device$' | wc -l)
|
|
if [ "$VERBUNDEN" -gt 0 ]; then
|
|
adb devices | grep -w 'device$' | sed 's/^/ /'
|
|
ok "Es ist bereits ein Gerät verbunden."
|
|
hinweis "Weiter mit: ./provision/provision.sh"
|
|
exit 0
|
|
fi
|
|
hinweis "Kein Gerät verbunden — Kopplung wird eingerichtet."
|
|
|
|
# ── 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."
|
|
printf ' Suche Verbindungsdienst '
|
|
if CONNECT_ZIEL=$(suche_dienst _adb-tls-connect._tcp 20); then
|
|
printf '\n'; ok "gefunden: $CONNECT_ZIEL"
|
|
else
|
|
printf '\n'; warn "Nichts per mDNS gefunden."
|
|
hinweis "Adresse steht auf der Hauptseite von 'Drahtloses Debugging'."
|
|
printf ' Adresse eintippen (IP:PORT) > '
|
|
read -r CONNECT_ZIEL </dev/tty
|
|
[ -n "$CONNECT_ZIEL" ] || { fehl "Ohne Adresse geht es nicht."; exit 1; }
|
|
fi
|
|
|
|
if adb connect "$CONNECT_ZIEL"; then
|
|
sleep 2
|
|
if adb devices | grep -qw 'device$'; then
|
|
ok "Verbunden"
|
|
adb devices | grep -w 'device$' | sed 's/^/ /'
|
|
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
|
|
|
|
# ── Weiter ───────────────────────────────────────────────────────────────────
|
|
kopf "Fertig"
|
|
cat <<TEXT
|
|
Jetzt läuft die Einrichtung wie mit Kabel:
|
|
|
|
./provision/provision.sh
|
|
|
|
Gut zu wissen für später:
|
|
|
|
· Die Kopplung bleibt bestehen. Nach einem Neustart des Telefons oder
|
|
nach dem Aus- und Einschalten von "Drahtloses Debugging" ändert sich
|
|
aber der Port — dann genügt dieses Skript erneut, ohne neuen Code.
|
|
· ADB wird in diesem Projekt nur für die Ersteinrichtung gebraucht.
|
|
Im Dauerbetrieb kommt HPOS ohne Privilegienkanal aus.
|
|
· Trennen mit: adb disconnect
|
|
TEXT
|