http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/apps/src/main/java/org/apache/edgent/samples/apps/JsonTuples.java ---------------------------------------------------------------------- diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/JsonTuples.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/JsonTuples.java deleted file mode 100644 index 0c231c8..0000000 --- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/JsonTuples.java +++ /dev/null @@ -1,196 +0,0 @@ -/* -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.edgent.samples.apps; - -import static org.apache.edgent.analytics.math3.stat.Statistic.MAX; -import static org.apache.edgent.analytics.math3.stat.Statistic.MEAN; -import static org.apache.edgent.analytics.math3.stat.Statistic.MIN; -import static org.apache.edgent.analytics.math3.stat.Statistic.STDDEV; - -import java.util.List; - -import org.apache.commons.math3.util.Pair; -import org.apache.edgent.analytics.math3.json.JsonAnalytics; -import org.apache.edgent.analytics.math3.stat.Statistic; -import org.apache.edgent.function.BiFunction; -import org.apache.edgent.function.Function; -import org.apache.edgent.topology.TStream; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; - -/** - * Utilties to ease working working with sensor "samples" by wrapping them - * in JsonObjects. - * <p> - * The Json Tuple sensor "samples" have a standard collection of properties. - */ -public class JsonTuples { - - /* - * Common attributes in the JsonObject - */ - public static final String KEY_ID = "id"; - public static final String KEY_TS = "msec"; - public static final String KEY_READING = "reading"; - public static final String KEY_AGG_BEGIN_TS = "agg.begin.msec"; - public static final String KEY_AGG_COUNT = "agg.count"; - - /** - * Create a JsonObject wrapping a raw {@code Pair<Long msec,T reading>>} sample. - * @param <T> Tuple type - * @param sample the raw sample - * @param id the sensor's Id - * @return the wrapped sample - */ - public static <T> JsonObject wrap(Pair<Long,T> sample, String id) { - JsonObject jo = new JsonObject(); - jo.addProperty(KEY_ID, id); - jo.addProperty(KEY_TS, sample.getFirst()); - T value = sample.getSecond(); - if (value instanceof Number) - jo.addProperty(KEY_READING, (Number)sample.getSecond()); - else if (value instanceof String) - jo.addProperty(KEY_READING, (String)sample.getSecond()); - else if (value instanceof Boolean) - jo.addProperty(KEY_READING, (Boolean)sample.getSecond()); -// else if (value instanceof array) { -// // TODO cvt to JsonArray -// } -// else if (value instanceof Object) { -// // TODO cvt to JsonObject -// } - else { - Class<?> clazz = value != null ? value.getClass() : Object.class; - throw new IllegalArgumentException("Unhandled value type: "+ clazz); - } - return jo; - } - - /** - * Create a stream of JsonObject wrapping a stream of - * raw {@code Pair<Long msec,T reading>>} samples. - * - * @param <T> Tuple type - * @param stream the raw input stream - * @param id the sensor's Id - * @return the wrapped stream - */ - public static <T> TStream<JsonObject> wrap(TStream<Pair<Long,T>> stream, String id) { - return stream.map(pair -> wrap(pair, id)); - } - - /** - * The partition key function for wrapped sensor samples. - * <p> - * The {@code KEY_ID} property is returned for the key. - * @return the function - */ - public static Function<JsonObject,String> keyFn() { - return sample -> sample.get(KEY_ID).getAsString(); - } - - - /** - * Get a statistic value from a sample. - * <p> - * Same as {@code getStatistic(jo, JsonTuples.KEY_READING, stat)}. - * - * @param jo the sample - * @param stat the Statistic of interest - * @return the JsonElement for the Statistic - * @throws RuntimeException of the stat isn't present - */ - public static JsonElement getStatistic(JsonObject jo, Statistic stat) { - return getStatistic(jo, JsonTuples.KEY_READING, stat); - } - - /** - * Get a statistic value from a sample. - * <p> - * Convenience for working with samples containing a property - * whose value is one or more {@link Statistic} - * as created by - * {@link JsonAnalytics#aggregate(org.apache.edgent.topology.TWindow, String, String, org.apache.edgent.analytics.math3.json.JsonUnivariateAggregate...) JsonAnalytics.aggregate()} - * - * @param jo the sample - * @param valueKey the name of the property containing the JsonObject of Statistics - * @param stat the Statistic of interest - * @return the JsonElement for the Statistic - * @throws RuntimeException of the stat isn't present - */ - public static JsonElement getStatistic(JsonObject jo, String valueKey, Statistic stat) { - JsonObject statsjo = jo.get(valueKey).getAsJsonObject(); - return statsjo.get(stat.name()); - } - - /** - * Create a function that computes the specified statistics on the list of - * samples and returns a new sample containing the result. - * <p> - * The single tuple contains the specified statistics computed over - * all of the {@code JsonTuple.KEY_READING} - * values from {@code List<JsonObject>}. - * <p> - * The resulting sample contains the properties: - * <ul> - * <li>JsonTuple.KEY_ID</li> - * <li>JsonTuple.KEY_MSEC - msecTimestamp of the last sample in the window</li> - * <li>JsonTuple.KEY_AGG_BEGIN_MSEC - msecTimestamp of the first sample in the window</li> - * <li>JsonTuple.KEY_AGG_COUNT - number of samples in the window ({@code value=factor})</li> - * <li>JsonTuple.KEY_READING - a JsonObject of the statistics - * as defined by - * {@link JsonAnalytics#aggregate(org.apache.edgent.topology.TWindow, String, String, org.apache.edgent.analytics.math3.json.JsonUnivariateAggregate...) JsonAnalytics.aggregate()} - * </ul> - * <p> - * Sample use: - * <pre>{@code - * TStream<JsonObject> s = ... - * // reduce s by a factor of 100 with stats MEAN and STDEV - * TStream<JsonObject> reduced = s.batch(100, statistics(Statistic.MEAN, Statistic.STDDEV)); - * }</pre> - * - * @param statistics the statistics to calculate over the window - * @return {@code TStream<JsonObject>} for the reduced {@code stream} - */ - public static BiFunction<List<JsonObject>,String,JsonObject> statistics(Statistic... statistics) { - BiFunction<List<JsonObject>,JsonElement,JsonObject> statsFn = - JsonAnalytics.aggregateList(KEY_ID, KEY_READING, - j -> j.get(KEY_READING).getAsDouble(), - MIN, MAX, MEAN, STDDEV); - - return (samples, key) -> { - JsonObject jo = statsFn.apply(samples, samples.get(0).get(KEY_ID)); - JsonTuples.addAggStdInfo(jo, samples); - return jo; - }; - } - - private static void addAggStdInfo(JsonObject jo, List<JsonObject> samples) { - // beginMsec, endMsec, nSamples - long msec = samples.get(0).get(KEY_TS).getAsLong(); - long msec2 = samples.get(samples.size()-1).get(KEY_TS).getAsLong(); - int nSamples = samples.size(); - - jo.addProperty(KEY_TS, msec2); - jo.addProperty(KEY_AGG_BEGIN_TS, msec); - jo.addProperty(KEY_AGG_COUNT, nSamples); - } - -}
http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/apps/src/main/java/org/apache/edgent/samples/apps/TopologyProviderFactory.java ---------------------------------------------------------------------- diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/TopologyProviderFactory.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/TopologyProviderFactory.java deleted file mode 100644 index 1128fcb..0000000 --- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/TopologyProviderFactory.java +++ /dev/null @@ -1,63 +0,0 @@ -/* -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.edgent.samples.apps; - -import java.util.Properties; - -import org.apache.edgent.providers.direct.DirectProvider; - -/** - * A configuration driven factory for an Edgent topology provider. - */ -public class TopologyProviderFactory { - private final Properties props; - - /** - * Construct a factory - * @param props configuration information. - */ - public TopologyProviderFactory(Properties props) { - this.props = props; - } - - /** - * Get a new topology provider. - * <p> - * The default provider is {@code org.apache.edgent.providers.direct.DirectProvider}. - * <p> - * The {@code topology.provider} configuration property can specify - * an alternative. - * - * @return the provider - * @throws Exception if the provider couldn't be created - */ - public DirectProvider newProvider() throws Exception { - String name = props.getProperty("topology.provider", "org.apache.edgent.providers.direct.DirectProvider"); - Class<?> clazz = null; - try { - clazz = Class.forName(name); - } - catch (ClassNotFoundException e) { - String msg = "Class not found: "+e.getLocalizedMessage(); - System.err.println(msg); - throw new IllegalStateException(msg); - } - return (DirectProvider) clazz.newInstance(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/FleetManagementAnalyticsClientApplication.java ---------------------------------------------------------------------- diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/FleetManagementAnalyticsClientApplication.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/FleetManagementAnalyticsClientApplication.java deleted file mode 100644 index 483ab09..0000000 --- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/FleetManagementAnalyticsClientApplication.java +++ /dev/null @@ -1,68 +0,0 @@ -/* -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.edgent.samples.apps.fleetManagement; - -import org.apache.edgent.samples.apps.AbstractIotpApplication; -import org.apache.edgent.topology.Topology; - -/** - * A Global Positional System and On-Board Diagnostics application to perform - * analytics defined in {@link GpsAnalyticsApplication} and - * {@link ObdAnalyticsApplication}. - * <p> - * The Edgent console URL is written to the console and to file consoleUrl.txt. - * <p> - * The Watson IotF URL is written to the console and to file iotfUrl.txt - * - * <p> - * Argument: specify pathname to application properties file. If running in - * Eclipse, you can specify GpsObdAnalyticsApplication.properties. - */ -public class FleetManagementAnalyticsClientApplication extends AbstractIotpApplication { - - public static void main(String[] args) throws Exception { - if (args.length < 1) - throw new Exception("missing pathname to application properties file"); - - FleetManagementAnalyticsClientApplication application = new FleetManagementAnalyticsClientApplication(args[0]); - - application.run(); - } - - /** - * Create an application instance. - * - * @param propsPath - * pathname to an application configuration file - * @throws Exception - */ - FleetManagementAnalyticsClientApplication(String propsPath) throws Exception { - super(propsPath); - } - - @Override - protected void buildTopology(Topology t) { - - // Add the GPS analytics to the topology - new GpsAnalyticsApplication(t, this).addAnalytics(); - - // TODO Add the OBD analytics to the topology - // new ObdAnalyticsApplication(t, this).addAnalytics(); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/GpsAnalyticsApplication.java ---------------------------------------------------------------------- diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/GpsAnalyticsApplication.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/GpsAnalyticsApplication.java deleted file mode 100644 index c656300..0000000 --- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/GpsAnalyticsApplication.java +++ /dev/null @@ -1,214 +0,0 @@ -/* -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.edgent.samples.apps.fleetManagement; - -import java.util.concurrent.TimeUnit; - -import org.apache.edgent.connectors.iot.QoS; -import org.apache.edgent.samples.utils.sensor.GpsSensor; -import org.apache.edgent.samples.utils.sensor.SimulatedGpsSensor; -import org.apache.edgent.topology.TStream; -import org.apache.edgent.topology.TWindow; -import org.apache.edgent.topology.Topology; - -import com.google.gson.JsonObject; - -/** - * GPS analytics - * <p> - * Source is a stream of GPS sensor data {@link GpsSensor} - * <p> - * Here's an outline of the topology - * <ul> - * <li>Log GPS coordinates by publishing to IotF. The data may be used by a - * server application to display the vehicle on a map.</li> - * <li>Filter to detect speeds above a threshold and publish alert IotF</li> - * <li>Filter for GPS coordinates that are outside of a defined Geofence - * boundary</li> - * <li>Windowing to detect hard driving: hard braking or hard acceleration and - * publish alert to IotF</li> - * </ul> - */ -public class GpsAnalyticsApplication { - - private final FleetManagementAnalyticsClientApplication app; - private final Topology topology; - - // TODO: make these configurable properties - boolean trackGpsLocation = true; - boolean trackSpeeding = true; - boolean trackGeofence = true; - boolean trackHardDriving = true; - // Hard braking and acceleration thresholds may depend on the vehicle model - double hardBrakingThreshold_MphPerSec = -8.25; - double hardAccelerationThreshold_MphPerSec = 7.37; - String driverId = "driver1"; - String VIN = "123456"; - double maxSpeed_Mph = 70; - - static double MILES_PER_HOUR_TO_METERS_PER_SEC = 0.44704; - double METERS_PER_HOUR_TO_MILES_PER_SEC = 1 / MILES_PER_HOUR_TO_METERS_PER_SEC; - // Convert 70 miles per hour to meters to sec - double MAX_SPEED_METERS_PER_SEC = maxSpeed_Mph * MILES_PER_HOUR_TO_METERS_PER_SEC; - static double MPS_TO_MPH = 3.6; - - public GpsAnalyticsApplication(Topology t, FleetManagementAnalyticsClientApplication app) { - this.topology = t; - this.app = app; - } - - /** - * Add the GPS sensor analytics to the topology. - */ - public void addAnalytics() { - - // Generate source GPS data - SimulatedGpsSensor g = new SimulatedGpsSensor(); - TStream<GpsSensor> gpsSensor = topology.poll(() -> g.nextGps(), 500, TimeUnit.MILLISECONDS); - - // Publish GPS data to IotF every 1 second - if (trackGpsLocation) { - TStream<GpsSensor> logGps = gpsSensor.peek(t -> System.out.println("log GPS: " + t.toString())); - logGps.tag("logGps"); - // Publish GPS location to IotF - app.iotDevice().events(JsonGps(logGps), "GPS: " + driverId, QoS.FIRE_AND_FORGET); - } - - // Filter for actual speeding and publish to IoTF and local file - if (trackSpeeding) { - TStream<GpsSensor> speeding = gpsSensor.filter(t -> t.getSpeedMetersPerSec() > MAX_SPEED_METERS_PER_SEC); - - speeding.tag("speeding"); - // Count speeding tuples - // TODO investigate why publish doesn't appear to work when a - // counter is set - // Metrics.counter(speeding); - - speeding.peek(t -> System.out.println("Alert: speeding - " + t.toString())); - // Write speeding event to IotF - app.iotDevice().events(JsonSpeed(speeding), "Speeding: " + driverId, QoS.FIRE_AND_FORGET); - } - - // Filter for Geofence boundary exceptions and publish to IoTF - if (trackGeofence) { - TStream<GpsSensor> geofence = gpsSensor - .filter(t -> SimulatedGeofence.outsideGeofence(t.getLatitude(), t.getLongitude())); - - geofence.tag("geofence"); - // Count Geofence exceptions - // TODO investigate why publish doesn't appear to work when a - // counter is set - // Metrics.counter(geofence); - - geofence.peek(t -> System.out.println("Alert: geofence - " + t.toString())); - // Write Geofence exceptions to IotF - app.iotDevice().events(JsonGeofence(geofence), "Geofence: " + driverId, QoS.FIRE_AND_FORGET); - } - - /* - * Hard braking: (speed1 - speed0)/(time1 - time0) < - * hardBrakingThreshold_KphPerSec Hard acceleration: (speed1 - - * speed0)/(time1 - time0) > hardAccelerationThreshold_KphPerSec 1 mps = - * 3.6 kph - */ - if (trackHardDriving) { - TStream<GpsSensor> hardDriving = gpsSensor; - // TODO replace hardcoded "2" in "last(2," to force seeing - // hardDriving alter - TWindow<GpsSensor, Object> window = hardDriving.last(2, tuple -> 0); - TStream<GpsSensor[]> logHardDriving = window.batch((tuples, key) -> { - GpsSensor[] results = null; - Object[] tuplesArray = tuples.toArray(); - - GpsSensor gps1 = (GpsSensor) tuplesArray[1]; - GpsSensor gps0 = (GpsSensor) tuplesArray[0]; - double speed1 = gps1.getSpeedMetersPerSec(); - double speed0 = gps0.getSpeedMetersPerSec(); - long time1 = gps1.getTime(); - long time0 = gps0.getTime(); - - // Check for hard braking or hard acceleration - // Avoid division by 0 - if (time1 - time0 != 0) { - double mphPerSec = (speed1 - speed0) / (time1 - time0) * MPS_TO_MPH; - if (mphPerSec < hardBrakingThreshold_MphPerSec || mphPerSec > hardAccelerationThreshold_MphPerSec) { - results = new GpsSensor[2]; - results[0] = gps0; - results[1] = gps1; - } - } - return results; - }).peek(t -> System.out.println("hardDriving: t0=" + t[0].toString() + " t[1]=" + t[1].toString())) - .tag("hardDriving"); - - app.iotDevice().events(JsonHardDriving(logHardDriving), "hardDriving: " + driverId, QoS.FIRE_AND_FORGET); - } - } - - private TStream<JsonObject> JsonGps(TStream<GpsSensor> gpsSensor) { - return gpsSensor.map(t -> { - JsonObject j = new JsonObject(); - j.addProperty("lat", t.getLatitude()); - j.addProperty("long", t.getLongitude()); - j.addProperty("alt", t.geAltitude()); - j.addProperty("mph", t.getSpeedMetersPerSec() * METERS_PER_HOUR_TO_MILES_PER_SEC); - j.addProperty("course", t.getCourse()); - j.addProperty("time", t.getTime()); - return j; - }); - } - - private TStream<JsonObject> JsonSpeed(TStream<GpsSensor> gpsSensor) { - return gpsSensor.map(t -> { - JsonObject j = new JsonObject(); - j.addProperty("lat", t.getLatitude()); - j.addProperty("long", t.getLongitude()); - j.addProperty("mph", t.getSpeedMetersPerSec() * METERS_PER_HOUR_TO_MILES_PER_SEC); - j.addProperty("time", t.getTime()); - return j; - }); - } - - private TStream<JsonObject> JsonGeofence(TStream<GpsSensor> gpsSensor) { - return gpsSensor.map(t -> { - JsonObject j = new JsonObject(); - j.addProperty("lat", t.getLatitude()); - j.addProperty("long", t.getLongitude()); - j.addProperty("time", t.getTime()); - return j; - }); - } - - private TStream<JsonObject> JsonHardDriving(TStream<GpsSensor[]> gpsSensors) { - return gpsSensors.map(t -> { - JsonObject j = new JsonObject(); - j.addProperty("lat1", t[0].getLatitude()); - j.addProperty("long1", t[0].getLongitude()); - j.addProperty("time1", t[0].getTime()); - j.addProperty("speed1", t[0].getSpeedMetersPerSec()); - j.addProperty("lat2", t[1].getLatitude()); - j.addProperty("long2", t[1].getLongitude()); - j.addProperty("time2", t[1].getTime()); - j.addProperty("speed2", t[1].getSpeedMetersPerSec()); - j.addProperty("mphPerSec", (t[1].getSpeedMetersPerSec() - t[0].getSpeedMetersPerSec()) * MPS_TO_MPH - / (t[1].getTime() - t[0].getTime())); - return j; - }); - } -} http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/ObdAnalyticsApplication.java ---------------------------------------------------------------------- diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/ObdAnalyticsApplication.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/ObdAnalyticsApplication.java deleted file mode 100644 index 06e512f..0000000 --- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/ObdAnalyticsApplication.java +++ /dev/null @@ -1,39 +0,0 @@ -/* -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.edgent.samples.apps.fleetManagement; - -import org.apache.edgent.topology.Topology; -public class ObdAnalyticsApplication{ -// TODO: -// private final FleetManagementAnalyticsClientApplication app; -// private final Topology t; -// private final String sensorId = "obd"; - - public ObdAnalyticsApplication(Topology t, FleetManagementAnalyticsClientApplication app) { -// this.t = t; -// this.app = app; - } - - /** - * Add the ODB sensor's analytics to the topology. - */ - public void addAnalytics() { - - } -} http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/SimulatedGeofence.java ---------------------------------------------------------------------- diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/SimulatedGeofence.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/SimulatedGeofence.java deleted file mode 100644 index 546229c..0000000 --- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/fleetManagement/SimulatedGeofence.java +++ /dev/null @@ -1,36 +0,0 @@ -/* -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.edgent.samples.apps.fleetManagement; - -public class SimulatedGeofence { - protected static double GEOFENCE_LATITUDE_MAX = 37.21; - protected static double GEOFENCE_LATITUDE_MIN = 37.0; - protected static double GEOFENCE_LONGITUDE_MAX = -121.75; - protected static double GEOFENCE_LONGITUDE_MIN = -122.0; - - // Simple Geofence test - public static boolean outsideGeofence(double latitude, double longitude) { - - if (latitude < GEOFENCE_LATITUDE_MIN || latitude > GEOFENCE_LATITUDE_MAX || longitude < GEOFENCE_LONGITUDE_MIN - || longitude > GEOFENCE_LONGITUDE_MAX) - return true; - else - return false; - } -} http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/AbstractMqttApplication.java ---------------------------------------------------------------------- diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/AbstractMqttApplication.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/AbstractMqttApplication.java deleted file mode 100644 index 6bd943a..0000000 --- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/AbstractMqttApplication.java +++ /dev/null @@ -1,121 +0,0 @@ -/* -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.edgent.samples.apps.mqtt; - -import static org.apache.edgent.connectors.iot.IotDevice.CMD_PAYLOAD; - -import java.util.Arrays; - -import org.apache.edgent.connectors.mqtt.iot.MqttDevice; -import org.apache.edgent.samples.apps.AbstractApplication; -import org.apache.edgent.samples.apps.ApplicationUtilities; -import org.apache.edgent.samples.apps.TopologyProviderFactory; -import org.apache.edgent.topology.Topology; - -import com.google.gson.JsonObject; - -/** - * An MQTT Application base class. - * <p> - * Application instances need to: - * <ul> - * <li>define an implementation for {@link #buildTopology(Topology)}</li> - * <li>call {@link #run()} to build and submit the topology for execution.</li> - * </ul> - * <p> - * The class provides some common processing needs: - * <ul> - * <li>Support for an external configuration file</li> - * <li>Provides a {@link TopologyProviderFactory}</li> - * <li>Provides a {@link ApplicationUtilities}</li> - * <li>Provides a {@link MqttDevice}</li> - * </ul> - */ -public abstract class AbstractMqttApplication extends AbstractApplication { - - private MqttDevice mqttDevice; - - public AbstractMqttApplication(String propsPath) throws Exception { - super(propsPath); - } - - @Override - protected void preBuildTopology(Topology t) { - // Add an MQTT device communication manager to the topology - updateTopicPrefix(); - mqttDevice = new MqttDevice(t, props); - System.out.println("MqttDevice serverURLs " + Arrays.toString(mqttDevice.getMqttConfig().getServerURLs())); - System.out.println("MqttDevice clientId " + mqttDevice.getMqttConfig().getClientId()); - System.out.println("MqttDevice deviceId " + props.getProperty("mqttDevice.id")); - System.out.println("MqttDevice event topic pattern " + mqttDevice.eventTopic(null)); - System.out.println("MqttDevice command topic pattern " + mqttDevice.commandTopic(null)); - } - - /** - * Get the application's MqttDevice - * @return the MqttDevice - */ - public MqttDevice mqttDevice() { - return mqttDevice; - } - - private void updateTopicPrefix() { - String val = props.getProperty("mqttDevice.topic.prefix"); - if (val != null) { - val = val.replace("{user.name}", System.getProperty("user.name")); - val = val.replace("{application.name}", props.getProperty("application.name")); - props.setProperty("mqttDevice.topic.prefix", val); - } - } - - /** - * Compose a MqttDevice eventId for the sensor. - * @param sensorId the sensor id - * @param eventId the sensor's eventId - * @return the device eventId - */ - public String sensorEventId(String sensorId, String eventId) { - return sensorId + "." + eventId; - } - - /** - * Compose a MqttDevice commandId for the sensor - * @param sensorId the sensor id - * @param commandId the sensor's commandId - * @return the device commandId - */ - public String commandId(String sensorId, String commandId) { - return sensorId + "." + commandId; - } - - /** - * Extract a simple string valued command arg - * from a {@link MqttDevice#commands(String...)} returned - * JsonObject tuple. - * <p> - * Interpret the JsonObject's embedded payload as a JsonObject with a single - * "value" property. - * @param jo the command tuple. - * @return the command's argument value - */ - public String getCommandValueString(JsonObject jo) { - return jo.get(CMD_PAYLOAD).getAsJsonObject().get("value").getAsString(); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/DeviceCommsApp.java ---------------------------------------------------------------------- diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/DeviceCommsApp.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/DeviceCommsApp.java deleted file mode 100644 index 70deaa4..0000000 --- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/DeviceCommsApp.java +++ /dev/null @@ -1,114 +0,0 @@ -/* -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.edgent.samples.apps.mqtt; - -import org.apache.edgent.connectors.iot.QoS; -import org.apache.edgent.connectors.mqtt.MqttStreams; -import org.apache.edgent.topology.TStream; -import org.apache.edgent.topology.Topology; -import org.apache.edgent.topology.json.JsonFunctions; - -import com.google.gson.JsonObject; - -/** - * An MQTT Device Communications client for watching device events - * and sending commands. - * <p> - * This is an "application properties" aware client that gets MQTT configuration - * from an Edgent sample app application configuration properties file. - * <p> - * This client avoids the need for other MQTT clients (e.g., from a mosquitto - * installation) to observe and control the applications. - */ -public class DeviceCommsApp extends AbstractMqttApplication { - - private static final String usage = "Usage: watch | send <cmdLabel> <cmdArg>"; - - private String mode; - private String cmdLabel; - private String cmdArg; - - public static void main(String[] args) throws Exception { - if (args.length < 1) - throw new Exception("missing pathname to application properties file"); - - try { - int i = 0; - DeviceCommsApp application = new DeviceCommsApp(args[i++]); - String mode = args[i++]; - if (!("watch".equals(mode) || "send".equals(mode))) { - throw new IllegalArgumentException("Unsupport mode: "+application.mode); - } - application.mode = mode; - if (application.mode.equals("send")) { - application.cmdLabel = args[i++]; - application.cmdArg = args[i++]; - } - - application.run(); - } - catch (IllegalArgumentException | IndexOutOfBoundsException e) { - throw new IllegalArgumentException(e.getMessage() - +"\n"+usage); - } - } - - /** - * Create an application instance. - * @param propsPath pathname to an application configuration file - * @throws Exception - */ - DeviceCommsApp(String propsPath) throws Exception { - super(propsPath); - } - - @Override - protected void buildTopology(Topology t) { - mqttDevice().getMqttConfig().setClientId(null); - MqttStreams mqtt = new MqttStreams(t, () -> mqttDevice().getMqttConfig()); - if (mode.equals("send")) { - String topic = mqttDevice().commandTopic(cmdLabel); - JsonObject jo = new JsonObject(); - jo.addProperty("value", cmdArg); - System.out.println("Publishing command: topic="+topic+" value="+jo); - TStream<String> cmd = t.strings(JsonFunctions.asString().apply(jo)); - mqtt.publish(cmd, topic, QoS.FIRE_AND_FORGET, false/*retain*/); - // Hmm... the paho MQTT *non-daemon* threads prevent the app - // from exiting after returning from main() following job submit(). - // Lacking MqttStreams.shutdown() or such... - // Delay a bit and then explicitly exit(). Ugh. - cmd.sink(tuple -> { - try { - Thread.sleep(3*1000); - } catch (Exception e) { } - System.exit(0); }); - } - else if (mode.equals("watch")) { - String topicFilter = mqttDevice().eventTopic(null); - System.out.println("Watching topic filter "+topicFilter); - TStream<String> events = mqtt.subscribe(topicFilter, QoS.FIRE_AND_FORGET, - (topic,payload) -> { - String s = "\n# topic "+topic; - s += "\n" + new String(payload); - return s; - }); - events.print(); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/package-info.java ---------------------------------------------------------------------- diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/package-info.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/package-info.java deleted file mode 100644 index 54598cb..0000000 --- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/mqtt/package-info.java +++ /dev/null @@ -1,25 +0,0 @@ -/* -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. -*/ -/** - * Base support for Edgent MQTT based application samples. - * <p> - * This package builds on {@code org.apache.edgent.samples.apps} providing - * additional common capabilities in the area of MQTT based device appliations. - */ -package org.apache.edgent.samples.apps.mqtt; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/apps/src/main/java/org/apache/edgent/samples/apps/package-info.java ---------------------------------------------------------------------- diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/package-info.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/package-info.java deleted file mode 100644 index cf62ba2..0000000 --- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/package-info.java +++ /dev/null @@ -1,42 +0,0 @@ -/* -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. -*/ -/** - * Support for some more complex Edgent application samples. - * <p> - * This package provides some commonly needed capabilities particularly in - * the area of an external configuration description influence on various - * things. - * <p> - * Focal areas: - * <ul> - * <li>{@link org.apache.edgent.samples.apps.AbstractApplication} - a base class for - * Edgent applications providing commonly needed features. - * </li> - * <li>{@link org.apache.edgent.samples.apps.TopologyProviderFactory} - a configuration - * driven factory for an Edgent topology provider. - * </li> - * <li>{@link org.apache.edgent.samples.apps.ApplicationUtilities} - some - * general configuration driven utilities. - * </li> - * <li>{@link org.apache.edgent.samples.apps.JsonTuples} - utilities for wrapping - * sensor samples in a JsonObject and operating on it. - * </li> - * </ul> - */ -package org.apache.edgent.samples.apps; \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/Sensor1.java ---------------------------------------------------------------------- diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/Sensor1.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/Sensor1.java deleted file mode 100644 index bdad9f4..0000000 --- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/Sensor1.java +++ /dev/null @@ -1,286 +0,0 @@ -/* -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.edgent.samples.apps.sensorAnalytics; - -import static org.apache.edgent.analytics.math3.stat.Statistic.MAX; -import static org.apache.edgent.analytics.math3.stat.Statistic.MEAN; -import static org.apache.edgent.analytics.math3.stat.Statistic.MIN; -import static org.apache.edgent.analytics.math3.stat.Statistic.STDDEV; -import static org.apache.edgent.samples.apps.JsonTuples.KEY_ID; -import static org.apache.edgent.samples.apps.JsonTuples.KEY_READING; -import static org.apache.edgent.samples.apps.JsonTuples.KEY_TS; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicReference; - -import org.apache.commons.math3.util.Pair; -import org.apache.edgent.analytics.sensors.Range; -import org.apache.edgent.analytics.sensors.Ranges; -import org.apache.edgent.connectors.iot.QoS; -import org.apache.edgent.function.Supplier; -import org.apache.edgent.samples.apps.JsonTuples; -import org.apache.edgent.samples.utils.sensor.PeriodicRandomSensor; -import org.apache.edgent.topology.TStream; -import org.apache.edgent.topology.Topology; -import org.apache.edgent.topology.plumbing.PlumbingStreams; - -import com.google.gson.JsonArray; -import com.google.gson.JsonObject; - -/** - * Analytics for "Sensor1". - * <p> - * This sample demonstrates some common continuous sensor analytic themes. - * <p> - * In this case we have a simulated sensor producing 1000 samples per second - * of an integer type in the range of 0-255. - * <p> - * The processing pipeline created is roughly: - * <ul> - * <li>Batched Data Reduction - reduce the sensor's 1000 samples per second - * down to 1 sample per second simple statistical aggregation of the readings. - * </li> - * <li>Compute historical information - each 1hz sample is augmented - * with a 30 second trailing average of the 1hz readings. - * </li> - * <li>Threshold detection - each 1hz sample's value is compared - * against a target range and outliers are identified. - * </li> - * <li>Local logging - outliers are logged to a local file - * </li> - * <li>Publishing results to a MQTT broker: - * <ul> - * <li>when enabled, invdividual outliers are published.</li> - * <li>Every 30 seconds a list of the last 10 outliers is published.</li> - * </ul> - * </li> - * </ul> - * <p> - * The sample also demonstrates: - * <ul> - * <li>Dynamic configuration control - subscribe to a MQTT broker - * to receive commands to adjust the threshold detection range value. - * </li> - * <li>Generally, the configuration of the processing is driven via an - * external configuration description. - * </li> - * <li>Conditional stream tracing - configuration controlled inclusion of tracing. - * </li> - * <li>Use of {@link TStream#tag(String...)} to improve information provided by - * the Edgent DevelopmentProvider console.</li> - * </ul> - */ -public class Sensor1 { - private final SensorAnalyticsApplication app; - private final Topology t; - private final String sensorId = "sensor1"; - - public Sensor1(Topology t, SensorAnalyticsApplication app) { - this.t = t; - this.app = app; - } - - /** - * Add the sensor's analytics to the topology. - */ - public void addAnalytics() { - - // Need synchronization for set/get of dynamically changeable values. - AtomicReference<Range<Integer>> range = new AtomicReference<>(); - AtomicReference<Boolean> isPublish1hzOutsideRange = new AtomicReference<>(); - - // Initialize the controls - range.set(app.utils().getRangeInteger(sensorId, "outside1hzMeanRange")); - isPublish1hzOutsideRange.set(false); - - // Handle the sensor's device commands - app.mqttDevice().commands(commandId("set1hzMeanRangeThreshold")) - .tag(commandId("set1hzMeanRangeThresholdCmd")) - .sink(jo -> { - Range<Integer> newRange = Ranges.valueOfInteger(getCommandValue(jo)); - System.out.println("===== Changing range to "+newRange+" ======"); - range.set(newRange); - }); - app.mqttDevice().commands(commandId("setPublish1hzOutsideRange")) - .tag(commandId("setPublish1hzOutsideRangeCmd")) - .sink(jo -> { - Boolean b = new Boolean(getCommandValue(jo)); - System.out.println("===== Changing isPublish1hzOutsideRange to "+b+" ======"); - isPublish1hzOutsideRange.set(b); - }); - - // Create a raw simulated sensor stream of 1000 tuples/sec. - // Each tuple is Pair<Long timestampMsec, sensor-reading (0..255)>. - PeriodicRandomSensor simulatedSensorFactory = new PeriodicRandomSensor(); - TStream<Pair<Long,Integer>> raw1khz = - simulatedSensorFactory.newInteger(t, 1/*periodMsec*/, 255) - .tag("raw1khz"); - traceStream(raw1khz, "raw1khz"); - - // Wrap the raw sensor reading in a JsonObject for convenience. - TStream<JsonObject> j1khz = JsonTuples.wrap(raw1khz, sensorId) - .tag("j1khz"); - traceStream(j1khz, "j1khz"); - - // Data-reduction: reduce 1khz samples down to - // 1hz aggregate statistics samples. - TStream<JsonObject> j1hzStats = j1khz.last(1000, JsonTuples.keyFn()) - .batch(JsonTuples.statistics(MIN, MAX, MEAN, STDDEV)) - .tag("1hzStats"); - - // Create a 30 second sliding window of average trailing Mean values - // and enrich samples with that information. - j1hzStats = j1hzStats.last(30, JsonTuples.keyFn()).aggregate( - (samples, key) -> { - // enrich and return the most recently added tuple - JsonObject jo = samples.get(samples.size()-1); - double meanSum = 0; - for (JsonObject js : samples) { - meanSum += JsonTuples.getStatistic(js, MEAN).getAsDouble(); - } - jo.addProperty("AvgTrailingMean", Math.round(meanSum / samples.size())); - jo.addProperty("AvgTrailingMeanCnt", samples.size()); - return jo; - }) - .tag("1hzStats.enriched"); - traceStream(j1hzStats, "j1hzStats"); - - // Detect 1hz samples whose MEAN value are - // outside the configuration specified range. - TStream<JsonObject> outside1hzMeanRange = j1hzStats.filter( - sample -> { - int value = JsonTuples.getStatistic(sample, MEAN).getAsInt(); - return !range.get().contains(value); - }) - .tag("outside1hzMeanRange"); - traceStream(outside1hzMeanRange, () -> "outside1hzMeanRange"+range.get()); - - // Log every outside1hzMeanRange event - app.utils().logStream(outside1hzMeanRange, "ALERT", "outside1hzMeanRange"); - - // Conditionally publish every outside1hzMeanRange event. - // Use a pressureReliever to prevent backpressure if the broker - // can't be contacted. - // TODO enhance MqttDevice with configurable reliever. - app.mqttDevice().events( - PlumbingStreams.pressureReliever( - outside1hzMeanRange.filter(tuple -> isPublish1hzOutsideRange.get()) - .tag("outside1hzMeanRangeEvent.conditional"), - tuple -> 0, 30).tag("outside1hzMeanRangeEvent.pressureRelieved"), - app.sensorEventId(sensorId, "outside1hzMeanRangeEvent"), QoS.FIRE_AND_FORGET); - - // Demonstrate periodic publishing of a sliding window if - // something changed since it was last published. - periodicallyPublishLastNInfo(outside1hzMeanRange, 10, 30, - "periodicLastOutsideRangeEvent"); - - // TODO histogram: #alerts over the last 8hr - - } - - /** - * Periodically publish the lastN on a stream. - * @param stream tuples to - * @param count sliding window size "lastN" - * @param nSec publish frequency - * @param event sensor's publish event label - */ - private void periodicallyPublishLastNInfo(TStream<JsonObject> stream, - int count, int nSec, String event) { - - // Demonstrate periodic publishing of a sliding window if - // something changed since it was last published. - - // Maintain a sliding window of the last N tuples. - // TODO today, windows don't provide "anytime" access to their collection - // so maintain our own current copy of the collection that we can - // access it when needed. - // - List<JsonObject> lastN = Collections.synchronizedList(new ArrayList<>()); - stream.last(count, JsonTuples.keyFn()) - .aggregate((samples, key) -> samples) - .tag(event+".lastN") - .sink(samples -> { - // Capture the new list/window. - synchronized(lastN) { - lastN.clear(); - lastN.addAll(samples); - } - }); - - // Publish the lastN (with trimmed down info) every nSec seconds - // if anything changed since the last publish. - TStream<JsonObject> periodicLastN = - t.poll(() -> 1, nSec, TimeUnit.SECONDS).tag(event+".trigger") - .filter(trigger -> !lastN.isEmpty()).tag(event+".changed") - .map(trigger -> { - synchronized(lastN) { - // create a single JsonObject with the list - // of reduced-content samples - JsonObject jo = new JsonObject(); - jo.addProperty(KEY_ID, sensorId); - jo.addProperty(KEY_TS, System.currentTimeMillis()); - jo.addProperty("window", count); - jo.addProperty("pubFreqSec", nSec); - JsonArray ja = new JsonArray(); - jo.add("lastN", ja); - for (JsonObject j : lastN) { - JsonObject jo2 = new JsonObject(); - ja.add(jo2); - jo2.add(KEY_TS, j.get(KEY_TS)); - // reduce size: include only 2 significant digits - jo2.addProperty(KEY_READING, String.format("%.2f", - JsonTuples.getStatistic(j, MEAN).getAsDouble())); - } - lastN.clear(); - return jo; - } - }) - .tag(event); - - traceStream(periodicLastN, event); - - // Use a pressureReliever to prevent backpressure if the broker - // can't be contacted. - // TODO enhance MqttDevice with configurable reliever. - app.mqttDevice().events( - PlumbingStreams.pressureReliever(periodicLastN, tuple -> 0, 30) - .tag(event+".pressureRelieved"), - app.sensorEventId(sensorId, event), QoS.FIRE_AND_FORGET); - } - - private String commandId(String commandId) { - return app.commandId(sensorId, commandId); - } - - private String getCommandValue(JsonObject jo) { - return app.getCommandValueString(jo); - } - - private <T> TStream<T> traceStream(TStream<T> stream, String label) { - return traceStream(stream, () -> label); - } - - private <T> TStream<T> traceStream(TStream<T> stream, Supplier<String> label) { - return app.utils().traceStream(stream, sensorId, label); - } -} http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/SensorAnalyticsApplication.java ---------------------------------------------------------------------- diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/SensorAnalyticsApplication.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/SensorAnalyticsApplication.java deleted file mode 100644 index 061bf95..0000000 --- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/SensorAnalyticsApplication.java +++ /dev/null @@ -1,57 +0,0 @@ -/* -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.edgent.samples.apps.sensorAnalytics; - -import org.apache.edgent.samples.apps.mqtt.AbstractMqttApplication; -import org.apache.edgent.topology.Topology; - -/** - * A sample application demonstrating some common sensor analytic processing - * themes. - */ -public class SensorAnalyticsApplication extends AbstractMqttApplication { - - public static void main(String[] args) throws Exception { - if (args.length != 1) - throw new Exception("missing pathname to application properties file"); - - SensorAnalyticsApplication application = new SensorAnalyticsApplication(args[0]); - - application.run(); - } - - /** - * Create an application instance. - * @param propsPath pathname to an application configuration file - * @throws Exception - */ - SensorAnalyticsApplication(String propsPath) throws Exception { - super(propsPath); - } - - @Override - protected void buildTopology(Topology t) { - - // Add the "sensor1" analytics to the topology - new Sensor1(t, this).addAnalytics(); - - // TODO Add the "sensor2" analytics to the topology - // TODO Add the "sensor3" analytics to the topology - } -} http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/package-info.java ---------------------------------------------------------------------- diff --git a/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/package-info.java b/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/package-info.java deleted file mode 100644 index 6ce82b6..0000000 --- a/samples/apps/src/main/java/org/apache/edgent/samples/apps/sensorAnalytics/package-info.java +++ /dev/null @@ -1,164 +0,0 @@ -/* -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. -*/ -/** - * The Sensor Analytics sample application demonstrates some common - * continuous sensor analytic application themes. - * See {@link org.apache.edgent.samples.apps.sensorAnalytics.Sensor1 Sensor1} for the - * core of the analytics processing and - * {@link org.apache.edgent.samples.apps.sensorAnalytics.SensorAnalyticsApplication - * SensorAnalyticsApplication} - * for the main program. - * <p> - * The themes include: - * <ul> - * <li>Batched Data Reduction - reducing higher frequency sensor reading - * samples down to a lower frequency using statistical aggregations - * of the raw readings. - * </li> - * <li>Computing continuous historical statistics such as a - * 30 second trailing average of sensor readings. - * </li> - * <li>Outlier / threshold detection against a configurable range</li> - * <li>Local logging of stream tuples</li> - * <li>Publishing analytic results to an MQTT broker</li> - * <li>Dynamic configuration control - subscribing to a MQTT broker - * to receive commands to adjust the threshold detection range value. - * </li> - * <li>Generally, the configuration of the processing is driven via an - * external configuration description. - * </li> - * <li>Conditional stream tracing - configuration controlled inclusion of tracing. - * </li> - * </ul> - * - * <h2>Prerequisites:</h2> - * <p> - * The default configuration is for a local MQTT broker. - * A good resource is <a href="http://mosquitto.org">mosquitto.org</a> - * if you want to download and setup your own MQTT broker. - * Or you can use some other broker available in your environment. - * <p> - * Alternatively, there are some public MQTT brokers available to experiment with. - * Their availability status isn't guaranteed. If you're unable to connect - * to the broker, it's likely that it isn't up or your firewalls don't - * allow you to connect. DO NOT PUBLISH ANYTHING SENSITIVE - anyone - * can be listing. A couple of public broker locations are noted - * in the application's properties file. - * <p> - * The default {@code mqttDevice.topic.prefix} value, used by default in - * generated MQTT topic values and MQTT clientId, contains the user's - * local login id. The SensorAnalytics sample application does not have any - * other sensitive information. - * <p> - * Edit {@code <edgent-release>/java8/scripts/apps/sensorAnalytics/sensoranalytics.properties} - * to change the broker location or topic prefix. - * - * <h2>Application output:</h2> - * <p> - * The application periodically (every 30sec), publishes a list of - * the last 10 outliers to MQTT. When enabled, it also publishes - * full details of individual outliers as they occur. - * It also subscribes to MQTT topics for commands to dynamically change the - * threshold range and whether to publish individual outliers. - * <p> - * All MQTT configuration information, including topic patterns, - * are in the application.properties file. - * <p> - * The application logs outlier events in local files. The actual location - * is specified in the application.properties file. - * <p> - * The application generates some output on stdout and stderr. - * The information includes: - * <ul> - * <li>MQTT device info. Lines 1 through 5 in the sample console output below.</li> - * <li>URL for the Edgent development console. Line 6.</li> - * <li>Trace of the outlier event stream. Line 7. - * The output is a label, which includes the active threshold range, - * followed by the event's JSON. - * These are the events that will also be logged and conditionally published - * as well as included in the periodic lastN info published every 30sec. - * </li> - * <li>Announcement when a "change threshold" or "enable publish of 1khz outliers" - * command is received and processed. - * Line 8 and 9. - * </li> - * <li>At this time some INFO trace output from the MQTT connector</li> - * <li>At this time some INFO trace output from the File connector</li> - * </ul> - * Sample console output: - * <pre>{@code - * [1] MqttDevice serverURLs [tcp://localhost:1883] - * [2] MqttDevice clientId id/012345 - * [3] MqttDevice deviceId 012345 - * [4] MqttDevice event topic pattern id/012345/evt/+/fmt/json - * [5] MqttDevice command topic pattern id/012345/cmd/+/fmt/json - * [6] Edgent Console URL for the job: http://localhost:57324/console - * [7] sensor1.outside1hzMeanRange[124..129]: {"id":"sensor1","reading":{"N":1000,"MIN":0.0,"MAX":254.0,"MEAN":130.23200000000006,"STDDEV":75.5535473324351},"msec":1454623874408,"agg.begin.msec":1454623873410,"agg.count":1000,"AvgTrailingMean":128,"AvgTrailingMeanCnt":4} - * ... - * [8] ===== Changing range to [125..127] ====== - * sensor1.outside1hzMeanRange[125..127]: {"id":"sensor1","reading":{"N":1000,"MIN":0.0,"MAX":254.0,"MEAN":129.00099999999978,"STDDEV":74.3076080870567},"msec":1454624142419,"agg.begin.msec":1454624141420,"agg.count":1000,"AvgTrailingMean":127,"AvgTrailingMeanCnt":30} - * [9] ===== Changing isPublish1hzOutsideRange to true ====== - * ... - * }</pre> - * - * <h2>Running, observing and controlling the application:</h2> - * <pre>{@code - * $ ./runSensorAnalytics.sh - * }</pre> - * <p> - * To observe the locally logged outlier events: - * <pre>{@code - * $ tail -f /tmp/SensorAnalytics/logs/.outside1hzMeanRange - * }</pre> - * <p> - * To observe the events that are getting published to MQTT: - * <pre>{@code - * $ ./runDeviceComms.sh watch - * }</pre> - * <p> - * To change the outlier threshold setting: - * <br>The command value is the new range string: {@code [<lowerBound>..<upperBound>]}. - * <pre>{@code - * $ ./runDeviceComms.sh send sensor1.set1hzMeanRangeThreshold "[125..127]" - * }</pre> - * <p> - * To change the "publish individual 1hz outliers" control: - * <pre>{@code - * $ ./runDeviceComms.sh send sensor1.setPublish1hzOutsideRange true - * }</pre> - * - * <h3>Alternative MQTT clients</h3> - * You can use any MQTT client but you will have to specify the - * MQTT server, the event topics to watch / subscribe to, and the command topics - * and JSON for publish commands. The MqttDevice output above provides most - * of the necessary information. - * <p> - * For example, the {@code mosquitto_pub} and - * {@code mosquitto_sub} commands equivalent to the above runDeviceComms.sh - * commands are: - * <pre>{@code - * # Watch the device's event topics - * $ /usr/local/bin/mosquitto_sub -t id/012345/evt/+/fmt/json - * # change the outlier threshold setting - * $ /usr/local/bin/mosquitto_pub -m '{"value":"[125..127]"}' -t id/012345/cmd/sensor1.set1hzMeanRangeThreshold/fmt/json - * # change the "publish individual 1hz outliers" control - * $ /usr/local/bin/mosquitto_pub -m '{"value":"true"}' -t id/012345/cmd/sensor1.setPublish1hzOutsideRange/fmt/json - * }</pre> - */ -package org.apache.edgent.samples.apps.sensorAnalytics; http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/apps/src/main/resources/META-INF/NOTICE ---------------------------------------------------------------------- diff --git a/samples/apps/src/main/resources/META-INF/NOTICE b/samples/apps/src/main/resources/META-INF/NOTICE deleted file mode 100644 index 4b208a9..0000000 --- a/samples/apps/src/main/resources/META-INF/NOTICE +++ /dev/null @@ -1,12 +0,0 @@ - -Apache Edgent: Samples: Apps -Copyright 2016-2017 The Apache Software Foundation - -This product includes software developed at -The Apache Software Foundation (http://www.apache.org/). - -=============================================================================== - -Portions of this bundle were developed by IBM Corp. -Copyright IBM Corp. 2015, 2016 - http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/apps/src/main/resources/org/apache/edgent/samples/apps/applicationTemplate.properties ---------------------------------------------------------------------- diff --git a/samples/apps/src/main/resources/org/apache/edgent/samples/apps/applicationTemplate.properties b/samples/apps/src/main/resources/org/apache/edgent/samples/apps/applicationTemplate.properties deleted file mode 100644 index 4f23ff5..0000000 --- a/samples/apps/src/main/resources/org/apache/edgent/samples/apps/applicationTemplate.properties +++ /dev/null @@ -1,98 +0,0 @@ -# -# 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. -# - -# A template file for Application Configuration properties -# -# The default Edgent topology provider is DirectProvider -#topology.provider=org.apache.edgent.providers.development.DevelopmentProvider -# -application.name=MyAnalytics -# - -# ========================================================================= -# Application stream logging configuration -# Where the app puts its stream logs. -# The directory will be created when the topology -# runs if it doesn't already exist. -application.log.dir=/tmp/MyAnalytics/logs - -# ========================================================================= -# Application "ranges" - e.g., for threshold detections -# Specify values generated by Range.toString(): -# <lowerBoundType><lowerBound>..<upperBound><upperBoundType> -# where -# lowerBoundType is "[" inclusive or "(" exclusive -# upperBoundType is "]" inclusive or ")" exclusive -# lowerBound or upperBound is "*" for open ranges, -# e.g., [*..50] for "atMost" 50 -# -sensor1.range.outside1hzMeanRange=[124..129] - -# ========================================================================= -# MQTT Device and Connector configuration info. -# -# MQTT Device -- See org.apache.edgent.connectors.mqtt.device.MqttDevice for all -# of the properties. -# -# An optional topic prefix. It can be used to isolate users or applications -# in shared MQTT broker configurations. By default it is incorporated -# into device topics and the MQTT clientId. -# If you use a public MQTT broker you may want to change the topic -# prefix so it is still unique for you but doesn't include the -# user name or application name. -mqttDevice.topic.prefix=ibm.xyzzy-streams.samples/user/{user.name}/{application.name}/ -# -# The device id used for identifying the device's events and commands -# in the MQTT topic namespace. -# By default it also gets incorporated into the MQTT clientId value. -mqttDevice.id=012345 -# -# The MQTT clientId. Only one instance of a MqttDevice can connect -# to the MQTT broker with a given clientId. -#mqttDevice.mqtt.clientId={mqttDevice.topic.prefix}id/{mqttDevice.id} -# -# MQTT Connector See org.apache.edgent.connectors.mqtt.MqttConfig.fromProperties() -# -# The default configuration is for a local MQTT broker. -# See mosquitto.org for instructions on downloading a MQTT broker. -# Or use some other MQTT broker available in your environment. -mqtt.serverURLs=tcp://localhost:1883 -# -# Alternatively, there are some public MQTT brokers available to experiment with. -# Their availability status isn't guaranteed. If you're unable to connect -# to the broker, it's likely that it isn't up or your firewalls don't -# allow you to connect. DO NOT PUBLISH ANYTHING SENSITIVE - anyone -# can be listing. -#mqtt.serverURLs=tcp://iot.eclipse.org:1883 -#mqtt.serverURLs=tcp://test.mosquitto.org:1883 -# -#mqtt.userName=xyzzy -#mqtt.password=myMosquittoPw - -# ========================================================================= -# Patterns for identifying which streams to trace to System.out -# To enable use include.csv and/or includes.regex. -# To exclude an otherwise included file, use excludes.csv and/or excludes.regex -# -# Some tracing labels -# sensor1.raw1khz,sensor1.j1khz,sensor1.j1hzStats,sensor1.outside1hzMeanRange*, -# sensor1.periodicLastN* -# -#stream.tracing.includes.csv=sensor1.j1hzStats -stream.tracing.includes.regex=sensor1.outside1hzMeanRange.* -#stream.tracing.excludes.regex=.* -#stream.tracing.excludes.csv=sensor1.raw1khz http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/connectors/README.md ---------------------------------------------------------------------- diff --git a/samples/connectors/README.md b/samples/connectors/README.md deleted file mode 100644 index 391cde3..0000000 --- a/samples/connectors/README.md +++ /dev/null @@ -1,3 +0,0 @@ -See the README.md in the samples root directory for information on building the samples. - -See the scripts directory for information on running these samples. http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/connectors/pom.xml ---------------------------------------------------------------------- diff --git a/samples/connectors/pom.xml b/samples/connectors/pom.xml deleted file mode 100644 index a918f59..0000000 --- a/samples/connectors/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- - - 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. - ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <parent> - <groupId>org.apache.edgent.samples</groupId> - <artifactId>edgent-samples</artifactId> - <version>1.3.0-SNAPSHOT</version> - </parent> - - <artifactId>edgent-samples-connectors</artifactId> - - <name>Apache Edgent Samples ${samples.projname.platform}: Connectors</name> - - <dependencies> - <!-- parent pom has Platforms and SLF4J dependencies --> - - <dependency> - <groupId>${edgent.runtime.groupId}</groupId> - <artifactId>edgent-connectors-mqtt</artifactId> - <version>${edgent.runtime.version}</version> - </dependency> - <dependency> - <groupId>${edgent.runtime.groupId}</groupId> - <artifactId>edgent-connectors-kafka</artifactId> - <version>${edgent.runtime.version}</version> - </dependency> - <dependency> - <groupId>${edgent.runtime.groupId}</groupId> - <artifactId>edgent-connectors-jdbc</artifactId> - <version>${edgent.runtime.version}</version> - </dependency> - <dependency> - <groupId>${edgent.runtime.groupId}</groupId> - <artifactId>edgent-connectors-serial</artifactId> - <version>${edgent.runtime.version}</version> - </dependency> - <dependency> - <groupId>${edgent.runtime.groupId}</groupId> - <artifactId>edgent-connectors-file</artifactId> - <version>${edgent.runtime.version}</version> - </dependency> - <dependency> - <groupId>${edgent.runtime.groupId}</groupId> - <artifactId>edgent-connectors-iotp</artifactId> - <version>${edgent.runtime.version}</version> - </dependency> - <dependency> - <groupId>${edgent.runtime.groupId}</groupId> - <artifactId>edgent-analytics-math3</artifactId> - <version>${edgent.runtime.version}</version> - </dependency> - - <dependency> - <groupId>org.apache.edgent.samples</groupId> - <artifactId>edgent-samples-topology</artifactId> - <version>1.3.0-SNAPSHOT</version> - </dependency> - </dependencies> - -</project> http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/connectors/scripts/file/README ---------------------------------------------------------------------- diff --git a/samples/connectors/scripts/file/README b/samples/connectors/scripts/file/README deleted file mode 100644 index 13629d0..0000000 --- a/samples/connectors/scripts/file/README +++ /dev/null @@ -1,21 +0,0 @@ -Sample File Streams connector topology applications. - -The file writer application writes a stream's tuples to files. - -The file reader application watches a directory for files and reads their -contents into a stream of tuples. - -The source code for the samples is in the <edgent-release>/samples directory. - -Use: - -# create a new directory for the sample to use -$ mkdir /tmp/fileSample - -# run the sample file watcher / reader -# the reader runs forever printing out content from files read -$ ./runfilesample.sh reader /tmp/fileSample - -# run the sample file writer -# the writer runs forever printing out each generated tuple -$ ./runfilesample.sh writer /tmp/fileSample http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/connectors/scripts/file/runfilesample.sh ---------------------------------------------------------------------- diff --git a/samples/connectors/scripts/file/runfilesample.sh b/samples/connectors/scripts/file/runfilesample.sh deleted file mode 100755 index 1552d1b..0000000 --- a/samples/connectors/scripts/file/runfilesample.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash -# -# 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. -# - -CONNECTOR_SAMPLES_DIR=../.. - -UBER_JAR=`echo ${CONNECTOR_SAMPLES_DIR}/target/edgent-samples-connectors-*-uber.jar` - -# Runs the File connector sample -# -# ./runfilesample.sh writer -# ./runfilesample.sh reader - -sampledir=/tmp/fileConnectorSample -if [ ! -e $sampledir ]; then - mkdir $sampledir -fi - -export CLASSPATH=${UBER_JAR} - -app=$1; shift -if [ "$app" == "writer" ]; then - java org.apache.edgent.samples.connectors.file.FileWriterApp $sampledir -elif [ "$app" == "reader" ]; then - java org.apache.edgent.samples.connectors.file.FileReaderApp $sampledir -else - echo "unrecognized mode '$app'" - echo "usage: $0 'writer|reader'" - exit 1 -fi http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/connectors/scripts/iotp/README ---------------------------------------------------------------------- diff --git a/samples/connectors/scripts/iotp/README b/samples/connectors/scripts/iotp/README deleted file mode 100644 index eccb2f8..0000000 --- a/samples/connectors/scripts/iotp/README +++ /dev/null @@ -1,36 +0,0 @@ - -# ########## -# The "Quickstart" samples connect to the IBM Watson IoT Platform -# using the Quickstart feature that does not require device registration. -# When the samples are run they print out a URL which allows a browser -# to see the data being sent from this sample. -# -# IotpQuickstart2 demonstrates using the WIoTP API to initialize the IotpDevice -# connector as well as the ability to publish events using the WIoTP HTTP protocol. - -IotpQuickstart - ./runquickstart.sh -IotpQuickstart2 - ./runquickstart2.sh [useHttp] - -# ########## -# IotpSensors connects to your IBM Watson IoT Platform service -# as the device defined in your device config file. -# -# A prototype config file for your WIoTP registered device information -# is provided in device.cfg. - -IotpSensors - ./runiotsensors.sh device-cfg-path - -# ########## -# IotpDeviceSample and IotpGatewaySample -# connect to your IBM Watson IoT Platform service. -# They publish device events and print out received device commands. -# Use IotpAppClient to print out the generated device events and -# to generate the device commands. -# -# Prototype config files for your WIoTP registered device, gateway, -# and application client information are provided in -# iotp-device-sample.cfg, iotp-gwdevice-sample.cfg and iotp-app-client.cfg - -IotpDeviceSample - ./run-iotp-device-sample.sh [useDeviceClient|useManagedDevice] [useHttp] <device-cfg-path> -IotpGatewaySample - ./run-iotp-gwdevice-sample.sh [useGatewayClient|useManagedGateway] [useHttp] <device-cfg-path> -IotpAppClient - ./run-iotp-client-app.sh [useGW] <app-cfg-path> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/connectors/scripts/iotp/device.cfg ---------------------------------------------------------------------- diff --git a/samples/connectors/scripts/iotp/device.cfg b/samples/connectors/scripts/iotp/device.cfg deleted file mode 100644 index 9c67292..0000000 --- a/samples/connectors/scripts/iotp/device.cfg +++ /dev/null @@ -1,7 +0,0 @@ -[device] -org = -type = -id = -auth-method = token -auth-token = - http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/connectors/scripts/iotp/iotp-app-client.cfg ---------------------------------------------------------------------- diff --git a/samples/connectors/scripts/iotp/iotp-app-client.cfg b/samples/connectors/scripts/iotp/iotp-app-client.cfg deleted file mode 100644 index 177e6b5..0000000 --- a/samples/connectors/scripts/iotp/iotp-app-client.cfg +++ /dev/null @@ -1,25 +0,0 @@ -# configuration properties for the IotpAppSample app - -[application] -# WIoTP defined application configuration properties - -Organization-ID = -id = -Authentication-Method = apikey -API-Key = -Authentication-Token = - -# -------------------------------------------------------- -# Input for the sample app, not WIoTP App props - -# Non-gateway mode target registered device -# Corresponding values from the iotp-device-sample.cfg file -deviceType = -deviceId = - -# Gateway mode target registered gateway device and the connected device -# Corresponding values from the iotp-gwdevice-sample.cfg file -gwDeviceType = -gwDeviceId = -cn-dev1-type = myCnDev1Type -cn-dev1-id = myCnDev1Id http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/connectors/scripts/iotp/iotp-device-sample.cfg ---------------------------------------------------------------------- diff --git a/samples/connectors/scripts/iotp/iotp-device-sample.cfg b/samples/connectors/scripts/iotp/iotp-device-sample.cfg deleted file mode 100644 index 3a2aefb..0000000 --- a/samples/connectors/scripts/iotp/iotp-device-sample.cfg +++ /dev/null @@ -1,10 +0,0 @@ -# configuration properties for IotpDeviceSample - -[device] -# WIoTP defined IoT device configuration properties - -Organization-ID = -Device-Type = -Device-ID = -Authentication-Method = token -Authentication-Token = http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/connectors/scripts/iotp/iotp-gwdevice-sample.cfg ---------------------------------------------------------------------- diff --git a/samples/connectors/scripts/iotp/iotp-gwdevice-sample.cfg b/samples/connectors/scripts/iotp/iotp-gwdevice-sample.cfg deleted file mode 100644 index 1845fcc..0000000 --- a/samples/connectors/scripts/iotp/iotp-gwdevice-sample.cfg +++ /dev/null @@ -1,17 +0,0 @@ -# configuration properties for IotpGWDeviceSample - -[device] -# WIoTP defined IoT Gateway device configuration properties - -Organization-ID = -Gateway-Type = -Gateway-ID = -Authentication-Method = token -Authentication-Token = - -# -------------------------------------------------------- -# Input for the sample app, not WIoTP device props - -# a type and id for a device connected to the gateway - pick anything -cn-dev1-type = myCnDev1Type -cn-dev1-id = myCnDev1Id http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/connectors/scripts/iotp/run-iotp-app-client.sh ---------------------------------------------------------------------- diff --git a/samples/connectors/scripts/iotp/run-iotp-app-client.sh b/samples/connectors/scripts/iotp/run-iotp-app-client.sh deleted file mode 100755 index 349aeb5..0000000 --- a/samples/connectors/scripts/iotp/run-iotp-app-client.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash -# -# 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. -# - -CONNECTOR_SAMPLES_DIR=../.. - -UBER_JAR=`echo ${CONNECTOR_SAMPLES_DIR}/target/edgent-samples-connectors-*-uber.jar` - -# Runs IBM Watson IoT Platform IotpAppClient sample. -# -# run-iotp-app-client.sh [useGW] <app-cfg-path> # see iotp-app-client.cfg -# -# Connects to WIoTP and sends device commands to the -# IotpDeviceSample or IotpGWDeviceSample device samples. -# -# This connects to your IBM Watson IoT Platform service -# as the Application defined in a application config file. -# The file format is the standard one for IBM Watson IoT Platform. -# -# Note, the config file also contains some additional information for this application. -# A sample iot-app-client.cfg is in the scripts/connectors/iotp directory. - - -export CLASSPATH=${UBER_JAR} - -# https://github.com/ibm-watson-iot/iot-java/tree/master#migration-from-release-015-to-021 -# Uncomment the following to use the pre-0.2.1 WIoTP client behavior. -# -#USE_OLD_EVENT_FORMAT=-Dcom.ibm.iotf.enableCustomFormat=false - -VM_OPTS=${USE_OLD_EVENT_FORMAT} - -java ${VM_OPTS} org.apache.edgent.samples.connectors.iotp.IotpAppClient $* http://git-wip-us.apache.org/repos/asf/incubator-edgent/blob/a7aeb2b4/samples/connectors/scripts/iotp/run-iotp-device-sample.sh ---------------------------------------------------------------------- diff --git a/samples/connectors/scripts/iotp/run-iotp-device-sample.sh b/samples/connectors/scripts/iotp/run-iotp-device-sample.sh deleted file mode 100755 index a8b3453..0000000 --- a/samples/connectors/scripts/iotp/run-iotp-device-sample.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -# -# 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. -# - -CONNECTOR_SAMPLES_DIR=../.. - -UBER_JAR=`echo ${CONNECTOR_SAMPLES_DIR}/target/edgent-samples-connectors-*-uber.jar` - -# Runs IBM Watson IoT Platform IotpDeviceSample sample. -# -# run-iotp-device-sample.sh [useDeviceClient|useManagedDevice] [useHttp] <device-cfg-path> # see iotp-device-sample.cfg -# -# Connects to WIoTP and sends device events and receives device commands. -# -# This connects to your IBM Watson IoT Platform service -# as the Device defined in a device config file. -# The file format is the standard one for IBM Watson IoT Platform. -# -# Note, the config file also contains some additional information for this application. -# A sample iot-device-sample.cfg is in the scripts/connectors/iotp directory. - -export CLASSPATH=${UBER_JAR} - -# https://github.com/ibm-watson-iot/iot-java/tree/master#migration-from-release-015-to-021 -# Uncomment the following to use the pre-0.2.1 WIoTP client behavior. -# -#USE_OLD_EVENT_FORMAT=-Dcom.ibm.iotf.enableCustomFormat=false - -VM_OPTS=${USE_OLD_EVENT_FORMAT} - -java ${VM_OPTS} org.apache.edgent.samples.connectors.iotp.IotpDeviceSample $*