Cygwin
Socat在多個程序之間共享串列連結
我有一個場景,同一個盒子上的多個程序想要與串列設備通信。程序A需要與串口進行雙向通信,程序B只需要能夠寫入串口即可。串列設備不斷噴出數據,而兩個程序定期寫入埠。環境是 Windows 上的 Cygwin(程序是 Windows 程序),但如果有人有僅 Linux 的解決方案,則可以將串列埠移動到 *nix 虛擬機。
我的“網路圖”如下:
/--<->--[Process A] [serial device]-ttyS0--<->--[socat]-udp-< \--<<<--[Process B]
我的第一次嘗試是使用 udp-recvfrom 和 fork 選項設置一個 socat 實例。這適用於第一個數據包 - 一個程序從 socat 分叉,將數據發送到串列設備,然後開始從串列設備讀回數據。但是,這個分叉的程序現在打開了串口進行讀寫,所以沒有更多的分叉成功啟動。
任何人都可以想出任何方法來讓它工作嗎?我可以想到以下途徑,但我還沒有找到使它們中的任何一個起作用的設置:
- 使用 socat 的 udp-recv 選項接收來自任何人的資訊,但要找到一種方法讓它向特定地址發送回复。
- 使用兩個單向 socat,一個用於寫入埠,一個用於從埠讀取。然後我需要一種方法將這兩個單向流組合成一個雙向流,但我不知道如何。
我找到了解決方案。它涉及到 4 個 socat 實例,排列在下面的網路圖中:
/-<-[A - udp receiver] <=udp= [D - udp sender]-<-\ ttyS0 <--> [B - serial adapter] [C - tcp adapter] <=tcp=> Process A \->-------------------------------------------->-/
- Socat “B” 與串列埠通信,在標準輸入上輸入並輸出到標準輸出。
- Socat “A” 監聽來自任何地方的 UDP 數據包,並通過標準輸出將它們輸出,然後通過管道將它們傳送到 socat “B”。
- Socat“C”監聽來自程序A的TCP連接。來自socat“A”的數據進入stdin並被路由到程序A。來自程序A的數據被發送到stdout到socat“D”。
- Socat “D” 從標準輸入獲取數據並通過 UDP 將其發送到 socat “A”。
程序 B 在要注入流量時向 socat “B” 發送 UDP 數據包。
創建這個怪物的 bash 命令如下:
socat -d -d -d -lpA_udp_rxr -u -T5 udp-recv:1111 - 2>>log.txt | socat -d -d -d -lpB_serial_adapter -t5 - /dev/ttyS0,raw 2>>log.txt | socat -d -d -d -lpC_tcp_adapter -T5 - tcp4-listen:3333 2>>log.txt | socat -d -d -d -lpD_udp_sender -u -T5 - udp:localhost:1111,sourceport=2222 2>>log.txt
這也將超時設置為 5 秒,並將大量詳細資訊記錄到“log.txt”中。為安全起見更換了埠號。