package ch.epfl.gsn.networking.mqtt; import java.io.IOException; 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.DataField; import ch.epfl.gsn.beans.StreamElement; import ch.epfl.gsn.delivery.DeliverySystem; public class MQTTDelivery implements DeliverySystem { private final transient Logger logger = LoggerFactory.getLogger(MQTTDelivery.class); private MqttClient client; private String serverURI; private String topic; private String vsname; private boolean closed = false; private MqttConnectOptions options = new MqttConnectOptions(); public MQTTDelivery(String serverURI, String clientID, String topic, String vsname) { try{ client = new MqttClient(serverURI, clientID); options.setAutomaticReconnect(true); client.connect(options); }catch (Exception e){ logger.error("Unable to instanciate delivery system MQTT.", e); } } @Override public void writeStructure(DataField[] fields) throws IOException { StreamElement se = new StreamElement(fields, new Integer[fields.length]); try { client.publish(topic, se.toJSON(vsname).getBytes(), 0, true); } catch (MqttException e) { logger.error("Unable to publish stream element to topic " + topic + " on "+ serverURI); } } @Override public boolean writeStreamElement(StreamElement se) { try { client.publish(topic, se.toJSON(vsname).getBytes(), 0, false); } catch (MqttException e) { logger.error("Unable to publish stream element to topic " + topic + " on "+ serverURI); return false; } return true; } @Override public boolean writeKeepAliveStreamElement() { //The client takes care of keep-alive return true; } @Override public void close() { try { client.disconnect(); client.close(); closed = true; } catch (MqttException e) { logger.warn("Error while closing the MQTT client.", e); } } @Override public boolean isClosed() { return closed; } }