環境について
今回利用したのは以下の環境です。
- 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を使うことでデータ活用を効率化してください。
]]>