This guide will help you to get familiar with MQTT Connector configuration for ThingsBoard IoT Gateway.
Use general configuration to enable this Connector.
The purpose of this Connector is to connect to an external MQTT broker and subscribe to data feed from devices.
The connector is also able to push data to MQTT brokers based on the updates/commands from ThingsBoard.
This connector is useful when you have local MQTT broker in your facility or corporate network, and you would like to push data from this broker to ThingsBoard.
We will describe connector configuration file below.
Please note: If you are new to IoT Gateway, use the “Basic” configuration mode. If you are familiar with configuring IoT Gateway, you can use the “Advanced” configuration mode.
Connector configuration
Connector configuration is a UI form that contains information about how to connect to external MQTT broker, what topics to use when subscribing to data feed and how to process the data.
Let’s take a comprehensive look at all the possible settings. We will go through each option in detail to ensure that we thoroughly understand their functions and implications.
By doing so, we can make well-informed decisions about which settings will best suit our needs and preferences.
Section “General”
This configuration section contains general connector settings, such as:
Name - connector name for logs and saving to persistent devices;
Logs configuration:
Enable remote logging - enabling remote logging for connector;
Logging level - logging level for local and remote logs: INFO, DEBUG, WARNING, ERROR, CRITICAL, NONE;
Send data only on change - sending only if data changed from last check, if not – data will be sent after every check.
The settings are the same for both the basic and advanced configurations.
Section “Connection to broker”
Section “Connection to broker” offers detailed connection configuration options and contains several important fields, including host, port, MQTT version, client ID, and security settings.
The host field specifies the address of the broker, while the port field indicates the communication port.
The MQTT version field ensures compatibility with the protocol version being used.
The client ID uniquely identifies the client, and the security settings provides configuration for client authorization at MQTT Broker.
Anonymous auth is the most simple option. It is useful for testing on public MQTT brokers, like test.mosquitto.org.
One type of security configuration is basic. For authorization, a combination of username and password provided in this section, in config will be used.
The table below describes the parameters required to configure authorization on MQTT broker.
Anonymous auth is the most simple option. It is useful for testing on public MQTT brokers, like test.mosquitto.org.
Parameter
Default value
Description
type
anonymous
Type of authorization.
Security subsection in configuration file will look like this:
1
2
3
"security":{"type":"anonymous"}
One type of security configuration is basic.
For authorization, a combination of username and password provided in this section, in config will be used.
Parameter
Default value
Description
type
basic
Type of authorization.
username
username
Username for authorization.
password
password
Password for authorization.
Security subsection in configuration file will look like this:
This configuration section contains an array of topics that the gateway will subscribe to after connecting to the broker, along with settings about processing incoming messages (converter).
For adding new data mapping, click the “plus” icon:
Opened modal window provide the following fields: topic filter, QoS, payload type:
The Topic filter - topic address for subscribing. The Topic filter supports special symbols: ‘#’ and ‘+’, allowing to subscribe to multiple topics.
Also, MQTT connector supports shared subscriptions.
To create shared subscription you need to add “$share/” as a prefix for topic filter and shared subscription group name.
For example to subscribe to the my-shared-topic in group my-group-name you can set the topic filter to “$share/my-group-name/my-shared-topic”.
MQTT Quality of Service (QoS) is an agreement between the message sender and receiver that defines the level of delivery guarantee for a specific message. (0-At most once, 1-At least once, 2-Exactly once)
Parameter
Default value
Description
topicFilter
sensor/data
Topic address for subscribing.
QoS
1
An agreement between the message sender and receiver that defines the level of delivery guarantee for a specific message. (0-At most once, 1-At least once, 2-Exactly once)
The topicFilter supports special symbols: ‘#’ and ‘+’, allowing to subscribe to multiple topics.
Also, MQTT connector supports shared subscriptions.
To create shared subscription you need to add “$share/” as a prefix for topic filter and shared subscription group name.
For example to subscribe to the my-shared-topic in group my-group-name you can set the topic filter to “$share/my-group-name/my-shared-topic”.
Let’s assume we would like to subscribe and process the following data from Thermometer device:
Converter for this payload type processes MQTT messages in JSON format.
It uses JSON Path expressions to extract vital details such as device names, device profile names, attributes, and time series from the message.
And regular expressions to get device details from topics.
Select “JSON” payload type, and fill in the fields in the “Device” section. Then click “pencil” icon of the “Attributes” section to add new attribute key;
In the opened window click “Add attribute”. Enter the key name, select the type and enter the value of the key. Click “Apply”;
Now click on the “pencil” icon of the “Time series” section to add new time series key;
In the opened window click “Add time series”. Enter the key name, select the type and enter the value of the key. Click “Apply”;
Click “Add”.
Converter for this payload type designed for binary MQTT payloads, this converter directly interprets binary data to retrieve device names and device profile names, along with attributes and time series, using specific byte positions for data extraction.
Select “Bytes” payload type, and fill in the fields in the “Device” section. Then click “pencil” icon of the “Attributes” section to add new attribute key;
In the opened window click “Add attribute”. Enter the key name, select the type and enter the value of the key. Click “Apply”;
Now click on the “pencil” icon of the “Time series” section to add new time series key;
In the opened window click “Add time series”. Enter the key name, select the type and enter the value of the key. Click “Apply”;
Click “Add”.
This option allows you to use a custom converter for specific data tasks.
You need to add your custom converter to the extension folder and enter its class name in the UI settings.
Any keys you provide will be sent as configuration to your custom converter.
Select “Custom” payload type, and fill in the fields in the “Device” section. Then click “pencil” icon of the “Keys” section to add new key;
In the opened window click “Add key”. Enter the key name and its value. Click “Apply”;
Json converter is the default converter, it looks for ‘deviceName’, ‘deviceType’, attributes and telemetry in the incoming message from the broker, following the rules described in this subsection:
Parameter
Default value
Description
type
json
Provides information to connector that default converter is to be used for converting data from topic.
deviceNameExpression
${serialNumber}
Simple JSON expression, is used for looking up device name in the incoming message (parameter “serialNumber” will be used as the device name).
deviceProfileExpression
${sensorType}
Simple JSON expression, is used for looking up device type in the incoming message (parameter “sensorType” will be used as the device type).
timeout
60000
Timeout for triggering “Device Disconnected” event
attributes:
This subsection contains parameters of the incoming message, to be interpreted as attributes for the device.
… type
string
Type of incoming data for a current attribute.
… key
model
Attribute name, to be sent to ThingsBoard instance.
… value
${sensorModel}
Simple JSON expression, is used for looking up value in the incoming message, to be sent to ThingsBoard instance as the value of key parameter.
… type
string
Type of incoming data for a current attribute.
… key
${sensorModel}
Simple JSON expression, is used for looking up value in the incoming message, to be used as attribute name.
… value
on
Attribute value, to be sent to ThingsBoard instance.
timeseries:
This subsection contains parameters of the incoming message, to be interpreted as telemetry for the device.
… type
integer
Type of incoming data for a current telemetry.
… key
temperature
Telemetry name, to be sent to ThingsBoard instance.
… value
${temp}
Simple JSON expression, is used for looking up value in the incoming message, to be sent to ThingsBoard instance as the value of key parameter.
… type
integer
Type of incoming data for a current telemetry.
… key
humidity
Telemetry name, to be sent to ThingsBoard instance.
… value
${hum}
Simple JSON expression, is used for looking up value in the incoming message, to be sent to ThingsBoard instance as the value of key parameter.
Parameters in attributes and telemetry section may differ from those presented above, but will follow the same structure.
Note: The device profile is set when the device is created. Changing the device profile using a Gateway is not supported.
Bytes converter is the default converter, it looks for ‘deviceName’, ‘deviceType’, attributes and telemetry in the incoming
message from the broker, following the rules described in this subsection:
Parameter
Default value
Description
type
bytes
Provides information to connector that default converter is to be used for converting data from topic.
deviceNameExpression
[0:4]
The expression that is used to find device name in the incoming message.
deviceProfileExpression
[1:3]
The expression that is used to find device type in the incoming message.
timeout
60000
Timeout for triggering “Device Disconnected” event.
attributes:
This subsection contains parameters of the incoming message, to be interpreted as attributes for the device.
… type
raw
Type of incoming data for a current attribute.
… key
temp
Attribute name, to be sent to ThingsBoard instance.
… value
[:]
Final view of data that will be sent to ThingsBoard, [:] - will replace to device data using python slice rules.
timeseries:
This subsection contains parameters of the incoming message, to be interpreted as telemetry for the device.
… type
raw
Type of incoming data for a current telemetry.
… key
rawData
Telemetry name, to be sent to ThingsBoard instance.
… value
[4:]
Final view of data that will be sent to ThingsBoard, [:] - will replace to device data using python slice rules.
Parameters in attributes and telemetry section may differ from those presented above, but will have the same structure.
Note: The device profile is set when the device is created. Changing the device profile using a Gateway is not supported.
A custom converter is converter written for some device:
Parameter
Default value
Description
type
custom
Provides information to connector that a custom converter will be used for converting data from the topic.
extension
CustomMqttUplinkConverter
Name of custom converter class.
extension-config
This subsection is a configuration for the custom converter. In default example it contains the number of bytes and keys for telemetry.
temperatureBytes
2
In the default example, first 2 bytes from received message will be interpreted as temperature key of telemetry (Substring “Bytes” will remove if exists).
humidityBytes
2
In the default example, the second and third byte from received message will be interpreted as humidity key of telemetry (Substring “Bytes” will remove if exists).
batteryLevelBytes
1
In the default example, the fifth byte from received message will be interpreted as batteryLevel key of telemetry (Substring “Bytes” will removed if exists).
All parameters from this subsection and topic will be transferred as dictionary during initialization to the converter object.
Converter subsection in the configuration will look like:
Mapping process subscribes to the MQTT topics using topicFilter parameter of the mapping object.
Each message that is published to this topic by other devices or applications is analyzed to extract device name, type and data (attributes and/or timeseries values).
By default, gateway uses Json converter, but it is possible to provide custom converter. See examples in the source code.
Connector won’t pass the ‘None’ value from the converter
Now let’s review an example of sending data from “SN-001” thermometer device.
Let’s assume MQTT broker is installed locally on your server.
Use terminal to simulate sending message from the device to the MQTT broker:
For adding new requests mapping, click “plus” icon:
Modal window will open. Select request type, set a topic filter, fill in the entities fields of the “Device” section. Then, click “Add”.
Below we go through all the supported requests for both Gateway and ThingsBoard.
Subsection “Connect request”
ThingsBoard allows sending RPC commands and notifications about device attribute updates to the device.
But in order to send them, the platform needs to know if the target device is connected and what gateway or session is used to connect the device at the moment. If your device is constantly sending telemetry data - ThingsBoard already knows how to push notifications.
If your device just connects to MQTT broker and waits for commands/updates, you need to send a message to the Gateway and inform that device is connected to the broker.
Also, it is possible to configure where to get the device name: from the topic or from the message body.
To adding new requests mapping, navigate to the “Requests mapping” tab and click the “plus” icon.
In the open modal window, select the “Connect request” type, set a topic filter, and fill in the “Name” and “Profile name” fields of the “Device” section. Then, click “Add”.
Your ThingsBoard instance will get information from the broker about last connecting time of the device. You can see this information under the “Server attributes” scope in the “Attributes” tab.
Subsection “Disconnect request”
This configuration section is optional.
Configuration, provided in this section will be used to get information from the broker about disconnecting device.
If your device just disconnects from MQTT broker and waits for commands/updates, you need to send a message to the Gateway and inform it that device is disconnected from the broker.
To adding new requests mapping, navigate to the “Requests mapping” tab and click the “plus” icon.
In the open modal window, select the “Disconnect request” type, set a topic filter, and fill in the “Name” field of the “Device” section. Then, click “Add”.
Your ThingsBoard instance will get information from the broker about last disconnecting time of the device. You can see this information under the “Server attributes” scope in the “Attributes” tab.
Subsection “Attribute requests”
This configuration section is optional.
In order to request client-side or shared device attributes to ThingsBoard server node, Gateway allows sending
attribute requests.
To adding new requests mapping, navigate to the “Requests mapping” tab and click the “plus” icon.
In the open modal window, select the “Attribute request” type, set a topic filter. Fill in the fields of the “Input request parsing” and “Output request parsing” sections. Then, click “Add”.
Also, you can request multiple attributes at once. Simply add one more JSON-path to
attributeNameExpression parameter. For example, we want to request two shared attributes in one request, our config
will look like:
If set to true, the message will be set as the “last known good”/retained message for the topic.
topicFilter
v1/devices/me/attributes/request
Topic for attribute request
deviceNameExpression
${serialNumber}
JSON-path expression, for looking the device name in topicFilter message
attributeNameExpression
${versionAttribute}
JSON-path expression, for looking the attribute name in topicFilter message
topicExpression
devices/${deviceName}/attrs
JSON-path expression, for formatting reply topic
valueExpression
${attributeKey}: ${attributeValue}
Message that will be sent to topic from topicExpression
Subsection “Attribute updates”
This configuration section is optional.
ThingsBoard allows to provision device attributes and fetch some of them from the device application.
You can treat this as a remote configuration for devices. Your devices are able to request shared attributes from ThingsBoard.
See user guide for more details.
The “attributeUpdates” configuration allows configuring the format of the corresponding attribute request and response messages.
To adding new requests mapping, navigate to the “Requests mapping” tab and click the “plus” icon.
In the open modal window, select the “Attribute update” type, and set a device name filter, attribute filter, response value expression, and response topic expression. Then, click “Add”.
If set to true, the message will be set as the “last known good”/retained message for the topic.
deviceNameFilter
.*
Regular expression device name filter, used to determine, which function to execute.
attributeFilter
uploadFrequency
Regular expression attribute name filter, used to determine, which function to execute.
topicExpression
sensor/${deviceName}/${attributeKey}
JSON-path expression used for creating topic address to send a message.
valueExpression
{\”${attributeKey}\”:\”${attributeValue}\”}
JSON-path expression used for creating the message data that will send to topic.
Let’s look at an example.
Run the command below to start the mosquitto_sub client, subscribing to the topic “sensor/SN-001/firmwareVersion” of the local broker. Start waiting for new messages from ThingsBoard server to broker.
Update device attribute value on the ThingsBoard server following these steps:
Open the “Devices” page;
Click on your device and navigate to the “Attributes” tab;
Choose “Shared attributes” scope and click on the “pencil” icon next to “firmwareVersion” attribute.
Change firmware version value from “1.1” to “1.2”. Then click “Update” button.
The firmware version has been updated to “1.2”.
Broker received new message from the ThingsBoard server about updating attribute “FirmwareVersion” to “1.2”.
Server side RPC commands
ThingsBoard allows sending RPC commands to the device that is connected to ThingsBoard directly or via Gateway.
Configuration, provided in this section is used for sending RPC requests from ThingsBoard to device.
There are 2 options for RPC request:
With a response – If the configuration includes a responseTopicExpression, the gateway will attempt to subscribe to it and wait for a response.
To adding new requests mapping, navigate to the “Requests mapping” tab and click the “plus” icon.
In the open modal window, select the “RPC command” request type, and set a device name filter, method filter, request topic expression, value expression, response topic expression, response topic QoS and response timeout. Then, click “Add”.
Without a response – If the configuration does not include a responseTopicExpression, the gateway will simply send the message without waiting for a response.
To adding new requests mapping, navigate to the “Requests mapping” tab and click the “plus” icon.
In the open modal window, select the “RPC command” request type, toggle “Without response” option, and set a device name filter, method filter, and value expression. Then, click “Add”.
Parameter
Default value
Description
deviceNameFilter
.*
Regular expression device name filter, is used to determine, which function to execute.
methodFilter
echo
Regular expression method name filter, is used to determine, which function to execute.
JSON-path expression, is used for creating topic address to subscribe for response message.
responseTimeout
10000
Value in milliseconds. If there is no response within this period after sending the request, gateway will unsubscribe from the response topic.
valueExpression
${params}
JSON-path expression, is used for creating data for sending to broker.
You can use device name filter and method filter to apply different mapping rules for various devices/methods.
Once Gateway receives RPC request from the server to the device, it will publish the corresponding message based on request topic expression and value expression.
In case you expect a reply to the request from the device, you should also specify response topic expression and response timeout.
The Gateway will subscribe to the “response” topic and wait for a device reply until “responseTimeout” is reached (in milliseconds).
Here is an example of an RPC request (rpc-request.json) that needs to be sent from the server:
1
2
3
4
5
6
{"method":"echo","params":{"message":"Hello!"}}
Also, every telemetry and attribute parameter has built-in GET and SET RPC methods out of the box, so you don’t need to configure
it manually. To use them, make sure you set all the required parameters (in the case of MQTT Connector, these are the following:
request topic expression, response topic expression, response timeout, value expression).
See the guide.
JSON-path expression, is used for creating topic address to subscribe for response message.
responseTimeout
10000
Value in milliseconds. If there is no response within this period after sending the request, gateway will unsubscribe from the response topic.
valueExpression
${params}
JSON-path expression, is used for creating data for sending to broker.
There are 2 options for RPC request:
With a response – If the configuration includes a responseTopicExpression, the gateway will attempt to subscribe to it and wait for a response.
Without a response – If the configuration does not include a responseTopicExpression, the gateway will simply send the message without waiting for a response.
You can use deviceNameFilter and methodFilter to apply different mapping rules for various devices/methods.
Once Gateway receives RPC request from the server to the device, it will publish the corresponding message based on requestTopicExpression and valueExpression.
In case you expect a reply to the request from the device, you should also specify responseTopicExpression and responseTimeout.
The Gateway will subscribe to the “response” topic and wait for a device reply until “responseTimeout” is reached (in milliseconds).
Here is an example of an RPC request (rpc-request.json) that needs to be sent from the server:
1
2
3
4
5
6
{"method":"echo","params":{"message":"Hello!"}}
Also, every telemetry and attribute parameter has built-in GET and SET RPC methods out of the box, so you don’t need to configure
it manually. To use them, make sure you set all the required parameters (in the case of MQTT Connector, these are the following:
requestTopicExpression, responseTopicExpression, responseTimeout, valueExpression).
See the guide.
Workers settings
This configuration settings provides fields for configuring connector performance and message reading/formatting speed:
Max number of workers is a maximal number of workers thread for converters (amount of workers changes dynamically, depending on load). Recommended amount 50-100.
Max messages queue per worker is a maximal messages count that will be in queue for each converter worker.
maxNumberOfWorkers is a maximal number of workers thread for converters (amount of workers changes dynamically, depending on load). Recommended amount 50-100;
maxMessageNumberPerWorker is a maximal messages count that will be in queue for each converter worker.
{"broker":{"name":"Default Local Broker","host":"127.0.0.1","port":1883,"clientId":"ThingsBoard_gateway","version":5,"maxMessageNumberPerWorker":10,"maxNumberOfWorkers":100,"sendDataOnlyOnChange":false,"security":{"type":"basic","username":"user","password":"password"}},"mapping":[{"topicFilter":"sensor/data","converter":{"type":"json","deviceNameJsonExpression":"${serialNumber}","deviceTypeJsonExpression":"${sensorType}","sendDataOnlyOnChange":false,"timeout":60000,"attributes":[{"type":"string","key":"model","value":"${sensorModel}"},{"type":"string","key":"${sensorModel}","value":"on"}],"timeseries":[{"type":"double","key":"temperature","value":"${temp}"},{"type":"double","key":"humidity","value":"${hum}"},{"type":"string","key":"combine","value":"${hum}:${temp}"}]}},{"topicFilter":"sensor/+/data","converter":{"type":"json","deviceNameTopicExpression":"(?<=sensor\/)(.*?)(?=\/data)","deviceTypeTopicExpression":"Thermometer","sendDataOnlyOnChange":false,"timeout":60000,"attributes":[{"type":"string","key":"model","value":"${sensorModel}"}],"timeseries":[{"type":"double","key":"temperature","value":"${temp}"},{"type":"double","key":"humidity","value":"${hum}"}]}},{"topicFilter":"sensor/raw_data","converter":{"type":"bytes","deviceNameExpression":"[0:4]","deviceTypeExpression":"default","sendDataOnlyOnChange":false,"timeout":60000,"attributes":[{"type":"raw","key":"rawData","value":"[:]"}],"timeseries":[{"type":"raw","key":"temp","value":"[4:]"}]}},{"topicFilter":"custom/sensors/+","converter":{"type":"custom","extension":"CustomMqttUplinkConverter","cached":true,"extension-config":{"temperatureBytes":2,"humidityBytes":2,"batteryLevelBytes":1}}}],"connectRequests":[{"topicFilter":"sensor/connect","deviceNameJsonExpression":"${serialNumber}"},{"topicFilter":"sensor/+/connect","deviceNameTopicExpression":"(?<=sensor\/)(.*?)(?=\/connect)"}],"disconnectRequests":[{"topicFilter":"sensor/disconnect","deviceNameJsonExpression":"${serialNumber}"},{"topicFilter":"sensor/+/disconnect","deviceNameTopicExpression":"(?<=sensor\/)(.*?)(?=\/disconnect)"}],"attributeRequests":[{"retain":false,"topicFilter":"v1/devices/me/attributes/request","deviceNameJsonExpression":"${serialNumber}","attributeNameJsonExpression":"${versionAttribute}, ${pduAttribute}","topicExpression":"devices/${deviceName}/attrs","valueExpression":"${attributeKey}: ${attributeValue}"}],"attributeUpdates":[{"retain":true,"deviceNameFilter":".*","attributeFilter":"firmwareVersion","topicExpression":"sensor/${deviceName}/${attributeKey}","valueExpression":"{\"${attributeKey}\":\"${attributeValue}\"}"}],"serverSideRpc":[{"deviceNameFilter":".*","methodFilter":"echo","requestTopicExpression":"sensor/${deviceName}/request/${methodName}/${requestId}","responseTopicExpression":"sensor/${deviceName}/response/${methodName}/${requestId}","responseTimeout":10000,"valueExpression":"${params}"},{"deviceNameFilter":".*","methodFilter":"no-reply","requestTopicExpression":"sensor/${deviceName}/request/${methodName}/${requestId}","valueExpression":"${params}"}]}
Next steps
Explore guides related to main ThingsBoard features: