package ch.epfl.gsn.networking.mqtt;
import java.util.TreeMap;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.epfl.gsn.beans.StreamElement;
import ch.epfl.gsn.vsensor.AbstractVirtualSensor;
public class MQTTExporterVS extends AbstractVirtualSensor {
private static transient Logger logger = LoggerFactory.getLogger(MQTTExporterVS.class);
private MqttClient client;
private String serverURI;
private String clientID;
private String topic;
private MqttConnectOptions options = new MqttConnectOptions();
public MQTTExporterVS() {}
@Override
public boolean initialize() {
TreeMap<String, String> params = getVirtualSensorConfiguration().getMainClassInitialParams();
serverURI = params.get("uri");
if (serverURI == null) {
logger.error("Parameter uri not provided in Virtual Sensor file.");
return false;
}
clientID = params.get("client_id");
if (clientID == null) {
logger.warn("Parameter client_id not provided in Virtual Sensor file, using random one.");
clientID = MqttClient.generateClientId();
}
topic = params.get("topic");
if (topic == null) {
logger.warn("Parameter topic not provided in Virtual Sensor file, using virtual sensor name.");
topic = getVirtualSensorConfiguration().getName();
}
try{
client = new MqttClient(serverURI, clientID);
options.setAutomaticReconnect(true);
client.connect(options);
}catch (Exception e){
logger.error("Unable to connect to MQTT server.", e);
return false;
}
return true;
}
@Override
public void dispose() {
try {
client.disconnect();
client.close();
} catch (MqttException e) {
logger.warn("Error while closing the MQTT client.", e);
}
}
@Override
public void dataAvailable(String inputStreamName, StreamElement streamElement) {
try {
//to adapt according to content to be sent...
client.publish(topic, ((byte[])streamElement.getData("raw_packet")), 0, false);
} catch (MqttException e) {
logger.warn("Error while sending stream element to the MQTT server.", e);
}
dataProduced(streamElement);
}
}