Azure IoT Hub SDKを使用してIoT Hubに接続する

2022年12月9日掲載

キービジュアル

ご覧いただきありがとうございます。ソフトバンクの小柳です。

ソフトバンク Advent Calendar2022の9日目の記事になります。
今回は、Azure IoT HubのDevice SDKを使用して、IoT Hubへの接続を試してみたいと思います。
他クラウドの類似SDKでは接続するだけでも苦労したのですが、Azure IoT Hub SDKでは簡単に接続できるのでしょうか。

目次

Azure IoT Hubと、そのSDKとは

初めにAzure IoT Hubとは何かについて、簡単に説明します。
Azure IoT Hubは、IoTデバイスが情報をアップロードするために必要なエンドポイントを提供し、エンドポイント上でIoTデバイスの管理もできるサービスです。
他クラウドの類似製品としては、AWS IoT Platform、Alibaba Cloud IoT Platform、Google IoT Coreなどが挙げられます。

IoT Hubは接続用のエンドポイントを提供しますが、IoTデバイスをエンドポイントに接続しようとしても、IoTデバイスがエンドポイントに簡単に接続できなければ、デバイスアプリケーション開発の障壁になってしまいます。
そこで、IoT Hubに簡単に接続できるようにするために、Software Development Kit、略してSDKが提供されています。
Azure IoT Hubでは3種類のSDKがありますが、今回はIoTデバイスに実装するDevice SDKを使用します。
他のService SDKとManagement SDKは、デバイスではなくIoT Hubそのものを操作、管理するSDKです。

Device SDKを使用した今回の接続イメージ

Device SDKを使用したIoT Hubへの接続イメージ図は、以下です。
Alibaba Cloud上のECS(仮想サーバ)をIoTデバイスと見立ててDevice SDKを導入し、Azure IoT Hubに接続できるかを試します。
Device SDKのプログラミング言語はC言語、ECSのOSはUbuntu 20.04とAlibaba Cloud Linux 3.2104の2つのOSで試しました。

2つのOSで試した理由は、デバイスから送信された情報がAzure IoTエクスプローラーで見られなかったため、問題切り分けの一環として2つのOSで試しました。
結果として、Azure PortalではどちらのOSからもデータが送信できていることは確認できたので、OSによる違いではなくAzure IoTエクスプローラーに問題があるという結論に至りました。

dataintegration

Device SDKの接続手順

それでは、Device SDKとサンプルプログラムを使用して、IoT Hubに接続する手順をご紹介します。
インターネット上で調べると、たくさんの公式ドキュメントが出てくるのですが、このクイックスタートが一番有用でした。

・事前に用意するもの
事前に用意するものは、3つです。

1.Azureサブスクリプション
今回、Azureサブスクリプションは作成済みの前提で進めます。

2.Device SDKをインストールできる環境
前述の通り、今回はAlibaba Cloud上のECSをデバイスとして見立てます。
ECSもUbuntuとAlibaba Cloud Linuxのイメージを指定してインスタンスを作成するだけですので、作成済みの前提で進めます。

3.Azure IoTエクスプローラーをインストールできる環境
Device SDKをインストールできる環境とは別に、Azure IoTエクスプローラーをインストールできる環境もあると良いです。Azure IoTエクスプローラーがなくても、一部はAzure CLIでも代用できます。
Azure IoTエクスプローラーは、Githubから入手できます。
今回私はAzure IoTエクスプローラーを自端末にインストールし、最後の確認だけAzure CLIを使用しています。

上記3つの準備が出来たら、作業を進めていきます。

・Device SDKをインストールする
Device SDKがインストールできる環境、今回ではECSにログインして、Device SDKをインストールします。
最初に必要なパッケージをインストールして、インストール後にcmakeのバージョンが2.8.12以上、gccのバージョンが4.4.7以上であることを確認します。

Ubuntuの場合

apt-get install git cmake build-essential curl libcurl4-openssl-dev libssl-dev uuid-dev

Alibaba Cloud Linuxの場合

yum install git cmake gcc-c++ libcurl-devel libuuid-devel openssl-devel

・IoT Hubを作成する
Azure Portalにログインして、IoT Hubを作成します。
このAzure PortalからIoT Hubを作成する方法は、公式のチュートリアルにある「IoT Hubの作成」の項目が参考になります。
ログイン後、上にある検索フォームにIoTと入力し、IoT Hubをクリックします。

dataintegration

IoT Hubの画面になったら、作成をクリックし、必要情報を入力してIoT Hubを作成します。
基本のタブは情報入力ですみますが、管理のタブでスケーリングレベルを適切なものに変更します。
サブスクリプションでFreeレベルのIoT Hubが1つもなければ、F1:Freeレベルを選択することもできます。デフォルトはS1:スタンダードになります。
画像では既にF1:FreeレベルのIoT Hubが作成されているため、新たなF1:FreeレベルのIoT Hubは作成できません。

IoT Hubが作成出来たら、次に進みます。

dataintegration

IoT Hubが作成出来たら、Azure IoTエクスプローラーを利用するうえで必要なIoT Hubのプライマリ接続文字列を控えます。

作成したIoT Hubをクリックして、セキュリティ設定にある共有アクセスポリシーをクリックします。
ポリシーの中からiothubownerをクリックすると表示される、IoT Hubのプライマリ接続文字列を控えて、一旦Azure Portalの操作を終えます。

dataintegration

Azure IoTエクスプローラーを起動して、左側のメニューのIoT Hubを選択し、Add connectionをクリックします。
先ほど控えたIoT Hubのプライマリ接続文字列を、Connection Stringの入力フォームに貼り付けてSaveをクリックします。
問題がなければ、デバイス一覧が表示されます。まだデバイスを作成していないので一覧には何も表示されていない状態で次に進みます。

dataintegration

Azure IoTエクスプローラーでIoT Hubへの接続が成功したら、パブリックモデルレポジトリを追加します。

Azure IoTエクスプローラーのHomeを選択してホーム ビューに戻り左側のメニューからIoT Plug and Play Settingsを選択します。
Addを選択したら、ドロップダウン メニューからPublic Repositoryを選択するとパブリックレポジトリが追加されるので、Saveをクリックします。
画像は既に追加済みの参考画像です。

dataintegration

・IoT Hubでデバイスを作成する
Azure Portalに戻って、公式のチュートリアルにある「デバイスの認証を確認する」の項目に従い、IoT Hubにデバイスを作成します。
今回はAzure Portalで作成していますが、Azure IoTエクスプローラーでもデバイスは作成できます。
デバイスを作成することで、SDKで使用するIoT Hubに接続するための必要情報が自動で生成されます。

IoT Hubの一覧から作成したIoT Hubをクリックし、デバイス管理にある「デバイス」をクリックして、「デバイスの追加」をクリックします。

次に表示される画面で「デバイスID」を入力して、保存を押すとIoT Hub上でデバイスが作成されます。

dataintegration

デバイスの一覧から作成したデバイスをクリックして、デバイスのプライマリ接続文字列をコピーします。
デバイスのプライマリ接続文字列は、SDKの設定時に使用するので、テキストなどに控えておきます。
デバイスのプライマリ接続文字列を控えたら、デバイスの画面は、右上のバツで閉じAzure Portal上の操作を一旦終えます。

dataintegration

・デバイスサンプルを実行して、IoT Hubに接続する
いよいよ、公式のチュートリアルにある「デバイスサンプルを実行する」の項目に従って、デバイスとして見立てたECS上にSDKをインストールし、サンプルプログラムを実行してIoT Hubに接続します。

デバイスとして見立てたECSにログインして、コマンドを実行します。
コマンドは、UbuntuとAlibaba Cloud Linuxどちらも共通です。

# git clone

git clone https://github.com/Azure/azure-iot-sdk-c.git

# git update

cd azure-iot-sdk-c
git submodule update --init

# build

cmake -Bcmake -Duse_prov_client=ON -Dhsm_type_symm_key=ON -Drun_e2e_tests=OFF
cmake --build cmake

ビルドが終わったら、環境変数を設定しますが、ここで控えたデバイスのプライマリ接続文字列が必要になります。
exportコマンドを実行しますが、上の行の赤字箇所だけデバイスのプライマリ接続文字列に置き換えてコマンドを実行します。
下の行は置き換えずにそのまま入力してください。置き換えてしまうとエラーになり接続できません。

export IOTHUB_DEVICE_CONNECTION_STRING= "デバイスのプライマリ接続文字列に置き換え"
export IOTHUB_DEVICE_SECURITY_TYPE="connectionString"

ここまで終わったら、サンプルプログラムを実行します。
サンプルプログラムを止めたいときは、Ctrl + Cで中断します。

cmake/iothub_client/samples/pnp/pnp_temperature_controller/pnp_temperature_controller

無事に実行できると、デバイスと見立てたECSではログが表示され、一定時間ごとにデータを送信していることが確認できます。

dataintegration

Azure IoTエクスプローラーでも、デバイスがIoT Hubに接続されている状態(Connected)になったことが確認できます。

dataintegration

・デバイスから送信されたデータを確認する
デバイスからIoT Hubにデータが送信されているかを確認します。
IoTエクスプローラーでは、Ubuntu、Alibaba Cloud Linuxどちらのサンプルプログラムからもデータが送信されているか確認できなかったため、今回はAzure Portal内のCloud Shellで実行できるazコマンドで確認します。

Cloud ShellはAzure Portalの右上にある[>_ ]アイコンをクリックすると、起動できます。
Cloud Shellが起動したら、赤字箇所を作成したデバイス名とIoT Hub名に置き換えて、下のコマンドを実行します。

az iot hub monitor-events --output table --device-id mydevice --hub-name YourIoTHubName

コマンドの内容から推測できる通り、このコマンドはデバイスからのイベントをリアルタイムで見るコマンドです。
そのため、サンプルプログラムの実行と並行して、このコマンドを実行して確認します。
サンプルプログラムを停止している時にこのコマンド実行しても、何も表示されません。

サンプルプログラムの実行と並行して、このコマンドを実行すると、下の画像のようにIoT Hubまでデータが送信されていることをCloud Shellで確認できます。

dataintegration

・失敗ポイント
最後に、今回の手順をまとめる中でいくつか失敗した点を記載しておきます。

・Azure IoTエクスプローラーが、Azure Portal内の画面ではなく、インストール型のツールだった。
しばらくAzure Portal内で項目を探していましたが、Azure IoTエクスプローラーはAzure Portal外の別ツールであることに気がつきました。
別クラウド製品を使用していた思い込みによる失敗でした。

・一度ログアウトしたら、サンプルプログラムが動かなくなった。
exportコマンドで一時的に環境変数を定義しているので、ログアウトすると環境変数がリセットされます。永続化するか、exportコマンドを再度実行しましょう。
チュートリアルのコマンドだけをそのまま実行してしまったことによる失敗ですが、エラーも表示されるので気がつきやすいと思います。

まとめ

今回初めてIoT Hubへの接続を試してみましたが、良かった点はSDKの設定とサンプルプログラムでの接続が簡単にできた点です。複雑な設定もなく、スムーズに接続できました。

あまりにシンプルかつスムーズに接続できるので、接続が出来ない、データが送られてこないなどのトラブルが発生した時のトラブルシュートに不安を覚えるかもしれません。
接続やデータ送信を簡単にするためのSDKですので、トラブルが発生した場合、まずは設定を一通り見直してみましょう。

悪かった点は、デバイスから送信された情報の中身がAzure IoTエクスプローラーで見られなかったり、Azure Portalでもデバイスから送信された情報の中身はコマンドでの確認しかできない点にIoT Hubの使いづらさを感じました。
情報の中身ではありませんが、デバイスから送信された情報の件数は、Azure Portalのグラフから確認することはできます。
これは利用者側ではどうにもできない点なので、ポータル画面やツールの改修が望まれます。

今回の記事で参考にした公式ドキュメントは、大筋の内容は正しく比較的スムーズに試すことができました。
ただ、自環境と合う情報は散らばっていて、いくつもの情報を並行して確認するのが大変だったので、この記事が皆さんのお役に立てば幸いです。

明日は、ソフトバンク Advent Calendar 2022の 10日目です。蒋さんよろしくお願いします。

関連サービス

Microsoft Azure

Microsoft Azureは、Microsoftが提供するパブリッククラウドプラットフォームです。コンピューティングからデータ保存、アプリケーションなどのリソースを、必要な時に必要な量だけ従量課金で利用することができます。

おすすめの記事

条件に該当するページがございません