|
|
WebOTX Manual V11.1 (第6版) 目次を表示 |
Developer’s Studioを使用したエッジアプリケーションの基本的な開発方法や考え方を説明します。
エッジアプリケーションはエッジ層で動作します。センサーからデータを受け取り、任意の条件に合致したデータをピックアップしてクラウド層にデータを送信することが可能です。また、エッジアプリケーションはEAFファイルとしてパッケージ化することができます。EAFファイルは .eaf という拡張子でなければなりません。
データ正規化APはセンサーから受信したデータをリアルタイム分析(CEP)やクラウド層で利用できるように正規化するためのJavaプログラムです。
OSGiバンドルプロジェクトでは、このJavaプログラムの開発とマニフェストファイルの編集によりOSGiバンドルを作成します。
本節ではOSGiバンドルプロジェクトの基本的な使用方法を説明します。
1. [ファイル]-[新規作成]-[プロジェクト]-[EAF]-[OSGiバンドルプロジェクト]を選択し「次へ」を押下

図 OSGiバンドルプロジェクトの選択
2. プロジェクト名を指定し「次へ」を押下

図 プロジェクト名の指定
3. Activatorクラスを新規作成にチェックを入れ、Activatorクラス名を指定し「終了」を押下するとOSGiバンドルが作成されます。
<\WebOTXインストールフォルダ>\Developer\Studio\workspace\<OSGiバンドルプロジェクト名>\src\<パッケージ名>\<Activatorのjavaファイル名>を編集します。

図 Activatorクラス編集画面
以下はデータ正規化APの実装例です。データ正規化APのAPI使用箇所をコメントで説明します。
データ正規化APのAPIリファレンスを参照してください。
package com.nec.eaf.demo.inbound;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.nec.eaf.inbound.*; //データ正規化APのAPIをインポート
public class InboundTweLite2525A implements Runnable {
private InboundClient client;
private BufferedReader deviceInputReader;
private volatile boolean runFlag = true;
private void setup() throws IOException {
String ip = "127.0.0.1";
int port = 6666;
//エッジ層からデータを受け取るIP,ポート番号を指定しクライアントを生成(正規化したデータをリアルタイム分析(CEP)に送信するためのクライアント)
client = new Netty4InboundClient(ip, port);
String device = "/opt/eaf/container/deploy/acceleration_data";
deviceInputReader = new BufferedReader(
new FileReader(new File(device)));
}
public void run() {
try {
setup();
} catch (IOException e) {
e.printStackTrace();
return;
}
try {
Thread.sleep(20 * 1000);
} catch (Exception e) {
// do nothing
}
try {
while (runFlag) {
Thread.sleep(1000);
Acceleration acceleration = readAccelerationData(
deviceInputReader);
if (acceleration == null) {
continue;
}
InboundData data = new InboundData();
try {
data.setData(acceleration);
data.setDesc("a data of TWE-LITE-2525A");
data.setID("TWE-LITE-2525A");
} catch (Exception e2) {
e2.printStackTrace();
}
if (client != null) {
try {
client.send(data); //正規化したデータをリアルタイム分析(CEP)に送信
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
// do nothing
} finally {
if (client != null) {
try {
client.close(); //クライアントをクローズ
} catch (Exception e) {
e.printStackTrace();
}
}
if (deviceInputReader != null) {
try {
deviceInputReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
----- 以下省略 -----
package com.nec.eaf.demo.inbound;
import org.apache.ignite.cache.query.annotations.QuerySqlField; //データ正規化APのAPIをインポート
public class Acceleration {
@QuerySqlField (index = true) //アノテーションを指定することでリアルタイム分析(CEP)のSQLクエリから"x"を参照可能とする
private int x;
@QuerySqlField (index = true) //アノテーションを指定することでリアルタイム分析(CEP)のSQLクエリから"y"を参照可能とする
private int y;
@QuerySqlField (index = true) //アノテーションを指定することでリアルタイム分析(CEP)のSQLクエリから"z"を参照可能とする
private int z;
public Acceleration(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getZ() {
return z;
}
public void setZ(int z) {
this.z = z;
}
}

図 エクスポートパッケージの選択

図 エクスポートパッケージのバージョンの指定

図 MANIFEST.MFタブ
エッジアプリケーションプロジェクトではルート定義ファイルの作成、データ正規化APの取り込み、エクスポートによりEAFファイルを作成することができます。
本節ではエッジアプリケーションプロジェクトの基本的な使用方法を説明します。
[ファイル]-[新規作成]-[プロジェクト]-[EAF]-[エッジアプリケーションプロジェクト]を選択しプロジェクト名を指定して「終了」を押下することでプロジェクトを新規作成します。

図 エッジアプリケーションプロジェクト名の指定
ルート定義ファイル(Archive/routes/Route.xml)をテキストエディタで開き編集します。
センサー、エッジ層、クラウド層へのルートを定義します。リアルタイム分析(CEP)で使用するSQLクエリもルート定義ファイルで指定します。
考え方は [プログラミング・開発ガイド > エッジアプリケーションの作成 > ルート定義ファイル、SQLクエリ] を参照してください。

図 ルート定義ファイルの編集
以下の手順でデータ正規化APを作成したOSGiバンドルプロジェクトと関連付けを行うことで、データ正規化APをエッジアプリケーションに取り込むことができます。
1. エッジアプリケーションプロジェクト名を右クリックし「プロパティ」から「プロジェクト参照」画面を開く
2. データ正規化APを作成したOSGiバンドルプロジェクト名を選択しOKボタン押下

図 OSGiバンドルプロジェクトとの関連付け
EAFファイルのエクスポートには以下の3通りの手順があります。
1. エッジアプリケーションプロジェクト名を右クリックし「エクスポート」-「EAF」-「EAFファイル」を選択

図 EAFファイルのエクスポート選択
2. 「参照」ボタンを押下し、出力先フォルダとEAFファイル名を指定し「終了」ボタンを押下

図 エクスポートするEAFファイルの選択
1. エッジアプリケーションプロジェクト名を右クリックし「エクスポート」-「EAF」-「エッジアプリケーションを配備先へ」を選択

図 エッジアプリケーションを配備先へ
2. 登録するリポジトリ機能を指定し、「エッジアプリケーションプロジェクト」にチェックを入れ「次へ」ボタンを押下

図 リポジトリ機能とエッジアプリケーションプロジェクト名指定
3. 「グループ」「名前」「バージョン」「バリエーション」「配備条件式」を指定し「次へ」ボタンを押下

図 リポジトリ機能に登録するためのメタデータ指定
4. エッジ層に配備した際に実行するLinuxコマンドラインを指定し「終了」ボタンを押下

図 エッジ層に配備した際に実行するLinuxコマンドライン指定画面

図 エッジアプリケーションを配備先へ

図 リポジトリ機能とEAFファイル名指定

図 リポジトリ機能に登録するためのメタデータ指定

図 エッジデバイスに配備した際に実行するLinuxコマンドライン指定画面
ルート定義ファイルはエッジアプリケーションプロジェクトのArchive/routes/Route.xmlに配置されるファイルで、センサデータ受信〜クラウドアダプタ〜クラウド層までのルートを定義します。
以下はルート定義ファイルの例です。
<?xml version="1.0" encoding="UTF-8" ?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<camelContext xmlns="http://camel.apache.org/schema/blueprint" id="eaf">
<route>
<from uri="netty4:tcp://127.0.0.1:6666?serverInitializerFactory=#json&encoding=UTF-8&sync=false"/> <!-- @ -->
<to uri="bean:CepProcessorWriteAdapter?method=process"/>
</route>
<route>
<from uri="timer://foo?fixedRate=true&period=1000"/> <!-- A -->
<!-- select one of below elements -->
<to uri="bean:CepProcessorReadAdapter?method=selectEntity"/> <!-- B -->
<!--<to uri="bean:CepProcessorReadAdapterForSelectElement?method=selectElement"/>--> <!-- B -->
<to uri="bean:OutboundAdapter?method=processCep"/>
</route>
<!-- If you want to receive message from MQTT message broker, please uncomment below. --> <!-- C -->
<!--
<route>
<from uri="mqtt://events?subscribeTopicName=NEC_EAF_OUTBOUND_ADAPTER_OUT" />
<to uri="${define your process}" />
</route>
-->
</camelContext>
<!-- Inbound -->
<bean id="json" class="com.nec.eaf.inbound.StringServerPipelineFactory"/>
<bean id="protobuf" class="com.nec.eaf.inbound.ProtobufServerPipelineFactory"/>
<bean id="string" class="com.nec.eaf.inbound.LineStringServerPipelineFactory"/>
<!-- CEP -->
<bean id="CepProcessorWriteAdapter" class="com.nec.eaf.cep.processor.CepProcessorWriteAdapter">
<property name="classname">
<value>com.nec.eaf.demo.inbound.Acceleration</value> <!-- D -->
</property>
<property name="cepjar">
<value>osgi-manual.jar</value> <!-- E -->
</property>
</bean>
<bean id="CepProcessorReadAdapter" class="com.nec.eaf.cep.processor.CepProcessorReadAdapter">
<property name="classname">
<value>com.nec.eaf.demo.inbound.Acceleration</value> <!-- F -->
</property>
<property name="cepjar">
<value>osgi-manual.jar</value> <!-- G -->
</property>
<property name="sql">
<value>select * from Acceleration where ABS(x) < 10 AND ABS(y) < 10 AND ABS(z) < 10</value> <!-- H -->
</property>
<property name="isDelete">
<value>off</value> <!-- I -->
</property>
</bean>
<bean id="CepProcessorReadAdapterForSelectElement" class="com.nec.eaf.cep.processor.CepProcessorReadAdapter">
<property name="sql">
<value>${the sql for data query}</value> <!-- H -->
</property>
<property name="isDelete">
<value>off</value> <!-- I -->
</property>
</bean>
<!-- Outbound -->
<bean id="OutboundAdapter" class="com.nec.eaf.outbound.OutboundAdapter">
<property name="url">
<value>http://${your server host name}/outbound-server-adapter/service</value> <!-- J -->
</property>
<property name="protocol">
<value>http</value> <!-- K -->
</property>
<property name="dataformat">
<value>JSON</value> <!-- L -->
</property>
<property name="sendtype">
<value>sse</value> <!-- M -->
</property>
<property name="classname">
<value>com.nec.webotx.eap.demo.servlet.JsonServlet</value> <!-- N -->
</property>
<property name="methodname">
<value>doGet</value> <!-- O -->
</property>
</bean>
</blueprint>
|
ルート候補 |
編集例 |
|---|---|
|
センサからの受信 ↓ クラウド層への送信 |
<camelContext xmlns="http://camel.apache.org/schema/blueprint" id="eaf">
<route>
<from uri="netty4:tcp://127.0.0.1:6666?serverInitializerFactory=#json&encoding=UTF-8&sync=false"/> <!-- @ -->
<!-- <to uri="bean:CepProcessorWriteAdapter?method=process"/> -->
<!-- </route> -->
<!-- <route> -->
<!-- <from uri="timer://foo?fixedRate=true&period=1000"/> <!-- A --> -->
<!-- select one of below elements -->
<!-- <to uri="bean:CepProcessorReadAdapter?method=selectEntity"/> <!-- B --> -->
<!-- <to uri="bean:CepProcessorReadAdapterForSelectElement?method=selectElement"/>--> <!-- B -->
<to uri="bean:OutboundAdapter?method=processCep"/>
</route>
------ 省略 ------
</camelContext>
|
|
センサからの受信 ↓ リアルタイム分析(CEP)への書き込み ↓ リアルタイム分析(CEP)からの読み込み ↓ クラウド層への送信 |
※削除行なし
<camelContext xmlns="http://camel.apache.org/schema/blueprint" id="eaf">
<route>
<from uri="netty4:tcp://127.0.0.1:6666?serverInitializerFactory=#json&encoding=UTF-8&sync=false"/> <!-- @ -->
<to uri="bean:CepProcessorWriteAdapter?method=process"/>
</route>
<route>
<from uri="timer://foo?fixedRate=true&period=1000"/> <!-- A -->
<!-- select one of below elements -->
<to uri="bean:CepProcessorReadAdapter?method=selectEntity"/> <!-- B-1 -->
<!--<to uri="bean:CepProcessorReadAdapterForSelectElement?method=selectElement"/>--> <!-- B-2 -->
<to uri="bean:OutboundAdapter?method=processCep"/>
</route>
------ 省略 ------
</camelContext>
|
|
センサからの受信 ↓ リアルタイム分析(CEP)への書き込み |
<camelContext xmlns="http://camel.apache.org/schema/blueprint" id="eaf">
<route>
<from uri="netty4:tcp://127.0.0.1:6666?serverInitializerFactory=#json&encoding=UTF-8&sync=false"/> <!-- @ -->
<to uri="bean:CepProcessorWriteAdapter?method=process"/>
</route>
<!-- <route> -->
<!-- <from uri="timer://foo?fixedRate=true&period=1000"/> <!-- A --> -->
<!-- select one of below elements -->
<!-- <to uri="bean:CepProcessorReadAdapter?method=selectEntity"/> <!-- B --> -->
<!-- <to uri="bean:CepProcessorReadAdapterForSelectElement?method=selectElement"/>--> <!-- B -->
<!-- <to uri="bean:OutboundAdapter?method=processCep"/> -->
<!-- </route> -->
------ 省略 ------
</camelContext>
|
|
リアルタイム分析(CEP)からの読み込み ↓ クラウド層への送信 |
<camelContext xmlns="http://camel.apache.org/schema/blueprint" id="eaf">
<!-- <route> -->
<!-- <from uri="netty4:tcp://127.0.0.1:6666?serverInitializerFactory=#json&encoding=UTF-8&sync=false"/> <!-- @ --> -->
<!-- <to uri="bean:CepProcessorWriteAdapter?method=process"/> -->
<!-- </route> -->
<route>
<from uri="timer://foo?fixedRate=true&period=1000"/> <!-- A -->
<!-- select one of below elements -->
<to uri="bean:CepProcessorReadAdapter?method=selectEntity"/> <!-- B -->
<!--<to uri="bean:CepProcessorReadAdapterForSelectElement?method=selectElement"/>--> <!-- B -->
<to uri="bean:OutboundAdapter?method=processCep"/>
</route>
------ 省略 ------
</camelContext>
|
|
項目 |
説明 |
|---|---|
| @ |
・"127.0.0.1" "6666"部分はセンサーからデータ受信するためのエッジ層のIPアドレス、ポート番号をユーザ環境に合わせて指定してください。 ・"#json"部分はセンサーから受信するデータの形式に合わせてJSON型の場合は"json"、Protocol Buffers型の場合は"protobuf"を指定してください。 |
| A | "period="部分にリアルタイム分析(CEP)からクラウドアダプタへデータ送信する間隔をms単位で指定します。 |
| B | フィルタしたデータをクラス型の単位で読み込む場合はB-1の行、文字列型の単位で読み込む場合はB-2の行を有効化してください。 |
| C | クラウド層にMQTTでメッセージ送信する場合のみ有効化してください。{define your process}部分には、クラウド層からMQTT受信後に行いたい処理をユーザが定義したクラス名を指定してください。 |
| D | データ正規化APで定義したセンサクラス名を指定してください。このクラス内でアノテーション定義をしたデータをリアルタイム分析(CEP)のSQLクエリから参照することができます。アノテーション定義例は [プログラミング・開発ガイド > エッジアプリケーションの作成 > データ正規化AP] を参照してください。 |
| E | Dで指定したクラスが含まれる.jarファイル名を指定してください。 |
| F | データ正規化APで定義したセンサクラス名を指定してください。このクラス内でアノテーション定義をした変数をリアルタイム分析(CEP)のSQLクエリから参照することができます。アノテーション定義例は [プログラミング・開発ガイド > エッジアプリケーションの作成 > データ正規化AP] を参照してください。 |
| G | Fで指定したクラスが含まれる.jarファイル名を指定してください。 |
| H | リアルタイム分析(CEP)で使用するSQLクエリを指定します。SQLクエリの詳細は[プログラミング・開発ガイド > エッジアプリケーションの作成 > SQLクエリ] を参照してください。 |
| I | リアルタイム分析(CEP)でフィルタしたデータを読み込みクラウドアダプタへ送信後に再利用せずにリアルタイム分析(CEP)上から削除する場合は"on"、再利用する場合は"off"を指定してください。 |
| J |
クラウド層のサーバアプリケーションの実行URLを指定してください。 MQTTプロトコルで通信する場合は本項目は無効となります。 |
| K |
クラウド層とHTTPプロトコルで通信する場合は"http"、HTTPSプロトコルで通信する場合は"https"を指定してください。 MQTTプロトコルで通信する場合は本項目は無効となります。 |
| L | クラウド層と通信するデータの形式がJSON形式の場合は"JSON"、XML形式で通信する場合は"XML"を指定してください。 |
| M | クラウド層とHTTPプロトコルで通信する場合は"sse"、MQTTプロトコルで通信する場合は"mqtt"を指定してください。 |
| N | クラウド層に配備するサーバアプリケーションの操作をするためのクラス名を指定してください。 |
| O | クラウド層に配備するサーバアプリケーションの操作をするためのメソッド名を指定してください。 |
<camelContext xmlns="http://camel.apache.org/schema/blueprint" id="eaf">
<route>
<from uri="netty4:tcp://127.0.0.1:6666?serverInitializerFactory=#json&encoding=UTF-8&sync=false"/> <!-- @ -->
<!-- <to uri="bean:CepProcessorWriteAdapter?method=process"/> -->
<to uri="bean:MonitorCounter?method=doCount" /> <!-- リアルタイム分析(CEP)へのデータ書き込み回数をカウントする場合 -->
</route>
<route>
<from uri="timer://foo?fixedRate=true&period=1000"/> <!-- A -->
<!-- select one of below elements -->
<to uri="bean:CepProcessorReadAdapter?method=selectEntity"/> <!-- B -->
<!-- <to uri="bean:CepProcessorReadAdapterForSelectElement?method=selectElement"/>--> <!-- B -->
<to uri="bean:MonitorCounter?method=doCount" /> <!-- リアルタイム分析(CEP)からのデータ読み込み回数をカウントする場合 -->
<to uri="bean:OutboundAdapter?method=processCep"/>
<to uri="bean:MonitorCounter?method=doCount" /> <!-- クラウド層へ送信した回数をカウントする場合 -->
</route>
------ 省略 ------
------ 以下を末尾に追記 ------
<bean id="MonitorCounter" class="com.nec.eaf.monitor.api.MonitorCounter">
<property name="group">
<value>{メタデータ:任意のグループ名}</value>
</property>
<property name="name">
<value>{メタデータ:任意のアプリケーション名}</value>
</property>
<property name="version">
<value>{メタデータ:任意のバージョン}</value>
</property>
<property name="variation">
<value>{メタデータ:任意のバリエーション}</value>
</property>
</bean>
データ正規化APから受け取ったデータをリアルタイム分析(CEP)でSQLクエリを使用することができます。
SQLクエリは [プログラミング・開発ガイド > エッジアプリケーションの作成 > ルート定義ファイル] の定義例のうちH部分に記述します。
例えば単純フィルタとして "SELECT temperature,pressure from WeatherData where temperature > 20" などと指定することができますが、
データ正規化APに WeatherData クラスが存在し、変数temperatureとpressureがアノテーション定義されている必要があります。アノテーション定義例は
[プログラミング・開発ガイド > エッジアプリケーションの作成 > データ正規化AP]を参照してください。
SQLクエリは以下のパターンを利用可能です。
|
項目 |
説明 |
|---|---|
|
単純フィルタ SELECT |
受信した任意のデータのうち、指定する条件を満たしているデータにフィルタすることができます。 |
|
条件付きフィルタ 副問い合わせ |
受信した任意のデータのうち、指定する条件を満たしているデータについて、さらに別条件でフィルタすることができます。 |
|
複数イベントフィルタ JOIN |
複数種類のデバイスから受信したデータのうち、指定した条件を満たしているデータにフィルタすることができます。 |
|
単純計算フィルタ avg、sum |
受信したデータにの平均値、合計値を条件に指定することができます。 |
本節はDocker環境上でEAFファイルをDockerイメージ化する手順とDockerイメージを起動する手順を掲載します。
手順1 Docker環境にEAFコンテナをインストール
1. JavaコマンドとdockerコマンドにPATHを通します。
# export PATH="$PATH:<javaコマンドのパス>"
# export PATH="$PATH:<dockerコマンドのパス>"
2. http,httpsのプロキシの環境変数を定義します。
# export https_proxy=<proxyホストURL>
# export http_proxy=<proxyホストURL>
3. インストーラの以下のファイルを任意のディレクトリにコピーし展開します。
# cp -p /media/cdrom/EAF/LINUX/EAF.TGZ / /home
# tar zxvf EAF.TGZ
4. セットアップスクリプトを実行します。
# cd edge
# ./setup.sh
Start installation of EAF Deployer.
(略)
Successfully tagged nec-eaf:latest
Done.
Success!
5. インストール後の確認を行います。
以下のようにnec-eaf, nec-eaf-baseのDockerイメージが存在することを確認します。このうち、nec-eafがEAFコンテナです。
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nec-eaf latest f8c8f0f33ee2 5 days ago 237MB
nec-eaf-base latest 7b305f6895a1 5 days ago 81.4MB
手順2 EAFコンテナを起動
# docker run -it nec-eaf /bin/sh /opt/eaf/container/bin/eaf
手順3 次回コンテナ起動時に不要なファイルの削除
# docker exec -i -t <DockerコンテナID> rm -f /opt/eaf/container/data/id
手順4 EAFファイルをEAFコンテナ内へ配備
# docker cp <EAFファイル名> <dockerコンテナID>:/opt/eaf/container/deploy/
手順5 custom.propertiesを編集
/opt/eaf/container/etc/custom.properties の最後の行に以下を追記してください。
com.nec.eaf.cep-initialization-bundle.indexedclassname=com.nec.eaf.demo.inbound.Acceleration
com.nec.eaf.outbound-adapter-bundle.host=<クラウド層のマシンのホスト名>
手順6 EAFコンテナからDockerイメージ(.tar)を生成
# docker commit <dockerコンテナID> <dockerイメージID>:<タグ名>
# docker save <dockerイメージID>:<タグ名> > <dockerイメージ名(.tar)>
手順1 Dockerイメージ(.tarファイル)からDockerイメージを出力
# docker load < <dockerイメージ名(.tar)>
手順2 Dockerイメージの起動
# docker run -it <dockerイメージ名>
EAFファイルをリポジトリ機能に登録するためには、事前にリポジトリ機能環境を構築してURLを設定しておく必要があります。 以下に構築手順と設定手順を説明します。
WebOTX Application Server をインストールしリポジトリ機能モジュールを配備します。
WebOTX Application Serverがインストールされていない状態でリポジトリ機能モジュールの配備を以下の手順で実施してください。
既にWebOTX Application Serverがインストールされている場合、手順1と手順4のみ実施してください。
手順1. インストールメディアから"EAF\EAF.zipをコピーし、"EAF\cloud\install_config.bat"を以下のように編集
REM インストールメディアのドライブレターを環境に合わせて変更
set WEBOTX_MEDIA_ROOT=<インストールメディアのドライブレター>
REM WebOTXインストールフォルダを環境に合わせて変更
set AS_INSTALLDIR=<WebOTXインストールフォルダ>
REM JDKを環境に合わせて変更
set AS_JAVA_HOME=<JDKインストールフォルダ>
手順2. "EAF\cloud\setup1.bat"を実行(WebOTX Application Serverのインストール)
手順3. OS再起動
手順4. "EAF\cloud\setup2.bat"を実行(リポジトリ機能モジュールの配備)
手順5. Internet Explorerで http://<ホスト名>/eaf-console/?tab=repository にアクセスし以下の EAF運用管理コンソールログイン画面 が表示されることを確認。

図 EAF運用管理コンソールログイン画面
1. [ウィンドウ]-[設定]-[一般]-[Webブラウザ]を開き、[外部Webブラウザを使用]にチェックを入れ[Internet Explorer]にチェックを入れます。
2. [ウィンドウ]-[設定]-[WebOTX]-[EAF]-[リポジトリ]を開き、[追加]ボタンを押下し名前とリポジトリ機能のURLを指定します。
リポジトリ機能のURLは"http://<ホスト名>/eaf-agent/rest/repository/"の形式で指定してください。

図 リポジトリ機能の設定画面