python-mqtt-script auf raspberry pi zum senden und empfangen von Nachrichten

MQTT Frage:

Hallo, ich bin die versuchen, eine MQTT-Netzwerk zwischen mehreren Raspberry Pis (ab zwei).
Ich habe einen raspberry pi (RPi-A), MQTT-client, der mit einem thermistor sensor befestigt, und eine raspberry (RPi-B), MQTT-broker/Kunden und agiert als hub für mein Netzwerk.
Über python Skript würde ich gerne die Temperatur gesendet werden, alle 30 Minuten von RPi-via MQTT zum Thema sensor - /Daten-und erhielt von RPi-B.
Bei RPi-B erhält eine Nachricht von RPi-Ein Thema über sensoren/Daten, ich will es reagiert mit einer Anweisung über MQTT Thema sensor/Weisungen an die RPi-A.
Unten ist mein script, so weit RPi-Nachrichten senden können und RPi-B erhalten Sie, aber ich kann nicht herausfinden, wie die RPi-B reagieren kann.

Im Grunde, was ich versuche zu verstehen ist, ist es möglich, für einen MQTT-Gerät zu handeln, als beide broker und client gleichzeitig?
Und, kann ein client sowohl senden als auch empfangen und wenn ja wie die Umsetzung aller oben genannten via python?
Ich habe gelesen, viele blogs, offizielle MQTT Artikel und die paho-Modul-Dokumentation (das ist für mich sehr schwer zu ergründen), aber noch nicht herausfinden. Ihre Hilfe wäre sehr nützlich/geschätzt.

Code RPi-A ( mit thermistor-sensor):

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()
Was der eigentliche Fehler sehen Sie? Der code sieht ungefähr richtig (RPI-Eine nicht benötigen eine der MQTT-client-code vor den loop, wie Sie mit Hilfe publish.single) und den RPI-B code sieht ok aus auf den ersten Blick.
vielen Dank für die Beantwortung, ich möchte RPi-A zu erhalten mqtt-Nachrichten von RPi-B sowie senden Sie Sie, so dass ich dachte, ich bräuchte den client-mqtt-code. Ich bekomme nicht ein Fehler per se, sondern RPi-B nicht scheinen, um Nachrichten zu senden in Reaktion auf RPi-A.
Sorry, verpaßt etwas. Antwort

InformationsquelleAutor Tullio_IRL | 2016-05-03

Schreibe einen Kommentar