Python MQTT Опубликовать JSONified Numpy Array

В настоящее время я использую протокол MQTT, который будет использоваться между двумя малиновыми pis. Первый - это Pi 0 и к нему подключается pi-камера. Он будет преобразовывать каждый захваченный кадр в массив numpy и затем публиковать его на главном Pi, который затем преобразует массив numpy в изображение с помощью PIL. Я делаю это так, так как хочу, чтобы основные операции обработки изображений выполнялись на главном Pi.

Моя проблема заключается в том, что никакие сообщения не принимаются мастером Pi. Я предварительно отлаживал отладку, и все отлично работает на скрипте servant. Но почему-то хозяин Пи ничего не получил.

Вот оба сценария:

servant.py:

import paho.mqtt.client as mqtt
import time
import cv2
import numpy
import json

MQTT_SERVER = "iot.eclipse.org"
MQTT_PATH = "test_channel"

mqttc = mqtt.Client()
mqttc.connect(MQTT_SERVER, 1883, 60)

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    frame_list = frame.tolist()
    MQTT_MESSAGE = json.dumps(frame_list)
    mqttc.publish(MQTT_PATH, MQTT_MESSAGE)
    time.sleep(1)

master.py:

import paho.mqtt.client as mqtt
import numpy as np
import json
import PIL

MQTT_SERVER = "iot.eclipse.org"
MQTT_PATH = "test_channel"

def on_connect(client, userdata, flags, rc):
    print("connected with result code " + str(rc))
    client.subscribe(MQTT_PATH)

def on_message(client, userdata, msg):
    data = json.loads(msg.payload)
    array = np.array(data)
    img = PIL.Image.fromarray(array)
    cv2.imshow('image', img)
    cv2.waitKey()

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect(MQTT_SERVER, 1883, 60)

client.loop_forever()

Всего 1 ответ


В вашем издательском коде вы фактически не даете клиенту обработать сообщение, которое оно пытается отправить. Это еще больше проблема, потому что сообщение, вероятно, будет больше, чем один сетевой пакет (являющийся изображением). Чтобы исправить это, вы должны вызвать функцию цикла клиента MQTT (или запустить цикл в b

import paho.mqtt.client as mqtt
import time
import cv2
import numpy
import json

MQTT_SERVER = "iot.eclipse.org"
MQTT_PATH = "test_channel"

mqttc = mqtt.Client()
mqttc.connect(MQTT_SERVER, 1883, 60)

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    frame_list = frame.tolist()
    MQTT_MESSAGE = json.dumps(frame_list)
    mqttc.publish(MQTT_PATH, MQTT_MESSAGE)
    mqttc.loop()
    time.sleep(1)

или вот так:

import paho.mqtt.client as mqtt
import time
import cv2
import numpy
import json

MQTT_SERVER = "iot.eclipse.org"
MQTT_PATH = "test_channel"

mqttc = mqtt.Client()
mqttc.connect(MQTT_SERVER, 1883, 60)

cap = cv2.VideoCapture(0)

mqttc.start_loop()

while True:
    ret, frame = cap.read()
    frame_list = frame.tolist()
    MQTT_MESSAGE = json.dumps(frame_list)
    mqttc.publish(MQTT_PATH, MQTT_MESSAGE)
    time.sleep(1)

Есть идеи?

10000