SORACOM Developers

Documents

SORACOM Air メタデータサービスでIMSI情報を取得し、Microsoft Azure「Event Hub」と接続する

はじめに

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

SORACOM Funnel もご利用いただけます
  • Event Hubsにデータをセキュアに送信する方法としては本稿で紹介している方法のほかに、 SORACOM Funnel をご利用いただくことで、より簡単に実装することができます。併せてご検討ください。

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

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

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

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

メタデータサービスを使用してIMSI情報を取得

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

取得したIMSI情報とセンサー情報を、Event Hubに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

送られてきたデータを単位時間のデータとして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 で確認することができました。

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

当ガイドは、kekekekentaさんの許可のもと、以下のエントリーを元に作成しています。 http://kentablog.cluscore.com/2015/10/soracomazureiot.html

kekekekentaさん、ありがとうございました。

pagetop