Azure IoT HubはIoTデバイスからのデータをクラウドへ簡単に取り込めるサービスとなっています。Azureのサービスなので、他のAzureの機能と組み合わせるのも簡単です。今回はチュートリアルAzure IoT Hub への利用統計情報の送信に関するクイック スタート (Python) | Microsoft Docsに沿って、使い方を解説します。

環境について

今回利用したのは以下の環境です。

  • Raspberry Pi
  • Python3.5

必要なライブラリのインストール

Raspberry Piに入っているデフォルトのPython3.5ではpipが入っていませんのでインストールします。

$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python3 get-pip.py 
$ sudo python3 get-pip.py

libboostも必要なのでインストールします。

$ sudo apt-get update
$ sudo apt-get install libboost-python-dev

これで準備完了です。

クラウドにデータをアップロードする

ではここからAzure IoT Hubにデータをアップロードする手順を紹介します。

リソースを作成する

最初にAzure Portalにログインします。Azureのアカウントが必要です。ログインしたら、左にあるリソースの作成をクリックします。

次にモノのインターネット(IoT)をクリックして、さらにIoT Hubをクリックします。

出てきたフォームを入力します(無料で開始する、というボタンが出る場合にはアカウント登録を行ってください)。リソースグループがない場合は新規作成します。IoT Hub Nameは適当に自分で分かりやすいものを入力してください。

確認が出ますので、問題なければ Create ボタンを押します。

デプロイが実行されます。しばらく待つと完了します。

Azure Cloud Shellと組み合わせる

続いてクラウド側に用意されたシェル Azure Cloud Shell で処理を行います。まずIoT Hub用の機能拡張をインストールします。

az extension add --name azure-cli-iot-ext

次にデバイスを作成します。 YourIoTHubName は先ほど作成したリソース名、 MyPythonDevice は任意の名前を指定します。

az iot hub device-identity create --hub-name YourIoTHubName --device-id MyPythonDevice

登録したら、そのデバイスが使う接続情報を取得します。

az iot hub device-identity show-connection-string --hub-name YourIoTHubName --device-id MyPythonDevice --output table

上記のように実行すると、以下のように結果が返ってきます。

Cs
-------------------------------------------------------------------------------------------------------------------------------------
HostName=isaax-iot-hub.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=P41...YWk=

このHostNameからはじまる文字列を使いますのでメモしておきます。

Pythonのコードについて

ではここからPythonのコードについて解説します。コードはチュートリアルのものを抜粋して利用しており、CPUの温度をAzure IoT Hubにアップロードします。

ライブラリのインポート

必要なライブラリをインポートします。iothub_clientがAzure IoT Hubのライブラリです。

import time
import sys
import subprocess
import re
import iothub_client
from iothub_client import IoTHubClient, IoTHubClientError, IoTHubTransportProvider, IoTHubClientResult
from iothub_client import IoTHubMessage, IoTHubMessageDispositionResult, IoTHubError, DeviceMethodReturnValue

定数の定義

次に定数を定義します。特に大事なのは CONNECTION_STRING で、先ほどAzure Cloud Shellで出力したものを指定します。

CONNECTION_STRING = "HostName=isaax-iot-hub.azure-devices.net;DeviceId=MyPythonDevice;SharedAccessKey=D6J...cI="
PROTOCOL = IoTHubTransportProvider.MQTT
MESSAGE_TIMEOUT = 10000
MSG_TXT = "{\"temperature\": %s}"

Azure IoT Hubクライアントの作成

まずAzure IoT Hubを利用するためのクライアントを作成します。

client = IoTHubClient(CONNECTION_STRING, PROTOCOL)

CPUの温度を取得する

次にCPUの温度を取得します。これは vcgencmd measure_temp を実行し、その結果から数値の部分を取り出しているだけです。

res = subprocess.check_output(['vcgencmd', 'measure_temp'])
temperature = re.search("[0-9\.]+", str(res)).group(0)
msg_txt_formatted = MSG_TXT % (temperature)
message = IoTHubMessage(msg_txt_formatted)

Azure IoT Hubにメッセージを送信する

後はAzure IoT Hubにメッセージを送信するだけです。 send_confirmation_callback はメッセージ送信を行った際のコールバックになります。

def send_confirmation_callback(message, result, user_context):
    print ( "IoT Hub responded to message with status: %s" % (result) )

client.send_event_async(message, send_confirmation_callback, None)

実行する

この処理を実行すると、以下のようにログが流れます。メッセージの送信とAzure IoT Hubからのレスポンスが出力されます。ネットワーク処理は非同期なので、必ず交互に出るとは限りません。

$ python SimulatedDevice.py 
Sending message: {"temperature": 56.4}
Sending message: {"temperature": 55.3}
IoT Hub responded to message with status: OK

Azure IoT Hubで確認する

これでデータはAzure IoT Hubに飛んでいる状態ですが、以下のコマンドをAzure Cloud Shellで実行することで、閲覧できるようになります。 YourIoTHubName は作成したAzure IoT Hubリソースの名前に書き換えてください。

az iot hub monitor-events --device-id MyPythonDevice --hub-name YourIoTHubName

そうするとデバイスからの出力がAzure Cloud Shell上に出力されるはずです。

まとめ

このようにしてAzure IoT HubとIoTデバイスとを接続できます。データがクラウド側に入ってくれば、後はデータを保存したり別なサービスと組み合わせて加工するのも難しくないでしょう。

isaaxを使うことでIoT開発は高速化、スムーズになります。さらにAzure IoT Hubを使うことでデータ活用を効率化してください。

IoT Hub | Microsoft Azure


1 Comment

Azure IoT HubでRaspberry Piを試してみよう(デバイスを制御する) – Isaax Camp · 2019-06-01 at 11:53

[…] Azure IoT HubはIoTデバイスからのデータをクラウドへ簡単に取り込めるサービスとなっています。Azureのサービスなので、他のAzureの機能と組み合わせるのも簡単です。 […]

Leave a Reply

Your email address will not be published. Required fields are marked *