получить эмулятор Ip для подключения к эмулятору Android (virtualbox) - PullRequest
0 голосов
/ 03 февраля 2019

Моя операционная система - Windows 10.

Я использую Android x86 в своем эмуляторе.

Я использовал virtualbox в качестве эмулятора, и сеть virtualbox настроена на:

-Адаптер моста (тип подключения)

-Intel (R) двухдиапазонный беспроводной-AC 3168 (имя)

-Intel PRO / 1000 МТ для настольных ПК (8254OEM) -> (тип адаптера)

-Allow All (Случайный режим)

Я установил, что из-за этого набора работает, чтобы мой эмулятор подключался к Интернету.

Я использую python для запуска скрипта, который используетэмулятор.

проблема в том, что когда я использую другую сеть, IP-адрес эмулятора меняется ..

, поэтому некоторая часть моего кода не работает, когда я меняю сеть, которую я использую, код:

from subprocess import Popen, PIPE
import os

ip_emulator ='192.168.100.15' #the ip got from "ALT + F1" and type ipconfig on emulator
fileadb = 'adb.exe'
pathsys32 = r'C:\Users\admin\AppData\Local\Android\Sdk\platform-tools'
adb = os.path.join(pathsys32, fileadb)
cek = Popen([adb, 'connect', ip_emulator], stdout=PIPE, stderr=PIPE)

из-за изменения ip в эмуляторе, вызванного изменением моей сети, которую я использовал (например, переход с домашней сети на офисную или на мобильный модем).

Я должен сделать код, чтобы обнаружить IP-эмулятор, чтобы убедиться, что мой ADB подключен кэмулятор.

как это сделать?вывести его за пределы эмулятора с помощью python, не входя в эмулятор (например, нажмите ALT + F1 и введите ifconfig).

Я уже пробую использовать: "arp -a", но иногда ip-шоу иногда нет.

уже попробуйте "netstat -a" без эмулятора ip показать там

код для обнаружения через arp:

from subprocess import Popen, PIPE
import os
import re

arpfile = 'ARP.EXE'
fileadb = 'adb.exe'
pathsys32 = r'C:\Windows\System32'
arp = os.path.join(pathsys32, arpfile)
adb = os.path.join(pathsys32, fileadb)

def detectiparp():
    cek = Popen([arp, '-a'], stdout=PIPE, stderr=PIPE)
    out, err = cek.communicate()
    outdata = (out.decode('utf-8')).split('\n')
    for i in outdata:
        mac = '08-00-27-ce-9e-8c'
        rexmac = re.search(mac, i)
        if rexmac:
            ipre = '([0-9]{0,}\.[0-9]{0,}\.[0-9]{0,}\.[0-9]{0,})\s.+?08-00-27-ce-9e-8c'
            iprex = re.search(ipre, i)
            ip_emu = iprex.group(1)
            return ip_emu
        else:
            return False

ip_emulator = detectiparp()

cek = Popen([adb, 'connect', ip_emulator], stdout=PIPE, stderr=PIPE)

Я уже прочитал:

Как получить IP-адрес эмулятора Android?

Как подключиться к AVD

Как получить IP-адресэмулятор для связи с локальным сервером

, и я думаю, что весь ответ "получить свой эмулятор IP из эмулятора" или "использовать набор IP по умолчанию (10.0.2.2)"

Итак, я объяснил кое-что, IP 10.0.2.2 происходит только в том случае, если тип подключения, который я использую в virtualbox, является типом NAT, но с этим параметром мой эмулятор не может подключиться к Интернету.

Уже попробуйте использовать:

1-ую сеть, установленную как NAT, и 2-ую сеть, установленную как Bridge, но IP-адрес меняется на класс C (192.169.xx), и IP-адрес эмулятора все еще изменяется, если я используюдругая сеть.

если я знаю, как определить IP-адрес моего эмулятора (с хоста / ноутбука / вне моего эмулятора), я могу создать код или есть модуль python, который я могу использовать для его обнаружения?

1 Ответ

0 голосов
/ 06 февраля 2019

хорошо, два дня и нет ответа ...

и все вопросы с одинаковым вопросом, все еще нет ответа ....

Я уже нашел ответ, поэтому я делюсь имздесь ... кто-нибудь помог с моим ответом, пожалуйста, дайте мне оценку ...

инструменты для обнаружения эмулятора снаружи эмулятора использует 'arp -a', но прежде чем сделать это, мы должны сначала пропинговать эмуляторчтобы команда 'arp -a' дала результат.

, поэтому я делаю скрипт, который автоматически делает это каждый раз, когда я включаю свой скрипт.

мои настройки эмулятора уже объясняли ранее, что яЯ не объясняю, я включаю свой эмулятор в режиме без головы ...

это мой сценарий:

from __future__ import print_function
import os
import time
import re
from subprocess import Popen, PIPE
from io import StringIO
from contextlib import redirect_stdout
import ipaddress as ipaddr
import socket

pathvbox = r'C:\Program Files\Oracle\VirtualBox'
pathadb = r'C:\Users\admin\AppData\Local\Android\Sdk\platform-tools'
fileadb = 'adb.exe'
filevboxmanage = 'VBoxManage.exe'
adb = os.path.join(pathadb, fileadb)
vbmanage = os.path.join(pathvbox, filevboxmanage)

arpfile = 'ARP.EXE'
pathsys32 = r'C:\Windows\System32'
arp = os.path.join(pathsys32, arpfile)

pathpy3 = r'C:\Users\admin\AppData\Local\Programs\Python\Python37'
py3file = 'python3.exe'
python3 = os.path.join(pathpy3, py3file)

def startemulator():
#function to run emulator in headless (Android x86)
    cek = Popen([vbmanage, 'startvm', 'andro', '--type', 'headless'], stdout=PIPE, stderr=PIPE)
    time.sleep(5)

def killemulator():
    #function to shutdown emulator in savestate condition
    sstate = Popen([vbmanage, 'controlvm', 'andro', 'savestate'], stdout=PIPE, stderr=PIPE)
    shutdown = Popen([vbmanage, 'controlvm', 'andro', 'savestate', 'shutdown', '/s', '/t', '10'], stdout=PIPE, stderr=PIPE)
    out, err = shutdown.communicate()

def ping(str):
    p1 = Popen(['ping', '-c', '3', str], stdout=PIPE, stderr=PIPE)
    p1.communicate()

def get_own_ip():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(("8.8.8.8", 80))
    return s.getsockname()[0]

def ping_all_ip():
    ipnow = get_own_ip()
    inet = ipaddr.ip_interface(ipnow + '/24')
    allip = inet.network
    f = StringIO()
    with redirect_stdout(f):
        for ip in allip:
            print(ip)
        all_ip = f.getvalue().split('\n')

    for ip in all_ip:
        ping(ip)

def detectiparp():
    cek = Popen([arp, '-a'], stdout=PIPE, stderr=PIPE)
    out, err = cek.communicate()
    outdata = (out.decode('utf-8')).split('\n')
    for i in outdata:
        mac = '(08-00-27-ec-9c-8e)' #put your mac address here
        rexmac = re.search(mac, i)
        if rexmac:
            ipre = '([0-9]{0,}\.[0-9]{0,}\.[0-9]{0,}\.[0-9]{0,})\s.+?' + mac
            iprex = re.search(ipre, i)
            iponline = iprex.group(1)
        else:
            pass

    try:
        if iponline:
            return iponline
        else:
            return False
    except:
        return False

def detectip():
    while True:
        ping_all_ip()
        try:
            ipis = detectiparp()
            if ipis:
                break
        except:
            continue
    return ipis

def turnonADB():
    ip_emu = detectip()
    while True:
        cek = Popen([adb, 'connect', ip_emu], stdout=PIPE, stderr=PIPE)
        out, err = cek.communicate()
        outstring = out.decode('utf-8')
        try:
            failed = re.search('failed', outstring)
            if not failed:
                break
        except:
            continue

if __name__ == '__main__':
    startemulator()
    turnonADB()

Вот и все ...

что яdo is ....:

просто определите мой ip ...

, затем преобразуйте его в cidr / 24,

, затем извлеките его снова,

ping all ip, который извлечен

после ping всех ip в моей сети, включите команду 'arp -a'.

, потому что эмулятору требуется некоторое время для 'activate / turn on / live ', поэтому при пинге ip эмулятора есть шанс, что он не активируется / не отвечает, поэтому этот скрипт автоматически повторно обрабатывает ping и вызывает его в arp -a.

if'arp -a 'все еще не показан mac-адрес эмулятора, значит, эмулятор находится в процессе включения.

ура ... надеюсь, кому-нибудь нужен ответ.

admin может закрыть этот вопрос.... спасибо ....

...