Brought to you by Henryk Konsek Open source IoT gateway Tale of Eclipse Kura, Apache Camel and Rhiot
Brought to you by Henryk Konsek
Open source IoT gatewayTale of Eclipse Kura, Apache Camel and Rhiot
Henryk Konsek
- engineer at Red Hat- open source contributor- Rhiot project founder
@hekonsek
Running Apache Camel in the Eclipse Kura server.
This talk@hekonsek
● Eclipse Kura● Apache Camel● Why Camel+Kura?● How Camel+Kura?
This talk@hekonsek
Eclipse Kura
@hekonsek
OSGi-based IoT gateway for field devices.
What is Eclipse Kura?@hekonsek
OSGi-based IoT gateway for the field devices.
OSGi● modularity system for Java● provides modules classpath separation● promotes hot runtime redeployments
What is Eclipse Kura?
OSGi Application Container (Eclipse Equinox, Concierge)
Java SE 7 / 8 (OpenJDK)
@hekonsek
What is Eclipse Kura?IoT gateway● collects messages from the edge devices (like sensors)● performs messages processing/aggregation/forwarding
OSGi-based IoT gateway for the field devices.
OSGi Application Container (Eclipse Equinox, Concierge)
Java SE 7 / 8 (OpenJDK)
Serial GPIO HID BLE I2C Field protocols
Networking Gateway Services Web UI Remote Management
Cloud Services Data Services EP
Connectivity and Delivery
@hekonsek
What is Eclipse Kura?
OSGi-based IoT gateway for the field devices.
@hekonsek
Gateway TL;DR;
A proxy between field devices and a data center
GATEWAY
@hekonsek
Eclipse. Donated by Eurotech (http://eurotech.com).
Who’s behind Kura?@hekonsek
Apache Camel
@hekonsek
A message routing framework.
What is Apache Camel?@hekonsek
How to orchestrate messages flow.
What is message routing?
● Apache Camel● Spring Integration● Mule
@hekonsek
- read message from JMS queue - transform to JSON- save to FTP and MongoDB
Crash course to the Apache Camel
from('jms:invoices'). transform { new Invoice(uuid(), it.in.body) }. marshal().json(Jackson). multicast().parallelProcessing(). to('ftp:myftp.com/invoices', 'mongodb:myDb?collection=invoices&operation=save')]
@hekonsek
Why Camel and Kura?
@hekonsek
Camel provides ~200 OSGi-ready connectors (JMS, REST, CoAP, AMQP, MQTT…)
How can Kura benefit from Camel?@hekonsek
Enterprise Integration Patterns (EIP)
How can Kura benefit from Camel?@hekonsek
Prevents messages overflow.
EIP - throttler@hekonsek
Provides SLA for the different channels.
EIP - throttler@hekonsek
Dynamically decide where to route the message.
EIP - content based router@hekonsek
Client side load balancing. Useful for field devices connectivity.
EIP - load balancer@hekonsek
How can I control which parts of a field device should be running at the given moment?
EIP - control bus@hekonsek
How Camel and Kura?
@hekonsek
Camel OSGi bundle is started from the Kura.
Kura + Camel: architecture@hekonsek
Invoke REST method every second.
Camel route module for Kura
public class MyKuraRouter extends KuraRouter { @Override public void configure() throws Exception { from("timer:trigger"). to("netty4-http:http://app.mydatacenter.com/api"); } }
@hekonsek
Just deploy the route as the OSGi bundle and enjoy Camel running the Kura.
Concerned about the lifecycle?@hekonsek
Display WiFi networks accessible near the field device using the web browser.
Fancy example #1
public class MyKuraRouter extends KuraRouter { @Override public void configure() throws Exception { from("netty4-http:http://0.0.0.0:18080"). to("bean:org.eclipse.kura.net.NetworkService?method=getAllWifiAccessPoints"); } }
@hekonsek
Start syncing cached data only when WiFi is accessible.
Fancy example #2
public class MyKuraRouter extends KuraRouter { @Override public void configure() throws Exception { from("kura-wifi:wlan0/mySSID"). to("controlbus:route?routeId=onlineSync&action=start");
from("file:///var/sensor/temperature"). routeId("onlineSync").autoStartup(false). to("netty4-http://api.mydatacenter.com"); } }
@hekonsek
Loading XML Camel routes at runtime using web UI.
Routes management@hekonsek
Camel will be soon a 1st class citizen in Kura.
Camel as a core part of the Kura@hekonsek
http://rhiot.io
Rhiot@hekonsek
Soon to be converted to Maven archetype :) .
Rhiot Kura quickstarts@hekonsek
git clone [email protected]:rhiot/quickstarts.git
cp -r quickstarts/kura-camel kura-camel
cd kura-camel
mvn install
CloudService user doesn’t know that payload is dispatched to Camel.
Rhiot CamelCloudService@hekonsek
CloudService cloudService = new DefaultCamelCloudService();CloudClient client = cloudService.newCloudClient("appId");
// Publish message to internal in-memory Camel queuecloudClient.publish("topic", "foo".getBytes(), 0, true, 0);
// Read message from Camel routefrom("kura-cloud:appId/topic"). to("netty4-http:http://example.com");
Use CloudService to publish message to any endpoint supported by Camel.
Rhiot CamelCloudService@hekonsek
CloudService cloudService = new DefaultCamelCloudService();CloudClient client = cloudService.newCloudClient("appId");
cloudClient.publish("amqp:topic", "foo".getBytes(), 0, true, 0);