Skip to main content

MQTT

Bridging networks

Meshtastic networks in different locations beyond the reach of LoRa can be easily bridged together using MQTT. The simplest option is to connect your mesh to the official Meshtastic MQTT broker. This makes your devices appear on the world map, and provides a copy of your mesh traffic, translated into JSON. All you have to do to join the public MQTT server is to Enable MQTT and set Uplink and Downlink on the channels that you want to share over MQTT. The default device configuration using the public MQTT Server is encrypted.

You can also share channel settings with a remote network. If you use the default Meshtastic MQTT server, packets are always encrypted. If you use a custom MQTT broker (ie set mqtt.address), the mqtt.encryption_enabled setting applies, which by default is false. You can also specify your own private MQTT broker and specify authentication for that broker to bridge several mesh networks together, via the internet (or just a local IP network).

You can find the settings available for MQTT here.

important

When MQTT is turned on, you are potentially broadcasting your entire mesh's traffic onto the public internet. This includes messages and position information.

Software Integrations

Using or emitting packets directly in/from smart home control software such as Home Assistant or other consumers that can work with JSON messages.

When MQTT is enabled, the Meshtastic device simply uplinks and/or downlinks every raw protobuf MeshPacket that it sees to the MQTT broker, encapsulated in a ServiceEnvelope protobuf. In addition, some packet types are serialized or deserialized from/to JSON messages for easier use in consumers. All packets are sent to the broker, whether they originate from another device on the mesh, or the gateway node itself.

MQTT Topics

If no specific root topic is configured, the default root topic will be msh/. Each device that is connected to MQTT will publish its MQTT state (online/offline) to:

msh/2/stat/USERID, where USERID is the node ID of the gateway device (the one connected to MQTT).

For each channel where uplink and/or downlink is enabled, two other topics might be used:

Protobufs topic

A gateway node will uplink and/or downlink raw (protobuf) MeshPackets to the topic:

msh/2/c/CHANNELNAME/USERID, where CHANNELNAME is the name of the channel.

For example: msh/2/c/LongFast/!abcd1234

The payload is a raw protobuf, whose definitions for Meshtastic can be found here. Reference guides for working with protobufs in several popular programming languages can be found here. Looking at the MQTT traffic with a program like mosquitto_sub will tell you it's working, but you won't get much useful information out of it. For example:

苓????"!
!937bed1cTanksTnk"D???05??=???aP`
ShortFast !937bed1c

If encryption_enabled is set to true, the payload of the MeshPacket will remain encrypted with the key for the specified channel.

JSON topic

If JSON is enabled, packets from the following port numbers are serialized to JSON: TEXT_MESSAGE_APP, TELEMETRY_APP, NODEINFO_APP, POSITION_APP, WAYPOINT_APP, and NEIGHBORINFO_APP. These are then forwarded to the topic:

msh/2/json/CHANNELNAME/USERID.

An example of a received NODEINFO_APP message:

{
"id": 452664778,
"channel": 0,
"from": 2130636288,
"payload": {
"hardware": 10,
"id": "!7efeee00",
"longname": "base0",
"shortname": "BA0"
},
"sender": "!7efeee00",
"timestamp": 1646832724,
"to": -1,
"type": "nodeinfo"
}

The meaning of these fields is as follows:

  • "id" is the unique ID for this message.
  • "channel" is the channel index this message was received on.
  • "from" is the unique node number of the node on the mesh that sent this message.
  • "id" inside the payload of a NODEINFO_APP message is the user ID of the node that sent it, which is currently just the hexadecimal representation of the node number.
  • "hardware" is the hardware model of the node sending the NODEINFO_APP message.
  • "longname" is the long name of the device that sent the NODEINFO_APP message.
  • "shortname" is the short name of the device that sent the NODEINFO_APP message.
  • "sender" is the user ID of the gateway device, which is in this case the same node that sent the NODEINFO_APP message (the hexadecimal value 7efeee00 represented by an integer in decimal is 2130636288).
  • "timestamp" is the Unix Epoch when the message was received, represented as an integer in decimal.
  • "to" is the node number of the destination of the message. In this case, "-1" means it was a broadcast message (this is the decimal integer representation of 0xFFFFFFFF).
  • "type" is the type of the message, in this case it was a NODEINFO_APP message.

The from field can thus be used as a stable identifier for a specific node. Note that in firmware prior to 2.2.0, this is a signed value in JSON, while in firmware 2.2.0 and higher, the JSON values are unsigned.

If the message received contains valid JSON in the payload, the JSON is deserialized and added as a JSON object rather than a string containing the serialized JSON.

Sent messages will be checked if the MQTT payload contains a valid JSON-encoded envelope:

{
"sender": "SENDER",
"payload": {
"key":"value"
...
}
}

sender and payload fields are required for a valid envelope. If a valid MQTT message is found, the message is sent over the radio as a message of type TEXT_MESSAGE_APP with the serialized payload value in the message payload.

Basic Configuration

Check out MQTT Settings for full information. For quick start instructions, read on.

  • Connect your gateway node to wifi, by setting the network.wifi_ssid, network.wifi_psk and network.wifi_enabled preferences.
  • Alternatively use the RAK4631 with Ethernet Module RAK13800, by setting network.eth_mode and network.eth_enabled.
  • Configure your broker settings: mqtt.address, mqtt.username, and mqtt.password. If all are left blank, the device will connect to the Meshtastic broker.
  • Set uplink_enabled and downlink_enabled as appropriate for each channel. Most users will just have a single channel (at channel index 0). meshtastic --ch-index 0 --ch-set uplink_enabled true

uplink_enabled will tell the device to publish mesh packets to MQTT. downlink_enabled will tell the device to subscribe to MQTT, and forward any packets from there onto the mesh.

Gateway nodes

Any meshtastic node that has a direct connection to the internet (either via a helper app or installed WiFi/4G/satellite hardware) can function as a "Gateway node".

Gateway nodes (via code running in the phone) will contain two tables to whitelist particular traffic to either be delivered toward the internet, or down toward the mesh. Users that are developing custom apps will be able to customize these filters/subscriptions.

Since multiple gateway nodes might be connected to a single mesh, it is possible that duplicate messages will be published on any particular topic. Therefore, subscribers to these topics should deduplicate if needed by using the packet ID of each message.

Optional web services

Public MQTT broker service

An existing public MQTT broker will be the default for this service, but clients can use any MQTT broker they choose.

Examples