Files
esp32-core/libraries/WiFi/examples/WiFiUDPClient/udp_server.py
T
2026-05-22 21:52:50 +03:00

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()