Bridge Mosquitto MQTT messages to EMQ X

EMQ X nodes can be bridged by other types of MQTT broker to achieve cross-platform message subscription and post. In this article, we present a configuration example to illustrate how to configure the bridge from Mosquitto to EMQ X.

Mosquitto is a small, lightweight, open source MQTT Broker written in C/C++ language. Mosquitto uses a single core and single thread architecture to support embedded devices deployed in limited resources, access a small number of MQTT device terminals, and implement MQTT 5.0 and 3.1.1 protocols.

Both EMQ X and Mosquitto fully support the MQTT protocol feature, but EMQ X supports more communication protocols and private protocol access. In terms of functional extension of the application, Mosquitto lacks the out-of-the-box business-related functions, such as certification authentication, rules engine, data persistence and high-performance message bridging (EMQ X enterprise editions). In the aspect of monitoring operation, maintenance and visualization management, EMQX has full existing features and extended solution support. In terms of the basic function, Mosquitto clustering is weak, and neither official nor third-party clustering solutions can support the performance requirements of large-scale massive connectivity of IoT.

Therefore, Mosquitto is not suitable for the MQTT broker for large-scale services. However, since it is lightweight and compact, it can run on any low-power microcontroller including embedded sensors, mobile devices, embedded microprocessors, and message access at the edge of the Internet of Things. It is a better technology choice for edge message access in the IoT, and the message can be processed locally and passed to the cloud by combining bridging function

Scene description

Assuming we have an EMQ X server'emqx1'and a Mosquitto server, we need to create a bridge on Mosquitto to forward all ''sensor" topic messages to the'emqx1' server and subscribe to all "control" topics from EMQX.



Node Node name Listening port
emqx1 emqx1@ 1883


Address Listening port 1883

Configure Mosquitto MQTT server

Configuring Mosquitto's bridging requires modifying the mosquitto.conf file after installation. For each bridge, the basic content that needs to be configured is:

  • the address and port of the remote EMQ X server;
  • MQTT protocol parameters, such as protocol version, keepalive, clean_session, etc. (if not configured, the default value is used);
  • Client login information required by EMQ X;
  • the topic of the message that needs to be bridged;
  • Configure bridging topic mapping (no mapping by default).

Create a new MQTT bridge

Open the mosquitto.conf file and add a connection to create a new bridge. The string after the connection keyword is also the client id used on the remote node:

connection emqx1

Configure the address and port of the bridged remote node


Configure MQTT protocol version

The MQTT protocol version used by Mosquitto bridge defaults to 3.1, and the 3.1.1 protocol needs to be specified in the configuration for use.

bridge_protocol_version mqttv311

Configure the remote node username

remote_username user

Configure the remote node password

remote_password passwd

Specify MQTT topics that need to be bridged

The configuration format of the bridged topic is topic topic mode direction QoS local prefix remote prefix, which defines the rules for bridging forwarding and receiving. among them:

  • The topic mode specifies the topics that need to be bridged, supporting wildcards;
  • The direction can be in, out or both
  • QoS is the QoS level of the bridge. If not specified, the original QoS of the forwarded message is used.
  • Local and remote prefixes are used for topic mapping, with prefixes on the topic of the forwarded and received messages so that the application can identify the source of the message.

The following configuration example adds two bridging rules:

topic sensor/# out 1
topic control/# in 1

After the configuration is complete, Mosquitto needs to be restarted to make the bridge configuration take effect.

Configuring the EMQ X MQTT server

After the EMQ X MQTT server is installed, in order to make the Mosquitto bridge accessible, it is necessary to decide whether to configure the corresponding user certification and authentication information. Or in the experimental phase, in order to simplify testing, anonymous login is allowed and acl_nomatch can skip certification and authentication.

Test configuration

We use the mosquitto_sub and mosquitto_pub tools to test if the bridging configuration was successful.

Test the out direction of the bridge

Subscribe to the 'sensor/#' topic on 'emqx1', which will receive data reported by Mosquitto:

$ mosquitto_sub -t "sensor/#" -p 1883 -d -q 1 -h

Client mosqsub|19324-Zeus- sending CONNECT
Client mosqsub|19324-Zeus- received CONNACK
Client mosqsub|19324-Zeus- sending SUBSCRIBE (Mid: 1, Topic: sensor/#, QoS: 1)
Client mosqsub|19324-Zeus- received SUBACK
Subscribed (mid: 1): 1

Post a message on Mosquitto:

mosquitto_pub -t "sensor/1/temperature" -m "37.5" -d -h -q 1
Client mosqpub|19325-Zeus- sending CONNECT
Client mosqpub|19325-Zeus- received CONNACK
Client mosqpub|19325-Zeus- sending PUBLISH (d0, q1, r0, m1, 'sensor/1/temperature', ... (4 bytes))
Client mosqpub|19325-Zeus- received PUBACK (Mid: 1)
Client mosqpub|19325-Zeus- sending DISCONNECT

This message should be received on 'emqx1':

Client mosqsub|19324-Zeus- received PUBLISH (d0, q1, r0, m1, 'sensor/1/temperature', ... (4 bytes))
Client mosqsub|19324-Zeus- sending PUBACK (Mid: 1)

Test the in direction of the bridge

Subscribe to the 'control/#' topic on Mosquitto, which will receive messages posted on EMQ X:

$ mosquitto_sub -t "control/#" -p 1883 -d -q 1 -h
Client mosqsub|19338-Zeus- sending CONNECT
Client mosqsub|19338-Zeus- received CONNACK
Client mosqsub|19338-Zeus- sending SUBSCRIBE (Mid: 1, Topic: control/#, QoS: 1)
Client mosqsub|19338-Zeus- received SUBACK
Subscribed (mid: 1): 1

Post a message on 'emqx1', the message will be passed on 'emqx1' and bridged to Mosquitto local:

$ mosquitto_pub -t "control/1" -m "list_all" -d -h -q 1
Client mosqpub|19343-Zeus- sending CONNECT
Client mosqpub|19343-Zeus- received CONNACK
Client mosqpub|19343-Zeus- sending PUBLISH (d0, q1, r0, m1, 'control/1', ... (8 bytes))
Client mosqpub|19343-Zeus- received PUBACK (Mid: 1)
Client mosqpub|19343-Zeus- sending DISCONNECT

This message should be received on Mosquitto:

Client mosqsub|19338-Zeus- received PUBLISH (d0, q1, r0, m2, 'control/1', ... (8 bytes))
Client mosqsub|19338-Zeus- sending PUBACK (Mid: 2)
Did you like this blog post? Share it now

Related Posts

MQTT X Guideline

MQTT X is suitable for users who are building their own MQTT message server to test connections, subscribing and publishing messages, etc. When using a client, the user can be either a publisher or a subscriber.

EMQ X plugin persistence series (5) - MySQL MQTT data storage

This article uses the practical example in `CentOS 7.2` to illustrate how to store related MQTT data through MySQL.

EMQ X Rule Engine Series (8) Bridging Messages to MQTT Broker

Bridge is a way to connect multiple EMQ X or other MQTT message middleware. Unlike clusters, topic trees and routing tables are not replicated between nodes operating in bridge mode.