Github user queeniema commented on a diff in the pull request: https://github.com/apache/incubator-edgent-website/pull/97#discussion_r155388008 --- Diff: site/docs/power-of-edgent.md --- @@ -0,0 +1,417 @@ +--- +title: The Power of Apache Edgent +--- + +Edgent is designed to accellerate your development of event driven flow-graph +style analytic applications running on edge devices. This is achieved by +Edgent's combination of API, connectors, basic analytics, utilities, and openness! + +Let's have some fun with a shallow but broad view into what you +can do in a few of lines of code... an introduction to Edgent's capabilities via +a series of terse code fragments. + +See the [Getting Started Guide](edgent-getting-started) for a step by step introduction, +and information about full samples and recipies. + +Let's start with a complete application that periodically samples a sensor +and publishes its values to an Enterprise IoT Hub in less than 10 lines of code + +```java +public class ImpressiveEdgentExample { + public static void main(String[] args) { + DirectProvider provider = new DirectProvider(); + Topology top = provider.newTopology(); + + IotDevice iotConnector = IotpDevice.quickstart(top, "edgent-intro-device-2"); + // open https://quickstart.internetofthings.ibmcloud.com/#/device/edgent-intro-device-2 + + // ingest -> transform -> publish + TStream<Double> readings = top.poll(new SimulatedTemperatureSensor(), 1, TimeUnit.SECONDS); + TStream<JsonObject> events = readings.map(JsonFunctions.valueOfNumber("temp")); + iotConnector.events(events, "readingEvents", QoS.FIRE_AND_FORGET); + + provider.submit(top); + } +} +``` + +Ok, that was 11 lines and it omitted the imports, but there are only 7 lines in main()! + +That leveraged the [IotpDevice]({{ site.docsurl }}/index.html?org/apache/{{ site.data.project.unix_name }}/connectors/iotp/IotpDevice.html) +connector to the +IBM Watson IoT Platform and the platform's Quickstart feature. +The value of its Quickstart feature is no account or device +preregistration and the ability to open a browser to see the +data being published. Great to quickly get started. + +Hopefully that had enough of a wow factor to encourage you +to keep reading! + +### Connectors, Ingest and Sink + +Edgent Applications need to create streams of data from external entities, +termed ingest, and sink streams of data to external entities. +There are primitives for those operations and a collection of +connectors to common external entities, +more Connectors contributions are welcome! + +Connectors are just code that make it easier for an Edgent application +to integrate with an external entity. They use Edgent ingest primitives +like (`Topology.poll()`, `Topology.events()`, etc), and `TStream.sink()` +like any other Edgent code. A connector may provide `Supplier` and +`Consumer` functions, for ingest and sink respectively, that an +application can use directly with the Edgent API. + +OK... fewer words, more code! + +You've already seen publishing using the `IotpDevice` connector. + +Want to receive [IotDevice]({{ site.docsurl }}/index.html?org/apache/{{ site.data.project.unix_name }}/connectors/iot/IotDevice.html) device commands? Simple! + +```java + TStream<JsonObject> cmds = iotConnector.commands(); + cmds.sink(cmd -> System.out.println("I should handle received cmd: "+cmd)); + + or + TStream<JsonObject> xzyCmds = iotConnector.command("xyzCmds"); +``` + +There's an [IotGateway]({{ site.docsurl }}/index.html?org/apache/{{ site.data.project.unix_name }}/connectors/iot/IotGateway.html) device model too. + +Don't want no stinkin `IotDevice` model and just +want to pub/sub to an MQTT server? No worries! Use the [MqttStreams]({{ site.docsurl }}/index.html?org/apache/{{ site.data.project.unix_name }}/connectors/mqtt/MqttStreams.html) connector + +```java + //IotDevice iotConnector = IotpDevice.quickstart(top, "edgent-intro-device-2"); + MqttStreams iotConnector = new MqttStreams(top, "ssl://myMqttServer:8883", "my-device-client-id"); + + ... + + //iotConnector.events(events, "readingEvents", QoS.FIRE_AND_FORGET); + iotConnector.publish(events, "readingEvents", QoS.FIRE_AND_FORGET, false); + + TStream<JsonObject> xyzTopicMsgs = iotConnector.subscribe("xyzTopic"); +``` + +Want to connect to Kafka? Use the [KafkaProducer]({{ site.docsurl }}/index.html?org/apache/{{ site.data.project.unix_name }}/connectors/kafka/KafkaProducer.html) and [KafkaConsumer]({{ site.docsurl }}/index.html?org/apache/{{ site.data.project.unix_name }}/connectors/kafka/KafkaConsumer.html) connectors with similar ease. + +There's a [JdbcStreams]({{ site.docsurl }}/index.html?org/apache/{{ site.data.project.unix_name }}/connectors/jdbc/JdbcStreams.html) connector too. + +Want to sink a `TStream` to rolling text files? Use the [FileStreams]({{ site.docsurl }}/index.html?org/apache/{{ site.data.project.unix_name }}/connectors/file/FileStreams.html) connector. + +```java + new File("/tmp/MY-DEMO-FILES").mkdir(); + FileStreams.textFileWriter(events.asString(), () -> "/tmp/MY-DEMO-FILES/READINGS"); + + // tail -f /tmp/MY-DEMO-FILES/.READINGS +``` + +Or watch for, ingest and process text files? [Csv]({{ site.docsurl }}/index.html?org/apache/{{ site.data.project.unix_name }}/connectors/csv/Csv.html) can be useful if your input lines of comma separated values + +```java + String watchedDir = "/some/directory/path"; + List<String> csvFieldNames = ... + TStream<String> pathnames = FileStreams.directoryWatcher(top, () -> watchedDir, null); + TStream<String> lines = FileStreams.textFileReader(pathnames); + TStream<JsonObject> parsedLines = lines.map(line -> Csv.toJson(Csv.parseCsv(line), csvFieldNames)); +``` + +Want to sink to a command's stdin? Use the [CommandStreams]({{ site.docsurl }}/index.html?org/apache/{{ site.data.project.unix_name }}/connectors/command/CommandStreams.html) connector + +```java + TStream<MyEvent> events = ... + ProcessBuilder cmd = new ProcessBuilder("cat").redirectOutput(new File("/dev/stdout")); + CommandStreams.sink(events.asString(), cmd); +``` + +Or ingest a command's stdout/err? + +```java + ProcessBuilder cmd = new ProcessBuilder("date", "-R"); + TStream<List<String>> readings = CommandStreams.periodicSource(top, cmd, 1, TimeUnit.SECONDS); + + TStream<JsonObject> events = + readings + .flatMap(list -> list) + .map(JsonFunctions.valueOfString("date")); + + // also note TStream support for a fluent programming style + // and use of TStream.flatmap() to transform in input list to + // an output list and then add each output list item as a separate + // tuple to the output stream +``` + + +Want to sink to a log via slf4j or another logging system? Just do it! --- End diff -- nit: "slf4j" --> "SLF4J"
---