64 lines
2.0 KiB
Python
64 lines
2.0 KiB
Python
|
|
import socket
|
||
|
|
import psutil
|
||
|
|
import subprocess
|
||
|
|
|
||
|
|
base_ip = "192.168.1.10"
|
||
|
|
|
||
|
|
def descobrir_nic_para_rover() -> str | None:
|
||
|
|
"""
|
||
|
|
Descobre qual placa de rede (NIC) o sistema usaria para alcançar o rover.
|
||
|
|
Funciona mesmo se o nome da interface mudar de PC pra PC.
|
||
|
|
"""
|
||
|
|
|
||
|
|
try:
|
||
|
|
# Abre socket UDP só para descobrir o IP local usado na rota
|
||
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||
|
|
s.connect((base_ip, 80)) # porta não importa
|
||
|
|
local_ip = s.getsockname()[0]
|
||
|
|
s.close()
|
||
|
|
except Exception as e:
|
||
|
|
print("Erro ao descobrir IP local da rota:", e)
|
||
|
|
return None
|
||
|
|
|
||
|
|
# Agora, com o local_ip, encontrar qual NIC possui esse IP
|
||
|
|
addrs = psutil.net_if_addrs()
|
||
|
|
|
||
|
|
for nic_name, addr_list in addrs.items():
|
||
|
|
for addr in addr_list:
|
||
|
|
if addr.family == socket.AF_INET and addr.address == local_ip:
|
||
|
|
return nic_name
|
||
|
|
|
||
|
|
return None
|
||
|
|
|
||
|
|
def _ping_once() -> float | None:
|
||
|
|
"""
|
||
|
|
Retorna RTT em ms se ok, ou None se timeout.
|
||
|
|
Aqui exemplo pra Windows usando 'ping -n 1'.
|
||
|
|
Ajuste pro teu ambiente se precisar.
|
||
|
|
"""
|
||
|
|
try:
|
||
|
|
# timeout de 1000 ms
|
||
|
|
proc = subprocess.run(
|
||
|
|
["ping", "-n", "1", "-w", "1000", base_ip],
|
||
|
|
capture_output=True, text=True
|
||
|
|
)
|
||
|
|
if proc.returncode != 0:
|
||
|
|
return None
|
||
|
|
|
||
|
|
# Procura 'Tempo=XXms'
|
||
|
|
for line in proc.stdout.splitlines():
|
||
|
|
line = line.lower()
|
||
|
|
if ("tempo" in line or "time" in line) and "ms" in line:
|
||
|
|
# procura algo tipo 'tempo=34ms'
|
||
|
|
parts = line.replace("=", " ").replace("ms", " ").split()
|
||
|
|
for p in parts:
|
||
|
|
if p.isdigit():
|
||
|
|
return float(p)
|
||
|
|
return None
|
||
|
|
except Exception:
|
||
|
|
return None
|
||
|
|
|
||
|
|
ping = _ping_once()
|
||
|
|
print(ping)
|
||
|
|
nic = descobrir_nic_para_rover()
|
||
|
|
print("NIC encontrada:", nic)
|