All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.ar4k.agent.mqtt.client.PahoClientService Maven / Gradle / Ivy

package org.ar4k.agent.mqtt.client;

import java.util.ArrayList;
import java.util.List;

import org.ar4k.agent.core.Homunculus;
import org.ar4k.agent.core.data.DataAddress;
import org.ar4k.agent.core.interfaces.EdgeComponent;
import org.ar4k.agent.core.interfaces.ServiceConfig;
import org.ar4k.agent.exception.ServiceInitException;
import org.ar4k.agent.exception.ServiceWatchDogException;
import org.ar4k.agent.logger.EdgeLogger;
import org.ar4k.agent.logger.EdgeStaticLoggerBinder;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttClientPersistence;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence;

/**
 * @author Andrea Ambrosini Rossonet s.c.a r.l. [email protected]
 *
 *         Servizio di connessione client Paho.
 */

public class PahoClientService implements EdgeComponent {

	private MqttClient mqttClient = null;
	private PahoClientConfig configuration = null;
	private DataAddress dataAddress = null;
	private Homunculus homunculus = null;
	private ServiceStatus serviceStatus = ServiceStatus.INIT;
	private List subscriptions = new ArrayList<>();

	private static final EdgeLogger logger = EdgeStaticLoggerBinder.getClassLogger(PahoClientService.class);

	@Override
	public void close() throws Exception {
		kill();
	}

	@Override
	public ServiceStatus updateAndGetStatus() throws ServiceWatchDogException {
		return serviceStatus;
	}

	@Override
	public void init() throws ServiceInitException {
		try {
			MqttClientPersistence persistence = null;
			if (configuration.persistenceOnFileSystem != null && !configuration.persistenceOnFileSystem.isEmpty()) {
				persistence = new MqttDefaultFilePersistence(configuration.persistenceOnFileSystem);
			} else {
				persistence = new MemoryPersistence();
			}
			mqttClient = new MqttClient(configuration.broker, configuration.clientId, persistence);
			MqttConnectOptions connOpts = new MqttConnectOptions();
			connOpts.setCleanSession(configuration.cleanSession);
			connOpts.setAutomaticReconnect(true);
			connOpts.setConnectionTimeout(configuration.connectionTimeout);
			connOpts.setKeepAliveInterval(configuration.keepAliveInterval);
			connOpts.setMaxInflight(configuration.maxInflight);
			connOpts.setMaxReconnectDelay(configuration.maxReconnectDelay);
			if (configuration.userName != null && configuration.password != null && !configuration.password.isEmpty()
					&& !configuration.userName.isEmpty()) {
				connOpts.setUserName(configuration.userName);
				connOpts.setPassword(configuration.password.toCharArray());
			}
			mqttClient.connect(connOpts);
			subscribeTopics();
			serviceStatus = ServiceStatus.RUNNING;
		} catch (MqttException exception) {
			logger.logException(exception);
		}
	}

	private void subscribeTopics() {
		for (MqttTopicConfig t : configuration.subscriptions) {
			subscriptions.add(new MqttTopicSubscription(this, mqttClient, t));
		}

	}

	@Override
	public void kill() {
		if (mqttClient != null) {
			try {
				mqttClient.disconnect();
			} catch (MqttException exception) {
				logger.logException(exception);
			}
		}
		serviceStatus = ServiceStatus.KILLED;
	}

	@Override
	public Homunculus getHomunculus() {
		return homunculus;
	}

	@Override
	public DataAddress getDataAddress() {
		return dataAddress;
	}

	@Override
	public void setDataAddress(DataAddress dataAddress) {
		this.dataAddress = dataAddress;
	}

	@Override
	public void setHomunculus(Homunculus homunculus) {
		this.homunculus = homunculus;
	}

	@Override
	public ServiceConfig getConfiguration() {
		return configuration;
	}

	@Override
	public void setConfiguration(ServiceConfig configuration) {
		this.configuration = (PahoClientConfig) configuration;
	}

	@Override
	public String getServiceName() {
		return getConfiguration().getName();
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy