package org.thingml.generated.network; import org.thingml.generated.messages.*; import org.thingml.java.*; import org.thingml.java.ext.*; import org.fusesource.hawtbuf.Buffer; import org.fusesource.hawtbuf.UTF8Buffer; import org.fusesource.mqtt.client.*; import java.net.URISyntaxException; public class MQTTJava extends Component { private final /*$SERIALIZER$*/ formatter = new /*$SERIALIZER$*/(); private final String pubtopic; private final String subtopic; //TODO: Make QoS parameterized final CallbackConnection connection; final Callback<Void> disconnectOnFailure = new Callback<Void>() { public void onSuccess(Void v) {} public void onFailure(Throwable value) { System.err.println("MQTT failure: " + value.getMessage()); disconnect(); } }; /*$PORTS$*/ public MQTTJava(String url, String pubtopic, String subtopic) { this.pubtopic = pubtopic; this.subtopic = subtopic; final MQTT mqtt = new MQTT(); try { mqtt.setHost(url); } catch (URISyntaxException e) { e.printStackTrace(); } connection = mqtt.callbackConnection(); registerListener(); connect(); } private void registerListener() { connection.listener(new Listener() { public void onDisconnected() {} public void onConnected() {} public void onPublish(UTF8Buffer topic, Buffer payload, Runnable ack) { if (topic.toString().equals(MQTTJava.this.subtopic)) { /*$PARSING CODE$*/ } ack.run(); } public void onFailure(Throwable value) { System.err.println("MQTT failure: " + value.getMessage()); disconnect(); // a connection failure occured. } }); } private void disconnect() { connection.disconnect(new Callback<Void>() { @Override public void onSuccess(Void aVoid) {} @Override public void onFailure(Throwable throwable) {} }); } private void connect() { connection.connect(new Callback<Void>() { public void onFailure(Throwable value) { System.err.println("Cannot connect to MQTT broker: " + value.getMessage()); disconnect(); } // Once we connect.. public void onSuccess(Void v) { // Subscribe to a topic Topic[] topics = {new Topic(MQTTJava.this.subtopic, QoS.AT_LEAST_ONCE)}; connection.subscribe(topics, new Callback<byte[]>() { public void onSuccess(byte[] qoses) {} public void onFailure(Throwable value) { System.err.println("Cannot subscribe to MQTT topic: " + value.getMessage()); disconnect(); } }); } }); } @Override public void stop() { super.stop(); disconnect(); } @Override public void run() { while (active.get()) { try { final Event e = queue.take();//should block if queue is empty, waiting for a message final Object payload = formatter.format(e); if (payload != null) { /*$PUBLISH$*/ } } catch (InterruptedException e) { //e.printStackTrace(); } } } @Override public Component buildBehavior(String id, Component root) { /*$INIT PORTS$*/ final java.util.List < AtomicState > states = new java.util.ArrayList < AtomicState > (); final AtomicState init = new AtomicState("Init"); states.add(init); behavior = new CompositeState("default", states, init, java.util.Collections.EMPTY_LIST); return this; } }