Matlab Server with python client on raspberry pi BrokenPipeError: [Errno 32] Broken pipe
Matlab Server with python client on raspberry pi BrokenPipeError: [Errno 32] Broken pipe
我正在尝试从连接到 raspberry pi 的传感器收集数据,并将它们发送到我的笔记本电脑进行一些处理。我写了一个非常基本的 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()
在我的驱动程序代码中,我创建了一个对象并尝试像这样发送消息:
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] 管道损坏
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
似乎连接仍然有效,但当我尝试发送到服务器时,客户端抛出错误。服务器看起来很好,我还没有尝试将任何数据发送回客户端。一段时间以来,我一直在努力研究这个问题,我们将不胜感激。
ps 关于网络设置的一些细节,如果有用ps,我将 pi 置于临时模式,IP 静态分配为 192.168.1.1,并将我的 macbook 连接到网络它创造了。我的 Mac 分配了静态 IP 192.168.1.5.
所以我想通了这个问题。虽然我可以看到端口是打开的,但 matlab TCPIP 对象的工作方式是它会默默地拒绝任何不是来自传递给构造函数的 IP 的连接。所以我能够构建监听端口连接的对象。在 python 端,我的客户会看到这个 "connect" 但实际上服务器拒绝连接导致管道损坏。 (这也是它在本地主机上运行良好但在远程主机上运行良好的原因)
只需更改即可轻松修复:
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 不是静态的,那么它可能会因您而异。禁用设备上的防火墙也很重要。
我正在尝试从连接到 raspberry pi 的传感器收集数据,并将它们发送到我的笔记本电脑进行一些处理。我写了一个非常基本的 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()
在我的驱动程序代码中,我创建了一个对象并尝试像这样发送消息:
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] 管道损坏
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
似乎连接仍然有效,但当我尝试发送到服务器时,客户端抛出错误。服务器看起来很好,我还没有尝试将任何数据发送回客户端。一段时间以来,我一直在努力研究这个问题,我们将不胜感激。
ps 关于网络设置的一些细节,如果有用ps,我将 pi 置于临时模式,IP 静态分配为 192.168.1.1,并将我的 macbook 连接到网络它创造了。我的 Mac 分配了静态 IP 192.168.1.5.
所以我想通了这个问题。虽然我可以看到端口是打开的,但 matlab TCPIP 对象的工作方式是它会默默地拒绝任何不是来自传递给构造函数的 IP 的连接。所以我能够构建监听端口连接的对象。在 python 端,我的客户会看到这个 "connect" 但实际上服务器拒绝连接导致管道损坏。 (这也是它在本地主机上运行良好但在远程主机上运行良好的原因)
只需更改即可轻松修复:
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 不是静态的,那么它可能会因您而异。禁用设备上的防火墙也很重要。