provision.sh fragt beim Start nach USB oder WLAN, statt ohne Gerät einfach abzubrechen. Der WLAN-Weg braucht kein Kabel — Android 11 und neuer koppeln per sechsstelligem Code. adb-wireless.sh sucht Kopplungs- und Verbindungsdienst per mDNS, statt die Adressen abtippen zu lassen. Beide Ports vergibt Android bei jedem Einschalten neu, und sie sind verschieden — das ist die häufigste Verwechslung dabei. Fällt auf manuelle Eingabe zurück, wenn das Netz Multicast blockiert. provision.sh kann die Skripte anschließend per adb push aufs Telefon legen. Das erspart es, Zugangsdaten für ein privates Repo auf einer Bildschirmtastatur einzutippen. Mit dem Hinweis, dass /sdcard keine Ausführungsrechte kennt und die Dateien deshalb erst nach ~ kopiert werden müssen. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
152 lines
6.4 KiB
Bash
Executable File
152 lines
6.4 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
|
|
|
|
if [ -t 1 ]; then
|
|
C_OK=$'\033[32m'; C_WARN=$'\033[33m'; C_ERR=$'\033[31m'
|
|
C_HEAD=$'\033[1;36m'; C_DIM=$'\033[2m'; C_OFF=$'\033[0m'
|
|
else
|
|
C_OK=""; C_WARN=""; C_ERR=""; C_HEAD=""; C_DIM=""; C_OFF=""
|
|
fi
|
|
kopf() { printf '\n%s══ %s ══%s\n' "$C_HEAD" "$*" "$C_OFF"; }
|
|
ok() { printf '%s ✓%s %s\n' "$C_OK" "$C_OFF" "$*"; }
|
|
warn() { printf '%s !%s %s\n' "$C_WARN" "$C_OFF" "$*"; }
|
|
fehl() { printf '%s ✗%s %s\n' "$C_ERR" "$C_OFF" "$*"; }
|
|
hinweis() { printf '%s %s%s\n' "$C_DIM" "$*" "$C_OFF"; }
|
|
|
|
command -v adb >/dev/null 2>&1 || { fehl "adb nicht gefunden."; exit 1; }
|
|
|
|
# Ab Version 30 gibt es 'adb pair'. Ältere Fassungen können Wireless Debugging nicht.
|
|
if ! adb pair 2>&1 | grep -q 'usage: adb pair'; then
|
|
fehl "Dieses adb kennt 'adb pair' nicht — zu alt für Wireless Debugging."
|
|
hinweis "Aktuelle platform-tools von developer.android.com/tools/releases/platform-tools"
|
|
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
|