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()
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der einfachste Weg ist es, das Netzwerk zu starten-Schleife auf einem separaten thread mit den
client.loop_start()
- Funktion, dann verwenden Sie die normaleclient.publish
MethodeLassen Sie es wie es ist, für diesen Anwendungsfall ist es richtig
Vielen Dank für das ans. Dieser arbeitete für mich als auch
InformationsquelleAutor hardillb