目次


コグニティブ IoT アプリケーション対応のブロックチェーンを実装する、第 2 回

車載センサーのデータを使用して Blockchain 内でスマート・トランザクションを実行する

IBM Watson IoT Platform に IBM Blockchain サービスを統合してサンプル使用ケースを開発する

Comments

コンテンツシリーズ

このコンテンツは全2シリーズのパート#です: コグニティブ IoT アプリケーション対応のブロックチェーンを実装する、第 2 回

このシリーズの続きに乞うご期待。

このコンテンツはシリーズの一部分です:コグニティブ IoT アプリケーション対応のブロックチェーンを実装する、第 2 回

このシリーズの続きに乞うご期待。

このシリーズの第 1 回では、IoT ソリューション内でブロックチェーンを使用するという手法について説明し、さまざまな業界でこの 2 つのテクノロジーを利用して完全に自動化されたセキュアなソリューションを構築している例を取り上げました。この第 2 回では、BM Watson IoT Platform と IBM Blockchain サービスを利用して使用ケースを組み立てる例を紹介します。

使用ケースの詳細

このシナリオでは主に自動車データに焦点を当て、V2V (Vehicle to Vehicle) メッセージ、V2I (Vehicle to Infrastructure) メッセージ、車載センサーからの監視データを扱います。したがって、標準的な属性には、接続された自動車とその近くの自動車のタイムスタンプ、緯度、経度、高度、速度、方向ベクトル、加速度が含まれます。このデモでは扱いませんが、車載センサーに関する他のデータ (管理対象自動車のガソリンやオイルの残量など) とサポート・データ (気象情報、道路状況、場所に固有の交通規則) を利用して、この使用ケースをさらに拡張することもできます。

IBM Blockchain サービス・インスタンスを統合すれば、コグニティブ IoT アプリケーションを比較的簡単に、しかも迅速に構築できます。

表 1 に、このシナリオの参加者を記載します。

表 1. 主な参加者
参加者説明
自動車車載センサーと V2V/V2I センサーが、ブロックチェーン内でトランザクションを実行するために必要なすべての関連データを送信します。
行政機関一般に、(特定の区域に応じた) 行政機関が運転パターンを監視して、ドライバーの評価を設定します。運転パターン (スピード違反など) によっては罰金や刑罰が課せられる場合もあります。
ドライバーまたは所有者ドライバーの評価を表示します。
保険業者ドライバーの評価を読み取り、チェーンコードのルールを更新して、保険関連の値 (保険料など) を調整します。

このデモ・アプリケーションには、上記の参加者と管理対象自動車 (資産) との間のやりとりのすべてを記録するレジャーを表示するビューが含まれます。行政機関と保険業者はレジャーのビューを使用して、特定の自動車と近くの自動車の運転挙動を確認し、評価することができます。このデモ・アプリケーションには含まれていませんが、自動車修理のプロバイダーを参加させて、プロバイダーが自動車の性能と道路状況を判断して、ブロックチェーン内にセットアップされたルールに基づいてメンテナンスを予約できるよう、アプリケーションを拡張することも可能です。

受信したデータに基づいてすべての参加者が反応し、各自が所有するレジャーの属性に対するアクションをトリガーできることから、表 2 に記載するシナリオが考えられます。

表 2. シナリオ
参加者シナリオスマート・コントラクトのアクション
保険業者保険料の改正運転の評価が特定のしきい値を下回った場合は、保険料を改正する
自動車 (IoT)運転パターンまたは危険運転の記録運転の評価を更新する
自動車 (IoT)自動車部品の状態の記録リアルタイムの入力に基づいて部品の状態を常に更新する
自動車 (V2V/V2I)危険運転の識別

交通違反の記録
運転の評価を更新する

交通レコードを更新する
行政機関交通違反ケースの送信違反があった場合、交通違反ケースを作成する

識別された交通違反に基づく自動罰金請求に対応することも可能

上記のシナリオに関する詳細は以下のとおりです。

  • 主な資産クラス:
    • 自動車— 自動車の運転に関するデータ、自動車部品データ、運転評価、保険記録、交通違反データを完全に包含します。
  • イベント:
    • 安全でない運転— 場所、移動、速度、方向などを記録する自動車 IoT データから導き出されるイベントです。
    • 交通違反または危険運転— V2V/V2I データを基に記録されるイベントです。
    • 保険料改正— 「安全でない運転」、「交通違反」などの他のイベントから派生するイベントです。
    • 交通違反ケース解決— 行政機関が交通違反に関するケースを解決した時点で発生するイベントです。
  • ルールおよびアラート:
    • 交通違反ケース保留— 「交通違反」イベントに対してアラートを起動するルールです。このアラートは、「交通違反ケース解決」イベントによってクリアされるまで維持されます
    • 長期間にわたる危険運転— このルールは、他の関連するアクションをトリガーします。

コントラクト・インスタンスや動作と状態などの詳細については、このリンク先の記事「Introduction to Hyperledger Smart Contracts for IoT Best Practices and Patterns」を参照してください。

アーキテクチャーの概要

ブロックチェーン・テクノロジーを使用する場合は、新しいトランザクションが追加されるたびに、コンセンサス・プロセスが発生します。このプロセスが完了するまでは、トランザクションはレジャーにコミットされません。トランザクション・データが大きいと、コンセンサス・サービスでジョブを完了するのに時間がかかるため、その分、待ち時間が長くなります。これはつまり、トランザクションが「コミット済み」として監視システムに可視になるまでに、多少の時間がかかることを意味します。この遅延は、コンセンサス待ち時間と考えられます。

さらに、ブロックチェーンとやりとりするアプリケーションでは、通常、拒否不能にする必要があるデータと、そうでないデータを把握する必要があります。拒否不能にするデータについては、ブロックチェーン内で保管するよりも、リポジトリーに直接保管したほうが妥当な場合もあります。

以上の背景から、データをブロックチェーンに追加できる速度と量には実質的制限が課せられるため、自動車の IoT センサーと V2V センサーからのリアルタイム・データを直接ブロックチェーンに送信することはしません。

このデモ・アプリケーションの設計で主に重点を置くのは、ブロックチェーンに対する処理です。特定のイベントを識別するには、V2V および IoT から送信されるリアルタイム・データを分析します。そうして識別されたイベントをブロックチェーン・サービスに送信することで、リアルタイムの処理とブロックチェーンでの処理が適切に分離されるようになります。

このデモで使用するコンポーネントには、リアルタイム・データに直ちにアクセスしなければならないものはありません。

図 1 に、デモ・アプリケーションのアーキテクチャー概要を示します。

図 1. アプリケーションのアーキテクチャー
アプリケーションのアーキテクチャーを示す図
アプリケーションのアーキテクチャーを示す図

センサーと Watson IoT Platform

車載センサーの役割は、運転中の自動車データを監視し、そのデータを Watson IoT Platform に送信することです。このデモ・アプリケーションに使用するセンサー・データには、主に 2 つのタイプがあります。

  • 自動車に搭載された監視デバイスは、速度、場所、方向をはじめ、運転パターンを分析するために必要なパラメーターを監視します。
  • V2V および V2I センサーは、近くの自動車またはインフラストラクチャーからイベントを受信し、それらのイベントをさらに分析するために Watson IoT Platform に送信します。

このデモではデバイス・シミュレーターを使用して、必要なセンサー・データをシミュレーションします。

Watson IoT Platform はセンサーから送られてくるすべての自動車イベントを受信します。それらのイベントを Bluemix ベースのサービスが分析して運転パターンを検出し、出力イベントを IBM Blockchain サービス・インスタンスに転送して以降のアクションを実行するという仕組みです。

スマート・コントラクトと IBM Blockchain

このデモで使用するスマート・コントラクトは、Generic IoT Sample Contract を引用し、それを自動車の運転というシナリオに合わせて構成したものです。Hyperledger Fabric ベースのブロックチェーン内で実行されるこのスマート・コントラクトは、Watson IoT Platform に統合されるように設計されています。

Generic IoT Sample Contract での場合と同じく、ブロックチェーン・レジャー内で処理されるメッセージには以下の 2 つのクラスがあります。

  • トランザクション— レジャーの状態を変更するためのメッセージです。
  • クエリー— レジャーの状態を読み取るためのメッセージです。

このスマート・コントラクトは、Generic IoT Sample Contract から非常に有用な機能をいくつか継承しています。具体的には、資産の履歴ストレージ、最新のものから優先して更新する機能、アラートを起動/クリアするルール・エンジン、アクティブなアラートを追跡するアラート・メカニズム、「イベントとしての部分的状態」パターンです。

チェーンコードの実行結果として IBM Blockchain のセキュアなストアに保管されたデータには、利害関係者が Node.js ベースのクライアント・アプリケーションを使用してアクセスすることができます。受信した IoT データがチェーンコードによって処理されると、利害関係者 (保険業者、ドライバー、行政機関) はそのトランザクションの出力を表示できます。

このクライアント・アプリケーションでは IBM Blockchain REST API を使用してチェーンコードに対するクエリーを実行し、単純な Web ベースのインターフェースを使用してデータを表示します。

実装の詳細

このセクションでは、上述の使用ケースを実装する手法を詳しく解説します。まず、実装に必要なコンポーネントと、必要とされる機能を達成するために、それらのコンポーネントがやりとりする仕組みについて説明します。続いて、機能フローの個々のステップをリストアップし、Bluemix サービスと IBM Watson IoT Platform を利用して各ステップを実装する方法を説明します。

アプリを実行するクライアント・アプリケーションのサンプル・コードを入手するスマート・コントラクトのサンプル・コードを入手する

図 2 に、デモ・アプリケーションを構成する各種のコンポーネントを示します。

図 2. アプリケーションのコンポーネント
アプリケーションのコンポーネントを示す図
アプリケーションのコンポーネントを示す図

センサーから受信したデータを分析する際に重要な役割を果たすのは、以下のコンポーネントです。

  • Node-RED によるオーケストレーション— Bluemix 内の Node-RED Starter サービスを利用して、IoT イベントのオーケストレーションを行い、データを拡充した上でイベントを運転パターン分析サービスに送信します。
  • Driver Behavior による分析Watson IoT Driver Behavior サービスは拡充されたイベント・データを取り、ドライバーの挙動と自動車の使用パターンを分析します。

図 3 に、これらのコンポーネントがやりとりし、Node-RED と Driver Behavior 分析サービスを利用して必要な機能を実装する仕組みを示します。このシナリオでは、Node.js ベースのカスタム・アプリケーションから直接スマート・コントラクトをトリガーしています。

図 3. デモ・アプリケーションのフロー
デモ・アプリケーションのフロー図
デモ・アプリケーションのフロー図

このプロセスは、以下のように機能します。

  1. 所有者がクライアント・アプリケーションを使用して、自分の自動車を登録します。これにより、対応する資産がブロックチェーン内に作成されます。
  2. 登録された自動車に搭載されたセンサーが、その自動車のプローブ・データを Watson IoT Platform に送信します。
  3. Node-RED によるオーケストレーション (以下で詳細を説明) を使用してセンサー・データを分析し、それによって Driver Behavior サービスを呼び出します。
  4. Driver Behavior サービスの出力を使用して Blockchain サービスを呼び出します。呼び出された Blockchain サービスはスマート・コントラクトを実行し、表 2 に記載されているアクションを実行します。

車載 IoT と V2V のデータ収集

V2V データと IoT データは、自動車に搭載されたデバイスによって収集されて、そのデバイスから Watson IoT Platform に送信されます。このデモ・アプリケーション用には、以下のコード・リストに示すように、デバイス・シミュレーターを使用してデバイスの運転データを送信します。

車載センサーからのデータ

車載センサーのデータは、順序付けられた一連の自動車イベントです。各イベントは、走行中の自動車から取得された方位、緯度、経度、速度、タイムスタンプで構成されます。運転パターンを分析するためにサンプルとして使用するセンサー・データを以下に記載します。

リスト 1. サンプル・センサー・データ
{
    "heading":273.995431,
    "latitude":30.398981,
    "longitude":97.746804,
    "speed":8.256416399999999,
    "timestamp":"2016-03-11T13:43:17.000Z",
    "trip_id":"1HGFM82644B006001_2017-02-10"
}

V2V センサーからのデータ

シミュレーションされた自動車間の通信メッセージが Watson IoT Platform に送信されます。これらのメッセージには、以下の 2 つのタイプがあります。

  1. 基本安全メッセージ (BSM)— 接続された自動車内の受信側が受け取る V2V メッセージです。BSM には、非常ブレーキ・ライト、自動車の速度、方向といった情報が含まれます。
  2. 沿道アラート・メッセージ (RSA)— 沿道のインフラストラクチャー・コンポーネントによってトリガーされるメッセージです。RSA メッセージには、交通信号、停車中の自動車に関する警告、事故、迂回路の情報が含まれます。

以下に、サンプル V2V BSM メッセージを記載します。

リスト 2. サンプル V2V BSM メッセージ
{
    "msgID": "basicSafetyMessage",
    "secMark":10,
    "id": 1111111111,
    "lat":60369542144,
    "lng": -984987654,
    "elev": 13000,
    "speed": 10000,
    "heading": 1820,
    "accelset": {
        "lat":0,
        "lng":0,
        "vert": 0,
        "yaw": 0
    },
    "brakes": {
        "wheelBrakes": 11110000,
        "traction": "off",
        "abs": "off"
    },
    "steering": 1501,
    "throttle": 60,
    "lightSet": {},
    "size": {
        "width": 213,
        "length": 640
    },
    "valueCnt1": 0,
    "items1": {},
    "valueCnt2": 0,
    "items2": {}	
}

このようなメッセージが分析されて、特定の運転に固有のイベント (信号無視、スピード違反、異常接近など) が生成されます。生成されたイベントは、Bluemix Blockchain インスタンスに渡されて分析され、記録されます。

V2V イベントと IoT イベントを分散型レジャーにリンクする

IoT Platform でデータが受信されると、対応する Node-RED フローがトリガーされます。このフローでデータがフィルタリングおよび拡充されて、必要に応じて特定のルールが適用されます。デモ・アプリケーションでは、Node-RED フローによって車載センサーのデータが Driver Behavior サービスに送信されます。Driver Behavior サービスは自動車の走行に基づくイベントをバッチ・ジョブとして識別します。ジョブが完了した時点で、デモ・アプリケーションが Blockchain サービスにおいてトランザクションをトリガーします。したがって、このデモ・アプリケーションでは、自動車が走行するごとにトランザクションがブロックチェーンに追加されることになります。

Node-RED ワークフロー

図 4 に、デモ・アプリケーション内で使用している Node-RED ワークフローを示します。

図 4. Node-RED ワークフロー
Node-RED ワークフロー図
Node-RED ワークフロー図

この Node-RED フローの目的は、IoT データが Driver Behavior サービス内に取り込まれるようにするとともに、必要に応じて地図情報によってデータを拡充することです。

このフローでは、着信 IoT メッセージを読み取ると、まず始めに、Bluemix アプリケーションに関連付けられた Driver Behavior サービス用の適切なテナント ID とホスト名をその着信 IoT メッセージに追加します。その後、着信 IoT メッセージから該当するデバイス・データを抽出し、Driver Behavior サービスで理解できるフォーマットに変換します。

変換後のデータは、Context Mapping サービスの地図情報と突き合わされます。そのために呼び出す Context Mapping API は、/matching と /link の 2 つです。メッセージに追加されたデータは、生成されたログを見るとわかります。

このデモ用にシミュレーションした走行データ (前に記載した一連のイベント) を Driver Behavior サービスに取り込むと、その走行に関する特定の運転挙動が生成されます。センサー・データから生成される挙動イベントについては、このリンク先の資料を参照してください。

最後に、Driver Behavior サービスが特定の走行に対して、プローブ・データを自身のデータ・ストア内に追加できるよう、拡充された IoT メッセージを使用して Driver Behavior サービスの /carProbe API を呼び出します。

緑色の「ログ」ノードは、デバッグ出力を生成するためのものです。対応する「遅延」ノードは、ログ・メッセージが完全に出力に書き込まれた後で次のノードに移動するためのもので、これにより、ログ・メッセージが互いに上書きすることが確実になくなります。

この API の詳細については、Bluemix サービスの資料で調べることができます。また、このリンク先のチュートリアルで、このフローをセットアップする詳しい方法を説明しています。

レジャーのトランザクションを実行する

イベントをトリガーするには (したがって、トランザクションがトリガーされるようにするには)、IoT Platform によって開始されたイベント、または参加者が開始したイベントを使用できます。

ブロックチェーン・サービス内の検証ピアはトランザクションを受信すると、ネットワーク内の他の検証ピアとのコンセンサス・プロセスを開始します。デフォルトの Bluemix Blockchain サービスには、4 つの検証ピアが含まれています。コンセンサスに達すると、検証ピアがトランザクションをコミットします。

受信してレジャーにコミットされたトランザクションによっては、参加者が後続のトランザクションを開始する場合もあります。例えば、行政機関が危険運転のイベントを受信した場合、運転評価を下げるためのトランザクションを開始するなどです。

スマート・コントラクトのスキーマ

スマート・コントラクトは、センサーと Driver Behavior サービスから受け取ったデータを処理します。以下のコード・リストに、トランザクションのすべてのイベントを処理するためにデモ・アプリケーション内で使用しているサンプル・スキーマを記載します。このスキーマは、Advanced IoT の Trade Lane サンプルに基づいています。

リスト 3. トランザクションのすべてのイベントを処理するために使用しているサンプル・スキーマ
"state": {
	            "type": "object",
	            "description": "A set of properties that constitute a complete asset state. Includes event properties and any other calculated properties such as compliance related alerts.",
	            "properties": {
	                "assetID": {
	                    "$ref": "#/definitions/assetID"
	                },
	                "vehicleID": {
	                		"$ref": "#/definitions/vehicleID"
	                },
	                "timestamp": {
	                    "type": "string",
	                    "description": "Event timestamp."
	                },
	                "lastKnownLocation": {
	                    "$ref": "#/definitions/geo"
	                },
	                "extension": {
	                    "type": "object",
	                    "description": "Application-managed state. Opaque to contract.",
	                    "properties": {
	                   		"authorityRating": {
	                    		"$ref": "#/definitions/rating"
	                    	},
	                   		"insurerRating": {
	                    		"$ref": "#/definitions/rating"
	                    	},
	                    	"lastTrip": {
	                    		"$ref": "#/definitions/trip"
	                    	}
	                    }
	                },
	                "txntimestamp": {
	                    "type": "string",
	                    "description": "Transaction timestamp matching that in the blockchain."
	                },
	                "txnuuid": {
	                    "type": "string",
	                    "description": "Transaction UUID matching that in the blockchain."
	                },
	                "compliant": {
	                    "type": "boolean",
	                    "description": "A contract-specific indication that this asset is compliant."
	                },
	                "alerts": {
	                    "$ref": "#/definitions/alertStatus"
	                },
	                "lastEvent": {
	                    "$ref": "#/definitions/eventWithFunction"
	                }
	            }
	        }

クライアント・アプリケーションを開発する

ブロックチェーンとやりとりし、データのクエリーを実行するサンプル・クライアント Web アプリケーションは、Bluemix Node.js SDK を使用して開発しました。このクライアント・アプリケーションが、ブロックチェーンに対してクエリーを実行して、資産とトランザクションの詳細を表示します。また、運転挙動の評価を得るために、シミュレーション・データをトリガーします。そのデータが Watson IoT Platform へ送信され、そこからドライバー分析サービスへ送信されることになります。

Blockchain REST API 呼び出しの構成

以下に、REST API 呼び出しによって共通して使用される構成を記載します。この構成で設定しているのは、接続先のピア、API 呼び出しの認証に使用するユーザー ID とシークレット、および呼び出しの引き数です。

リスト 4. Blockchain REST API 呼び出しの構成
var config = {
		host: "<peer id>-vp0.us.blockchain.ibm.com", 
		port: "5003", 
		secure_context: "<user id>", 
		enroll_secret: "<enroll secret>",
		protocol: "https",
		debug_mode: true,
		chaincodeURL: "<peer id>-vp0.us.blockchain.ibm.com:5003/chaincode",
		name: blk_chaincode,
		path: blk_chaincode,
		messageId: "",
		contract_version: "1.0",
		timeout: 3000,
		template: {
				"jsonrpc": "2.0",
				"method": "{{method}}",
				"params": {
					"type": 1,
					"chaincodeID":{
						"name":"mycc",
					},
					"ctorMsg": {
						"function":"{{function}}",
						"args":[],
					},
					"secureContext": "<user id>",
				},
				"id": 0
			},
	};

以降のセクションで、デモ・アプリケーションを実装する方法をステップ・バイ・ステップで説明します。また、コード・スニペットに、IBM Blockchain REST API を使用して資産を登録する方法、資産のデータを更新する方法、ブロックチェーンに対して現在および過去の資産データのクエリーを実行する方法を具体的に示します。

1a. 資産を登録する

ユーザーはまず、所有する自動車を資産として登録します。図 5 に、デモ・アプリケーションでサポートしている資産の詳細を示します。

図 5. デモ・アプリケーションでの資産の詳細
デモ・アプリケーションでの資産の詳細を示すスクリーンショット
デモ・アプリケーションでの資産の詳細を示すスクリーンショット

1b. 新しい資産を作成する

新しい資産を作成するために使用するブロックチェーン・メソッドは、createAsset() です。また、このデモの自動車リポジトリーとして、Cloudant データベースを使用します。対応する資産がブロックチェーン内で作成されると、自動車がデータベースに挿入されます。

リスト 5. createAsset()
// Prepare the rest body for createAsset
createBody.method = 'invoke';
createBody.params.ctorMsg.function = 'createAsset';
createBody.params.ctorMsg.args = ["{\"assetID\":\""+ input_vin +"\",\"ownerName\":\""+ input_ownerName +"\",\"createDate\":\""+ v_createdt +"\",\"numberPlate\":\""+ input_numberPlate +"\"}"];
	
// Call blockchain createAsset function using rest api
https.request(options, function(res4) {
	  res4.setEncoding('utf8');
	  res4.on('data', function (chunk) {
	    console.log('BODY: ' + chunk);
	  });
	
// Prepare the vehicle JSON structure for inserting into Cloudant
var vehicle = {
		vin: input_vin,
		owner: input_ownerName,
		number: input_numberPlate,
		status: 'active',
		createDate: v_createdt
	};
var v_id = input_vin + ' - ' + input_numberPlate;

// Insert the vehicle into Cloudant
db.insert(vehicle, v_id, function(err, body, header) {
    if (err) {
      return console.log(v_id + ' -- [insert] ', err.message);
    }
  });

}).end(JSON.stringify(createBody));

これで、資産を追跡するための準備は完了です。ステップ 2 では、IoTデータを収集して拡充する方法を説明します。

2a. 登録済み自動車のシミュレーション・データを送信する

自動者を登録した後は、車載センサーのデータを送信する必要があります。ここではデバイス・シミュレーターを使用して、自動車のプローブ・データを Watson IoT Platform に送信します。シミュレーターによる自動車運転データについては、デバイス・シミュレーターのコードを参照してください。

以下のコード・スニペットに、データを Watson IoT Platform に送信する方法を示します。

リスト 6. Watson IoT Platform へのデータの送信
deviceClient.connect();
deviceClient.on('connect', function(){

if(iotDeviceConnectionStatus == false) {
 	iotDeviceConnectionStatus = true;	
     var i=0;
     console.log("connected");
     var IOTSent = setInterval(function sendIOTData() {
        if (i >= totalcount)
        {	
                deviceClient.disconnect();
                iotDeviceConnectionStatus = false;
                selectedVehicle.sim_status_id="1";
                iotDataSent = true;
                clearInterval(IOTSent);
                return;
        }
        datatopublish.d = carprobesampledata[i];
        i++;
	   processingStatus = "Capturing car data "+i+"/"+totalcount;
        console.log(processingStatus);
	   var driveTimestamp = new Date().toISOString();
        datatopublish.d.timestamp = drivedate + driveTimestamp.substr(10,driveTimestamp.length);
        datatopublish.d.trip_id = assetid+moment(new Date()).format('DD');
        datatopublish.ts = drivedate + moment(new Date()).format('THH:mm:ss.SSSZZ');
      
        deviceClient.publish('load', 'json', JSON.stringify(datatopublish), 0);
    	},delay*800);
    	console.log("End of on connect..");
    }
});

2b. IoT Platform によってロー・センサー・データが受信された後、そのデータを Context Mapping サービスのデータで拡充する

前に説明したカスタム Node-RED フローは、IoT Platform イベントを listen し、IoT Platform からセンサー・データを受信します。このフローは、Context Mapping サービスを呼び出してデータを拡充するように実装されています。

2c. 拡充されたデータをドライバー分析サービスに送信する

データが拡充された後、Node-RED フローはそのデータをドライバー分析サービスに送信して保管します。

次に必要となるのは、データの分析を調整して、ブロックチェーン資産内で分析結果を更新することです。このチュートリアルでは、データ分析の調整をフロントエンドのシミュレーター・デモ・アプリケーションによって行います。

3a. データ・セットがドライバー分析サービス内で利用できるようになった後、データの分析をトリガーする

ユーザーは更新されたステータスを UI 内で確認しつづける必要があります。

ドライバー分析サービスのジョブ実行依頼 API (POST) URL は以下のとおりです。

https://automotive.internetofthings.ibmcloud.com/driverinsights/jobcontrol/job?tenant_id=yourtenantid&from= dateoftravel&to=dateoftravel

Authorization Basic userid:secretkey

基本認証のユーザー ID とシークレット・キーは、Bluemix アプリケーションに関連付けた Driver Behavior サービスから提供されます。以下のコードでは、「from」日付より後の「to」日付を指定することで、1 つのバッチ内で複数の日付を分析することもできます。

リスト 7. 「to」日付と「from」日付
var new_event_date = moment(selectedVehicle.lastEventDate, 'DD-MMM-YYYY').add(1, 'days').format('YYYY-MM-DD');
path_str = "&from=" + new_event_date + "&to=" + new_event_date;
console.log(path_str);
driver_path_post =
“https://automotive.internetofthings.ibmcloud.com/driverinsights/jobcontrol/job?tenant_id=<tenant_id>”+
path_str;
    request(
    {
		url : driver_path_post,
		method : 'POST',
		headers : {
            "Authorization" : auth,
            "content-Type" : 'application/x-www-form-urlencoded'
        }
     },
     function (error, response, body) {
	    	var jsonbody = JSON.parse(body);
        	selectedVehicle.job_id = jsonbody.job_id;
        	selectedVehicle.sim_status_id = "2";
        	selectedVehicle.sim_status_desc = "Driver analysis in progress. This might take couple of minutes. Job id = " + jsonbody.job_id;
          res7.render('index', { title : 'Home', moment: moment, selectedVehicle : selectedVehicle, vehicleList : db_vehicle_list, sim_triggered : 'true'});
	});

上記のコードによって、以下のような JSON フォーマットの job_id が返されます。

    {
        "job_id": "4f9b70ef-6bcd-4a21-b311-e57ba9729a3d"
    }

この job_id が返されたら、ドライバー分析が完了するまで待ちます。サンプル・データの場合、分析完了するまでに約 1 分かかります。

ジョブ・ステータス API (GET) URL は以下のとおりです。

https://automotive.internetofthings.ibmcloud.com/driverinsights/drbresult/tripSummaryList?tenant_id=yourtenantid&job_id=yourjobid

以下のコード・スニペットに、ジョブ・ステータス API を呼び出す方法が示されています。

リスト 8. ジョブ・ステータス API
path_str = "&job_id=" + selectedVehicle.job_id;
driver_path_get =
“https://automotive.internetofthings.ibmcloud.com/driverinsights/jobcontrol/job?tenant_id=<tenant_id>”
+ path_str;
    request(
        {
            url : driver_path_get,
            method : 'GET',
            headers : {
                "Authorization" : auth,
                "content-Type" : 'application/x-www-form-urlencoded'
            }
        },
        function (error, response, body) {
        	var jbody_1 = JSON.parse(body);
        	var sim_stat = jbody_1["job_status"];
        	console.log("job status - " + sim_stat);
        	if(sim_stat=="SUCCEEDED")
        	{
	            	selectedVehicle.sim_status_id = "3";
	        	selectedVehicle.sim_status_desc = "Driver analysis is complete.. Fetching results...";
        	}	
});

この API から返される JSON には、ジョブ・ステータスが「RUNNING (実行中)」または「SUCCEEDED (成功)」として示されます。ステータスが「RUNNING (実行中)」になっている場合は、しばらく時間を空けてから同じ API をもう一度呼び出してください。

ドライバー分析結果が利用可能になったら、その生成されたデータ構造を、開発したチェーンコードで許容されるデータ構造に変換する必要があります。

簡潔さを期して、サンプル・コードではほぼ同じデータ構造を維持しているため、変換の必要はほとんどありません。

3b. ドライバー分析結果を取得する

走行の詳細をフェッチするには、ドライバー・サービス API に対して 2 つの呼び出しを行います。最初の API 呼び出しでは、テナント ID とジョブ ID を渡して、特定の走行 UUID を取得します。
https://automotive.internetofthings.ibmcloud.com/driverinsights/drbresult/tripSummaryList?tenant_id=<テナント ID>&job_id=<ジョブ ID>

次の API 呼び出しでは、前の呼び出しで取得した走行 UUID を渡して、その走行の詳細を取得します。
https://automotive.internetofthings.ibmcloud.com/driverinsights/drbresult/trip?tenant_id=<テナント ID>&trip_uuid=<走行 UUID>

ドライバーおよび保険業者の評価は、このデータ構造内で更新されます。危険運転のイベントが検出された場合は評価が下がり、イベントが検出されなかった場合、つまり安全な運転である場合は評価が上がります。

3c. 資産 ID に対する新しい資産データで資産の状態を更新するために、ブロックチェーンに対してリクエストを実行する

次は、チェーンコードの updateAsset メソッドを呼び出して、入力引数としてストリングの配列を渡します。配列の長さは 1 です。したがって、配列のゼロ番目の要素には、上記のステップで取得したデータ配列を格納します。

リスト 9. updateAsset メソッドの呼び出し
// Prepare the rest body for updateAsset
updateBody.method = 'invoke';
updateBody.params.ctorMsg.function = 'updateAsset';
updateBody.params.ctorMsg.args = ["{\"assetID\":\""+ input_vin +"\",\"lastEvent\":\""+ input_lastEvent +"\"}"];
	
// Call blockchain updateAsset function using rest api
https.request(options, function(res4) {
	  res4.setEncoding('utf8');
	  res4.on('data', function (chunk) {
	    console.log('BODY: ' + chunk);
	  });
}).end(JSON.stringify(updateBody));

4. ブロックチェーンに対して資産の状態をクエリーする

資産 ID を設定して readAsset() を呼び出し、最新の評価を取得して UI 上に表示します。

リスト 10. readAsset()
var queryBody = config.template;
queryBody.params.chaincodeID.name = blk_chaincode;
// Prepare the rest body for readAsset
queryBody.method = 'query';
queryBody.params.ctorMsg.function = 'readAsset';
queryBody.params.ctorMsg.args = [ "{\"assetID\":\""+selected_vin+"\"}"];

console.log('queryBody - ' + JSON.stringify(queryBody));
var raw_str;	
// Call blockchain readAsset function using rest api
https.request(options, function(res2) {
	  res2.setEncoding('utf8');
	  res2.on('data', function (chunk) {
	    console.log('BODY: ' + chunk);
	    raw_str+=chunk;
	    var json_str = eval('(' + chunk + ')');
	    var json_msg = eval('(' + json_str.result.message + ')');
	    selectedVehicle.assetID = json_msg.assetID;
	    selectedVehicle.createDate = json_msg.createDate;
	    selectedVehicle.ownerName = json_msg.ownerName;
	    selectedVehicle.numberPlate = json_msg.numberPlate;
	    selectedVehicle.lastEventDate = moment(new Date(json_msg.txntimestamp)).format('DD-MMM-YYYY');
	  });
	}).end(JSON.stringify(queryBody));

ブロックチェーンに対して資産状態の履歴をクエリーする

以下のコード・スニペットに示されているように、履歴データを取得するにはチェーンコードの readAssetHistory() メソッドを呼び出します。履歴データを使用して、自動車の過去の走行を一覧表示したり、緯度と経度に従って地図上に走行を示したりできます。

リスト 11. 履歴データの取得
queryBody.method = 'query';
queryBody.params.ctorMsg.function = 'readAssetHistory';
queryBody.params.ctorMsg.args = [ "{\"assetID\":\""+selectedVehicle.assetID+"\"}"];
 
// Call blockchain readAsset function using rest api
https.request(options, function(res2) {
      res2.setEncoding('utf8');
      res2.on('data', function (chunk) {
        console.log('BODY: ' + chunk);
        var jbody_1 = JSON.parse(chunk);
        var json_msg = jbody_1[0].result.message;
      });
    }).end(JSON.stringify(queryBody));

まとめ

このチュートリアル (およびサンプル・コード) から明らかなように、IBM Blockchain サービス・インスタンスを統合すれば、コグニティブ IoT アプリケーションを比較的簡単に、しかも迅速に構築できます。IoT センサーからのデータを分析し、ブロックチェーンのスマート・コントラクトにデータを取り込んでルールを実行することでトランザクションを完了し、そのトランザクションをすべての参加ピアが検証して合意することができます。

このアプリケーションは、他にもコグニティブ・サービスを追加して拡張することができます。例えば、走行中の気象データや、場所に応じた交通規制を統合するコグニティブ・サービスを追加すれば、ドライバーがさまざまな状況でどのように反応するかを分析できます。また、デモ・アプリケーションと同様のソリューションを使用して、トレーニングのシナリオにおける新米ドライバーのパフォーマンスを分析することも可能です。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Cloud computing
ArticleID=1050530
ArticleTitle=コグニティブ IoT アプリケーション対応のブロックチェーンを実装する、第 2 回: 車載センサーのデータを使用して Blockchain 内でスマート・トランザクションを実行する
publish-date=10052017