Ereignisse mit PubSub veröffentlichen und abonnieren

Einleitung

Viele Ereignisse an der Materialsortieranlage (MSA) sind interessant in weiteren Anwendungszusammenhängen. Wenn bspw. eine Lichtschranke unterbrochen wird, muss das nicht nur ein wichtiges Ereignis für die Steuerung des Transportbandes sein. Auch andere Systeme können von dieser Information profitieren. So könnte bspw. ein Display an einem Microcontroller (Arduino, ESP8266 o.ä.) die Anzahl der Objekte anzeigen, die die Lichtschranke passiert haben. Dafür ist aber entscheidend, dass die Information von einem System (MSA) zum anderen (Microcontroller) gelangt.

In diesem Abschnitt soll es daher um ein robustes und weit verbreitetes Konzept gehen, das die Kommunikation zwischen Systemen übers Netzwerk ermöglicht: PubSub, für: Publish/Subcribe.

Grundlagen von PubSub verstehen

Eine gute Einführung in das Konzept bietet das folgende Video:

Video “Publisher Subscriber Pattern Real-Life Applications” auf YouTube ansehen

PubSub mit Python implementieren

Für den praktischen Einstieg in die Anwendung von PubSub brauchen Sie zwei Rechner im selben Netzwerk, auf denen Python ausgeführt werden kann.

Auf beiden Rechner ist zunächst die weit verbreitete Python-Unterstützung für PubSub ZMQ zu installieren:

$ pip install pyzmq

Rechner 1: Publisher

Der folgende Code macht den Rechner zu einem Publisher:

 1# publisher.py
 2import zmq
 3import time
 4import random
 5
 6def run_publisher():
 7    context = zmq.Context()
 8    socket = context.socket(zmq.PUB)
 9    socket.bind("tcp://*:5555")  # Binds to all network interfaces on port 5555
10    
11    print("Publisher started. Publishing messages...")
12    
13    # Simple message generator
14    topics = ["weather", "traffic", "news"]
15    
16    try:
17        while True:
18            topic = random.choice(topics)
19            message = f"Update for {topic}: {time.time()}"
20            print(f"Sending: {topic} {message}")
21            
22            # Format: topic message
23            socket.send_string(f"{topic} {message}")
24            
25            time.sleep(1)
26    except KeyboardInterrupt:
27        print("Publisher shutting down")
28        socket.close()
29        context.term()
30
31if __name__ == "__main__":
32    run_publisher()

Rechner 2: Subscriber

Der folgende Code macht den Rechner zu einem Subscriber:

 1# subscriber.py
 2import zmq
 3import sys
 4
 5def run_subscriber(topics=None):
 6    # Default to all topics if none specified
 7    if topics is None:
 8        topics = ["weather", "traffic", "news"]
 9    
10    context = zmq.Context()
11    socket = context.socket(zmq.SUB)
12    
13    # Connect to publisher
14    #socket.connect("tcp://localhost:5555")  # For local testing
15    socket.connect("tcp://publisher_ip:5555")  # For network testing
16    
17    # Subscribe to topics
18    for topic in topics:
19        socket.setsockopt_string(zmq.SUBSCRIBE, topic)
20    
21    print(f"Subscriber started. Listening for topics: {topics}")
22    
23    try:
24        while True:
25            message = socket.recv_string()
26            topic, data = message.split(' ', 1)
27            print(f"Received [{topic}]: {data}")
28    except KeyboardInterrupt:
29        print("Subscriber shutting down")
30        socket.close()
31        context.term()
32
33if __name__ == "__main__":
34    # If topics provided as command line arguments, use those
35    topics = sys.argv[1:] if len(sys.argv) > 1 else None
36    run_subscriber(topics)

Kommunkation testen

Um die Kommunikation zwischen beiden Rechnern zu testen, müssen Sie im Skript auf Rechner 2 noch die IP-Adresse von Rechner 1 eintragen. Dann starten Sie zunächst das Programm auf Rechner 1 und anschließend das auf Rechner 2.

Rechner 1

$ python publisher.py

Rechner 2

$ python subscriber.py weather

Der Parameter des Topics ist optional, ohne eine Angabe unterschreibt der Client für alle Topics des Publishers. Erfolgreich sind Sie, wenn Rechner 2 Nachrichten zum “weather” empfängt.

Aufgaben und Fragestellungen

  • Überlegen Sie: Wie müssen Programme für die MSA geschrieben werden, damit sie Ereignisse an interessierte Subscriber melden?
  • Auf welchen beteiligten Rechnern müssen die beiden Skriptteile für Pub und Sub laufen?
Zurück
Weiter