Connect to MQTT Broker

This chapter serves as a short tutorial how to connect to a MQTT broker. In this example we will be using a RabbitMQ docker image. For other MQTT brokers the example should only differ in the connection string (mainBrokerURL) and most, if not all, brokers which are supported by Eclipse Paho should be supported by structr.

Step 1: Install RabbitMQ

First we need to start a RabbitMQ docker instance. We select and modify one of the default docker images provided by RabbitMQ (https://hub.docker.com/_/rabbitmq)

We expose port 15675 to connect to it later locally.

$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 -p 5672:5672 -p 15675:15675 rabbitmq:3-management

Let’s assume the docker container id is 459dbf747dac. We need this in the next step.

Step 2: Install RabbitMQ Web MQTT plugin

First, we open a shell inside the docker container:

$ docker exec -it 459dbf747dac /bin/sh

Inside the container we now enable the necessary plugin:

# rabbitmq-plugins enable rabbitmq_web_mqtt

Step 3: Create MQTTClient and MessageSubscriber

In our structr instance we navigate to the data section and select the type MQTTClient.

We create a new object with the following attributes (the default settings for RabbitMQ)

mainBrokerURL = 'ws://localhost:15675/ws'
username = 'guest'
password = 'guest'

Afterwards we check the isEnabled checkbox which triggers the client to connect to the server. If everything is configured properly it will blink green - otherwise it will blink red and result in an error.

Then we select the type MessageSubscriber and create a new MessageSubscriber with the following attributes:

topic = '*'
callback = "{ $.log($.topic, ': ', $.message) }"

This instructs the subscriber to listen to any topic and simply log the messages to the server log. We could also forward the messages to any global schema method - for example handleIncomingMQTTMessage like this:

{
  $.call('handleIncomingMQTTMessage', { topic: $.topic, message: $.message });
}