1.引入依赖:
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
</dependency>
2.创建基础类:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MqttConfig {
private String host;
private String clientId;
private String userName;
private String passWord;
private Integer timeout;
public void randomClientId() {
double random = Math.random();
String s = String.valueOf(random).substring(2, 11);
StringBuilder hexString = new StringBuilder(Integer.toHexString(Integer.parseInt(s)));
if (hexString.length() < 7) {
int length = 7 - hexString.length();
for (int i = 0; i < length; i++) {
hexString.append("0");
}
}
this.clientId = "mqtt_" + hexString;
}
public MqttClient connect() throws MqttException {
MqttConnectOptions options = getMqttConnectOptions();
if (this.clientId == null || this.clientId.isEmpty()) {
this.randomClientId();
}
if (this.host == null || this.host.isEmpty()) {
return null;
}
MqttClient mqttClient = new MqttClient(this.host, this.clientId, new MemoryPersistence());
try {
mqttClient.connect(options);
System.out.println("clientId: ' " + this.clientId + " ' 连接成功!");
} catch (MqttException e) {
System.out.println("连接失败:" + e.getMessage());
return mqttClient;
}
return mqttClient;
}
private MqttConnectOptions getMqttConnectOptions() {
MqttConnectOptions options = new MqttConnectOptions();
if (this.userName == null ||this.userName.isEmpty()) {
options.setUserName("");
} else {
options.setUserName(this.userName);
}
if (this.passWord == null ||this.passWord.isEmpty()) {
options.setPassword("".toCharArray());
} else {
options.setPassword(this.passWord.toCharArray());
}
if (this.timeout == null ||this.timeout <= 0) {
options.setConnectionTimeout(10);
} else {
options.setConnectionTimeout(this.timeout);
}
options.setAutomaticReconnect(true);
options.setCleanSession(false);
return options;
}
}
3.基本操作:
MqttConfig mqttConfig = new MqttConfig();
mqttConfig.setHost("tcp://192.168.100.104:1883");
MqttClient connect = mqttConfig.connect();
String topicFilter = "testtopic/test";
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setPayload("Hello Java".getBytes());
MqttTopic topic = connect.getTopic(topicFilter);
MqttDeliveryToken publish = topic.publish(mqttMessage);
publish.waitForCompletion();
connect.setCallback(new MqttCallback() {
@SneakyThrows
@Override
public void connectionLost(Throwable cause) {
while (true) {
System.out.println(mqttConfig.getClientId() + ": 连接丢失,尝试重新连接...");
try {
Thread.sleep(5000);
connect.connect();
if (connect.isConnected()) {
System.out.println("MQTT 客户端已成功连接到 MQTT 代理。");
connect.subscribe(topicFilter);
break;
}
} catch (MqttException | InterruptedException e) {
System.out.println("重新连接失败:" + e.getMessage());
}
}
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
String payload = new String(message.getPayload());
System.out.println("收到消息:Topic=" + topic + ", Message=" + payload);
}
@SneakyThrows
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
System.out.println("消息发送完成: " + token.getMessage().getPayload());
}
});
connect.subscribe(topicFilter);