UDP透傳程序
本腳本用于在 設備 A 和 設備 B 之間建立 UDP 數據轉發橋梁,適用于 A 和 B 設備無法直接通信的情況。
流程:
A --> 電腦 (中繼) --> B
B --> 電腦 (中繼) --> A需要修改參數:
B_IP = “192.168.1.123” # 設備 B 的 IP
B_PORT = 37260 # 設備 B 監聽的端口
RELAY_A_PORT = 37260 # 筆記本監聽 A 設備的端口
- A 發送數據到 電腦 (UDP 端口 37260 )
- 電腦收到數據后,轉發給 B (UDP 端口 37260 )
- B 處理后返回數據給 電腦
- 電腦收到 B 的數據后,轉發給 A
系統:
- Linux / Windows
- Python 3.x
依賴庫:
- socket (Python 標準庫,無需額外安裝)
import socket
import select
from datetime import datetime
# 設備 A 和 B 的 IP 與端口, A為上游,B為下游,改腳本為中繼
# A_IP = "180.101.101.100" # 設備 A 的 IP
B_IP = "192.168.1.123" # 設備 B 的 IP
B_PORT = 37260 # 設備 B 監聽的端口
# 筆記本監聽 A 設備的端口
RELAY_A_PORT = 37260 # 筆記本監聽 A 設備的端口
RELAY_B_PORT = 7001 # 電腦用于發送數據到 B 的端口(固定,不用臨時端口)# 創建 UDP 套接字(監聽 A 的數據)
sock_a = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock_a.bind(("0.0.0.0", RELAY_A_PORT))# 創建 UDP 套接字(用于和 B 通信,固定端口)
sock_b = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock_b.bind(("0.0.0.0", RELAY_B_PORT))
sock_b.connect((B_IP, B_PORT)) # 連接 B,確保發送時使用固定端口# 記錄 A 設備的地址(用于返回數據)
a_address = Noneprint(f"UDP 中繼服務器啟動,監聽 {RELAY_A_PORT} 和 {RELAY_B_PORT} ...")while True:readable, _, _ = select.select([sock_a, sock_b], [], [])for sock in readable:data, addr = sock.recvfrom(1024)hex_data = data.hex() # 轉換為 hex 格式# if sock == sock_a and addr[0] == A_IP: # A 發送數據,轉發給 Bif sock == sock_a:a_address = addr # 記錄 A 的地址print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 從 A ({addr}) 收到數據: {hex_data}")sock_b.send(bytes.fromhex(hex_data)) # 直接發送(會用 `RELAY_B_PORT` 作為源端口)print(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 數據已通過端口 {RELAY_B_PORT} 轉發給 B")elif sock == sock_b and addr[0] == B_IP: # B 返回的數據,轉發給 Aprint(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 從 B ({addr}) 收到數據: {hex_data}")if a_address: # 確保 A 設備地址已記錄sock_a.sendto(bytes.fromhex(hex_data), a_address) # 發送回 Aprint(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] 數據已轉發給 A*********")