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

今回はチュートリアルAzure IoT Hub からのデバイスの制御に関するクイック スタート (Python) | Microsoft Docsに沿って、使い方を解説します。

環境について

今回利用したのは以下の環境です。母艦はRaspberry Piへ指令を送るのに使います。ただし、macOSではSSLのエラーが出てしまいましたので、今回はLinux(Ubuntu)を使いました。

  • Raspberry Pi
  • Python3.5
  • 母艦(デスクトップやサーバ)

Raspberry Pi側のセットアップ

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

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

これで準備完了です。

母艦側のセットアップ

母艦側でもPython3を使っています。ライブラリをインストールします。

pip install azure-iothub-service-client future

これで準備完了です。

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

ではここから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からはじまる文字列を使いますのでメモしておきます。

さらにデバイス制御用の接続文字列を出力します。

az iot hub show-connection-string --hub-name YourIoTHubName --output table

こちらも HostName={YourIoTHubName}.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey={YourSharedAccessKey} といった文字列が出ますので、メモしておきます。

Pythonのコードについて

ではここからPythonのコードについて解説します。コードはチュートリアルのものを抜粋して利用しています。

Raspberry Pi側

ライブラリのインポート

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

import time
import sys
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="

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

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

client = IoTHubClient(CONNECTION_STRING, IoTHubTransportProvider.MQTT)

コールバックを設定する

母艦側からイベントが送られてきた時のコールバックを指定します。

client.set_device_method_callback(
    device_method_callback, None)

コールバックの内容

device_method_callbackはメソッド名、ペイロード、コンテクストが送られてきます。メソッド名に応じて処理分けし、サーバから送られてきたペイロードを使って処理を行います。

def device_method_callback(method_name, payload, user_context):
    print ( "\nMethod callback called with:\nmethodName = %s\npayload = %s" % (method_name, payload) )
    device_method_return_value = DeviceMethodReturnValue()
    if method_name == "SetTelemetryInterval":
        # SetTelemetryIntervalの実装
        device_method_return_value.response = "{ \"Response\": \"Executed direct method %s\" }" % method_name
        device_method_return_value.status = 200
    else:
        # 他のメソッドを呼んだ場合
        device_method_return_value.response = "{ \"Response\": \"Direct method not defined: %s\" }" % method_name
        device_method_return_value.status = 404
    return device_method_return_value

母艦側

ライブラリのインポート

必要なライブラリをインポートします。

import sys
import iothub_service_client
from iothub_service_client import IoTHubDeviceMethod, IoTHubError
from builtins import input

定数の定義

次に定数を定義します。特に大事なのは CONNECTION_STRING で、先ほどAzure Cloud Shellで出力したものを指定します。Raspberry Piに設定したものとは異なるので注意してください。

CONNECTION_STRING = "HostName=isaax-iot-hub.azure-devices.net;DeviceId=MyPythonDevice;SharedAccessKey=D6J...cI="

メソッドの作成

CONNECTION_STRING を’使ってAzure IoT Hubのデバイスメソッドを作成します。

iothub_device_method = IoTHubDeviceMethod(CONNECTION_STRING)

メソッドの実行

作成したデバイスメソッドの invoke メソッドを実行します。これで処理がRaspberry Piに送信され、処理結果を受け取れます。

DEVICE_ID = "MyPythonDevice"
METHOD_NAME = "SetTelemetryInterval"
METHOD_PAYLOAD = "10"
TIMEOUT = 60

response = iothub_device_method.invoke(DEVICE_ID, METHOD_NAME, METHOD_PAYLOAD, TIMEOUT)

処理結果は response.statusresponse.payload で確認できます。

Device Method called
Device Method name       : SetTelemetryInterval
Device Method payload    : 10

Response status          : 200
Response payload         : {"Response":"Executed direct method SetTelemetryInterval"}
Press Enter to continue...

IoTデバイス側でもメソッドを呼ばれたのをログとして残せます。

Method callback called with:
methodName = SetTelemetryInterval
payload = 10

このようにしてAzure IoT Hubを介してIoTデバイスと母艦とを接続できます。システムアップデートをダイナミックに行ったり、不定期でデータを取得するなど様々な場面で利用できるでしょう。

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

IoT Hub | Microsoft Azure

おわりに

Raspberry Pi を使ってAzureやAWSと組み合わせてIoTシステムの構築を学習したい方はぜひIoTエンジニア養成キットで学習してみてください。


0 Comments

Leave a Reply

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