Search code examples
pythonmqttmosquittopaho

How to test the python paho mqtt with mosquitto?


I want to test the mosquitto MQTT Python client ports.

import json

import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    """Called when connected to MQTT broker."""
    client.subscribe("hermes/intent/#")
    client.subscribe("hermes/nlu/intentNotRecognized")
    print("Connected. Waiting for intents.")

def on_disconnect(client, userdata, flags, rc):
    """Called when disconnected from MQTT broker."""
    client.reconnect()

def on_message(client, userdata, msg):
    """Called each time a message is received on a subscribed topic."""
    nlu_payload = json.loads(msg.payload)
    if msg.topic == "hermes/nlu/intentNotRecognized":
        sentence = "Unrecognized command!"
        print("Recognition failure")
    else:
        # Intent
        print("Got intent:", nlu_payload["intent"]["intentName"])

        # Speak the text from the intent
        sentence = nlu_payload["input"]

    site_id = nlu_payload["siteId"]
    client.publish("hermes/tts/say", json.dumps({"text": sentence, "siteId": site_id}))


# Create MQTT client and connect to broker
client = mqtt.Client()
client.on_connect = on_connect
client.on_disconnect = on_disconnect
client.on_message = on_message

client.connect("localhost", 1883)
client.loop_forever()

I run it with the command

$ python script.py` 
Connected. Waiting for intents.

Does mosquitto send a POST request? or do I have to start a request with mosquitto? How should I create a request so that I get

Got intent: SetTimer

Solution

  • MQTT is not HTTP, POST is a HTTP verb that has no meaning in a MQTT context.

    MQTT is a pub/sub protocol, where as HTTP is a request/response protocol.

    The code you have posted only subscribes to 2 topics, it doesn't publish anything (until it receives a message). So unless you have another application that will publish a message to 1 of the 2 topics the python code has subscribed to it will just sit there and wait for a message.

    You can use the mosquitto command line tools to send a message if needed. e.g.

    mosquitto_pub -t hermes/intent/foo -m '{"intent": { "intentName": "SetTimer"}}'