Message Queuing Telemetry Transport (MQTT) es un protocolo de mensajería asíncrona basado en la pila de protocolos TCP/IP. Al ser un protocolo ligero de publicación-suscripción, está diseñado para entornos de red no confiables y resulta adecuado para escenarios donde los dispositivos tienen recursos limitados de almacenamiento o ancho de banda. El protocolo MQTT desacopla a los emisores y receptores de mensajes tanto en tiempo como en espacio. IoT Platform admite conexiones de dispositivos mediante MQTT.
Versiones compatibles
IoT Platform admite conexiones MQTT estándar, compatibles con las versiones 5.0, 3.1.1 y 3.1. Especificaciones oficiales: MQTT 5.0, MQTT 3.1.1, MQTT 3.1.
Importante
Para usar el protocolo MQTT 5.0, primero debe adquirir una instancia Enterprise.
Diferencias respecto al estándar MQTT
Admite mensajes MQTT como PUB, SUB, PING, PONG, CONNECT, DISCONNECT y UNSUB.
Admite sesiones limpias.
No admite mensajes de última voluntad ni mensajes retenidos.
Admite niveles de Calidad de Servicio (QoS) 0 y 1. No admite QoS 2.
No admite QoS de suscripción. El QoS del mensaje lo determina el emisor (PUB).
Admite revert-RPC (RRPC) basado en temas MQTT nativos, lo que permite llamadas síncronas del servidor al dispositivo.
Funciones compatibles con MQTT 5.0
MQTT 5.0 introduce funciones que mejoran el rendimiento y la usabilidad. Consulte el Apéndice C. Resumen de nuevas funciones en MQTT v5.0 y la descripción general de MQTT 5.0.
IoT Platform admite las siguientes funciones de MQTT 5.0.
|
Funciones compatibles
|
Cómo utilizarlas
|
|
Session expiry
|
-
Establezca Clean Start y Session Expiry Interval al conectarse: MqttConnectionOptions options = new MqttConnectionOptions();
options.setCleanStart(true);
options.setSessionExpiryInterval(60L);// Unit: seconds.
MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.connect(options);
-
Establezca Session Expiry Interval al desconectarse: MqttProperties mqttProperties = new MqttProperties();
mqttProperties.setSessionExpiryInterval(60L);// Unit: seconds.
MqttAsyncClient mqttAsyncClient = new MqttAsyncClient(host, clientId, new MemoryPersistence());
mqttAsyncClient.disconnect(30000, null, null, MqttReturnCode.RETURN_CODE_SUCCESS, mqttProperties);
|
|
Message expiry
|
Establezca Message Expiry Interval al publicar: IntervalString content = "Hello World";
byte[] payload = content.getBytes();
// Create a message.
MqttMessage message = new MqttMessage(payload);
// Set the QoS for the message.
message.setQos(1);
MqttProperties mqttProperties = new MqttProperties();
// Set the message time-to-live (TTL).
mqttProperties.setMessageExpiryInterval(600L);
message.setProperties(mqttProperties);
// Publish the message.
MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.publish(topic, message);
|
|
Subscription options
|
Opciones de suscripción disponibles:
-
QoS: Nivel de QoS del mensaje MQTT. Establézcalo en 0 (mensaje QoS 0) o 1 (mensaje QoS 1).
-
No Local: Especifica si el cliente recibe los mensajes que publica.
En MQTT 3.1.1, un cliente recibe sus propios mensajes publicados en los temas suscritos. En MQTT 5.0, establezca esta opción en true para evitar la autoentrega.
Valores:
-
true: No recibe.
-
false: Recibe.
-
Retain As Publish: Especifica si el servidor conserva la marca RETAIN al reenviar un mensaje a un cliente.
Valores:
-
true: Si el mensaje tiene una marca RETAIN, dicha marca se conserva. Si el mensaje no tiene una marca RETAIN, esta opción no surte efecto.
-
false: La marca RETAIN no se conserva, independientemente de si el mensaje original la incluye.
Importante
La configuración de Retain As Publish no afecta la marca RETAIN en los mensajes retenidos.
-
Retain Handling: Especifica si el servidor envía mensajes retenidos al cliente cuando se establece una suscripción.
Valores:
-
0: El servidor envía mensajes retenidos siempre que la suscripción del cliente sea exitosa.
-
1: El servidor envía mensajes retenidos solo si la suscripción del cliente es exitosa y la suscripción no existía previamente.
-
2: El servidor no envía mensajes retenidos incluso si la suscripción del cliente es exitosa.
MqttSubscription mqttSubscription = new MqttSubscription("aaa/bbb");
// Set the QoS subscription option.
mqttSubscription.setQos(1);
// Set the No Local subscription option.
mqttSubscription.setNoLocal(true);
// Set the Retain As Published subscription option.
mqttSubscription.setRetainAsPublished(true);
// Set the Retain Handling subscription option.
mqttSubscription.setRetainHandling(1);
MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.subscribe(new MqttSubscription[]{mqttSubscription});
|
|
Retained message
|
// Create a retained message.
String content = "Hello World";
byte[] payload = content.getBytes();
MqttMessage message = new MqttMessage(payload);
// Set the message as a retained message.
message.setRetained(true);
// Publish the message.
MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.publish(topic, message);
|
|
Will message
|
// Create a will message.
String content = "Will Message";
byte[] payload = content.getBytes();
MqttMessage message = new MqttMessage(payload);
MqttConnectionOptions options = new MqttConnectionOptions();
options.setUserName(USERNAME);
options.setPassword(PASSWORD.getBytes());
// Set the will message.
options.setWill(topic, message);
// Set the will delay.
MqttProperties willMessageProperties = new MqttProperties();
willMessageProperties.setWillDelayInterval(60L);
options.setWillMessageProperties(willMessageProperties);
// Establish a connection.
MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.connect(options);
|
|
Connection negotiation
|
MqttConnectionOptions connOpts = new MqttConnectionOptions();
connOpts.setMaximumPacketSize(1024L);
|
|
User property
|
MqttProperties properties = new MqttProperties();
List<UserProperty> userPropertys = new ArrayList<>();
userPropertys.add(new UserProperty("key1","value1"));
properties.setUserProperties(userPropertys);
Después de que un dispositivo se conecta mediante MQTT 5.0, los datos de UserProperty reportados son visibles en los registros de IoT Platform.
Importante
Máximo de 20 propiedades. Las claves no pueden comenzar con guion bajo (_). La longitud combinada de clave y valor no puede exceder los 128 caracteres.
|
|
Request-response pattern
|
Si el solicitante es un dispositivo y el receptor es su servidor empresarial, analice sintácticamente ResponseTopic y CorrelationData de las propiedades del mensaje después de la suscripción AMQP o el reenvío por reglas. Luego, invoque la operación de API Pub para responder al dispositivo. MqttProperties properties = new MqttProperties();
properties.setCorrelationData("requestId12345".getBytes());
properties.setResponseTopic("/" + productKey + "/" + deviceName + "/user/get");
|
|
Enhanced error codes
|
Troubleshoot errors.
|
|
Topic alias
|
No aplica.
|
|
Shared subscriptions
|
Formato de tema de suscripción compartida: $share/${ShareName}/${filter}.
-
$share: Campo estático. El tema para una suscripción compartida debe comenzar con $share.
-
${ShareName}: Cadena que contiene únicamente letras, dígitos y guiones bajos (_).
Las sesiones con el mismo ${ShareName} comparten una sola suscripción. Cada mensaje coincidente se entrega a una única sesión.
-
${filter}: Filtro de tema en una suscripción no compartida. Admite letras, dígitos y guiones bajos (_).
Ejemplo: MqttConnectionOptions options = new MqttConnectionOptions();
options.setUserName(username);
options.setPassword(password);
MqttClient mqttClient = new MqttClient(host, clientId, new MemoryPersistence());
mqttClient.connect(options);
mqttClient.subscribe("$share/testGroup/user/post", 1);
|
Especificaciones de temas
Para consultar las definiciones y clasificación de temas, véase What is a topic?.
Puede consultar los temas de comunicación predeterminados en la página de producto de un dispositivo dentro de la consola. Los temas específicos de cada función se describen en la documentación correspondiente.
Límites
Cada identidad de dispositivo registrada admite únicamente un protocolo de comunicación a la vez.