@Slf4j
@Configuration
public class MqttConfig {
private static MqttClient mqttClient = null;
static {
try {
initializeMqttClient();
} catch (Exception e) {
log.error("Failed to initialize MQTT client", e);
}
}
private static void initializeMqttClient() throws IOException, MqttException {
String topic = "topic";
String brokerUrl = "tcp://127.0.0.1:1883";
String clientId = "clientId";
// 使用临时目录作为持久化存储
String tempDir = Files.createTempDirectory("mqtt").toString();
MqttDefaultFilePersistence persistence = new MqttDefaultFilePersistence(tempDir);
mqttClient = new MqttClient(brokerUrl, clientId, persistence);
MqttConnectionOptions options = new MqttConnectionOptions();
options.setUserName("");
options.setPassword("".getBytes());
options.setCleanStart(false);
options.setSessionExpiryInterval(3600L * 24L);
options.setKeepAliveInterval(60);
mqttClient.setCallback(new MyMqttCallback(clientId));
mqttClient.connect(options);
mqttClient.subscribe(topic, 2);
log.info("MQTT client initialized successfully with persistence dir: {}", tempDir);
}
public static boolean publishMessage(String topic, String payload, int qos) {
if (mqttClient != null && mqttClient.isConnected()) {
try {
MqttMessage message = new MqttMessage(payload.getBytes());
message.setQos(qos);
mqttClient.publish(topic, message);
return true;
} catch (MqttException e) {
log.error("Failed to publish message to topic: {}", topic, e);
return false;
}
} else {
log.warn("MQTT client is not connected, cannot publish message to topic: {}", topic);
return false;
}
}
@PreDestroy
public void disconnect() {
if (mqttClient != null && mqttClient.isConnected()) {
try {
mqttClient.disconnect();
log.info("MQTT client disconnected successfully");
} catch (MqttException e) {
log.error("Error disconnecting MQTT client", e);
}
}
}
@Bean
public MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
}
class MyMqttCallback implements MqttCallback {
private final String clientId;
public MyMqttCallback(String clientId) {
this.clientId = clientId;
}
@Override
public void connectComplete(boolean reconnect, String serverURI) {
System.out.println(clientId + "::MyMqttCallback, reconnect=" + reconnect + ", serverURI=" + serverURI);
}
@Override
public void disconnected(MqttDisconnectResponse disconnectResponse) {
System.out.println(clientId + "::disconnected, reason=" + disconnectResponse.getReasonString());
}
@Override
public void deliveryComplete(IMqttToken token) {
System.out.println(clientId + "::deliveryComplete, complete=" + token.isComplete());
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
System.out.println(clientId + "::messageArrived, topic=" + topic + ", qos=" + message.getQos() + ", message=" + new String(message.getPayload()));
}
@Override
public void mqttErrorOccurred(MqttException exception) {
System.out.println(clientId + "::mqttErrorOccurred, error=" + exception.getMessage());
}
@Override
public void authPacketArrived(int reasonCode, MqttProperties properties) {
System.out.println(clientId + "::authPacketArrived, reasonCode=" + reasonCode);
}
}