Khanh Tran
Khanh Tran

Reputation: 87

MQTT communication with multiple clients

I'm implementing MQTT clients communication among cart, elevator, and mobile. The sample scenario is that the cart will take the document at room 331 and give to room 442 through elevator and mobile.

I want to declare 3 clients in one python file, but the built-in functions from Paho MQTT on_connect, on_message,... are only available for "one" client. Hence, in my case only cart client works and my console shows like this:

Cart connected with result code 0
cart/status b'ON'
cart/room/starting_room_number b'331'

Can you please help me how to make 3 clients interact with each other ? This is my mqtt.py code file:

import paho.mqtt.client as mqtt 
import time

### Cart definition
def on_connect(client, obj, flags, rc):
    if rc == 0:
        print("Cart connected with result code " + str(rc))
    else:
        print("Bad connection returned code = ", rc)

def on_message(client, obj, msg):
    print(msg.topic + " " + str(msg.payload))

cart = mqtt.Client()
mobile = mqtt.Client()
elevator = mqtt.Client()

cart.on_connect = on_connect
cart.on_message = on_message

cart.connect("test.mosquitto.org", 1883, 60)
mobile.connect("test.mosquitto.org", 1883, 60)
elevator.connect("test.mosquitto.org", 1883, 60)

###(1)Call dolly
cart.subscribe("cart/status")
mobile.publish("cart/status", "ON")
time.sleep(1)

###(2)Get starting room number
cart.subscribe("cart/room/starting_room_number")
mobile.publish("cart/room/starting_room_number", "331")
time.sleep(1)

###(3)Call elevator
elevator.subscribe("elevator/status")
cart.publish("elevator/status", "ON")
time.sleep(1)

###(4)Enter floor
elevator.subscribe("elevator/starting_floor_number")
cart.publish("elevator/starting_floor_number", "3")
time.sleep(1)

###(5)Take document
mobile.subscribe("cart/document_status")
cart.publish("cart/document_status", "TAKEN")

###(6)Get destination room number
cart.subscribe("cart/room/destination_room_number")
mobile.publish("cart/room/destination_room_number", "442")

###(7)Call elevator
elevator.subscribe("elevator/status")
cart.publish("elevator/status", "ON")

###(8)Enter floor
elevator.subscribe("elevator/destination_floor_number")
cart.publish("elevator/destination_floor_number", "4")

###(9)Take document
mobile.subscribe("cart/document_status")
cart.publish("cart/document_status", "GIVEN")

cart.loop_forever()
# mobile.loop_forever()
# elevator.loop_forever()

Upvotes: 1

Views: 8325

Answers (1)

hardillb
hardillb

Reputation: 59791

You can declare alternate functions for each client:

...
def on_connect_cart(client, obj, flags, rc):
    if rc == 0:
        print("Cart connected with result code " + str(rc))
    else:
        print("Bad connection returned code = ", rc)

def on_message_cart(client, obj, msg):
    print(msg.topic + " " + str(msg.payload))


def on_connect_mobile(client, obj, flags, rc):
    if rc == 0:
        print("Cart connected with result code " + str(rc))
    else:
        print("Bad connection returned code = ", rc)

def on_message_mobile(client, obj, msg):
    print(msg.topic + " " + str(msg.payload))
cart = mqtt.Client()
mobile = mqtt.Client()
elevator = mqtt.Client()

cart.on_connect = on_connect_cart
cart.on_message = on_message_cart
mobile.on_connect = on_connect_mobile
mobile.on_message = on_message_mobile
...

Upvotes: 1

Related Questions