簡體   English   中英

Matlab 服務器與樹莓派上的 python 客戶端 BrokenPipeError: [Errno 32] Broken pipe

[英]Matlab Server with python client on raspberry pi BrokenPipeError: [Errno 32] Broken pipe

我正在嘗試從連接到樹莓派的傳感器收集數據並將它們發送到我的筆記本電腦進行一些處理。 我寫了一個非常基本的 matlab 服務器(用於我的筆記本電腦)

t = tcpip('127.0.0.1', 42069, 'NetworkRole', 'server');
fopen(t);

flag = true;
while flag
        if t.BytesAvailable > 0
            t.BytesAvailable
            raw_data = fread(t, t.BytesAvailable);
            data = typecast(uint8(raw_data), 'double');
            current_x = data(1);
            current_y = a.cell_size*a.rows - data(2);
            current_th = -data(3);
            flag = false;
        end
end
.
.
.
fclose(t)

在我的 PI 上,我編寫了以下 class 來處理發送數據。

class LocalizationClient():

    #TCP_IP = '127.0.0.1'
    TCP_IP = '192.168.1.5'
    TCP_PORT = 42069
    BUFFER_SIZE = 1000
    # MESSAGE = "Hello, World!"
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    def __init__(self):
        self.s.connect((self.TCP_IP, self.TCP_PORT))
        print("connected to server")


    def sendData(self,MESSAGE):
        try:
            self.s.send(MESSAGE)
        except BrokenPipeError as e:
            print(e)
            self.close()
            raise RuntimeError()

在我的驅動程序代碼中,我創建了一個 object 並嘗試發送如下消息:

lo_c = lc.LocalizationClient()
lo_c.sendData(np.array([float(x), float(y), float(th)]))
.
.
.
for x in range(50):

    measures = lidar.measures
    measures = np.append([float(dx), float(dy), float(dth)], measures)

    lo_c.sendData(measures)
    time.sleep(.2)


當我只是在筆記本電腦上使用環回進行測試時,所有這些都工作得很好而且很漂亮,但是當我試圖把它放在 pi 上時,我在 python 客戶端收到以下錯誤:

連接到服務器 [Errno 32] 損壞 pipe

Traceback (most recent call last):
  File "/home/pi/Desktop/EXAMPLES/LocalizationClient.py", line 21, in sendData
    self.s.send(MESSAGE)
BrokenPipeError: [Errno 32] Broken pipe

似乎連接仍然有效,但是當我嘗試發送到服務器時,客戶端會引發錯誤。 服務器似乎很好,我還沒有嘗試將任何數據發送回客戶端。 一段時間以來,我一直在努力解決這個問題,我們將不勝感激。

如果有幫助,請附上有關網絡設置的一些詳細信息,我已將 pi 置於 ad-hoc 模式,IP 靜態分配為 192.168.1.1,並將我的 macbook 連接到它創建的網絡。 我的 Mac 分配了 static IP 192.168.1.5。

所以我想通了這個問題。 雖然我可以看到端口以 matlab TCPIP object 的工作方式打開,但它會默默地拒絕任何不是來自 IP 傳遞給構造函數的連接。 所以我能夠構建 object 來監聽端口上的連接。 在 python 端,我的客戶端會看到這個“連接”,但實際上服務器拒絕連接導致 pipe 損壞。 (這也是它在本地主機上運行良好但在遠程主機上運行良好的原因)

修復很容易,只需更改:

t = tcpip('127.0.0.1', 42069, 'NetworkRole', 'server');
fopen(t);

至:

t = tcpip('0.0.0.0', 42069, 'NetworkRole', 'server');
fopen(t);

這將允許 matlab 服務器接受來自 LAN 上指定端口上的任何 ip 的連接。 或者,可以為 matlab 服務器和客戶端 IP 提供僅接受來自一個設備的連接,但如果 IP 不是 ZA81259C56FBCZDF1DEF458E959C297ZE 可能會改變你。 禁用設備上的防火牆也很重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM