MQTT: Topics, Wildcards, & Best Practices | Part 5
Tags: iot, mqtt, beginners
Published: 2022-07-06 07:03:35

In this post, we focus on MQTT topics, wildcards, and best practices. 

## MQTT Topics

In MQTT, the word topic refers to an UTF-8 string that the broker uses to filter messages for each connected client. The topic consists of one or more topic levels. Each topic level is separated by a forward slash (topic level separator).

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7l99r0hv9vr02lc6g078.png)

In comparison to a message queue, MQTT topics are very lightweight. The client does not need to create the desired topic before they publish or subscribe to it. The broker accepts each valid topic without any prior initialization.

Here are some examples of topics:

```
myhome/groundfloor/livingroom/temperature
USA/California/San Francisco/Silicon Valley
5ff4a2ce-e485-40f4-826c-b1a5d81be9b6/status
Germany/Bavaria/car/2382340923453/latitude
```
Note that each topic must contain at least 1 character and that the topic string permits empty spaces. Topics are case-sensitive. For example, myhome/temperature and MyHome/Temperature are two different topics. Additionally, the forward slash alone is a valid topic.

## MQTT Wildcards
When a client subscribes to a topic, it can subscribe to the exact topic of a published message or it can use wildcards to subscribe to multiple topics simultaneously. A wildcard can only be used to subscribe to topics, not to publish a message. There are two different kinds of wildcards: single-level and multi-level.

## Single Level: +

As the name suggests, a single-level wildcard replaces one topic level. The plus symbol represents a single-level wildcard in a topic.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o0ysum0q4evs5synkvce.png)

Any topic matches a topic with single-level wildcard if it contains an arbitrary string instead of the wildcard. For example a subscription to myhome/groundfloor/+/temperature can produce the following results:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pw9jc5umyxgcr163whjf.png)

## Multi Level: #
The multi-level wildcard covers many topic levels. The hash symbol represents the multi-level wild card in the topic. For the broker to determine which topics match, the multi-level wildcard must be placed as the last character in the topic and preceded by a forward slash.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gexqs5smj8db6hzxz35m.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/691v50y4l6sjkdn213vo.png)
    
When a client subscribes to a topic with a multi-level wildcard, it receives all messages of a topic that begins with the pattern before the wildcard character, no matter how long or deep the topic is. If you specify only the multi-level wildcard as a topic (#), you receive all messages that are sent to the MQTT broker. If you expect high throughput, subscription with a multi-level wildcard alone is an anti-pattern (see the best practices below).

## Topics beginning with $
Generally, you can name your MQTT topics as you wish. However, there is one exception: Topics that start with a $ symbol have a different purpose. These topics are not part of the subscription when you subscribe to the multi-level wildcard as a topic (#). The $-symbol topics are reserved for internal statistics of the MQTT broker. Clients cannot publish messages to these topics. At the moment, there is no official standardization for such topics. Commonly, $SYS/ is used for all the following information, but broker implementations varies. One suggestion for $SYS-topics is in the MQTT GitHub wiki. Here are some examples:

```
$SYS/broker/clients/connected
$SYS/broker/clients/disconnected
$SYS/broker/clients/total
$SYS/broker/messages/sent
$SYS/broker/uptime
```
## Summary

These are the basics of MQTT message topics. As you can see, MQTT topics are dynamic and provide great flexibility. When you use wildcards in real-world applications, there are some challenges you should be aware of. We have collected the best practices that we have learned from working extensively with MQTT in various projects and are always open to suggestions or a discussion about these practices. 

## MQTT Best Practices When Using Wildcards
 

- Never use a leading forward slash
- Never use spaces in a topic
- Keep the MQTT topic short and concise
- Use only ASCII characters, avoid non printable characters
- Embed a unique identifier or the Client Id into the topic
- Don’t subscribe to #
- Don’t forget extensibility
- Use specific topics, not general ones
 
[Read this article to know the details of each best practices when using MQTT Wildcards.](https://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices/)

Watch this video to visually understand MQTT topics and wildcards.

{% embed https://youtu.be/juq_l70Vg1w %}

[Click here to read the original post](https://www.hivemq.com/blog/mqtt-essentials-part-5-mqtt-topics-best-practices/).

Get your copy of [MQTT Essentials eBook](https://www.hivemq.com/download-mqtt-ebook/?utm_source=content+syndication&utm_medium=devto&utm_campaign=MQTT+Essentials) to understand the protocol in detail without you having to read the entire specification.