Technical details¶
Topics format¶
MQTT topics are a one way packet transport system. More advanced communication scheme need using multiple topics with some specific interfaces.
This section describes the different communication mechanisms used, topic naming conventions and message format.
Channels¶
Two way stream require having one topic for one communication side and one for the other. This includes serial port forwarding where one topic is used to read from the serial port and one to write to it.
input topic: | {resourcetopic}/data/in |
---|---|
output topic: | {resourcetopic}/data/out |
Example¶
For a resource at {prefix}/resource/1
, the channels topics will be:
# Topic for writing to the resource
{prefix}/resource/1/data/in
# Topic where the resource writes its output
{prefix}/resource/1/data/out
Request model¶
Requests allow executing commands on a resource is a form of two way stream, one to do the request and one to give the result. As a response must correspond to the right request and the right client, a per request/client topic should be specified.
The chosen format is the following:
request topic: | {resourcetopic}/ctl/{command}/request/{clientid}/{requestid} |
---|---|
reply topic: | {resourcetopic}/ctl/{command}/reply/{clientid}/{requestid} |
In practice, by using wildcard topic subscribtion, only one subscribe is necessary per agent/client/request/command:
# Agent subscribe
{prefix}/resource/topic/ctl/{command}/request/+/+
# Client subscribe
{prefix}/resource/topic/ctl/{command}/reply/{clientid}/+
For clientid
I recommend using a readable identifier concatenated to an
UUID to ensure both readability and unicity.
Error topic¶
As not all the following communication mechanisms have a response, asynchronous errors or failures happen on an error topic.
The errors are sent to a subtopic from the agent error topic. They are published to the concatenation of the agent error topic and the topic where error happend relative to the agent topic:
{agenttopic}/error/relative/topic/where/problem/occured
payload: | utf-8 encoded strings . |
---|
Clients subscribe to errors for this agent with:
{agenttopic}/error/#
Example¶
An error in resource {agenttopic}/resource/1
will be published to:
{agenttopic}/error/resource/1
An error in the general agent to the will be published to:
{agenttopic}/error/ # With the trailing `/`
Sending both UTF-8 and binary in a message¶
If in a message, both text (e.g., a json) and a binary data need to be sent,
it has been chosen to separate the UTF-8 string from the binary payload
using one 0xFF
byte.
<UTF-8 encoded JSON string> 0xFF <Binary data>
In fact, 0xFF
is never used in a UTF-8 encoded string wikipedia:utf-8
so the payload can safely be split on the first occurence of 0xFF
without
requiring to first decode the string.