Python MQTT Опубликовать JSONified Numpy Array - PullRequest
0 голосов
/ 19 ноября 2018

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

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

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

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 Ответ

0 голосов
/ 19 ноября 2018

В коде публикации вы фактически не предоставляете клиенту время для обработки сообщения, которое он пытается отправить.Это еще большая проблема, потому что сообщение, вероятно, будет больше, чем один сетевой пакет (являющийся изображением).Чтобы исправить это, вы должны вызвать функцию цикла клиента 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...