From a55c53299a2394fee5e42d44b68a144428a31608 Mon Sep 17 00:00:00 2001 From: fgather Date: Tue, 30 May 2017 21:49:31 +0200 Subject: [PATCH] Add possibility to set qos and retained state of MQTT messages --- .../HABridge/plugins/mqtt/MQTTHandler.java | 14 +++++++------- .../HABridge/plugins/mqtt/MQTTHome.java | 15 +++++---------- .../HABridge/plugins/mqtt/MQTTMessage.java | 17 +++++++++++++++++ src/main/resources/public/scripts/app.js | 6 +++--- .../resources/public/views/mqttpublish.html | 12 +++++++++++- 5 files changed, 43 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/bwssystems/HABridge/plugins/mqtt/MQTTHandler.java b/src/main/java/com/bwssystems/HABridge/plugins/mqtt/MQTTHandler.java index e40001f..ed3fc54 100644 --- a/src/main/java/com/bwssystems/HABridge/plugins/mqtt/MQTTHandler.java +++ b/src/main/java/com/bwssystems/HABridge/plugins/mqtt/MQTTHandler.java @@ -13,11 +13,12 @@ import org.slf4j.LoggerFactory; import com.bwssystems.HABridge.NamedIP; +import java.util.Optional; + public class MQTTHandler { private static final Logger log = LoggerFactory.getLogger(MQTTHandler.class); private NamedIP myConfig; private MqttClient myClient; - private int qos = 1; public MQTTHandler(NamedIP aConfig) { super(); @@ -40,20 +41,19 @@ public class MQTTHandler { } try { myClient.connect(connOpts); - } catch (MqttSecurityException e) { - log.error("Could not connect MQTT client for name: " + myConfig.getName() + " and ip: " + myConfig.getIp() + " with message: " + e.getMessage()); } catch (MqttException e) { log.error("Could not connect MQTT client for name: " + myConfig.getName() + " and ip: " + myConfig.getIp() + " with message: " + e.getMessage()); } } - public void publishMessage(String topic, String content) { + public void publishMessage(String topic, String content, Integer qos, Boolean retain) { MqttMessage message = new MqttMessage(StringEscapeUtils.unescapeJava(content).getBytes()); - message.setQos(qos); + + message.setQos(Optional.ofNullable(qos).orElse(1)); + message.setRetained(Optional.ofNullable(retain).orElse(false)); + try { myClient.publish(topic, message); - } catch (MqttPersistenceException e) { - log.error("Could not publish to MQTT client for name: " + myConfig.getName() + " and ip: " + myConfig.getIp() + " with message: " + e.getMessage()); } catch (MqttException e) { log.error("Could not publish to MQTT client for name: " + myConfig.getName() + " and ip: " + myConfig.getIp() + " with message: " + e.getMessage()); } diff --git a/src/main/java/com/bwssystems/HABridge/plugins/mqtt/MQTTHome.java b/src/main/java/com/bwssystems/HABridge/plugins/mqtt/MQTTHome.java index 23bee36..2e9ef7a 100644 --- a/src/main/java/com/bwssystems/HABridge/plugins/mqtt/MQTTHome.java +++ b/src/main/java/com/bwssystems/HABridge/plugins/mqtt/MQTTHome.java @@ -37,9 +37,7 @@ public class MQTTHome implements Home { return; log.debug("Shutting down MQTT handlers."); if(handlers != null && !handlers.isEmpty()) { - Iterator keys = handlers.keySet().iterator(); - while(keys.hasNext()) { - String key = keys.next(); + for (String key : handlers.keySet()) { handlers.get(key).shutdown(); } } @@ -108,7 +106,7 @@ public class MQTTHome implements Home { if (mqttHandler == null) { log.warn("Should not get here, no mqtt hanlder available"); } else { - mqttHandler.publishMessage(mqttMessages[y].getTopic(), mqttMessages[y].getMessage()); + mqttHandler.publishMessage(mqttMessages[y].getTopic(), mqttMessages[y].getMessage(), mqttMessages[y].getQos(), mqttMessages[y].getRetain()); } } } @@ -130,13 +128,10 @@ public class MQTTHome implements Home { aGsonHandler = new GsonBuilder() .create(); - handlers = new HashMap(); - Iterator theList = bridgeSettings.getBridgeSettingsDescriptor().getMqttaddress().getDevices().iterator(); - while(theList.hasNext()) { - NamedIP aClientConfig = theList.next(); + handlers = new HashMap<>(); + for (NamedIP aClientConfig : bridgeSettings.getBridgeSettingsDescriptor().getMqttaddress().getDevices()) { MQTTHandler aHandler = new MQTTHandler(aClientConfig); - if(aHandler != null) - handlers.put(aClientConfig.getName(), aHandler); + handlers.put(aClientConfig.getName(), aHandler); } } return this; diff --git a/src/main/java/com/bwssystems/HABridge/plugins/mqtt/MQTTMessage.java b/src/main/java/com/bwssystems/HABridge/plugins/mqtt/MQTTMessage.java index c9cb784..c1cb914 100644 --- a/src/main/java/com/bwssystems/HABridge/plugins/mqtt/MQTTMessage.java +++ b/src/main/java/com/bwssystems/HABridge/plugins/mqtt/MQTTMessage.java @@ -6,6 +6,8 @@ public class MQTTMessage { private String message; private Integer delay; private Integer count; + private Integer qos; + private Boolean retain; public String getClientId() { return clientId; } @@ -36,4 +38,19 @@ public class MQTTMessage { public void setCount(Integer count) { this.count = count; } + public Integer getQos() { + return qos; + } + + public void setQos(Integer qos) { + this.qos = qos; + } + + public Boolean getRetain() { + return retain; + } + + public void setRetain(Boolean retain) { + this.retain = retain; + } } diff --git a/src/main/resources/public/scripts/app.js b/src/main/resources/public/scripts/app.js index 12b5842..a39a8d9 100644 --- a/src/main/resources/public/scripts/app.js +++ b/src/main/resources/public/scripts/app.js @@ -2498,9 +2498,9 @@ app.controller('MQTTController', function ($scope, $location, bridgeService, ngD $scope.device = bridgeService.state.device; }; - $scope.buildMQTTPublish = function (mqttbroker, mqtttopic, mqttmessage) { - onpayload = "{\"clientId\":\"" + mqttbroker.clientId + "\",\"topic\":\"" + mqtttopic + "\",\"message\":\"" + mqttmessage + "\"}"; - offpayload = "{\"clientId\":\"" + mqttbroker.clientId + "\",\"topic\":\"" + mqtttopic + "\",\"message\":\"" + mqttmessage + "\"}"; + $scope.buildMQTTPublish = function (mqttbroker, mqtttopic, mqttmessage, mqttqos, mqttretain) { + onpayload = "{\"clientId\":\"" + mqttbroker.clientId + "\",\"topic\":\"" + mqtttopic + "\",\"message\":\"" + mqttmessage + "\",\"qos\":\"" + mqttqos + "\",\"retain\":\"" + mqttretain + "\"}"; + offpayload = "{\"clientId\":\"" + mqttbroker.clientId + "\",\"topic\":\"" + mqtttopic + "\",\"message\":\"" + mqttmessage + "\",\"qos\":\"" + mqttqos + "\",\"retain\":\"" + mqttretain + "\"}"; bridgeService.buildUrls(onpayload, null, offpayload, true, mqttbroker.clientId + "-" + mqtttopic, mqttbroker.clientId + mqtttopic, mqttbroker.clientId, "mqtt", "mqttMessage", null, null); $scope.device = bridgeService.state.device; diff --git a/src/main/resources/public/views/mqttpublish.html b/src/main/resources/public/views/mqttpublish.html index 9fe47da..b2d74a4 100644 --- a/src/main/resources/public/views/mqttpublish.html +++ b/src/main/resources/public/views/mqttpublish.html @@ -43,6 +43,8 @@ IP Topic Content + QoS + Retain Build Actions @@ -58,9 +60,17 @@ + + + + + +