40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
import socket
|
|
import sys
|
|
import select
|
|
|
|
# 設定來源 IP 與 Port
|
|
SRC_IP = '127.0.0.1' # 監聽所有介面
|
|
SRC_PORT = 16661 # 請自行修改
|
|
|
|
# 建立 UDP 監聽 socket
|
|
src_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
src_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
src_sock.bind((SRC_IP, SRC_PORT))
|
|
print(f"Listening for UDP on {SRC_IP}:{SRC_PORT}")
|
|
|
|
# 設定目標 Unix socket 路徑
|
|
UNIX_SOCKET_PATH = '/tmp/unix_socket_mavlink.sock' # 請自行修改
|
|
|
|
# 建立 Unix socket 連線
|
|
unix_sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
|
try:
|
|
unix_sock.connect(UNIX_SOCKET_PATH)
|
|
except Exception as e:
|
|
print(f"Failed to connect to unix socket: {e}")
|
|
sys.exit(1)
|
|
|
|
while True:
|
|
# 使用 select 監聽兩個 socket
|
|
readable, _, _ = select.select([src_sock, unix_sock], [], [])
|
|
for sock in readable:
|
|
if sock is src_sock:
|
|
data, addr = src_sock.recvfrom(4096)
|
|
if data:
|
|
unix_sock.sendall(data)
|
|
# print(f"Received UDP data from {addr}: {data}") # debug
|
|
# break # debug
|
|
elif sock is unix_sock:
|
|
data = unix_sock.recv(4096)
|
|
if data:
|
|
# 回送到最近收到資料的 UDP client
|
|
src_sock.sendto(data, addr) |