Использование MQTT с сервером потоковой передачи HTTP

#python #http #streaming #mqtt #raspberry-pi3

#python #http #потоковая передача #mqtt #raspberry-pi3

Вопрос:

Я пытаюсь использовать MQTT для получения сообщений при использовании потокового HTTP-сервера для потоковой передачи моей picamera на мой порт 5000 в том же файле. Это приводит к тому, что мой MQTT довольно нестабилен, и он не может вовремя получать сообщения. Могу ли я узнать, у кого-нибудь есть решение для этого? Спасибо.

Код MQTT

 def on_connect(client,rc):
    if rc == 0:
        global Connected                
        Connected = True                 
        client.subscribe("picam/show")

def on_message(client, userdata, message):
    global capture_image
    data = message.payload.decode("utf-8").replace("'", '"')
    d = json.loads(data)

    if d["action"] == "take pic":
        try:
            capture_image()
        except Exception as e:
            print(e)

client = mqttClient.Client("picam")  
client.on_connect= on_connect  
client.connect(broker_address, port=1884)      

# edited here to change loop_forever to loop_start 
client.loop_start()   
  

Потоковый HTTP-код

 output = StreamingOutput()
camera.start_recording(output, format='mjpeg')
try:
    address = ('', 5000)
    server = StreamingServer(address, StreamingHandler)
    server.serve_forever()
finally:
    camera.stop_recording()
  

Комментарии:

1. Кажется, у вас есть два цикла событий. Как вы запускаете оба?

2. @KlausD. Цикл клиентских событий навсегда запускается с помощью client.loop_forever(), а сервер запускается с помощью server.serve_forever(). Не уверен, что это из-за этих 2 циклов, которые вызывают нестабильность

3. Если вы запустите одну из команд цикла событий, ваш код не вернется из нее. Итак, как добраться до другого? Ваши два отдельных блока кода не показывают, как они выполняются в комбинации.

4. @KlausD. О, извините, вместо loop_forever я использовал loop_start(). Однако он по-прежнему кажется довольно нестабильным, и некоторые пакеты mqtt время от времени отбрасываются. Знаете ли вы, может ли он одновременно передавать потоки mqtt и http? Большое вам спасибо за вашу помощь!

Ответ №1:

Удалось решить это с помощью многопоточности 🙂 ! На всякий случай, если кто-то также сталкивается с этой проблемой