MENU
はじめに
Getting Started
ユーザーコンソールの操作
さまざまな機能の使い方
トラブルシューティングとサポート
リファレンス

Soracom

Users

メタデータサービスで IMSI 情報を取得し Microsoft Azure Event Hubs と接続する

はじめに

SORACOM Air メタデータサービス(以降、メタデータサービス) を使用して、Microsoft Azure の Event Hubs と連携します。Raspberry PI に接続されたセンサー情報を Power BI で分析することを想定しています。

当ガイドは、 kekekekenta さんの許可のもと ケンタテクブロ: SORACOM と Azure で IoT をやってみた (Event Hub 編) を元に作成しています。kekekekenta さん、ありがとうございました。
SORACOM Funnel もご利用いただけます
Event Hubs にデータをセキュアに送信する方法としては本稿で紹介している方法のほかに、 SORACOM Funnel をご利用いただくことで、より簡単に実装できます。併せてご検討ください。

Raspberry PI のセンサー情報は SORACOM を経由して Microsoft Azure に送られた後、データ整形されて Power BI に送られます。

以下のような流れとなります。

  1. メタデータサービスを使用して IMSI 情報を取得
  2. 取得した IMSI 情報とセンサー情報を、Event Hub に JSON フォーマットで送信
  3. 送られてきたデータを単位時間のデータとして Power BI で利用

IMSI 情報を含めて、サーバー(Event Hubs)に送信することで、サーバー側では、デバイスを特定することが可能となります。 デバイス識別を認識するために、メタデータサービスを使用します。

ステップ 1: メタデータサービスを使用して IMSI 情報を取得

メタデータサービスを使用すると、簡単に IMSI 情報が取得できます。 IoT SIM を使用しているデバイス(Raspberry PI)から以下のコマンドを実行すると、以下のように JSON 形式で、IoT SIM の IMSI、名前、タグ、速度クラスなど、IoT SIM の情報を取得できます。

$ curl -s http://metadata.soracom.io/v1/subscriber
{"imsi":"44010XXXXXXXXXX","msisdn":"81XXXXXXXXXX","ipAddress":"10.XXX.XXX.XX","apn":"soracom.io","type":"s1.standard","groupId":"XXXXXXXXXXXXXXXXXXXXXXXXXX","createdAt":1444126013510,"lastModifiedAt":1452656126137,"expiredAt":null,"terminationEnabled":false,"status":"active","tags":{"name":"noriyuki01"},"sessionStatus":{"lastUpdatedAt":1452656126137,"imei":"XXXXXXXXXXXX","location":null,"ueIpAddress":"10.XXX.XXX.XXX","dnsServers":["100.127.0.53","100.127.1.53"],"online":true},"speedClass":"s1.standard","moduleType":"nano","plan":0,"expiryTime":null,"createdTime":1444126013510,"operatorId":"OPXXXXXXXX","lastModifiedTime":1452656126137}

API アクセス の場合、認証を行ってトークンを付与してアクセスする必要があります。 ただし、メタデータサービスの場合、トークンは付与していません。既に SIM レベルでの認証ができているので、ここでは単純に HTTP でアクセスするだけで IoT SIM の情報を取得できます。

ステップ 2: 取得した IMSI 情報とセンサー情報を Event Hubs に JSON フォーマットで送信する

次に Raspberry PI からのセンサー情報を Event Hub に送信します。Event Hub を作成した後に Raspberry PI の送信プログラムを作成します。

Event Hub の作成

Azure のポータルから Event Hub を作成します。Event Hub は Service Bus の一部となっているため、初めに Service Bus の作成から始めます。

eventhub

ポータルから Event Hub をクリックすると、Service Bus の名前空間の作成が開始されます。Type に Messaging を選択し、好きな Messaging Tier を選択します。

eventhub

次に、作成された Service Bus の名前空間から Event Hub を作成します。今回は簡易作成を選択しています。

eventhub

Event Hub が作成されたら共有アクセスポリシーの設定を行います。Raspberry PI からデータを受け取るポリシーとして SendRule を作成します。また、Stream Analytics からのアクセスポリシーとして ReceiveRule を作成ます。パーミッションは以下の通りです。

  1. SendRule: 送信
  2. ReceiveRule: 管理、送信、リッスン

設定したら、画面下の保存を忘れないようにしてください。これで Event Hub の作成は完了です。

eventhub

Raspberry PI の送信プログラム作成

Raspberry PI から Azure Event Hub にデータを送信するために、プログラムを作成します。今回の Raspberry PI は、Linux と Python を使用します。以下のように追加でパッケージなどをインストールします。

#!/bin/sh
sudo apt-get install python-pip
sudo pip install urllib3
sudo pip install azure

Python の実行環境が整いましたので、以下のようなプログラムを作成します。

プログラムの中では、15 行目の部分でメタデータサービスから IMSI 情報を取得して、その IMSI 情報を JSON 内の DeviceID として使用しています。こうすることで、Raspberry PI を出荷する際は同じイメージを用意しておいても、Azure Event Hub に送られてきたセンサーの情報を SIM の IMSI 情報で管理できるようになります。

#coding: utf-8
from azure.servicebus import ServiceBusService
import json, urllib3
import datetime

#azure service bus
key_name = 'SendRule' # SharedAccessKeyName from Azure portal
key_value = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' # SharedAccessKey from Azure portal
service_namespace = 'sora-ns'
sbs = ServiceBusService(service_namespace,
                        shared_access_key_name=key_name,
                        shared_access_key_value=key_value)

#values
url = 'http://metadata.soracom.io/v1/subscriber'
http = urllib3.PoolManager()
r = http.request('GET', url)

root = json.loads(r.data)
devid = root['imsi']
dtime = datetime.datetime.today().strftime("%F %H:%M:%S %z").strip()

#from sensors
temp = "27.4"
pres = "1000.1"
hum = "68.0"
hilux = "100.0"
lowlux = "10.0"

#json fot event hub
json = '{ "Date":"' + dtime + '", "DeviceId":"' + devid + '", "Temp":"' + temp + '", "Pressure":"' + pres + '","Hum":"' + hum + '", "HiLux":"' + hilux + '","LowLux":"' + lowlux + '" }'
sbs.send_event('sora', json)

なお、8 行目の共有アクセスキーは、Event Hub の構成ページから取得してください。

eventhub

作成したプログラムは、cron などで動かすと定期的にセンサーから取得した情報を Event Hub に送信できます。

Event Hub で受信を確認

Event Hub で受信しているデータは、Event Hub のダッシュボードで確認できます。

eventhub

ステップ 3: 送られてきたデータを単位時間のデータとして Power BI で利用する

受信したデータは Stream Analytics を使用して Event Hub からのデータ取得と、30 秒間隔の平均値計算、そして、計算された結果を Power BI に送信しています。

Stream Analytics の作成

それでは、Azure ポータルから Stream Analytics を作成します。

eventhub

作成された後は、次の順で設定を行います。始めに Input の作成、次に Output の作成、最後に Query の作成です。下図の Job Topology を順にクリックしていきます。

eventhub

Input の作成では、前に作成した Event Hub の ReceiveRule ポリシーを指定して設定を行います。なお、エイリアス名は後で説明する Stream Analytics の Query 内で使用する文字列になるので - 文字は使用しないようにしてください。入力が終わったら Create をクリックします。

eventhub

次に、Output の作成です。今回は Power BI への出力ですが、現段階ではプレビューということもあり、少しデザインの異なる旧ポータル画面からの作成となります。

eventhub

Power BI との接続が行われます。すでに Power BI のアカウントを持っている方は、組織アカウントを入力が求められます。

eventhub

Stream Analytics の Query で使用するエイリアス名と、Power BI で使用されるデータセット名、テーブル名、グループ名を設定します。こちらも、エイリアス名には - を使用しないほうが良いでしょう。

eventhub

最後に Query を設定します。今回は DeviceID をグループにして、30 秒間の平均値を生成しています。FROM で Event Hub の入力エイリアスを指定して、INTO で Power BI の出力エイリアスを指定します。

eventhub

Query は以下になります。

SELECT
    System.Timestamp as Time,
    DeviceId,
    CAST(AVG(frompis.Temp) AS float) AS Temp,
    CAST(AVG(frompis.Pressure) AS float) AS Pressure,
    CAST(AVG(frompis.Hum) AS float) AS Hum,
    CAST(AVG(frompis.HiLux) AS float) AS HiLux,
    CAST(AVG(frompis.LowLux) AS float) AS LowLux
INTO
    powerbi
FROM
    raspisensors TIMESTAMP BY Date
GROUP BY
    DeviceId,
    TumblingWindow(second, 30)

全ての設定が終わったら Start をクリックして、Stream Analytics を開始します。

eventhub

Power BI でデータの確認

Stream Analytics から送られたデータは Power BI のデータセットとして入ってきます。このデータからレポートを作成し、ダッシュボードで表示できます。

eventhub

ここまでで、Raspberry PI のセンサー情報を SORACOM を経由して Microsoft Azure に送られた後、Power BI で確認できました。

  • メタデータサービスを使用することで、HTTP でのリクエストのみで IoT SIM の情報を取得できます。デバイスによっては、IMSI の情報を取得できないものありますが、その場合でもデバイス情報をハードコードする必要がありません。同じイメージを用意しておいてもサーバー側ではデバイスを識別することが可能です。
  • Microsoft Azure を使うことで、容易に可視化までを含んだ End-to-End の IoT のシステムを構築することが可能となります。

「SORACOM Air メタデータサービスを IMSI 情報を取得し、Microsoft Azure「Event Hubs」と連携する」は以上となります。