Сервер Matlab с клиентом python на Raspberry Pi BrokenPipeError: [Errno 32] Сломанная труба

Я пытаюсь собрать данные с датчиков, подключенных к 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 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)


Все это работало нормально и денди, пока я просто тестировал петлю на своем ноутбуке, но когда я попытался поместить его на пи, я получаю следующую ошибку на стороне клиента 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 некоторые подробности о настройке сети, если это поможет, я перевел pi в режим ad-hoc с IP-адресом, статически назначенным как 192.168.1.1, и подключил свой macbook к созданной сети. Моему Mac назначен статический IP-адрес 192.168.1.5.


person Sami Wood    schedule 17.11.2019    source источник


Ответы (1)


Итак, я разобрался с проблемой. Хотя я мог видеть, что порт был открыт, объект TCPIP в Matlab работает так, что он молча отклоняет любое соединение, которое не исходит от IP-адреса, переданного в конструктор. Таким образом, я смог создать объект, который прослушивал соединение через порт. На стороне python мой клиент увидит это «соединение», но на самом деле сервер отказывался от соединения, вызывая разрыв канала. (именно поэтому он отлично работал на локальном хосте, но не на удаленном)

Исправить легко, просто измените:

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

to:

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

Это позволит серверу Matlab принимать соединение с любого IP-адреса в локальной сети на указанном порту. В качестве альтернативы можно предоставить серверу Matlab IP-адрес клиентов, чтобы принимать соединения только с одного устройства, но если IP-адрес не является статическим, он может измениться для вас. Также важно отключить брандмауэры на устройствах.

person Sami Wood    schedule 20.11.2019