agrobot_base/Python/ip_bridge/health.py

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)