7
ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016 23 //internet of things / いを増しているモノのインターネット(IoT)分野はエンド・ツー・エ ンドで統制されるものであり、サーバー・サイドの分析、監視、デー タベース・ストレージ、エンタープライズ統合とリモート・デバイス(セン サー、コントローラ、アクチュエータなど)の統合が必要です。さらに、信頼 性の高い分散型通信も不可欠です。多数のプラットフォームとデバイスに 加えて個々のアクティビティを1つに結合しなくてはならないため、マルチ プラットフォーム対応という特性を持つJavaは利用言語として最適です。 しかし、往々にして求められるのは、 IoTアプリケーションで処理され るすべての関連ビジネス・アクティビティとテクニカル・アクティビティを 体系化できるプラットフォームまたはフレームワークであり、ここでクラウ ドが一役買います。 クラウドに関しては、以下の3つの重要な点に留意する必要があります。 クラウドは第三者が管理するデータセンターにとどまりません。単なる インフラストラクチャの枠を超えて、Platform as a Service(PaaS)に向 かっています。PaaSでは、開発者がサーバー、ロードバランサ、クラス タ、データベース・サイズ、構成といった詳細を意識する必要がなく、問 題の解決とコードの作成に集中できます。 PaaSサービスが提供する方法で分析を実装すると、 Javaコーディング の楽しさを損なわずに退屈なタスクを減らすことができます。 クラウドは、顧客およびビジネス主導で変更できる権限をビジネス・ オーナーに付与することで、重要度の低い変更や微調整を開発者が実 施する必要性を低減します。 たとえば、主要な分析機能をJavaからクラウドに移行すると、しきい値の 調整、詳細データの監視、その他の調整可能なパラメータの処理作業を、 問題領域に精通し、ユーザーと連絡を取れるビジネス・オーナーに任せる ことができます。本記事では、Oracle Internet of Things Cloud Service(以 下、Oracle IoT Cloud ServiceまたはIoTCSと呼びます)の使用例により、こ のアプローチを確認していきます。 JavaおよびOracle IoT Cloud Serviceの使用 PaaSであるOracle IoT Cloud Serviceを利用すると、サーバーやソフトウェア 更新、手動でのデプロイ、ロードバランシングなどのインフラストラクチャに 関する問題を気にすることなく、ソリューションの構築に専念できます。 少ない労力や管理作業、コード量でより容易にアプリケーションを 構築できるようにするため、プロバイダはベーシックなPaaSサービスを 提供するよりも、Oracle IoT Cloud Serviceなどのように専門化した実装と フレームワークをクラウドで提供する傾向にあります。 IoT分析の場合、これは大抵、しきい値を変更し、新しい条件に基づ くアラートを追加し、古いアラートを削除できることを意味します。Oracle IoT Cloud Serviceでは、組込みのStreams Explorer分析ルールを使用し てこれらのタスクを簡単に実行できます。実際の動きを確認するため、 IoTCSを使用したクラウド・アプリケーションの構築方法を確認していきま す。 IoTCSのドキュメントに目を通すと、多数のREST APIやルールベース の分析に加えて、パッケージおよびアダプタに基づく、ビジネス・インテリ ジェンス、モバイル・デバイス、およびエンタープライズ・システムの統合 が含まれています。ここでJavaがどのように貢献するのかは明白ではない かもしれません。しかし、オラクルは、 Javaを使用したデバイス、ゲートウェ イ、エンタープライズ・アプリケーションの開発に役立つ、 Javaベースの IoTCS Client Software Libraryを提供しています。 例を挙げると、 IoTCSでは、OAuth 2.0トークンを使用して大半のセ キュリティ・モデルを実装しています。REST APIを使用する場合、 IoTデバイ スを有効化してデータ通信を可能にするためには、SSLキーストアの読取 り、Base64方式での適切なユーザー名とパスワードのエンコーディング、 正しいOAuth 2ハンドシェイク・メッセージの送信、レスポンスの処理が 必要です。純粋なRESTを使用してこれを実現すると冗長な作業になりま すが、Oracle IoT Cloud Service Java Client Software Libraryのパーツを ERIC BRUNO IoTに特化したクラウドの利用 IoTに特化したクラウドでデバイス制御と分析を行って、デバイスのリモート管理および運用を実現

Oracle | Integrated Cloud Applications and Platform Services - IoT … · くアラートを追加し、古いアラートを削除できることを意味します。Oracle IoT Cloud

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Oracle | Integrated Cloud Applications and Platform Services - IoT … · くアラートを追加し、古いアラートを削除できることを意味します。Oracle IoT Cloud

ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016

23

//internet of things /

勢いを増しているモノのインターネット(IoT)分野はエンド・ツー・エンドで統制されるものであり、サーバー・サイドの分析、監視、デー

タベース・ストレージ、エンタープライズ統合とリモート・デバイス(センサー、コントローラ、アクチュエータなど)の統合が必要です。さらに、信頼性の高い分散型通信も不可欠です。多数のプラットフォームとデバイスに加えて個々のアクティビティを1つに結合しなくてはならないため、マルチプラットフォーム対応という特性を持つJavaは利用言語として最適です。

しかし、往々にして求められるのは、IoTアプリケーションで処理されるすべての関連ビジネス・アクティビティとテクニカル・アクティビティを体系化できるプラットフォームまたはフレームワークであり、ここでクラウドが一役買います。

クラウドに関しては、以下の3つの重要な点に留意する必要があります。 ■ クラウドは第三者が管理するデータセンターにとどまりません。単なるインフラストラクチャの枠を超えて、Platform as a Service(PaaS)に向かっています。PaaSでは、開発者がサーバー、ロードバランサ、クラスタ、データベース・サイズ、構成といった詳細を意識する必要がなく、問題の解決とコードの作成に集中できます。

■ PaaSサービスが提供する方法で分析を実装すると、Javaコーディングの楽しさを損なわずに退屈なタスクを減らすことができます。

■ クラウドは、顧客およびビジネス主導で変更できる権限をビジネス・オーナーに付与することで、重要度の低い変更や微調整を開発者が実施する必要性を低減します。たとえば、主要な分析機能をJavaからクラウドに移行すると、しきい値の調整、詳細データの監視、その他の調整可能なパラメータの処理作業を、問題領域に精通し、ユーザーと連絡を取れるビジネス・オーナーに任せることができます。本記事では、Oracle Internet of Things Cloud Service(以下、Oracle IoT Cloud ServiceまたはIoTCSと呼びます)の使用例により、このアプローチを確認していきます。

JavaおよびOracle IoT Cloud Serviceの使用PaaSであるOracle IoT Cloud Serviceを利用すると、サーバーやソフトウェア更新、手動でのデプロイ、ロードバランシングなどのインフラストラクチャに関する問題を気にすることなく、ソリューションの構築に専念できます。

少ない労力や管理作業、コード量でより容易にアプリケーションを構築できるようにするため、プロバイダはベーシックなPaaSサービスを提供するよりも、Oracle IoT Cloud Serviceなどのように専門化した実装とフレームワークをクラウドで提供する傾向にあります。

IoT分析の場合、これは大抵、しきい値を変更し、新しい条件に基づくアラートを追加し、古いアラートを削除できることを意味します。Oracle IoT Cloud Serviceでは、組込みのStreams Explorer分析ルールを使用してこれらのタスクを簡単に実行できます。実際の動きを確認するため、IoTCSを使用したクラウド・アプリケーションの構築方法を確認していきます。

IoTCSのドキュメントに目を通すと、多数のREST APIやルールベースの分析に加えて、パッケージおよびアダプタに基づく、ビジネス・インテリジェンス、モバイル・デバイス、およびエンタープライズ・システムの統合が含まれています。ここでJavaがどのように貢献するのかは明白ではないかもしれません。しかし、オラクルは、Javaを使用したデバイス、ゲートウェイ、エンタープライズ・アプリケーションの開発に役立つ、JavaベースのIoTCS Client Software Libraryを提供しています。

例を挙げると、IoTCSでは、OAuth 2.0トークンを使用して大半のセキュリティ・モデルを実装しています。REST APIを使用する場合、IoTデバイスを有効化してデータ通信を可能にするためには、SSLキーストアの読取り、Base64方式での適切なユーザー名とパスワードのエンコーディング、正しいOAuth 2ハンドシェイク・メッセージの送信、レスポンスの処理が必要です。純粋なRESTを使用してこれを実現すると冗長な作業になりますが、Oracle IoT Cloud Service Java Client Software Libraryのパーツを

ERIC BRUNO

IoTに特化したクラウドの利用IoTに特化したクラウドでデバイス制御と分析を行って、デバイスのリモート管理および運用を実現

Page 2: Oracle | Integrated Cloud Applications and Platform Services - IoT … · くアラートを追加し、古いアラートを削除できることを意味します。Oracle IoT Cloud

ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016

24

//internet of things /

使用した場合、IoTデバイスを認証および有効化するコードはリスト1に示すように短くなります。

リスト1:String url = ...HttpClient httpClient = new HttpClient(server_url,uid,pwd);

WebResource resource = httpClient.createHTTPClient(true).resource(url);

TokenInputDetails tokenInputDetails = new TokenInputDetails();

tokenInputDetails.setTokenType( TokenType.TOKEN_TYPE_ACTIVATION);tokenInputDetails.setDeviceId(endpointID);tokenInputDetails.setSharedSecret(secret);

String deviceModelStr = "urn:com:acme:conveyorbeltmodel";String messageFormat = "urn:com:acme:conveyorbeltmodel:speed";

Authorization authorization = new Authorization(resource);PrivateKey privateKey = authorization.activate(tokenInputDetails);

実際には、IoTCS Client Software Libraryのoracle.iot.client.device.DirectlyConnectedDeviceクラスを使うことで、こ

のコードを以下のようにさらに短くできます(リスト2を参照)。

リスト2:DirectlyConnectedDevice device = new DirectlyConnectedDevice();if ( ! device.isActivated() ) { device.activate( getDeviceModelURN() );}

クラウドベースの開発パラダイムを利用するときに鍵となるのは、IoTソリューションの中でどの側面をクラウドでの分析に任せ、どの側面をコードに実装するのかを理解することです。ここでの目標は、新しいソフトウェアをデプロイせずにビジネス・ユーザーによる変更を可能にすることで、冗長な保守作業の必要性を低減することです。ここからは、IoTアプリケーション・シナリオについて説明した後、Javaコードを調べて、この目標を達成可能にするOracle IoT Cloud Serviceの設定について確認していきます。

サンプル・アプリケーション:産業用ベルト・コンベアの監視このサンプルIoTアプリケーションでは、JavaとIoTCSを使用して工場のベルト・コンベアを実装、監視、制御します。ここではベルト・コンベアのモーターをエミュレートしていますが、IoTCS Client Software Libraryを使用したJavaコードは、実際のデバイス上またはデバイスとクラウドを接続するゲートウェイ上で実行するように作成されています。このシナリオに含まれるベルト・コンベアは、インターネットに直接接続して属性の更新を送信し、アクションをリスニングできるものとします。

最初のステップとして、図 1に示すように、IoTCSインスタンス内に新しいデバイス・モデルを作成します。デバイスのデータ属性とアクションをここに定義します。

この図では、ベルト速度、冷却ファン速度、油圧、温度を示すデバイス属性と、ベルトの電源をオン/オフするアクションが作成されています。

サーバー・サイドには、デバイス・データの分析とその他のクラウド・サービスまたはアプリケーションとの統合を管理するIoTCSアプリケー

オラクルは、Javaを使用したデバイス、ゲートウェイ、エンタープライズ・アプリケーションの開発に役立つ、JavaベースのOracle IoTCS Client Software Libraryを提供しています。

Page 3: Oracle | Integrated Cloud Applications and Platform Services - IoT … · くアラートを追加し、古いアラートを削除できることを意味します。Oracle IoT Cloud

ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016

25

//internet of things /

ションを定義します。図2に、サンプルIoTCSアプリケーションのエンド・ツー・エンドのアーキテクチャ全体図を示します。今回、Javaで作成した監視アプリケーションはオンプレミス(筆者のラップトップ上)で稼働しますが、クラウド上でも実行できます。

定義した分析機能では、しきい値を処理して、冷却ファンをオンにするタイミングや(過熱や油圧低下などのために)ベルトを停止するタイミングを通知し、Java監視アプリケーションとの統合を処理します。図3に示す分析機能TempThreshold1は、ブール・ロジックと該当するデバイス属性を使用して定義されています。

データ・ソースはベルト・コンベアのモーターであり、モーターの

温度が華氏100度を超え、冷却ファン速度が1を下回っている(ファンがオンでない)場合、ロジックによってアラートが送信されます。分析機能TempThreshold2も似ていますが、しきい値のモーター温度はさらに高く(華氏150度超)、ファン速度は2未満になります。残りの分析機能も同様です。

しかし、生成されるアラートをリスニングし、そのアラートに基づいて動作するアプリケーションがない限り、これらの分析機能は役に立ちません。このアプリケーションが、前述したJava監視アプリケーションであり、分析に基づいたアラートをIoTCSが送信するRESTエンドポイントが統合されています。以上の結果として、監視アプリケーションは、分析アラートに応じ

図1:Oracle IoTCS管理コンソールに表示されたベルト・コンベアのデバイス・モデル

Page 4: Oracle | Integrated Cloud Applications and Platform Services - IoT … · くアラートを追加し、古いアラートを削除できることを意味します。Oracle IoT Cloud

ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016

26

//internet of things /

て、ベルト・コンベアのモーター速度の変更や冷却ファン速度の調整、または電源停止をデバイスに指示します(リスト3を参照)。

リスト3:public static void handleREST(HttpExchange t) throws Exception { // Read request JSON string BufferedReader bodyReader = new BufferedReader( new InputStreamReader( t.getRequestBody() )); //... // Parse the JSON string StringReader sr = new StringReader(alert.toString()); JsonReader jr = Json.createReader(sr); JsonObject jo = //... JsonObject payload = jo.getJsonObject("payload");

// Get the alert type by URN String alertType = payload.getString("format");

switch ( alertType ) { case TEMP_TOO_LOW_ALERT_URN: device.set(FAN_SPEED_ATTR, OFF); break; case TEMP_LOW_ALERT_URN: device.set(FAN_SPEED_ATTR, FAN_LOW_SPEED); break; case TEMP_MED_ALERT_URN:

device.set(FAN_SPEED_ATTR,

図2:Oracle IoTCSのサンプル・アプリケーションのアーキテクチャ

“Power” Action

Data UpdatesData

Updates

ALERT!

Activate

Action Requests

Oracle IoT Cloud Service Java DeviceClient Software Library

Oracle IoT Cloud Service Java EnterpriseClient Software Library

ORACLEIOT CLOUD SERVICE

Real-TimeAnalytics

Model: “Conveyor Belt Device Model”Device: “Conveyor Belt”IoT Application: “My Factory”IoT Integration: “Factory Monitor App”

FACTORY MONITORAPPLICATION

CONVEYORBELT

(EMULATOR)

図3:Streams Explorerの分析定義

Page 5: Oracle | Integrated Cloud Applications and Platform Services - IoT … · くアラートを追加し、古いアラートを削除できることを意味します。Oracle IoT Cloud

ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016

27

//internet of things /

FAN_MED_SPEED); break; case TEMP_HIGH_ALERT_URN: device.set(FAN_SPEED_ATTR, FAN_HIGH_SPEED); break; case TEMP_CRITICAL_ALERT_URN: shutDownBelt(device); break; //... }}

IoTCS分析機能に基づくこの実装では、冷却ファン速度を調整するタイミングを示すしきい値を変更する際、Javaアプリケーションを変更する必要はありません。その代わり、ベルト・コンベアのモーターの機械特性に精通した人物が、分析機能を設定および調整できます。もう1つの方法は、リスト4のようなコードを使用して値とその範囲をハードコードするものですが、この方法を採用すると大幅に満足度が下がるでしょう。

リスト4:VirtualDevice device = event.getVirtualDevice();int temp = (Integer)namedValue.getValue();int coolingFanSpeed = device.get(FAN_SPEED_ATTR);

// Determine if action is needed based on new tempif ( temp >= 300 ) { // Shut things down! device.set(BELT_SPEED_ATTR, 0);}else if ( temp > 250 && ...

監視アプリケーションがベルトまたはファンの速度を変更したという通知を受け取るためには、リスト5に示すように、デバイスが、該当する属性の

変更を登録する必要があります。

リスト5:DeviceModel model = device.getDeviceModel( CONVEYOR_BELT_MODEL_URN);

VirtualDevice virtualDevice = device.createVirtualDevice( device.getEndpointId(), model);

virtualDevice.setOnChange( BELT_SPEED_ATTR, new VirtualDevice .ChangeCallback<VirtualDevice>() { public void onChange( VirtualDevice .ChangeEvent<VirtualDevice> e) { onBeltSpeedChange(e); }});virtualDevice.setOnChange( COOLING_FAN_SPEED_ATTR, new VirtualDevice.ChangeCallback<VirtualDevice>() { public void onChange( VirtualDevice.ChangeEvent<VirtualDevice> e) { onFanSpeedChange(e); }});

Java 8のラムダ式を使用すると、リスト6に示すようにすっきりしたコードになります。ここに示されていないコールバック・メソッドにより、値の変更に適宜対応できるように属性名が切り替えられます。

Page 6: Oracle | Integrated Cloud Applications and Platform Services - IoT … · くアラートを追加し、古いアラートを削除できることを意味します。Oracle IoT Cloud

ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016

28

//internet of things /

リスト6:virtualDevice.setOnChange( (VirtualDevice.ChangeEvent<VirtualDevice> event) -> { onAttributeChange(event);});

IoTCSのアクション・リクエスト(powerアクションなど)をリスニングするためには、デバイスに独立したコールバックを実装する必要があります(リスト7を参照)。このコールバック・メソッドには、IoTCSデバイス・モデルに定義したものと一致するパラメータを定義する必要があります。

リスト7:virtualDevice.setCallable("power", new VirtualDevice.Callable<Boolean>() { public void call( VirtualDevice virtualDevice, Boolean on) { belt.power(on); }});

言うまでもありませんが、デバイスはそれぞれが持つ属性を更新できます。そのためには、IoTCS Client Software Libraryを使用して、変更が効率的にクラウドに送信されるようにします。変更の送信には、クラウドにおけるデバイスそのものの表現である仮想デバイスの概念を使用します。リスト8に示すコードは、処理の最初にVirtualDevice.updateを呼び出します。次に、VirtualDevice.setを呼び出すことで各属性に値が割り当てられます。最後に、VirtualDevice.finishの呼出しは、IoTCSに変更を送信できることを示しています。クライアント・ライブラリは、信頼できるRESTベースのメッセージングを内部で使用して、IoTCSに変更を送信します。

リスト8:virtualDevice.update() .set(BELT_SPEED_ATTR, beltSpeed) .set(TEMP_ATTR, temp) .set(FAN_SPEED_ATTR, fanSpeed) .set(OIL_PRESSURE_ATTR, oilPSI) .finish();

デバイス属性の更新を受け取るために、監視アプリケーションではデバイスとまったく同じように登録を行います。リスト9のコードは、この方法と、監視アプリケーションからアクションを呼び出し、デバイス上の属性値を変更する方法を示しています。

リスト9:EnterpriseClient ec = EnterpriseClient.newClient(APP_NAME);

VirtualDevice virtualDevice = ec.createVirtualDevice( "0-LENQ", deviceModel);

virtualDevice.setOnChange( /*...*/);virtualDevice("power", true);virtualDevice.set(BELT_SPEED_ATTR, 1);

この例で、監視アプリケーションはpowerアクションに適切なパラメータ値を渡して呼び出し、ベルト速度を設定することで、ベルト・コンベアの電源を入れています。

以上で、ベルト・コンベアのIoTアプリケーションをエンド・ツー・エンドで適切に動作させるための要素がすべて整いました。実際のアプリケーションには、より容易にアクティビティを確認できるようにするためのユーザー・インタフェースが含まれるでしょうが、今回の目的上、ここではコマンドラインで代用します。以下に、ベルト・コンベアのデバイス・エミュレータが監視アプリケーションからコマンドを受け取ったときの出力サン

Page 7: Oracle | Integrated Cloud Applications and Platform Services - IoT … · くアラートを追加し、古いアラートを削除できることを意味します。Oracle IoT Cloud

ORACLE.COM/JAVAMAGAZINE /////////////////// SEPTEMBER/OCTOBER 2016

29

//internet of things /

プルを示します。[編集注:インデントされている行は、前の行から折り返されている行です。]

Created the directly-connected device--Device model=urn:com:acme:conveyorbeltmodel--Instance=0-LENQ--Starting belt speed:0Motor temp: 70Motor oil pressure: 0Mon Jul 25 12:00:37 EDT 2016 : 0-LENQ : Call : "power"=trueMotor temp: 70Motor oil pressure: 0Mon Jul 25 12:00:50 EDT 2016 : 0-LENQ : onChange : BeltSpeed was: 0, now: 1Motor temp: 81Motor oil pressure: 40Motor temp: 82Motor oil pressure: 42...Mon Jul 25 12:07:50 EDT 2016 : 0-LENQ : onChange : CoolingFanSpeed was: 0, now: 1...

冷却ファンのオン/オフを切り替えるタイミングとその他の重要なイベント(油圧低下や過熱など)について、IoTCS分析機能から監視アプリケーションにアラートが通知されています。以下の出力は、IoTCS分析機能による各種アラートへの監視アプリケーションの対応です。

Listening on http://localhost:7890/monitor/messagesDevice: 0-LENQ, OilPressure: 49Device: 0-LENQ, Temperature: 71

Alert: 0-LENQ, TempThreshold1 - set cooling fan to 1...

この出力と、対応する前述のコードにおいて注目すべきことは、Java Client Software Libraryを使用して実装され、IoTCS自体に定義された分析機能によって、IoTCSから送られるイベントにデバイスと監視アプリケーションの両方がどう対応しているかという点です。

クラウドにより、冗長な構成の大半が解消されるため、開発者は アプリケーションを正しく機能させることに集中できます。

まとめ ご紹介したとおり、PaaSクラウドではコーディングの楽しさをいくらか取り戻すことができます。単調さが軽減されており、必要に応じてユーザーがより迅速にアプリケーションを調節できます。</article>

Eric Bruno:オラクルのISVソフトウェア・セールス・チームのプリンシパル・セールス・コンサルタントで、Oracle IoT Championでもある。ライフサイクル全般、大規模ソフトウェアのアーキテクチャ、設計、開発に関する専門知識を有し、エンタープライズ・アーキテクト、開発者、業界アナリストとして、ITコミュニティで20年以上の実績がある。

Oracle IoT Cloud ServiceホームページOAuth 2.0

learn more