MQTT
This commit is contained in:
parent
49759832e1
commit
147bff7927
@ -6,3 +6,6 @@ spring.datasource.username=sa
|
|||||||
spring.datasource.password=password
|
spring.datasource.password=password
|
||||||
#-
|
#-
|
||||||
#spring.jpa.hibernate.ddl-auto=create
|
#spring.jpa.hibernate.ddl-auto=create
|
||||||
|
#-
|
||||||
|
de.ph87.data.message.receive.mqtt.host=10.0.0.50
|
||||||
|
de.ph87.data.message.receive.mqtt.topic=#
|
||||||
|
|||||||
@ -0,0 +1,26 @@
|
|||||||
|
package de.ph87.data.message.receive.mqtt;
|
||||||
|
|
||||||
|
import lombok.*;
|
||||||
|
import org.springframework.boot.context.properties.*;
|
||||||
|
import org.springframework.stereotype.*;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Component
|
||||||
|
@ConfigurationProperties(prefix = "de.ph87.data.message.receive.mqtt")
|
||||||
|
public class MqttConfig {
|
||||||
|
|
||||||
|
private String host;
|
||||||
|
|
||||||
|
private int port = 1883;
|
||||||
|
|
||||||
|
private String topic;
|
||||||
|
|
||||||
|
private String clientId;
|
||||||
|
|
||||||
|
private int connectTimeoutSec = 3;
|
||||||
|
|
||||||
|
private long retrySec = 3;
|
||||||
|
|
||||||
|
private int connectKeepAliveSec = 3;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,115 @@
|
|||||||
|
package de.ph87.data.message.receive.mqtt;
|
||||||
|
|
||||||
|
import jakarta.annotation.*;
|
||||||
|
import lombok.*;
|
||||||
|
import lombok.extern.slf4j.*;
|
||||||
|
import org.eclipse.paho.client.mqttv3.*;
|
||||||
|
import org.eclipse.paho.client.mqttv3.persist.*;
|
||||||
|
import org.springframework.boot.context.event.*;
|
||||||
|
import org.springframework.context.event.EventListener;
|
||||||
|
import org.springframework.stereotype.*;
|
||||||
|
|
||||||
|
import java.nio.charset.*;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class MqttReceiver {
|
||||||
|
|
||||||
|
private final MqttConfig config;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private MqttClient client;
|
||||||
|
|
||||||
|
private final Thread thread = new Thread(this::run, "MQTT-WATCH");
|
||||||
|
|
||||||
|
private boolean stop = false;
|
||||||
|
|
||||||
|
@EventListener(ApplicationStartedEvent.class)
|
||||||
|
public void startup() {
|
||||||
|
thread.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
@PreDestroy
|
||||||
|
public void preDestroy() {
|
||||||
|
synchronized (thread) {
|
||||||
|
stop = true;
|
||||||
|
thread.notifyAll();
|
||||||
|
log.debug("stopping...");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void run() {
|
||||||
|
try {
|
||||||
|
log.debug("started");
|
||||||
|
while (!stop) {
|
||||||
|
synchronized (thread) {
|
||||||
|
if (client == null || !client.isConnected()) {
|
||||||
|
_connect();
|
||||||
|
} else {
|
||||||
|
thread.wait();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
log.error("Interrupted");
|
||||||
|
} finally {
|
||||||
|
log.debug("terminating...");
|
||||||
|
_disconnect();
|
||||||
|
log.debug("terminated");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _connect() throws InterruptedException {
|
||||||
|
final String clientId;
|
||||||
|
final boolean cleanSession;
|
||||||
|
final MqttClientPersistence persistence;
|
||||||
|
final String uri = "tcp://%s:%d".formatted(config.getHost(), config.getPort());
|
||||||
|
if (config.getClientId() != null && !config.getClientId().isEmpty()) {
|
||||||
|
clientId = config.getClientId();
|
||||||
|
cleanSession = false;
|
||||||
|
persistence = new MqttDefaultFilePersistence("./data");
|
||||||
|
} else {
|
||||||
|
clientId = "DATA_TMP_" + UUID.randomUUID();
|
||||||
|
cleanSession = true;
|
||||||
|
persistence = new MemoryPersistence();
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
log.info("Connecting mqtt broker: {} as \"{}\"{}", uri, clientId, cleanSession ? " [CLEAN SESSION]" : "");
|
||||||
|
client = new MqttClient(uri, clientId, persistence);
|
||||||
|
final MqttConnectOptions options = new MqttConnectOptions();
|
||||||
|
options.setAutomaticReconnect(true);
|
||||||
|
options.setCleanSession(cleanSession);
|
||||||
|
options.setConnectionTimeout(config.getConnectTimeoutSec());
|
||||||
|
client.connect(options);
|
||||||
|
log.info("MQTT broker connected.");
|
||||||
|
client.subscribe(config.getTopic(), this::_receive);
|
||||||
|
} catch (MqttException e) {
|
||||||
|
log.error("Failed to connect MQTT broker: {}", e.getMessage());
|
||||||
|
client = null;
|
||||||
|
synchronized (thread) {
|
||||||
|
log.debug("Retrying in {} seconds...", config.getRetrySec());
|
||||||
|
thread.wait(config.getRetrySec() * 1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _disconnect() {
|
||||||
|
if (client != null && client.isConnected()) {
|
||||||
|
try {
|
||||||
|
client.disconnect();
|
||||||
|
} catch (MqttException e) {
|
||||||
|
log.error(e.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _receive(final String topic, final MqttMessage mqttMessage) {
|
||||||
|
Thread.currentThread().setName("MQTT-RECEIVE");
|
||||||
|
final String payload = new String(mqttMessage.getPayload(), StandardCharsets.UTF_8);
|
||||||
|
final String payloadLoggable = payload.replace("\n", "\\n").replace("\r", "\\r");
|
||||||
|
log.debug("received: topic={}, message={}", topic, payloadLoggable);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user