#chiroito ’s blog

Java を中心とした趣味の技術について

電車情報を使ったIoTリアルタイムストリーム処理

この記事はOracle Cloud Advent Calendar 2018 - Adventar」の12月22日の記事として書かれています。

今回やること

これまで仕事で散々 IoT やストリーム処理をしてきたので簡単に作ってみたいと思います。

作ってみたシステムは下図のように東京メトロさんの電車を GoogleMap に表示して、電車が今どこを走っているのかを見られるようにしてみましょう。

f:id:chiroito:20181223004925p:plain

今回、このシステムで使用する情報は電車の情報、駅の情報、路線の情報、行き先の情報です。電車の情報には、電車がどの駅とどの駅の間を走っているか、またどの駅に止まっているかが含まれていますが、電車が今いる座標は分かりません。電車から得られた情報をただ単に表示するだけでは芸が無いので、複数の情報を結合してみます。

システムの構成

システムの全体像は以下のとおりです。今回のシステムはOracleクラウドサービスである Oracle Cloud を使用して開発しています。左側がデバイスからのデータが投入される入口で、右側はユーザが情報を見る入口になります。

f:id:chiroito:20181223005552p:plain

OracleOSS

システムの全体像を見ていただくと、OSSが目に入ると思います。Oracle は昔からたくさんの OSS やそのコミュニティに対してスポンサーやコントリビュートをしており、Oracle Cloud が提供しているサービスの大半はこれらの OSS をベースにエンタープライズレベルでも使用可能なクラウドサービスを開発しています。

Data Source Layer

今回のシステムでは、電車の情報を自分のシステムに投入してもらうのは無理なので、東京メトロさんが公開している API から電車の情報を取って自分のシステムに投げるアプリを作っています(App1)。このアプリケーションは Kubernates のクラウドサービスである Oracle Container for Kubernates 上で動かします。

Ingestion Layer, Speed Layer, Storage Layer

電車の情報は、Kafka のクラウドサービスである Oracle Event Hub によって受け取ります。受け取った情報は、Hadoopクラウドサービスである Oracle Big Data Cloud Service - Compute Edtion 上で動いている Apache Spark のアプリケーションが処理します(App2) 。このアプリケーションは、電車がどの駅間を走っているかと各駅の座標情報から電車の座標を算出しています。今回は出発した駅と向かっている駅の中間点を算出してます。算出された情報は Oracle Coherence がベースとなっている Java Cloud Service 上に保存します。

このアプリケーションは GUI で Spark アプリケーションを開発できる Oracle Stream Analytics (OSA)を使って開発しました(後述)。OSAを使って開発することで、データのキャッシュや永続化などを自動的にインメモリ分散データキャッシュである Oracle Coherence へ格納・読み込みできるようになりエンタープライズなどで要求される高速なデータアクセスなどが可能となります。

Serving Layer, Visualization Layer

最後に電車を表示する側です。 Google Map のアプリケーションは定期的に電車の情報を取得して、得られた電車の情報を表示します。このアプリケーションの取得先として、時間を指定するとその時間に走っていた全ての電車の情報を先ほどの Oracle Coherence へ取りにいくアプリケーションがあります(App3)。このアプリケーションも Kubernates のクラウドサービスである Oracle Container for Kubernates 上で動きます。

Speed Layer の詳細

Spark アプリケーションの開発は Oracle Stream Analytics (OSA)を使って開発します。OSAでは、下図のような GUI を使って開発します。

f:id:chiroito:20181223011407p:plain

この図では、入力となる電車の生データに「丸ノ内線や銀座線」などの路線の情報、「荻窪行きや渋谷行き」などの行き先の情報、「西新宿駅外苑前駅の座標情報」などの駅情報を結合していきます。これらの情報は1度目はRDBMS である Exadata ベースの Autonomous Transaction Processing から読込まれますが、2度目からは Oracle Coherence から高速に読込まれます。

この例では、結合された情報を使って「稼働中の電車数」「各電車の座標」「遅延している電車数」を算出しています。これらの中で、「各電車の座標」を Oracle Coherence へ格納し、JavaScript のアプリケーションから App3 経由で情報を取りだしてGoogle Map 上に表示しています。

Oracle Cloud Infrastructure でインターネットからの通信を許可する

この記事は「Oracle Cloud その2 Advent Calendar 2018」の12月10日の記事として書かれています。

セキュリティ・リストで入力方向の通信を設定をします。

変更することは滅多に無いものの、設定画面までの遷移が非常に長いのでいざ変更しようと思うと大変です。

まずはじめに、Oracle Cloud InfrastructureのMENUからNetworking - Virtual Cloud Networksを選択します。

f:id:chiroito:20181201193744p:plain
OCI Top

次に、Virtual Cloud Network (VCN)一覧画面で、任意のVCNを選ぶと選んだVCNの詳細ページへ遷移します。

最後に、左下にあるResources内にある Security Lists を選択すると、右側にセキュリティ・リストの一覧が表示されるため、任意のセキュリティリストを選択します。

セキュリティ・リストの下の方に、クラウドへ入力方向の通信で許可する一覧が表示されます。 デフォルトでは SSH (TCP:22) と ICMP のうち限定された通信だけを許可します。

f:id:chiroito:20181201194354p:plain
Security List - Ingress Rules

ここにインターネットからTCP:9080への通信を許可するようにします。

同じ画面の↑の方にある Edit All Rulesを選択します。

f:id:chiroito:20181201194708p:plain
Security List

Edit Security List Rule のダイアログが表示されます。既に設定されているルールの下側に + Another Ingress Rule というボタンを選択し、新しいルールを入力できるようにします。

f:id:chiroito:20181201194814p:plain
Edit All Rules

ボタンを押すと、新しく 4 番目のルールの入力フォームが追加されます。以下のように全てのIP(0.0.0.0/0)からTCP:9080への通信を許可します。 入力完了後は一番下にある Save Security List Rules を選択します。

f:id:chiroito:20181201194844p:plain
Another Ingress Rule

追加した内容が以下のように一覧に反映されます。

f:id:chiroito:20181201194907p:plain
Security List

Oracle Digital Assistant のチャットボットのフロントエンドを Facebook Messanger にしてみた

チャットボットを使ったシステムでは、フロントエンドのインターフェースとしてユーザが使い慣れた Facebook Messanger や LINE をインターフェースとして使うことが多いです。

Oracle Degital Assistant は様々なメッセージアプリをフロントエンドとして使うことができます。今回は Facebook Messenger をフロントエンドとして使うまでの流れを以下の流れで紹介します。

Oracle Digital Assistant の設定には Facebook の以下 2 つが必要です。

  • APP Secret
  • Page Access Token

Facebook のアプリおよびページを作成すると上記が取得できます。

Facebook の設定には Oracle Digital Assistant の以下 2 つが必要です。

  • Verify Token
  • Webhook URL

これらは Digital Assistant の設定をすると取得できます。

そのため構築までの流れは Facebook -> Digital Assistant -> Facebook の流れで構築していきます。Digital Assistant の設定は少しだけで、流れのほとんどは Facebook になります。

チャットボットは、Digital Assistant のサンプルである挨拶ボットを使用します。

Facebook の App ID とページを作成

まずは、Facebook の開発者用ページでアプリケーションを作成します。以下のリンクから遷移します。 developers.facebook.com

右上にある My Apps をクリックして、新しいアプリを追加(Add New App)から作成していきます。 f:id:chiroito:20181204165803p:plain

ダイアログが表示されるので、表示名と連絡先メールアドレスを入力して作成します。 f:id:chiroito:20181204165815p:plain

App が作成されたら App Secret を取得します。 左側のメニューにある Settings の Basic を選択すると、App Secret などの情報が表示されます。ページを開いた時点ではApp Secretは非表示状態なので、「Show」ボタンを押すと表示されます。この情報が必要ですのでメモしましょう。 f:id:chiroito:20181204165833p:plain

次に、ページを作成します。左側のメニューで Settings - Advanced から Create New Page ボタンを押して作成します。 f:id:chiroito:20181204165836p:plain

要件によって作るページが違うようです。(※どう使い分けるのかが分からないです・・・)個人で試す場合は右側の「コミュニティまたは著名人」でいけました。あとは流れに沿っていくとページを作成できます。 f:id:chiroito:20181204165921p:plain

Messenger をアプリに追加します。左側のメニューでDashboardを選択すると右側は縦長の画面が表示されます。画面の下側にある Add a Product の中から Messenger を選んで Set Up を選択します。 f:id:chiroito:20181204165954p:plain

Page Access Token を取得します。 左側のメニューに Messenger が追加されますので、Settings を選択肢、Page のドロップダウンリストで先ほど作成したページを選択します。右側に Page Access Token が表示されるので、メモしましょう。 f:id:chiroito:20181204170006p:plain

Oracle Degital AssistantへFacebookの情報を設定

Facebook の設定で取得した App Secret と Page Access Token を使って Oracle Digital Assistant を設定します。まずは、Facebook Messenger 用の Channel を作成します。左側のメニューの Settings を選択し、次に Channels タブを選択すると下の画面が表示されます。 + Channel ボタンを選択して、チャネル追加ダイアログを表示します。

f:id:chiroito:20181204170057p:plain

Create Channel ダイアログでは、NameDescription は任意の文字列を入力し、Channel TypeFacebook Messengerを選択します。Page Access TokenApp Secret は Facebook から取得した物を入力します。最後に Channel EnabledEnable にして Create ボタンを選択します。

f:id:chiroito:20181204170128p:plain

Facebook に設定する Verify TokenWebhook URL を取得します。先ほど作成したチャネルを選択すると、チャネルの詳細が右側に表示されます。その中に、Verify TokenWebhook URL があるため、メモします。 f:id:chiroito:20181204170149p:plain

Facebook の webhookへ Oracle Digital Assistant の情報を設定

Oracle Digital Assistant の設定で取得した Verify TokenWebhook URL を使って Facebook を設定します。左側のメニューから Messenger - Settings を選択し、Webhooks の右側にある Setup Webhooksボタンを選択するとNew Page Subscriptionダイアログが表示されます。 f:id:chiroito:20181204170213p:plain

New Page Subscriptionダイアログでは、Oracle Digital Assistant で取得したVerify Token を設定し、Callback URL へWebhook URLを設定します。Subscription Fieldsmessagesmessaging_postbacksを選択してVerify and Saveを選択します。 f:id:chiroito:20181204170258p:plain

Webhook の設定が終わったら、以前作ったページを指定して Subscribe します。以上で設定は完了です。 f:id:chiroito:20181204170311p:plain

Facebook Messanger を使って動作確認

動作確認は Facebook からできます。メッセージの検索などからページを検索し、対象のページが見つかったら選択します。 f:id:chiroito:20181204170324p:plain

あとはメッセージを入力すると、チャットボットを介して結果を表示してくれます。 f:id:chiroito:20181204170334p:plain