[
https://issues.apache.org/jira/browse/NIFI-1767?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15310912#comment-15310912
]
ASF GitHub Bot commented on NIFI-1767:
--------------------------------------
Github user KayLerch commented on a diff in the pull request:
https://github.com/apache/nifi/pull/349#discussion_r65423267
--- Diff:
nifi-nar-bundles/nifi-aws-bundle/nifi-aws-processors/src/main/java/org/apache/nifi/processors/aws/iot/util/MqttWebSocketAsyncClient.java
---
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.nifi.processors.aws.iot.util;
+
+import java.net.URI;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import org.apache.nifi.logging.ProcessorLog;
+import org.eclipse.paho.client.mqttv3.MqttAsyncClient;
+import org.eclipse.paho.client.mqttv3.MqttCallback;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.TimerPingSender;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.eclipse.paho.client.mqttv3.MqttSecurityException;
+import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.eclipse.paho.client.mqttv3.internal.NetworkModule;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+
+public class MqttWebSocketAsyncClient extends MqttAsyncClient implements
MqttCallback {
+
+ protected volatile LinkedBlockingQueue<IoTMessage>
awsQueuedMqttMessages = new LinkedBlockingQueue<IoTMessage>();
+ protected final ProcessorLog logger;
+ protected final String serverURI;
+
+ protected static String createDummyURI(String original) {
+ if (!original.startsWith("ws:") && !original.startsWith("wss:")) {
+ return original;
+ }
+ final URI uri = URI.create(original);
+ return "tcp://DUMMY-" + uri.getHost() + ":"
+ + (uri.getPort() > 0 ? uri.getPort() : 80);
+ }
+
+ protected static boolean isDummyURI(String uri) {
+ return uri.startsWith("tcp://DUMMY-");
+ }
+
+ public MqttWebSocketAsyncClient(String serverURI, String clientId,
+ ProcessorLog logger) throws
MqttException {
+ super(createDummyURI(serverURI), clientId, new
MemoryPersistence(), new TimerPingSender());
+ this.serverURI = serverURI;
+ this.logger = logger;
+ this.setCallback(this);
+ }
+
+ @Override
+ protected NetworkModule[] createNetworkModules(String address,
+ MqttConnectOptions
options) throws MqttException{
+ String[] serverURIs = options.getServerURIs();
+ String[] array = serverURIs == null ? new String[] { address } :
+ serverURIs.length == 0 ? new String[] { address }: serverURIs;
+
+ NetworkModule[] networkModules = new NetworkModule[array.length];
+ for (int i = 0; i < array.length; i++) {
+ networkModules[i] = createNetworkModule(array[i], options);
+ }
+ return networkModules;
+ }
+
+ protected NetworkModule createNetworkModule(String input,
+ MqttConnectOptions
options) throws MqttException,
+ MqttSecurityException {
+ final String address = isDummyURI(input) ? this.serverURI : input;
+ if (!address.startsWith("ws:") && !address.startsWith("wss:")) {
+ return super.createNetworkModules(address, options)[0];
+ }
+
+ final String subProtocol = (options.getMqttVersion() ==
MqttConnectOptions.MQTT_VERSION_3_1) ? "mqttv3.1" : "mqtt";
+ return newWebSocketNetworkModule(URI.create(address), subProtocol,
options);
+ }
+
+ protected NetworkModule newWebSocketNetworkModule(URI uri,
+ String subProtocol,
MqttConnectOptions options) {
+ final WebSocketNetworkModule netModule = new
WebSocketNetworkModule(
+ uri, subProtocol, getClientId());
+ netModule.setConnectTimeout(options.getConnectionTimeout());
+ return netModule;
+ }
+
+ public LinkedBlockingQueue<IoTMessage> getAwsQueuedMqttMessages() {
+ return awsQueuedMqttMessages;
+ }
+
+ @Override
+ public void connectionLost(Throwable t) {
+ logger.error("Connection to " + this.getServerURI() + " lost with
cause: " + t.getMessage());
+ }
+
+ @Override
+ public void deliveryComplete(IMqttDeliveryToken token) {
+ }
+
+ @Override
+ public void messageArrived(String topic, MqttMessage message) throws
Exception {
+ logger.info("Message arrived from topic: " + topic);
--- End diff --
Changed it to debug.
> AWS IoT processors
> ------------------
>
> Key: NIFI-1767
> URL: https://issues.apache.org/jira/browse/NIFI-1767
> Project: Apache NiFi
> Issue Type: New Feature
> Components: Extensions
> Reporter: Kay Lerch
> Attachments: 20160413_apache-nifi-aws-iot-pull-request_lerchkay.pdf
>
>
> Four new processors to communicate with Amazon’s managed device gateway
> service AWS IoT.
> h5.Use cases
> * Consume reported states from a fleet of things managed and secured on
> Amazon’s gateway service
> * Propagate desired states to a fleet of things managed and secured on
> Amazon’s gateway service
> * Intercept M2M communication
> * Hybrid IoT solutions: brings together a managed device gateway in the cloud
> and onpremise data-consumers and -providers.
> h4.GetIOTMqtt:
> Opens up a connection to an AWS-account-specific websocket endpoint in order
> to subscribe to any of the MQTT topics belonging to a registered thing in AWS
> IoT.
> h4.PutIOTMqtt
> Opens up a connection to an AWS-account-specific websocket endpoint in order
> to publish messages to any of the MQTT topics belonging to a registered thing
> in AWS IoT.
> h4.GetIOTShadow
> In AWS IoT a physical thing is represented with its last reported state by
> the so-called thing shadow. This processor reads out the current state of a
> shadow (persisted as JSON) by requesting the managed API of AWS IoT.
> h4.PutIOTShadow
> In AWS IoT a physical thing is represented with its last reported state by
> the so-called thing shadow. This processor updates the current state of a
> shadow (persisted as JSON) by requesting the managed API of AWS IoT. An
> update to a shadow lets AWS IoT propagate changes to the MQTT topics of the
> thing.
> h5.Known issues:
> * It was hard for me to write appropriate integration tests since the MQTT
> processors work with durable websocket-connections which are kind of tough to
> test. With your help I would love to do a better job on testing and hand it
> in later on. All of the processors were tested in a live-scenario which ran
> over a longer period of time. Didn’t observe any issue.
> * I got rid of all the properties for the deprecated
> AWSCredentialProviderService and only made use of
> AWSCredentialsProviderControllerService. If both are still necessary for
> backward-compatibilities sake I would add the deprecated feature.
> Refers to Pull Request 349: https://github.com/apache/nifi/pull/349
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)