adb через Wi-Fi (Android 11+) в Windows: как сохранить фиксированный порт или подключиться автоматически?
Беспроводное соединение ADB работает отлично на моем Android 11 телефона станции + Windows.
Но это не удобно, так как каждый раз при отключении / повторном подключении телефона Wifi мне приходится:
- Включите беспроводную отладку в настройках Android.
- Обратите внимание на номер порта ХХХХХ, который каждый раз меняется!
- Запустить
adb connect 192.168.1.10:XXXXX
на компьютере.
Есть ли способ пропустить шаг 2:
- фиксируете порт?
- заставляет Windows автоматически определять телефон на новом порте? (документация, похоже, подразумевает, что шаги 2 и 3 не нужны в MacOS, после того, как соединение будет выполнено, мне интересно, как это работает)
11 ответов
Вы можете исправить порт до перезагрузки с помощью
adb tcpip
После сопряжения и подключения к динамическому порту
пытаться
adb tcpip 4444
тогда вы можете использовать
adb connect ip:4444
до перезагрузки (после перезагрузки вы должны подключиться к динамическому порту и снова установить tcpip на 4444)
Вы можете динамически получить порт, используя
nmap
и подключитесь к нему.
вот мое решение
adb connect <device_ip>:$(nmap $IP -p 37000-44000 | awk "/\/tcp/" | cut -d/ -f1)
Достаточно сканирования только портов 37000-44000. Также должна быть включена беспроводная отладка и разблокировано устройство во время сканирования nmap. Запустите его снова, если nmap не находит порт с первого раза.
Я добавил команду к псевдониму, чтобы ее было легко запустить,
например:
alias adbw='adb connect 192.168.0.7:$(nmap $IP -p 37000-44000 | awk "/\/tcp/" | cut -d/ -f1)'
Чтобы подключиться в следующий раз:
- Разблокировать устройство
- Включить отладку беспроводной сети (вы можете добавить ее в значки строки состояния)
- бежать
adbw
если установлен псевдоним.
Бывший выход:
connected to 192.168.0.7:38395
Android передает информацию о подключении через mDNS/DNS-SD с типом службы._adb-tls-connect._tcp
.
Вы можете обнаружить устройства Android с включенным беспроводным adb, используя что-то вроде avahi-browse.
$ avahi-browse --terminate --resolve _adb-tls-connect._tcp
+ br0 IPv6 adb-26df62cd-sGvUmf _adb-tls-connect._tcp local
+ br0 IPv4 adb-26df62cd-sGvUmf _adb-tls-connect._tcp local
+ enp5s0 IPv6 adb-26df62cd-sGvUmf _adb-tls-connect._tcp local
= br0 IPv6 adb-26df62cd-sGvUmf _adb-tls-connect._tcp local
hostname = [Android.local]
address = [10.0.0.199]
port = [37531]
txt = ["v=ADB_SECURE_SERVICE_VERSION"]
= br0 IPv4 adb-26df62cd-sGvUmf _adb-tls-connect._tcp local
hostname = [Android.local]
address = [10.0.0.199]
port = [37531]
txt = ["v=ADB_SECURE_SERVICE_VERSION"]
= enp5s0 IPv6 adb-26df62cd-sGvUmf _adb-tls-connect._tcp local
hostname = [Android.local]
address = [10.0.0.199]
port = [37531]
txt = ["v=ADB_SECURE_SERVICE_VERSION"]
Затем вы можете подключиться, используя имя службы.
$ adb connect adb-26df62cd-sGvUmf
connected to adb-26df62cd-sGvUmf._adb-tls-connect._tcp
Или используя адрес и порт.
$ adb connect 10.0.0.199:37531
connected to 10.0.0.199:37531
Мне понравился ответ Build3r, поэтому я перенес его в powershell, вам нужно только установить nmap, который доступен для Windows:
nmap YOUR_IP -p 37000-44000 | Where-Object{$_ -match "tcp open"} | ForEach-Object {$_.split("/")[0]}
я использую это в скрипте Python, который находится в моем PATH
ret=subprocess.run(["powershell","-command",F'nmap {ip} -p 37000-44000 | Where-Object{{$_ -match "tcp open"}} | ForEach-Object {{$_.split("/")[0]}}'],capture_output=True)
port=ret.stdout.decode().strip()
Опираясь на ответ от user3125800, вот фрагмент PowerShell, чтобы получить однострочное решение для беспроводной связи в Windows:
adb connect $IP`:$(((nmap $IP -p 37000-44000 | sls tcp) -Split '/')[0])
Вам нужно будет заранее определить IP-адрес вашего устройства (здесь пригодится постоянная аренда DHCP) через:
$IP="192.168.0.69"
Некоторая документация, необходимаяadb
сопряжение, прежде чем вы сможете использовать этот фрагмент: https://developer.android.com/studio/command-line/adb#wireless-android11-command-line
Опираясь на ответ от Build3r и SonicGold. Я пишу скрипт летучей мыши с Python для автоматического подключения. Питон:
ip = "192.168.10.136"
ret = subprocess.run(["powershell", "-command",
F"((nmap {ip} -p 37000-44000 | sls tcp) -Split '/')"],
capture_output=True)
outputs = ret.stdout.decode().strip().split("\n")
for output in outputs:
output = output.replace("\r", "")
if output.isalnum():
print(f"find port:{output}")
print(subprocess.run(["powershell", "-command",
F"adb connect {ip}:{output}"],
capture_output=True).stdout.decode().strip()
)
time.sleep(5)
летучая мышь:
"python" "xxx\scanWifi.py"
Он может сканировать все соответствующие порты и пытаться подключиться.
Теперь проблема решена благодаря недавнему обновлению Android Studio.
Теперь все шаги можно автоматизировать:
- Включите беспроводную отладку в настройках Android. → это можно автоматизировать с помощью простого профиля Tasker : при подключении к офисному Wi-Fi установите пользовательскую настройку для включения беспроводной отладки следующим образом:
Или, если вам не нужна полная автоматизация, вы, вероятно, можете добавить быстрый переключатель для удобства. На Pixel 3 это можно сделать в
Settings > System > Developer options > Quick settings developer tiles > Wireless debugging
- Android Studio Bumblebee 2021.1.1 теперь автоматически (через несколько секунд) определяет устройство и подключается к нему! Больше никакого копирования номеров портов.
Подсказка обо всех решениях, обсуждаемых здесь, и об использованииadb sync
иadb connect
для беспроводной отладки с помощью ADB в целом:
Вместо предоставления (неудобного, возможно, даже нестабильного) текущего IP-адреса мобильного устройства достаточно использоватьlocalhost
(или эквивалентный адрес IPv4127.0.0.1
или IPv6-адрес::1
).
Я только что нашел ниже способы для Linux и Windows (надеюсь, это поможет другим). Поскольку ADB 31.0.2 или более поздней версии отключает обнаружение mDNS, необходимо включить обнаружение mDNS, а затем перезапустить сервер ADB.
Линукс:
export ADB_MDNS_OPENSCREEN=1
adb kill-server
adb start-server
adb mdns services
Окна:
set ADB_MDNS_OPENSCREEN=1
adb kill-server
adb start-server
adb mdns services
Выходы (например):
List of discovered mdns services
driver_vm _adb._tcp 192.168.1.49:4444
device_vm _adb._tcp 192.168.1.49:3333
Если имеется только одно устройство, оно автоматически подключается к устройствам каждый раз, когда на этом устройстве включается беспроводная отладка. В противном случае вы можете использоватьconnect
команда, как показано ниже
adb connect driver_vm._adb._tcp
или
adb connect 192.168.1.49:3333
Ссылка: https://source.android.com/docs/automotive/virtualization/tools .
Я обнаружил, что после сопряжения устройства вас больше никогда не попросят ничего подключить к этому устройству (за исключением того, что вы позже отзовете разрешения вручную).
Чтобы подключить устройство из adb, сначала вы должны убедиться в следующем в этом контрольном списке:
- Вы находитесь в одной сети (например, ваш ноутбук и ваш телефон)
- Вы активировали беспроводную отладку на своем телефоне
После того, как вы подтвердите эти вещи, вам нужно перейти в меню разработчиков на вашем телефоне (там, где вы можете найти опцию беспроводной отладки). Войдите в это подменю и перейдите к опции «сопряжение с кодом». Появится всплывающее окно с определенными данными. Имея это в виду, вы идете в терминал и вводите эту команду:
abd pair <your-device-ip>:<device-port> <pairing-code>
После того, как это уже сделано, вы всегда будете видеть это устройство в списке устройств, когда будете выполнять adb devices на своем ноутбуке (если все пункты из контрольного списка выполнены)
В параметрах разработчика нажмите Беспроводная отладка -> Сопряжение устройства с кодом сопряжения.
И в терминале используйте предоставленный ip: порт и код для сопряжения вашего устройства
adb pair 192.168.1.171:42289
Затем в терминале вас попросят ввести код сопряжения (в данном случае 093044). После этого каждый раз, когда вы подключаетесь к Wi-Fi, если и ваш телефон, и компьютер подключены, а сервер adb активен, он будет подключаться автоматически
Очевидно, что ip: порт и коды сопряжения отличаются от этих снимков экрана.