125 lines
4.4 KiB
Python
125 lines
4.4 KiB
Python
# This python script listens on UDP port 3333
|
|
# for messages from the ESP32 board and prints them
|
|
import socket
|
|
import sys
|
|
import subprocess
|
|
import platform
|
|
|
|
|
|
def get_interface_ips():
|
|
"""Get all available interface IP addresses"""
|
|
interface_ips = []
|
|
|
|
# Try using system commands to get interface IPs
|
|
system = platform.system().lower()
|
|
|
|
try:
|
|
if system == "darwin" or system == "linux":
|
|
# Use 'ifconfig' on macOS/Linux
|
|
result = subprocess.run(["ifconfig"], capture_output=True, text=True, timeout=5)
|
|
if result.returncode == 0:
|
|
lines = result.stdout.split("\n")
|
|
for line in lines:
|
|
if "inet " in line and "127.0.0.1" not in line:
|
|
# Extract IP address from ifconfig output
|
|
parts = line.strip().split()
|
|
for i, part in enumerate(parts):
|
|
if part == "inet":
|
|
if i + 1 < len(parts):
|
|
ip = parts[i + 1]
|
|
if ip not in interface_ips and ip != "127.0.0.1":
|
|
interface_ips.append(ip)
|
|
break
|
|
elif system == "windows":
|
|
# Use 'ipconfig' on Windows
|
|
result = subprocess.run(["ipconfig"], capture_output=True, text=True, timeout=5)
|
|
if result.returncode == 0:
|
|
lines = result.stdout.split("\n")
|
|
for line in lines:
|
|
if "IPv4 Address" in line and "127.0.0.1" not in line:
|
|
# Extract IP address from ipconfig output
|
|
if ":" in line:
|
|
ip = line.split(":")[1].strip()
|
|
if ip not in interface_ips and ip != "127.0.0.1":
|
|
interface_ips.append(ip)
|
|
except (subprocess.TimeoutExpired, subprocess.SubprocessError, FileNotFoundError):
|
|
print("Error: Failed to get interface IPs using system commands")
|
|
print("Trying fallback methods...")
|
|
|
|
# Fallback: try to get IPs using socket methods
|
|
if not interface_ips:
|
|
try:
|
|
# Get all IP addresses associated with the hostname
|
|
hostname = socket.gethostname()
|
|
ip_list = socket.gethostbyname_ex(hostname)[2]
|
|
for ip in ip_list:
|
|
if ip not in interface_ips and ip != "127.0.0.1":
|
|
interface_ips.append(ip)
|
|
except socket.gaierror:
|
|
print("Error: Failed to get interface IPs using sockets")
|
|
|
|
# Fail if no interfaces found
|
|
if not interface_ips:
|
|
print("Error: No network interfaces found. Please check your network configuration.")
|
|
sys.exit(1)
|
|
|
|
return interface_ips
|
|
|
|
|
|
def select_interface(interface_ips):
|
|
"""Ask user to select which interface to bind to"""
|
|
if len(interface_ips) == 1:
|
|
print(f"Using interface: {interface_ips[0]}")
|
|
return interface_ips[0]
|
|
|
|
print("Multiple network interfaces detected:")
|
|
for i, ip in enumerate(interface_ips, 1):
|
|
print(f" {i}. {ip}")
|
|
|
|
while True:
|
|
try:
|
|
choice = input(f"Select interface (1-{len(interface_ips)}): ").strip()
|
|
choice_idx = int(choice) - 1
|
|
if 0 <= choice_idx < len(interface_ips):
|
|
selected_ip = interface_ips[choice_idx]
|
|
print(f"Selected interface: {selected_ip}")
|
|
return selected_ip
|
|
else:
|
|
print(f"Please enter a number between 1 and {len(interface_ips)}")
|
|
except ValueError:
|
|
print("Please enter a valid number")
|
|
except KeyboardInterrupt:
|
|
print("\nExiting...")
|
|
sys.exit(1)
|
|
|
|
|
|
try:
|
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
except socket.error as msg:
|
|
print("Failed to create socket. Error Code : " + str(msg[0]) + " Message " + msg[1])
|
|
sys.exit()
|
|
|
|
# Get available interfaces and let user choose
|
|
interface_ips = get_interface_ips()
|
|
selected_ip = select_interface(interface_ips)
|
|
|
|
try:
|
|
s.bind((selected_ip, 3333))
|
|
except socket.error as msg:
|
|
print("Bind failed. Error: " + str(msg[0]) + ": " + msg[1])
|
|
sys.exit()
|
|
|
|
print(f"Server listening on {selected_ip}:3333")
|
|
|
|
while 1:
|
|
d = s.recvfrom(1024)
|
|
data = d[0]
|
|
|
|
if not data:
|
|
break
|
|
|
|
print(data.strip())
|
|
|
|
s.close()
|