Java es un lenguaje potente e independiente de plataformas comúnmente utilizado para aplicaciones empresariales, desarrollo Android, yPlataformas IoT. El proyecto Eclipse Paho proporciona una robusta Java MQTT cliente que se puede utilizar para conectarse a los corredores MQTT sobre TCP o WebSocket, con soporte para TLS y autenticación.
Esta guía te lleva a través de la construcción de un cliente Java MQTT usando la biblioteca Eclipse Paho Java. It también esbozosMQTTflujos de conexión, publicación/suscripción a temas, y desconectar.
Antes de comenzar, asegúrate de tener la siguiente configuración:
Esta sección cubre múltiples maneras de conectarse a unMQTT brokerusando Java. Asegúrese de tener los detalles del corredor (nombre de host, puerto, nombre de usuario/password, certificado CA) útiles.
Basic TCP Conexión
import org.eclipse.paho.client.mqttv3.*;
Interventor de String = "tcp://broker-url:1883";
cliente String Id = "testclient";
MqttClient client = nuevo MqtClient(broker, cliente Id, new MemoryPersistence());
cliente.connect();
Conectarse con la autenticación
MqttConnectOptions options = nuevo MqttConnectOptions();
options.setUserName("nombre de usuario");
options.setPassword("password".toCharArray());
cliente.connect(options);
Conexión sobre TLS/SSL
String broker = "ssl://broker-url:8883"; // Nota: use `ssl://` esquema
MqttConnectOptions options = nuevo MqttConnectOptions();
options.setSocketFactory(SSLSocketFactoryGenerator.getSocketFactory("ca.crt")); // método de ayuda personalizada
cliente.connect(options);
Conectar a través de WebSocket
Interventor de String = "ws://broker-url:8080/mqtt"; // O "wss://" para WebSocket seguro
MqttClient client = nuevo MqtClient(broker, cliente Id, new MemoryPersistence());
cliente.connect();
Tema de cuerda = "test/topic";
Contenido de cuerda = "{\"temperatura\": 50.5, \"humidity\": 34}";
int qos = 1;
MqttMessage message = nuevo MqttMessage(content.getBytes());
message.setQos(qos);
client.publish(topic, message);
cliente.subscribe("test/topic", 1);
client.setCallback(new MqttCallback() {
conexión de vacío público Perdido(Causa potencial) {
// mango desconexión
}
mensaje de vacío público Llegada(Tema de la cuerda, MqtMessage message) {
System.out.println("Message received:\n\t" + topic + " - título " + nuevo String(message.getPayload()));
}
públicos Complete(IMqttDeliveryToken token) {
// no utilizado para suscripciones
}
});
Para darse de baja:
cliente.unsubscribe("test/+");
La desconexión limpia asegura que el corredor libera recursos vinculados a la sesión y evita las conexiones de toma de corriente.
cliente.disconnect();
cliente.close();
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
importar javax.net.ssl.SSLSocketFactory;
importar java.nio.charset.StandardCharsets;
clase pública MqttClient4Example {}
// - Configuración de Broker MQTT ---
static final String BROKER_HOST = "tcp://mqtt-broker-URL:1883"; // Reemplazar con su URL de broker
AUTHENTICATION final booleana privada = true;
final estático privado String USERNAME = "Username";
final estática privada PASSWORD = "Password";
privada estática final booleano ENCRYPTION = falso; // Establecer verdadero para habilitar TLS
final estática privada CLIENT_ID = "testclient4";
ático privado final String TOPIC = "test/topic";
public static void main(String[] args) {
Inténtalo.
// - Crear cliente MQTT ---
MqttClient client = new MqtClient(BROKER_HOST, CLIENT_ID, new MemoryPersistence());
// - Opciones de conexión de configuración ---
MqttConnectOptions options = nuevo MqttConnectOptions();
options.setCleanSession(true);
(AUTHENTICATION) {
options.setUserName(USERNAME);
options.setPassword(PASSWORD.toCharArray());
}
si (ENCRYPTION) {
SSLSocket Fábrica sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
options.setSocketFactory(sslSocketFactory);
}
// - ¿Qué?
client.setCallback(new MqttCallback() {
@Override
mensaje de vacío público Llegada(Tema de la cuerda, MqtMessage message) {
System.out.println("Recibido mensaje sobre tema '" + tema + ": " + nuevo String(message.getPayload()));
}
});
- ...conéctate con Broker...
cliente.connect(options);
// - Suscribe un tema...
cliente.subscribe(TOPIC, 1);
// -...espera brevemente para asegurar que la suscripción está registrada -...
Thread.sleep(2000);
// - Publicar un mensaje de prueba ---
Carga útil de cuerda = "{\"temperatura\": 50.5, \"humidity\": 34}";
MqttMessage message = nuevo MqttMessage(payload.getBytes(StandardCharsets.UTF_8));
message.setQos(1);
message.setRetained(false);
cliente. publicar (TOPIC, mensaje);
Espera a permitir la entrega...
Thread.sleep(3000);
- Desconéctate de Broker...
cliente.disconnect();
cliente.close();
} catch (Exception e) {}
e.printStackTrace();
}
}
}
Guarda este código de muestra como:
MqttClient4Example.java
Compile:
javac -cp .:org.eclipse.paho.client.mqttv3-1.2.5.jar MqttClient4Example.java
Ejecutar:
java -cp .:org.eclipse.paho.client.mqttv3-1.2.5.jar MqttClient4Example
import org.eclipse.paho.mqttv5.client.MqttAsyncClient;
import org.eclipse.paho.mqttv5.client.MqtConnectionOptions;
Importar org.eclipse.paho.mqttv5.client.IMqttoToken;
import org.eclipse.paho.mqttv5.client.MqttCallback;
import org.eclipse.paho.mqttv5.client.persist.MemoryPersistence;
importa org.eclipse.paho.mqttv5.common.MqttMesage;
import org.eclipse.paho.mqttv5.common.MqtException;
importar java.nio.charset.StandardCharsets;
clase pública MqttClient5Example {}
AUTHENTICATION final booleana privada = true;
final estático privado String USERNAME = "Username";
final estática privada PASSWORD = "Password";
public static void main(String[] args) {
Interventor de String = "tcp://mqtt-broker-URL:1883";
cliente String Id = "testclient5"
Tema de cuerda = "test/topic";
Inténtalo.
// Crear cliente y opciones
MqttAsyncClient client = nuevo MqttAsyncClient(broker, cliente Id, new MemoryPersistence());
MqttConnectionOptions options = nuevo MqttConnectionOptions();
options.setCleanStart(true);
(AUTHENTICATION)
{}
options.setUserName(USERNAME);
options.setPassword(PASSWORD.getBytes(StandardCharsets.UTF_8));
}
// Ajuste el callback para la conexión, la llegada del mensaje, etc.
client.setCallback(new MqttCallback() {
@Override
vacío público desconectado(org.eclipse.paho.mqttv5.client.MqtDisconnectResponse disconnectResponse) {
System.out.println("Disconnected: " + disconnectResponse.getReasonString());
}
@Override
vacío público mqtt ErrorOccurrido(Excepción MqtException) {
System.out.println("MQTT Error: " + excepción.getMessage());
}
@Override
mensaje de vacío público Llegada(Tema de la cuerda, MqtMessage message) {
System.out.println("Message llegó al tema '" + tema + ": " + nuevo String(message.getPayload()))));
}
@Override
públicos Complete(IMqttToken token) {
System.out.println("Delivery complete for message with ID: " + token.getMessageId());
}
@Override
conexión de vacío públicoCompleta(reconexión de boomlean, servidor de String) {
System.out.println("Connected to " + serverURI + (reconnect? " (reconnect)" : ""));
}
@Override
public void authPacketArrived(int reasonCode, org.eclipse.paho.mqttv5.common.packet.MqtProperties properties) {
// No-op por ahora
}
});
// Conectar cliente
IMqttToken connectToken = cliente.connect(opciones);
connectToken.waitForCompletion();
System.out.println("Connected!");
Thread.sleep(3000);
// Suscribirse al tema
IMqttToken subToken = cliente.subscribe(topic, 1);
subToken.waitForCompletion();
System.out.println("Suscrito a: " + tema);
// Publicar un mensaje
Carga útil de cuerda = "{\"temperatura\": 50.5, \"humidity\": 34}";
MqttMessage message = nuevo MqttMessage(payload.getBytes());
message.setQos(1);
IMqtToken pubToken = cliente.publish(topic, message);
pubToken.waitForCompletion();
System.out.println("Published message: " + payload);
// Espera a recibir mensajes (sleep for demo)
Thread.sleep(3000);
// Desconectar y cerrar
cliente.disconnect();
cliente.close();
System.out.println(" Cliente desconectado y cerrado.");
} catch (MqtException ← InterruptedException e) {}
e.printStackTrace();
}
}
}
Guarda este código de muestra como:
MqttClient5Example.java
Compile:
javac -cp .:org.eclipse.paho.mqttv5.client-1.2.5.jar MqttClient5Example.java
Ejecutar:
java -cp .:org.eclipse.paho.mqttv5.client-1.2.5.jar MqttClient5Example.java