python mqtt-Skript auf Himbeer-Pi zum Senden und Empfangen von Nachrichten

MQTT Frage:

Hi, ich versuche, ein MQTT-Netzwerk zwischen mehreren Raspberry Pis einzurichten (beginnend mit zwei). Ich habe einen Himbeer-Pi (RPi-A), einen MQTT-Client mit angeschlossenem Thermistorsensor und einen Himbeer-Pi (RPi-B), einen MQTT-Broker / Client, der als Hub für mein Netzwerk fungiert. Über Python-Skripte möchte ich, dass die Temperatur alle 30 Minuten von RPi-A über MQTT an die Themensensoren / -daten gesendet und von RPi-B empfangen wird. Wenn RPi-B eine Nachricht von RPi-A über Themensensor / Daten empfängt, möchte ich, dass RPi-A eine Anweisung über MQTT-Themensensor / Anweisungen erhält. Unten ist mein Skript, bisher kann RPi-A Nachrichten senden und RPi-B empfangen, aber ich kann nicht herausfinden, wie RPi-B reagieren kann.

Grundsätzlich versuche ich zu verstehen, ob ein MQTT-Gerät gleichzeitig als Broker und Client fungieren kann. Und kann ein Client sowohl Nachrichten senden als auch empfangen und wenn ja, wie kann er all das über Python implementieren? Ich habe viele Blogs, offizielle MQTT-Artikel und die Dokumentation zum paho-Modul gelesen (was für mich sehr schwer zu ergründen ist), kann dies aber immer noch nicht herausfinden. Ihre Hilfe wäre sehr nützlich / dankbar.

Code RPi-A (mit Thermistorsensor):

from sense_hat import SenseHat
import time
import paho.mqtt.client as mqtt
import paho.mqtt.publish as publish
sense = SenseHat()

Broker = "192.168.1.252"

sub_topic = "sensor/instructions"    # receive messages on this topic

pub_topic = "sensor/data"       # send messages to this topic


############### sensehat inputs ##################

def read_temp():
    t = sense.get_temperature()
    t = round(t)
    return t

def read_humidity():
    h = sense.get_humidity()
    h = round(h)
    return h

def read_pressure():
    p = sense.get_pressure()
    p = round(p)
    return p

def display_sensehat(message):
    sense.show_message(message)
    time.sleep(10)

############### MQTT section ##################

# when connecting to mqtt do this;

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

# when receiving a mqtt message do this;

def on_message(client, userdata, msg):
    message = str(msg.payload)
    print(msg.topic+" "+message)
    display_sensehat(message)

def publish_mqtt(sensor_data):
    mqttc = mqtt.Client("python_pub")
    mqttc.connect(Broker, 1883)
    mqttc.publish(pub_topic, sensor_data)
    #mqttc.loop(2) //timeout = 2s

def on_publish(mosq, obj, mid):
    print("mid: " + str(mid))


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


while True:
    sensor_data = [read_temp(), read_humidity(), read_pressure()]
    publish.single("monto/solar/sensors", str(sensor_data), hostname = Broker)
    time.sleep(1*60)

Code RPi-B (Netzwerk-Hub):

import time
import paho.mqtt.client as mqtt
import paho.mqtt.publish as publish

Broker = "192.168.1.252"

sub_topic = "sensor/data"    # receive messages on this topic

pub_topic = "sensor/instructions"               # send messages to this topic


# mqtt section

# when connecting to mqtt do this;

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

# when receiving a mqtt message do this;

def on_message(client, userdata, msg):
    message = str(msg.payload)
    print(msg.topic+" "+message)
    publish_mqtt(‘got your message’)

# to send a message

def publish_mqtt(sensor_data):
    mqttc = mqtt.Client("monto_hub")
    mqttc.connect(Broker, 1883)
    mqttc.publish(pub_topic, "this is the master speaking")
    #mqttc.loop(2) //timeout = 2s

def on_publish(mosq, obj, mid):
    print("mid: " + str(mid))


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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage