For a while, I develop during my free time for Rhiot project with my Red Hat colleague Henryk. We started to develop several Camel components like (kura, pi4j, bluetooth) with others volunteers. Now we focus to develop and integrate those components for Kura Platform. Kura is an OSGi Platform designed for IoT, it can run on RaspberryPi, BeagleBone or Intel Edison device. Kura Platform has got lot of embedded services for IoT context (GPIO, USB, I2C, Cloud Service, etc…) In this post we will see :
How to use Kura Rhiot Quickstart into emulator mode and real life mode.
Requisites
- Eclipse Mars
- Linux or Mac only for emulation
- One RaspberryPi
- tested w/ RPi B+
- Two LEDs
- Two Resistors
- Wires
Kura Setup
Emulator setup
First of all, you have to setup your Eclipse workspace with Kura eclipse workspace available for download. Just follow instruct strictly.
Warning
To avoid any compilation problem please downgrade your JRE to a 1.7 version
Info
You can test and configure your workspace with Heater Demo Project
Camel and Rhiot configuration into Emulator
Target Definition configuration
Before setup Camel and Rhiot into Kura Emulator, you have to download several java libraries :
- camel-core-2.16.0.jar
- From ASF Camel
- camel-core-osgi-2.16.0.jar
- From ASF Camel
- camel-kura-2.16.0.jar
- From ASF Camel
- camel-kura-0.1.3-SNAPSHOT.jar
- From Rhiot Project Camel
After create a new folder into target-definition
project like camel/2.16.0
and copy all previous downloaded libraries into it.
Open Target Definition panel and Add...
a new Installation
mapped to the new camel/2.16.0
folder.
Verify that Target Content
loads correctly Camel and Rhiot libraries, click into Content
tab to check.
Save configuration and click the Set as Target Definition
action (top right).
Launch configuration
We just finish to setup Target Definition
stack, now we will see how to run it with the Launch
command.
Edit it and select correct libraries once again.
In order to check Installation, just run the Launch
command as usual and check bundles loading via OSGi ss
command.
osgi> ss | grep camel
39 ACTIVE org.apache.camel.camel-core_2.16.0
47 ACTIVE org.apache.camel.camel-core-osgi_2.16.0
58 ACTIVE org.apache.camel.camel-kura_2.16.0
61 ACTIVE io.rhiot.camel-kura_0.1.3.SNAPSHOT
true
osgi>
Cool everything looks good to run our example !!!
Test an run Kura Rhiot quickstart into emulator.
Import Quickstart Sample
Download our Kura Rhiot quickstart directly from github repository.
Change GatewayRouter
class with
GatewayRouter
contains our Camel route as usual. It is a OSGi Service. Change GatewayRouter.xml
file with
This OSGi file is needed to start GatewayRouter service with Service Component Runtime mechanism. Because we use SCR an not BundleActivation stuff.
, change io.rhiot.quickstarts.kura.camel.GatewayRouter.xml
file with
This last file provides configuration attributes used by GatewayRouter
route, like camel.kura.gpio.ouput.id
.
Compile via maven mvn clean package -Dmaven.test.skip=true
to regenerate some MANIFEST and OSGi stuff via Bnd maven plugin.
You can also checkout remote branch https://github.com/rhiot/quickstarts/tree/kura-gpio
.
Emulator run
Use Kura_Emulator_OSX
Eclipse to run Equinox OSGi.
a little log4j modification `${loc_workspace}/org.eclipse.kura.emulator/src/main/resources/log4j.properties` file.
## eclipse
log4j.logger.org.eclipse.kura.emulator.position=INFO
log4j.logger.org.eclipse=WARN
log4j.logger.io.rhiot=DEBUG
log4j.logger.org.eclipse.kura.emulator.gpio=DEBUG
log4j.logger.org.apache.camel=INFO
log4j.logger.org.apache.camel.core.osgi=INFO
{% endhighlight %}
Output should looks like
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [bundleresource://28.fwk1988196802:1/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [bundleresource://28.fwk1988196802:2/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation. osgi> Framework is running in emulation mode 21:20:43,749 [Start Level Event Dispatcher] INFO Activator:96 - Camel activator starting 21:20:43,766 [Start Level Event Dispatcher] INFO Activator:102 - Camel activator started 21:20:44,114 [Component Resolve Thread] DEBUG GpioServiceImpl:21 - activating emulated GPIOService 21:20:44,825 [Component Resolve Thread] WARN SystemServiceImpl:769 - Maximum command line upload size not available. Set default to 100 MB 21:20:44,825 [Component Resolve Thread] WARN SystemServiceImpl:778 - Missing the parameter that specifies the maximum number of files uploadable using the command servlet. Set default to 1024 files 21:20:44,926 [Component Resolve Thread] DEBUG GatewayRouter:46 - Initializing bundle 40. 21:20:45,119 [Component Resolve Thread] INFO CamelContextHelper:583 - No existing PropertiesComponent has been configured, creating a new default PropertiesComponent with name: properties 21:20:45,128 [Component Resolve Thread] INFO OsgiDefaultCamelContext:2750 - Apache Camel 2.16.0 (CamelContext: camel-1) is starting 21:20:45,129 [Component Resolve Thread] INFO ManagedManagementStrategy:191 - JMX is enabled 21:20:45,439 [Component Resolve Thread] INFO DefaultRuntimeEndpointRegistry:203 - Runtime endpoint registry is in extended mode gathering usage statistics of all incoming and outgoing endpoints (cache limit: 1000) 21:20:45,565 [Component Resolve Thread] INFO KuraServiceFactory:45 - Found Kura org.eclipse.kura.gpio.GPIOService in the registry. Kura component will use that instance. 21:20:45,576 [Component Resolve Thread] INFO OsgiDefaultCamelContext:2983 - AllowUseOriginalMessage is enabled. If access to the original message is not needed, then its recommended to turn this option off as it may improve performance. 21:20:45,576 [Component Resolve Thread] INFO OsgiDefaultCamelContext:2993 - StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html 21:20:45,608 [Component Resolve Thread] DEBUG KuraGPIOProducer:73 - Starting producer: Producer[kura-gpio://6?action=BLINK] 21:20:45,608 [Component Resolve Thread] INFO EmulatedPin:76 - Emulated GPIO Pin 6 open. 21:20:45,684 [Component Resolve Thread] INFO OsgiDefaultCamelContext:3514 - Route: route1 started and consuming from: Endpoint[timer://io.rhiot.kura.timer?period=5000] 21:20:45,686 [Component Resolve Thread] INFO OsgiDefaultCamelContext:2785 - Total 1 routes, of which 1 is started. 21:20:45,687 [Component Resolve Thread] INFO OsgiDefaultCamelContext:2786 - Apache Camel 2.16.0 (CamelContext: camel-1) started in 0.558 seconds 21:20:45,690 [Component Resolve Thread] DEBUG GatewayRouter:52 - Bundle 40 started. 21:20:45,690 [Component Resolve Thread] DEBUG GatewayRouter:48 - Refreshing SCR properties: org.eclipse.equinox.internal.ds.impl.ReadOnlyDictionary@283dd358 ‘21:20:46,698 [Camel (camel-1) thread #0 - timer://io.rhiot.kura.timer] INFO heartbeat:96 - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 21:20:46,701 [Camel (camel-1) thread #1 - kura-gpio-camel] DEBUG EmulatedPin:58 - Emulated GPIO Pin 6 changed to on 21:20:46,752 [Camel (camel-1) thread #1 - kura-gpio-camel] DEBUG EmulatedPin:58 - Emulated GPIO Pin 6 changed to off 21:20:51,691 [Camel (camel-1) thread #0 - timer://io.rhiot.kura.timer] INFO heartbeat:96 - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 21:20:51,692 [Camel (camel-1) thread #1 - kura-gpio-camel] DEBUG EmulatedPin:58 - Emulated GPIO Pin 6 changed to on 21:20:51,745 [Camel (camel-1) thread #1 - kura-gpio-camel] DEBUG EmulatedPin:58 - Emulated GPIO Pin 6 changed to off 21:20:56,692 [Camel (camel-1) thread #0 - timer://io.rhiot.kura.timer] INFO heartbeat:96 - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 21:20:56,692 [Camel (camel-1) thread #1 - kura-gpio-camel] DEBUG EmulatedPin:58 - Emulated GPIO Pin 6 changed to on 21:20:56,747 [Camel (camel-1) thread #1 - kura-gpio-camel] DEBUG EmulatedPin:58 - Emulated GPIO Pin 6 changed to off 21:21:01,697 [Camel (camel-1) thread #0 - timer://io.rhiot.kura.timer] INFO heartbeat:96 - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 21:21:01,698 [Camel (camel-1) thread #1 - kura-gpio-camel] DEBUG EmulatedPin:58 - Emulated GPIO Pin 6 changed to on 21:21:01,752 [Camel (camel-1) thread #1 - kura-gpio-camel] DEBUG EmulatedPin:58 - Emulated GPIO Pin 6 changed to off 21:21:06,703 [Camel (camel-1) thread #0 - timer://io.rhiot.kura.timer] INFO heartbeat:96 - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 21:21:06,704 [Camel (camel-1) thread #1 - kura-gpio-camel] DEBUG EmulatedPin:58 - Emulated GPIO Pin 6 changed to on 21:21:06,758 [Camel (camel-1) thread #1 - kura-gpio-camel] DEBUG EmulatedPin:58 - Emulated GPIO Pin 6 changed to off 21:21:11,708 [Camel (camel-1) thread #0 - timer://io.rhiot.kura.timer] INFO heartbeat:96 - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 21:21:11,709 [Camel (camel-1) thread #1 - kura-gpio-camel] DEBUG EmulatedPin:58 - Emulated GPIO Pin 6 changed to on 21:21:11,763 [Camel (camel-1) thread #1 - kura-gpio-camel] DEBUG EmulatedPin:58 - Emulated GPIO Pin 6 changed to off’ 21:21:13,798 [qtp1872598749-36] INFO /:1947 - org.eclipse.kura.web.server.GwtSecurityTokenServiceImpl: Trying www resource2: /www/denali/CF261C606092B547DDA8A7EE4A5B1ADC.gwt.rpc 21:21:13,821 [qtp1872598749-34] INFO /:1947 - org.eclipse.kura.web.server.GwtComponentServiceImpl: Trying www resource2: /www/denali/48673E1A90F237B138F81C0DF07ED6D7.gwt.rpc 21:21:13,914 [Component Resolve Thread (Bundle 58)] INFO DefaultShutdownStrategy:190 - Starting to graceful shutdown 1 routes (timeout 10 seconds) ‘21:21:13,920 [Camel (camel-1) thread #2 - ShutdownTask] INFO DefaultShutdownStrategy:663 - Route: route1 shutdown complete, was consuming from: Endpoint[timer://io.rhiot.kura.timer?period=5000]’ 21:21:13,921 [Component Resolve Thread (Bundle 58)] INFO DefaultShutdownStrategy:254 - Graceful shutdown of 1 routes completed in 0 seconds 21:21:13,930 [Component Resolve Thread (Bundle 58)] DEBUG KuraGPIOProducer:82 - Stopping producer: Producer[kura-gpio://6?action=BLINK] 21:21:13,931 [Component Resolve Thread (Bundle 58)] INFO EmulatedPin:81 - Emulated GPIO Pin 6 closed. 21:21:13,933 [Component Resolve Thread (Bundle 58)] INFO OsgiDefaultCamelContext:3311 - Route: route1 is stopped, was consuming from: Endpoint[timer://io.rhiot.kura.timer?period=5000] 21:21:13,947 [Component Resolve Thread (Bundle 58)] INFO OsgiDefaultCamelContext:3311 - Route: route1 is shutdown and removed, was consuming from: Endpoint[timer://io.rhiot.kura.timer?period=5000] 21:21:13,949 [Component Resolve Thread (Bundle 58)] INFO OsgiDefaultCamelContext:3010 - Apache Camel 2.16.0 (CamelContext: camel-1) is shutting down 21:21:13,957 [Component Resolve Thread (Bundle 58)] INFO OsgiDefaultCamelContext:3095 - Apache Camel 2.16.0 (CamelContext: camel-1) uptime 28.829 seconds 21:21:13,957 [Component Resolve Thread (Bundle 58)] INFO OsgiDefaultCamelContext:3096 - Apache Camel 2.16.0 (CamelContext: camel-1) is shutdown in 0.009 seconds 21:21:13,961 [Component Resolve Thread (Bundle 58)] DEBUG GatewayRouter:48 - Refreshing SCR properties: org.eclipse.equinox.internal.ds.impl.ReadOnlyDictionary@283dd358 21:21:13,961 [Component Resolve Thread (Bundle 58)] INFO OsgiDefaultCamelContext:2750 - Apache Camel 2.16.0 (CamelContext: camel-1) is starting 21:21:13,961 [Component Resolve Thread (Bundle 58)] INFO ManagedManagementStrategy:191 - JMX is enabled 21:21:13,961 [Component Resolve Thread (Bundle 58)] INFO DefaultRuntimeEndpointRegistry:203 - Runtime endpoint registry is in extended mode gathering usage statistics of all incoming and outgoing endpoints (cache limit: 1000) 21:21:14,167 [Component Resolve Thread (Bundle 58)] INFO KuraServiceFactory:45 - Found Kura org.eclipse.kura.gpio.GPIOService in the registry. Kura component will use that instance. 21:21:14,171 [Component Resolve Thread (Bundle 58)] INFO OsgiDefaultCamelContext:2983 - AllowUseOriginalMessage is enabled. If access to the original message is not needed, then its recommended to turn this option off as it may improve performance. 21:21:14,171 [Component Resolve Thread (Bundle 58)] INFO OsgiDefaultCamelContext:2993 - StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html 21:21:14,183 [Component Resolve Thread (Bundle 58)] DEBUG KuraGPIOProducer:73 - Starting producer: Producer[kura-gpio://3?action=TOGGLE] 21:21:14,183 [Component Resolve Thread (Bundle 58)] INFO EmulatedPin:76 - Emulated GPIO Pin 3 open. 21:21:14,224 [Component Resolve Thread (Bundle 58)] INFO OsgiDefaultCamelContext:3514 - Route: route1 started and consuming from: Endpoint[timer://io.rhiot.kura.timer?period=10000] 21:21:14,224 [Component Resolve Thread (Bundle 58)] INFO OsgiDefaultCamelContext:2785 - Total 1 routes, of which 1 is started. 21:21:14,225 [Component Resolve Thread (Bundle 58)] INFO OsgiDefaultCamelContext:2786 - Apache Camel 2.16.0 (CamelContext: camel-1) started in 0.263 seconds ‘21:21:15,228 [Camel (camel-1) thread #3 - timer://io.rhiot.kura.timer] INFO heartbeat:96 - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 21:21:15,228 [Camel (camel-1) thread #3 - timer://io.rhiot.kura.timer] DEBUG EmulatedPin:58 - Emulated GPIO Pin 3 changed to on 21:21:25,233 [Camel (camel-1) thread #3 - timer://io.rhiot.kura.timer] INFO heartbeat:96 - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 21:21:25,234 [Camel (camel-1) thread #3 - timer://io.rhiot.kura.timer] DEBUG EmulatedPin:58 - Emulated GPIO Pin 3 changed to off 21:21:35,238 [Camel (camel-1) thread #3 - timer://io.rhiot.kura.timer] INFO heartbeat:96 - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 21:21:35,239 [Camel (camel-1) thread #3 - timer://io.rhiot.kura.timer] DEBUG EmulatedPin:58 - Emulated GPIO Pin 3 changed to on 21:21:45,239 [Camel (camel-1) thread #3 - timer://io.rhiot.kura.timer] INFO heartbeat:96 - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 21:21:45,239 [Camel (camel-1) thread #3 - timer://io.rhiot.kura.timer] DEBUG EmulatedPin:58 - Emulated GPIO Pin 3 changed to off 21:21:55,244 [Camel (camel-1) thread #3 - timer://io.rhiot.kura.timer] INFO heartbeat:96 - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 21:21:55,244 [Camel (camel-1) thread #3 - timer://io.rhiot.kura.timer] DEBUG EmulatedPin:58 - Emulated GPIO Pin 3 changed to on’
You can change some parameter via the Kura WebUI
<img src="/img/kura-camel-rhiot-7bis.png" style="max-width:100%;" />
## Execution IRL
Let's run it IRL
### Wire, LED, RaspberryPi
Follow schema below
<img src="/img/kura-camel-rhiot-8.png" style="max-width:80%;" />
### Bundles installation into RaspberryPi
Compile Kura-Rhiot Sample via common `mvn clean package`
After you have installed [Kura deb](https://s3.amazonaws.com/kura_downloads/raspbian/release/1.3.0/kura_1.3.0_raspberry-pi-bplus-nn_installer.deb) into RaspberryPi you can start and install bundles.
To start kura service:
rpbi> sudo service kura start
you can use `tail -f /var/log/kura.log` to check Kura Platform running.
Copy to RaspberryPi and Install all bundles via command line. Connect to Kura OSGi via telnet protocol:
rpbi> telnet 127.0.0.1 5002 Trying 127.0.0.1… Connected to 127.0.0.1. Escape character is ‘^]’.
osgi>
osgi> install file:///home/pi/kura/camel-core-2.16.0.jar
osgi> install file:///home/pi/kura/camel-core-osgi-2.16.0.jar
osgi> install file:///home/pi/kura/camel-kura-2.16.0.jar
osgi> install file:///home/pi/kura/camel-kura-0.1.3-SNAPSHOT.jar
osgi> install file:///home/pi/kura/rhiot-kura-camel-1.0.0-SNAPSHOT.jar
And start all INSTALLED bundle
start 69 70 71 72 73 // for example
Output should look like this
2015-12-02 21:37:24,414 [Component Resolve Thread (Bundle 6)] DEBUG i.r.q.k.c.GatewayRouter - Initializing bundle 75. 2015-12-02 21:37:24,424 [Component Resolve Thread (Bundle 6)] INFO o.a.c.u.CamelContextHelper - No existing PropertiesComponent has been configured, creating a new default PropertiesComponent with name: properties 2015-12-02 21:37:24,432 [Component Resolve Thread (Bundle 6)] INFO o.a.c.c.o.OsgiDefaultCamelContext - Apache Camel 2.16.0 (CamelContext: camel-2) is starting 2015-12-02 21:37:24,433 [Component Resolve Thread (Bundle 6)] INFO o.a.c.m.ManagedManagementStrategy - JMX is enabled 2015-12-02 21:37:24,934 [Component Resolve Thread (Bundle 6)] INFO o.a.c.i.DefaultRuntimeEndpointRegistry - Runtime endpoint registry is in extended mode gathering usage statistics of all incoming and outgoing endpoints (cache limit: 1000) 2015-12-02 21:37:25,242 [Component Resolve Thread (Bundle 6)] INFO i.r.c.k.u.KuraServiceFactory - Found Kura org.eclipse.kura.gpio.GPIOService in the registry. Kura component will use that instance. 2015-12-02 21:37:25,260 [Component Resolve Thread (Bundle 6)] INFO o.a.c.c.o.OsgiDefaultCamelContext - AllowUseOriginalMessage is enabled. If access to the original message is not needed, then its recommended to turn this option off as it may improve performance. 2015-12-02 21:37:25,263 [Component Resolve Thread (Bundle 6)] INFO o.a.c.c.o.OsgiDefaultCamelContext - StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html 2015-12-02 21:37:25,330 [Component Resolve Thread (Bundle 6)] DEBUG i.r.c.k.g.KuraGPIOProducer - Starting producer: Producer[kura-gpio://3?action=BLINK] 2015-12-02 21:37:25,619 [Component Resolve Thread (Bundle 6)] INFO o.a.c.c.o.OsgiDefaultCamelContext - Route: route2 started and consuming from: Endpoint[timer://io.rhiot.kura.timer?period=1000] 2015-12-02 21:37:25,622 [Component Resolve Thread (Bundle 6)] INFO o.a.c.c.o.OsgiDefaultCamelContext - Total 1 routes, of which 1 is started. 2015-12-02 21:37:25,624 [Component Resolve Thread (Bundle 6)] INFO o.a.c.c.o.OsgiDefaultCamelContext - Apache Camel 2.16.0 (CamelContext: camel-2) started in 1.191 seconds 2015-12-02 21:37:25,639 [Component Resolve Thread (Bundle 6)] DEBUG i.r.q.k.c.GatewayRouter - Bundle 75 started. 2015-12-02 21:37:25,640 [Component Resolve Thread (Bundle 6)] DEBUG i.r.q.k.c.GatewayRouter - Refreshing SCR properties: org.eclipse.equinox.internal.ds.impl.ReadOnlyDictionary@18158f3 2015-12-02 21:37:25,649 [Component Resolve Thread (Bundle 6)] INFO o.e.k.c.c.ConfigurableComponentTracker - Adding ConfigurableComponent io.rhiot.quickstarts.kura.camel.GatewayRouter 2015-12-02 21:37:25,657 [Component Resolve Thread (Bundle 6)] INFO o.e.k.c.c.ConfigurationServiceImpl - Registration of ConfigurableComponent io.rhiot.quickstarts.kura.camel.GatewayRouter by org.eclipse.kura.core.configuration.ConfigurationServiceImpl@18b94e4… 2015-12-02 21:37:25,700 [Component Resolve Thread (Bundle 6)] INFO o.e.k.c.c.ConfigurationServiceImpl - Registering io.rhiot.quickstarts.kura.camel.GatewayRouter with ocd: org.eclipse.kura.core.configuration.metatype.Tocd@1a80018 … 2015-12-02 21:37:25,701 [Component Resolve Thread (Bundle 6)] INFO o.e.k.c.c.ConfigurationServiceImpl - Registration Completed for Component io.rhiot.quickstarts.kura.camel.GatewayRouter. 2015-12-02 21:37:26,625 [Camel (camel-2) thread #12 - timer://io.rhiot.kura.timer] INFO i.r.k.heartbeat - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 2015-12-02 21:37:27,735 [Camel (camel-2) thread #12 - timer://io.rhiot.kura.timer] INFO i.r.k.heartbeat - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 2015-12-02 21:37:28,735 [Camel (camel-2) thread #12 - timer://io.rhiot.kura.timer] INFO i.r.k.heartbeat - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 2015-12-02 21:37:29,736 [Camel (camel-2) thread #12 - timer://io.rhiot.kura.timer] INFO i.r.k.heartbeat - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 2015-12-02 21:37:30,736 [Camel (camel-2) thread #12 - timer://io.rhiot.kura.timer] INFO i.r.k.heartbeat - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 2015-12-02 21:37:31,736 [Camel (camel-2) thread #12 - timer://io.rhiot.kura.timer] INFO i.r.k.heartbeat - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]] 2015-12-02 21:37:32,736 [Camel (camel-2) thread #12 - timer://io.rhiot.kura.timer] INFO i.r.k.heartbeat - Exchange[ExchangePattern: InOnly, BodyType: null, Body: [Body is null]]
### YouTube Demo
<iframe width="650" height="415" src="https://www.youtube.com/embed/ZAUm_g4Xp5U" frameborder="0" ></iframe>
<br/>
## Conclusion
[Kura Platform](http://www.eclipse.org/kura/) is really interesting OSGi Platform. As we prove today, the setup is not too complex if you know what you do. I love OSGi technology for its modularity, its flexibility and its robustness.
If we can plug Camel and Rhiot bundles, I think we can develop some cool new components, applications and products.
Let's develop and contribute more for [Kura](http://www.eclipse.org/kura/) , [Camel](http://camel.apache.org) and [Rhiot](http://rhiot.io) project too.
Stay tuned !!!
Please feel free to send me your feedback see [Apropos](/apropos/).
### Useful links
* [KuraGateway configuration](http://127.0.0.1:8080/kura)
* [rhiot projet](http://rhiot.io)
* [camel-kura component](https://github.com/rhiot/rhiot/tree/master/gateway/components/camel-kura)