Eclipse IoT の紹介 - Part3: Eclipse KuraでOSGiのHello World

　はじめに[Eclipse Kura](http://www.eclipse.org/kura/)で採用されているOSGiについて少し復習してから、[ドキュメントサイト](http://eclipse.github.io/kura/doc/hello-example.html)にある簡単なHello Woldアプリを開発してEclipse Kuraへデプロイしてみます。


## OSGiの復習

　OSGiはEclipseのプラグインの仕組みに採用されているので名前を聞いたことがある方も多いと思います。1999年に設立された[OSGi Alliance](https://www.osgi.org/)が仕様を策定しています。

　もともと「Open Service Gateway Initiative」と呼ばれるように、家庭やオフィスに設置したゲートウェイ端末上で家電やセンサーなどを制御するプログラムを動かすためのプラットフォームの仕様でした。その後ゲートウェイ以外に車載や組込機器、工場などエンタープライズの分野に採用が広がります。

### OSGiバンドルとOSGiフレームワーク

　リモートから動的にJavaモジュールを追加、更新できるのが特徴です。このモジュールをOSGiバンドルと呼びます。クラスファイルやリソースファイル、マニフェストなどを含んだ通常のjarファイルです。

　OSGiバンドルはJVMで動作するOSGiフレームワークにインストールします。Eclipse KuraではOSGiフレームワークの実装として[Eclipse Equinox](https://projects.eclipse.org/projects/rt.equinox)が採用されています。アプリケーションのコンポーネント化技術として他のモジュールを停止せずに機能の追加や更新ができます。現在主流になりつつあるコンテナ技術をベースにしたマイクロサービスのアーキテクチャと似ています。[前回](http://qiita.com/masato/items/912a447698f172dbb45b)調査した、[Resin.io](https://resin.io/)や[Ubuntu Core](https://www.ubuntu.com/core)もIoT Gatewayのアプリケーション管理に同様のコンテナ化のアプローチを取っています。



## Working Setの作成

　ここからEclipse使いHello Wolrdアプリを開発していきます。まずEclipseで複数のプロジェクトを管理する仕組みとしてワーキングセットを使います。パッケージエクスプローラの三角マークをクリックして、表示する単位をワーキングセットにします。適当な名前をつけて新しいワーキングセットを作成します。今回は「Kura Projects」にしました。

```
Package Exploler -> Top Level Elements -> Working Sets
```

<img width="400" alt="working-set-top-level.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/209cc000-7894-e4bf-c20b-6139acc965ff.png">


### サンプルプロジェクトをインポート

　[Getting Started](https://eclipse.github.io/kura/doc/kura-setup.html)にあるKuraのサンプルワークスペースから以下の6つのプロジェクトをEclipseにインポートします。

* org.eclipse.kura.demo.heater
* org.eclipse.kura.emulator
* org.eclipse.kura.example.beacon
* org.eclipse.kura.example.ble.tisensortag
* org.eclipse.kura.example.publisher
* target-definition



　[Kura User Workspace archive](http://www.eclipse.org/downloads/download.php?file=/kura/releases/2.0.2/user_workspace_archive_2.0.2.zip)をダウンロードします。Eclipse Kuraは2.0.2をインストールしているので同じバージョンを使います。


```
$ wget http://www.eclipse.org/downloads/download.php?file=/kura/releases/2.0.2/user_workspace_archive_2.0.2.zip
```


　ダウンロードしたzipファイルをEclipseにインポートします。プロジェクトは先ほど作成した`Kura Projets`に追加します。

```
File -> Import -> General -> Existing Projects into Workspace
Select archive file -> user_workspace_archive_2.0.2.zip　-> Add projects to working sets -> select -> Kura Projects
```


### プロジェクトの再ビルド

　target-definitionプロジェクトにあるkura-equinox_3.8.1.targetをTarget Editorで開きます。

```
target-definition/kura-equinox_3.8.1.target -> 右クリック -> Open With -> Target Editor
```

　Target Platformをリセットしてプロジェクトを再ビルドします。

```
Difinitionタブ -> Set as Target Platformをクリック
```

<img width="400" alt="target-definition.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/db5a0053-68e5-e929-f475-17516067d21c.png">


## Plug-in プロジェクト

　OSGiバンドルの開発はPlug-inプロジェクトで行います。　ウィザードを使いプロジェクトを作成します。

```
File -> New -> Project -> Plug-in Development  -> Plug-in Project
```

<img width="315" alt="plugin-development.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/2bc3778f-82f3-f54b-de8a-62e0a1782947.png">


　[Hello World Example](http://eclipse.github.io/kura/doc/hello-example.html)の例に沿って新しいプロジェクトを作成します。


* Project name: org.eclipse.kura.example.hello_osgi
* Target Platform: an OSGi framework: チェック
* 選択: standard


<img width="248" alt="plugin-development-project.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/29c9d006-bc0a-371c-339b-0f68659648f6.png">


　ダイアログを次に進みプラグインのプロパティを設定します。

* Name: Hello World Example with Logger

* Execution Environment : JavaSE-1.8

* Generate an activator... : チェックしない


<img width="248" alt="plugin-development-content.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/c73c698d-b231-a6bb-21b3-9ae3156f8e46.png">


　`Kura Projects`ワーキングセットに`eclipse.kura.example.hello_osgi`が作成されました。

<img width="340" alt="workingset.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/56c73071-ae00-86cb-d8ca-d092f0a91d4f.png">


### MANIFEST.MFの編集

　OSGiバンドルはバンドルのマニフェストファイルを含むjarファイルです。ここにバンドルのメタデータを定義します。プロジェクトに作成された`META-INF/MANIFEST.MF`をPlug-in Manifest Editorで開きDependenciesタブをクリックします。

```
META-INF/MANIFEST.MFを右クリック -> Open With -> Plug-in Manifest Editor -> Dependenciesタブ
```

　dependenciesにjarファイルを追加してファイルの変更を保存します。

* Automated Management of Dependencies を開く
* Add -> org.eclipse.osgi.services -> OK
* Add -> slf4j.api -> OK


<img width="400" alt="manifest-dependencies.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/2be114ff-6475-878c-6a65-8da1270f5421.png">


　作成されたMANIFEST.MFはEclipseでOpenJDK 8を利用しているため`JavaSE-1.8`となっています。Java 1.8のままOSGiバンドルをエクスポートすると`Export Plug-ins' has encountered a problem.`のエラーが出るためJavaSE-1.7に変更します。

```MANIFEST.MF
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Hello World Example with Logger
Bundle-SymbolicName: org.eclipse.kura.example.hello_osgi
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
Import-Package: org.osgi.service.component;version="1.2.0",
 org.slf4j;version="1.6.4"
Service-Component: component.xml
```

* Bundle-RequiredExecutionEnvironment: JavaSE-1.7


### Javaクラスの作成

　プロジェクトにサンプルにあるJavaクラスを作成してactivate()、deactivate()メソッドを定義します。この2つのメソッドはKuraのOSGiフレームワークによってインスタンスがActivate (活性化) 、Deactivate (非活性化)したときに実行され、OSGiバンドルをstart/stopした時に標準出力します。あとでに`component.xml`に指定します。


```
プロジェクトを右クリック ->  New -> Class
```

* Source folder: org.eclipse.kura.example.hello_osgi/src
* Package field: org.eclipse.kura.example.hello_osgi
* Name field: HelloOsgi


```HelloOsgi.java
package org.eclipse.kura.example.hello_osgi;

import org.osgi.service.component.ComponentContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloOsgi {

    private static final Logger s_logger = LoggerFactory.getLogger(HelloOsgi.class);
    private static final String APP_ID = "org.eclipse.kura.example.hello_osgi";

    protected void activate(ComponentContext componentContext) {
        s_logger.info("Bundle " + APP_ID + " has started!");
        s_logger.info(APP_ID + ": This is a debug message.");
    }

    protected void deactivate(ComponentContext componentContext) {
        s_logger.info("Bundle " + APP_ID + " has stopped!");
    }
}
```

### MANIFEST.MFにパッケージを追加

　MANIFEST.MFファイルをPlug-in Manifest Editorで開きDependencisesタブをクリックします。`Automated Management of Dependencies`メニューの`add dependencies` リンクをクリックすると、Javaファイルのimport宣言をベースにして`Imported Packages`に自動的にjarファイルが追加されます。

* org.osgi.service.component (1.2.0)
* org.slf4j (1.6.4)

<img width="366" alt="hello-java-dependencies.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/03f0c203-d8a4-a206-6493-10ec6ddc86b9.png">


　忘れずにMANIFEST.MFファイルの変更を保存して反映しておきます。


### component.xmlの作成


　次にOSGiコンポーネント定義ファイルの`component.xml`を作成します。このファイルでHelloOsgi.javaのインスタンスをコンポーネントに定義します。

```
プロジェクトを右クリック -> New -> Other -> Plug-in Development -> Component Definition
```

<img width="315" alt="component-definition.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/6f33e23a-5f3b-c68c-4c48-3be4fcac01fc.png">


　現在のプロジェクトのフォルダが選択されていることを確認して、`Class`の右にあるBrowseボタンをクリックします。


<img width="245" alt="component-class.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/54494733-eb66-ab43-a3c8-a0b76ba5b3ae.png">


　Select entriesのフィールドに`hello`と入力して先ほど作成したJavaクラスを選択してOKボタンをクリックします。

* Select entries: hello
* Matching items: HelloOsgi


<img width="360" alt="component-class-browse.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/727e25cc-892f-622d-d70b-b349a35b21ed.png">

　ウィザードに戻ると選択したクラスが入力された状態になります。最後に`component.xml`ファイルを保存する`OSGI-INF`フォルダを入力します。Finishボタンをクリックしてウィザードは終了です。


* Enter or select the parent folder: org.eclipse.kura.example.hello_osgi/OSGI-INF


<img width="245" alt="component-definition-finish.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/44d05491-16c5-98ea-5546-e09a76b4c75a.png">


　component.xmlをComponent Definition Editorで開きます。コンポーネントのライフサイクルは、OSGiフレームワークが管理します。Activate　(活性化)、Deactivate (非活性化)のサイクルで実行するコンポーネントのメソッドを指定します。

* Activate: activate
* Deactivate: deactivate


<img width="368" alt="component-activate-deactivate.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/9673dfd8-2be9-6971-3415-0af7414c4f0c.png">


　XMLファイルのコンポーネント定義が作成されました。

```component.xml
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" name="org.eclipse.kura.example.hello_osgi">
   <implementation class="org.eclipse.kura.example.hello_osgi.HelloOsgi"/>
</scr:component>
```



## OSGiバンドルのエクスポート

　ここまで開発したOSGiバンドルをエクスポートしてEclipse KuraのOSGiフレームワークにデプロイする準備をします。OSGiバンドルのデプロイ方法は、スタンドアロンのOSGiプラグイン形式と、デプロイ管理サービスを使うDeploymentパッケージの2つあります。

### OSGiプラグイン

　最初にスタンドアロンのOSGiプラグインとしてOSGiバンドルを作成します。

```
プロジェクトを右クリック -> Export -> Plug-in Development -> Deployable plug-ins and fragments
```

<img width="340" alt="deployable-fragments.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/cb3c66e1-1a11-9d95-7534-4a2b8e1a9aa3.png">


`Available Plug-ins and Fragments`で作成したOSGiプラグインを選択します。

* org.eclipse.kura.example.hello_osgi


　Directoryをチェックして右のBrowseボタンをクリックします。jarファイルを保存するローカルのファイルシステムの場所を選択します。


<img width="320" alt="deployable-fragments-dest.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/9ed26db1-e966-eb73-bb57-81c29daa869d.png">


　`MANIFEST.MF`をJavaSE-1.8をJavaSE-1.7に変更していない場合はこのエクスポートの時にエラーになるため確認しておきます。

```MANIFEST.MF
Bundle-RequiredExecutionEnvironment: JavaSE-1.7
```


　Finishボタンでウィザードを終了すると以下のように指定したフォルダにjarファイルがエクスポートされます。

```
~/myPlugins/plugins/org.eclipse.kura.example.hello_osgi_1.0.0.201702060832.jar
```


### Deploymentパッケージ

　次はもう一つのDeploymentパッケージを作成します。拡張子は`*.dp`のファイルです。`*.dpp`のパッケージ定義ファイルからビルドして複数のOSGiバンドルをパッケージ化できます。dpファイルはデプロイ管理サービスを使いリモートのEclipse Kuraにデプロイすることができます。


　最初にdppとdpファイルをエクスポートするフォルダ`resources/dp`を作成します。

```
プロジェクトを右クリック -> New -> Folder -> org.eclipse.kura.example.hello_osgi
```

* folder name: resources/dpを作成


<img width="271" alt="create-dp-folder.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/d4dc7913-d6d2-7542-fe30-6244fc33d450.png">


　`Deployment Package Definition`ウィザードを起動してDeploymentパッケージ定義のdppファイルを作成します。

```
File -> New -> Other -> OSGi -> Deployment Package Definition
```

<img width="315" alt="deployment-package-definition.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/7acf9b7a-c3f6-279f-687b-492a1ba620a8.png">


　ファイルを出力するフォルダとファイル名を指定します。

* Target folder: /org.eclipse.kura.example.hello_osgi/resources/dp
* File name: hello_osgi

<img width="315" alt="new-dpp-file.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/a2c1d33c-3c4f-3aa9-6397-0e0ef8aa5e08.png">


　Finishボタンでウィザードを終了すると`resources/dp/hello_osgi.dpp`に定義ファイルが作成されます。


　次にhello_osgi.dppファイルをDeployment Editorで開きます。BundlesタブにあるNewボタンをクリックして新しい行を作成したあと、Bundle Pathセルにある`...`ボタンをクリックします。ここで先ほどmyPluginsフォルダにエクスポートしたOSGiプラグインのjarファイルを選択します。

```
New -> Bundle Path column -> Browse
```

<img width="400" alt="bundle-path.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/4788b287-75c5-3396-24d2-58bf3373f449.png">


　Headersタブは以下のようにキーが入力されます。

* DeploymentPackage-SymbolicName: hello_osgi
* DeploymentPackage-Version: 1.0.0


<img width="400" alt="hello_osgi-dpp.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/25b541bd-66e8-94fc-e387-ef5d0c17d4ba.png">


　dppファイルから`Quick Build`するとhello_osgi.dpが作成されます。

```
resources/dp/hello_osgi.dppを右クリック -> Quick Build
```

<img width="400" alt="hello_osgi-dp.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/c56c07c8-9421-7b94-bd8f-347fdc21b995.png">



## OSGiバンドルのデプロイ - Local Emulation Mode

　[Deploying Bundles](http://eclipse.github.io/kura/doc/deploying-bundles.html)のページを読みながらOSGiバンドルをデプロイします。


### エミュレータの起動

　最初に試す[Local Emulation Mode](http://eclipse.github.io/kura/doc/deploying-bundles.html#local-emulation-mode)はLinuxとmacOSだけで動作するモードです。KuraのエミュレータをEclipse上で起動してここにOSGiバンドルをデプロイします。

　 他のプロジェクトが開いているとエミュレータを起動した時に一緒に動いてしまうので、Working SetはインポートしたKuraのサンプルプロジェクトの`org.eclipse.kura.emulator`と`hello_osgi`を残し他はcloseしておきます。


　macOSの場合src/main/resourcesフォルダにあるKura_Emulator_OSXを起動します。

```
/org.eclipse.kura.emulator/src/main/resources/Kura_Emulator_OSX.launch ファイル -> 右クリック -> Run as -> Kura_Emulator_OSX
```

<img width="386" alt="run-as-kura-emulator.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/a0927d41-c644-2446-90b4-1fd3a12f48c3.png">

　エミュレータが起動するとhello_osgiのOSGiバンドルにある`activate()`メソッドが自動的に開始します。EclipseのConsoleにHelloOsgiのログが出力されました。

```
13:47:07,009 [Component Resolve Thread] INFO  HelloOsgi:13  - Bundle org.eclipse.kura.example.hello_osgi has started!
13:47:07,009 [Component Resolve Thread] INFO  HelloOsgi:14  - org.eclipse.kura.example.hello_osgi: This is a debug message.
Framework is running in emulation mode
```


<img width="400" alt="console-log.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/557dcae0-6a4a-f7ea-d179-d4a47173d991.png">


### OSGiコンソール

　ConsoleウィンドウをクリックしてEnterキーを押すとOSGiコンソールの`osgi>`プロンプトが表示されます。ssコマンドでインストールされたOSGiバンドルのリストを表示することができます。バンドルID: 40が今回作成したhello_osgiのOSGiバンドルです。

```
osgi> ss
id	State       Bundle
0	ACTIVE      org.eclipse.osgi_3.8.1.v20120830-144521
	            Fragments=2
1	ACTIVE      org.eclipse.equinox.cm_1.0.400.v20120522-1841
2	RESOLVED    org.eclipse.kura.sun.misc_1.0.0
	            Master=0
3	ACTIVE      org.eclipse.equinox.common_3.6.100.v20120522-1841
...
38	ACTIVE      org.apache.felix.gogo.runtime_0.8.0.v201108120515
39	ACTIVE      org.apache.commons.fileupload_1.2.2.v20111214-1400
40	ACTIVE      org.eclipse.kura.example.hello_osgi_1.0.0.qualifier
...
```


<img width="400" alt="eclipse-osgi-ss.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/7361f025-5b53-3800-e25a-eaaed7afa19a.png">


　stopコマンドにバンドルIDを指定して　OSGiバンドルを停止させます。`deactivate()`メソッドが実行され定義してあるメッセージが出力されました。

```
osgi> stop 40
09:39:38,217 [Gogo shell] INFO  HelloOsgi:18  - Bundle org.eclipse.kura.example.hello_osgi has stopped!
```

　同様にuninstallコマンドにバンドルIDを指定するとOSGiバンドルを削除することができます。

```
osgi> uninstall 40
osgi> 
osgi> ss
...
38	ACTIVE      org.apache.felix.gogo.runtime_0.8.0.v201108120515
39	ACTIVE      org.apache.commons.fileupload_1.2.2.v20111214-1400
41	ACTIVE      org.hsqldb.hsqldb_2.3.0
...
```


　OSGiコンソールから直接OSGiバンドルをインストールしてみます。引数にはOSGiプラグインのjarを指定します。今度はバンドルID: 66でデプロイされました。

```
osgi> install file:/Users/mshimizu/myPlugins/plugins/org.eclipse.kura.example.hello_osgi_1.0.0.201702060832.jar
Bundle id is 66
...
```


<img width="400" alt="install-jar.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/a9fb7105-c28c-2c05-8e47-5211dcc48c63.png">


　startコマンドにバンドルIDを指定してOSGiバンドルを起動します。`activate()`メソッドに定義したメッセージが標準出力されました。

```
osgi> start 66
14:11:37,276 [Component Resolve Thread (Bundle 29)] INFO  HelloOsgi:13  - Bundle org.eclipse.kura.example.hello_osgi has started!
14:11:37,276 [Component Resolve Thread (Bundle 29)] INFO  HelloOsgi:14  - org.eclipse.kura.example.hello_osgi: This is a debug message.
```


<img width="400" alt="start-65.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/3d274ec9-7a2c-2166-e0bb-0a12406e0768.png">


## OSGiバンドルのデプロイ - Remote Target Device

　最後に[前回](http://qiita.com/masato/items/fcbbf7231e00d191611b)Raspberry Pi 2にインストールしたEclipse KuraのOSGiフレームワークに[リモートから](http://eclipse.github.io/kura/doc/deploying-bundles.html#remote-target-device)OSGiバンドルをデプロイしてみます。Raspberry Pi 2はmacOSと有線LANで接続してmDNSで名前解決できるようにしておきます。


### mToolkitのFrameworksビュー

　Eclipseにインストールした[mToolkit](http://dz.prosyst.com/pdoc/mBS_SDK_8.1/eclipse_plugins/mtoolkit/introduction.html)プラグインからリモートのOSGiフレームワークに接続してみます。最初にmToolkitのFrameworksビューを開きます。

```
Window -> Show View -> Other ->  mToolkit -> Frameworks 
```

<img width="220" alt="show-view-mtoolkit.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/e28f22b8-0a30-dc2c-b1d2-cbde761f3421.png">


　Frameworksビューを右クリックしてOSGiフレームワークを追加します。

```
右クリック -> Add Framework
```

　macOSと有線LANで接続したRaspberry Pi 2の名前とアドレスを入力します。mDNSで名前解決する場合は`raspberrypi.local`、または直接IPアドレスを入力します。

* Name: RPi2
* Address: raspberrypi.local


<img width="354" alt="framework-properties.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/d997ccc4-1beb-a7ab-fde2-c01c6ab303b2.png">

　Framework名は適当に「RPi2」と名前をつけました。右クリックして接続します。

```
Framework名を右クリック -> Connect Framework
```

　OSGiフレームワークのKuraはファイアウォールでポートを許可する必要があります。KuraのWeb UIからファイアウォールの設定を確認します。

http://raspberrypi.local/kura

　OSGiフレームワークへの接続は1450ポートを使います。デフォルトで許可されていました。

```
Firewall -> Open Portsタブ -> 1450の許可
```

* Port or Port Range: 1450
* Protocol: tcp
* Permitted Network: 0.0.0.0/0
* Permitted Interface Name: eth0


<img width="400" alt="1450-firewall.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/76212df7-70ea-7a61-46f9-819632ebe02a.png">


### OSGiプラグイン

スタンドアロンのOSGiプラグインのjarを選択してデプロイします。

```
* mToolkit Frameworksビュー -> Framework名を右クリック ->  Install Bundle -> org.eclipse.kura.example.hello_osgi_1.0.0.201702060832.jar
```


　Framework名のBundlesにデプロイしたorg.eclipse.kura.example.hello_osgiが表示されます。

<img width="400" alt="raspi2-connect.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/7373aa12-4619-275e-73a5-2de742acd63b.png">


　バンドル名を右クリックしてStart、StopするとOSGiコンソールの時と同じように`activate()`と`deactivate()`メソッドのメッセージが表示されます。

### Deploymentパッケージ


　以前にインストールしたOSGiバンドルはuninstallしておきます。Framework名を右クリックして今度は`Install Deployment Package`を選択します。

```
mToolkit Frameworks view -> Framework名を右クリック -> Install Deployment Package
```

　dpファイルは先ほどエクスポートした`hello_osgi.dp`ファイルを選択します。

```
~/Documents/workspace/org.eclipse.kura.example.hello_osgi/resources/dp/hello_osgi.dp
```

　Deployment Packagesのツリーの中にOSGiバンドルが表示されました。 

<img width="400" alt="bundle-installed.png" src="https://qiita-image-store.s3.amazonaws.com/0/43745/47218f19-5d35-2828-d6b1-d99b5295f1e9.png">

### Eclipse Kuraから確認

　Eclipse KuraへmacOSからSSH接続してログを確認します。Hello Worldバンドルのstartとstopのログが表示されています。

```
$ ssh pi@raspberrypi.local
$ tail -f /var/log/kura.log
...
2017-02-08 12:38:59,923 [Component Resolve Thread (Bundle 7)] INFO  o.e.k.e.h.HelloOsgi - Bundle org.eclipse.kura.example.hello_osgi has started!
2017-02-08 12:38:59,925 [Component Resolve Thread (Bundle 7)] INFO  o.e.k.e.h.HelloOsgi - org.eclipse.kura.example.hello_osgi: This is a debug message.
```

　teleneでOSGiフレームワークに接続してOSGiバンドルを一覧します。

```
$ telnet localhost 5002
osgi> ss
"Framework is launched."


id	State       Bundle
0	ACTIVE      org.eclipse.osgi_3.8.1.v20120830-144521
	            Fragments=2
1	ACTIVE      org.eclipse.equinox.cm_1.0.400.v20120522-1841
2	RESOLVED    org.eclipse.kura.sun.misc_1.0.0
...
78	ACTIVE      org.eclipse.kura.example.hello_osgi_1.0.0.201702081230
```



## OSGiバンドルを永続化する

　mToolkitからリモートのOSGiフレームワークにデプロイする方法は一時的な方法なのでEclipse Kuraを再起動すると消えてしまいます。


### SCPする場合

　動作確認が終わったらdpファイルをターゲットデバイスの以下のディレクトリにコピーして永続化します。

```
/opt/eclipse/kura/kura/packages
```

　macOSから一度Raspberry Pi 2にSCPでdpファイルを転送してから目的のディレクトリにコピーします。

```
$ scp ~/Documents/workspace/org.eclipse.kura.example.hello_osgi/resources/dp/hello_osgi.dp pi@raspberrypi.local:
$ ssh pi@raspberrypi.local
$ sudo cp ~/hello_osgi.dp /opt/eclipse/kura/kura/packages/
```

 `/opt/eclipse/kura/kura/dpa.properties`ファイルに以下の書式でパッケージ名とファイルのパスを追加します。

```
package_name=file\:/opt/eclipse/kura/kura/packages/package_filename.dp 
```


```/opt/eclipse/kura/kura/dpa.properties
org.eclipse.kura.example.hello_osgi=file\:/opt/eclipse/kura/kura/packages/hello_osgi.dp
```


 Eclipse Kuraをリスタートします。restartコマンドを使うとプロセスの停止に失敗することがあるので、stop　-> startします。

```
$ sudo /etc/init.d/kura stop
$ sudo /etc/init.d/kura start
```

### KuraのWeb UIからアップロードする場合

　Eclipse KuraのWeb UIにログインしてdpファイルをアップロードしてもOSGiバンドルは永続化されます。Webブラウザからデプロイできるのでこちらの方が簡単です。左のPackageメニューからdpファイルをSubmitします。

```
Package -> Upload - dpファイル -> Submit
```