今回より、SaaS型クラウド運用管理サービス「Vistara」を提供しているVistaNet社のエバンジェリストグループが
下記テーマをもとに、全3回にわたって連載記事をお届けします。
<連載テーマはこちら!>
RaspeberryPiベースの商用IoTデバイスをAzure IoTで認定を受け、Azure上のリソースと連携し、VistaraでAzureを監視しつつ日々のサービスデスク運用を通してITライフサイクルを回そう
第1回:Raspberry Piベースの商用IoTデバイスに対し、Azure IoTで認定を受ける手順
Microsoft社ではこちらにある通り、IoTハードウェアを認定しAzureをIoTプラットフォームで活用する施策を設けています。対象IoTハードウェア(デバイス)は、Windows OS以外にもいろいろあります。
https://azure.microsoft.com/en-us/marketplace/certified-iot-partners/
ウェブサイトでの認定デバイス一覧を数えると、6月30日時点で、全世界でおよそ150製品が認定されています。日本のメーカーも数社リストアップされています。
https://azure.microsoft.com/en-us/documentation/articles/iot-hub-tested-configurations/
昨今IoTというとRaspeberry Pi, Arduino, BeagleBone, テキサスインスツルメンツ社のLaunchPadなど、オープンソース及び商用ともに、小型かつ安価で誰でもIoTデバイスを開発できるデバイスが多数あり、ネット上でのノウハウも豊富ですが、このシリーズのネタとしては、Raspberry PiベースのIoTデバイスについて、読者の皆様が商用で製品を開発されている場合に、Microsoft社の認定を受けて、かつそれを事業者様ないしはIoTデバイスを購入されるお客様がIoTプロジェクトとしてクラウドで運用していく、ということを見ていきたいと思います。あるいは単純に、漠然とAzureとIoTって何だ?と思われている方には何らかの一考のきっかけになれば幸いです。ちなみに上記認定デバイスとして、表向きRaspberry Piと分かるものは6デバイス、うち2個は日本のメーカーとなっています(リストは随時増えています)。
第1回目は認定を受けるまでの手順、とくにAzure IoT SDKを実行し動作するまでの方法なども見てみます。Raspberry Piを使った場合、これまでのところいろいろな情報が散在しており一筋縄ではいかなかったので、ここでまとめると分かりやすいかと思います。
まず認定を受ける条件として Azure IoT SDKでコンパイルした実行コマンドが当該IoTデバイスで動作し、デバイスからAzure IoT Hubにデータを送る、及びIoT Hubからデバイスがデータを受ける、という双方向の通信を実施する必要があります。これができて初めて、デバイスがAzure上で動くので認定対象である、とみなされます。IoT Hubはこの時点ではあくまで通信の確認用で使うので、お客様へのサービスといった実利用に即使うわけではありません。
1. Microsoft社への認定申し込み
ウェブサイトから申し込みをすると、2、3日しないうちにメールで連絡がきます。ターゲットとなるIoTデバイスが何かを申請する必要がありますが、ここでは対象システムはRaspberryPiベースのIoTデバイス(ちなみにオリジナルのRaspberry Piはすでに認定されています)、OSは Raspbian、開発言語はCとして申し込んだとします。
2. Azure IoT SDKの環境用意とコンパイルの実施
Azure IoT SDKのダウンロードと利用手順のウェブサイトがメールで案内されるのでそれをくまなく読みます。ただしここで分かりにくかったのが、IoTデバイス自体を開発ホストとしてコンパイルすると思って前提要件を満たすパッケージをインストールしたのですが、Raspbian上でいくらビルドしてもエラーになるため(ここで2、3日ほど悩みましたが)Microsoft社に問い合わせところ、クロスコンパイル環境でやってほしい、ということで別途VMwareゲストでLinuxマシンを立てて、Raspbian用の実行ファイルをコンパイルして問題なく終了しました。ちなみにIoTデバイスのOSはリリース日 05/27/2016のRaspbian 8.0 (Jessie) なので、ちょっとバージョンが違うとうまくいくのかもしれません(未実施です。興味ある方はお試しください)。
3. IoT SDKのテストを終了するまでの具体的な手順
3-1). 用意するもの
- IoTデバイスであるRaspberry Pi
- Windows PC一台(”Device Explorer”というアプリをダウンロード、インストールしておきます。こちらをご参照ください。)
- Linux PC 一台(クロスコンパイルのビルド用に使います)
-Ubuntu Server 14.04 x86 のOSをインストールしておきます。(ビルド用にはどのLinuxディストリビューションでもいいのですが、情報があって一番安定してそうだったのでこれにしました)
3-2). Azureにログインして、IoT Hubの設定をします。
https://github.com/Azure/azure-iot-sdks/blob/master/doc/setup_iothub.md
ここでは悩むことはないかと思います。
3-3). Windows PCのDevice Explorerで、IoTデバイスをプロビジョン(登録)します。
こちらの”Use the Device Explorer tool to provision a device”よりデバイス登録設定を実施します。ここでも悩むことはないかと思います。
3-4). ビルド用マシンの詳細を構築します。
Ubutu OSインストール後、下記を実施します。これらはビルドマシン上での操作ですので、Raspberry Pi上での操作ではありません。
3-4-1). パッケージのアップデート
$sudo apt-get update
3-4-2). 要件となるパッケージのインストール
$sudo apt-get install -y curl uuid-dev libcurl4-openssl-dev build-essential cmake git
3-4-3). cmakeのバージョンが 2.8.12 以上でないといけないので確認します。下記でOKです。
$ cmake --version cmake version 3.0.2
3-4-4). gccが4.9以上でないといけないので確認します。
$ gcc ?version gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
バージョンが古いということで、アップグレードします。
$sudo add-apt-repository papa:ubuntu-toolchain-r/test $sudo apt-get update $sudo apt-get install gcc-4.9 g++-4.9 $gcc --version gcc (Ubuntu 4.9.3-8ubuntu2~14.04) 4.9.3
これでOKです。
3-4-5). Azure IoT SDK パッケージをダウンロードしローカル上に配置します。
(”Sources”というディレクトリは必須ではありません)
$cd ~ $mkdir Source $cd Source $git clone --recursive https://github.com/Azure/azure-iot-sdks.git
~/Source/azure-iot-sdksディレクトリ以下にレポジトリが格納されたことを確認してください(ディレクトリがばらっとあれば可)。
3-4-6). Raspberry Pi用のパッケージをダウンロード、配置します。
$cd ~ $mkdir RPiTools $cd RPiTools $git clone https://github.com/raspberrypi/tools.git
なお、Raspberry PiのIoTデバイスにて、sshを有効にしておいてください(raspi-config
コマンド)。
3-4-7). 下記の深いディレクトリに移動しIoTデバイスからディレクトリをごそっとリモートコピーします。下記を実行します。
$cd ~/RPiTools/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf $rsync -rl --safe-links pi@<IoT_device>:/{lib,usr}
rsync
のあとコマンドラインがうんともすんとも言わず30分くらいかかりますが、じっと待ちます。時折df
などでパーティションの増加具合を見るとコピーが動いているのが分かります。
3-4-8). ディレクトリはそのままで、環境変数を設定します。
$sudo export RPI_ROOT=$(pwd) $export -p
で確認すると以下の1行があるはずです。
declare -x RPI_ROOT="/root/RPiTools/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf"
3-4-9). `toolchain-rip.cmakevという名前のファイルを作成します。
$cd ~/Source/azure-iot-sdks/c/build_all/linux
$vi toolchain-rip.cmake
あるいは nanoのエディタでファイルを編集します。以下をコピペし保存します。
INCLUDE(CMakeForceCompiler) SET(CMAKE_SYSTEM_NAME Linux) # this one is important SET(CMAKE_SYSTEM_VERSION 1) # this one not so much # this is the location of the amd64 toolchain targeting the Raspberry Pi SET(CMAKE_C_COMPILER $ENV{RPI_ROOT}/../bin/arm-linux-gnueabihf-gcc) # this is the file system root of the target SET(CMAKE_FIND_ROOT_PATH $ENV{RPI_ROOT}) # search for programs in the build host directories SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) # for libraries and headers in the target directories SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) |
3-4-10). 通常、IoTデバイスとAzure IoT Hubとの通信には AMQP, HTTP, MQTTの3つのプロトコルのいずれかを選べるのですが、ここではHTTPで実施することにします。
~/Sources/azure-iot-sdks/c/iothub_client/samples/iothub_client_sample_https/iothub_client_sample_https.c
ファイルをエディタで編集します。
下記1行を見つけて
static const char* connectionString = "[device connection string]";
自分が使う文字列に置き換えます。この文字列はWindows PCでDevice Explorerを開いて確認します。
方法はこちらです。例えば以下のような文字列です。
HostName=xyz.azure-devices.net;DeviceId=MyDevice;SharedAccessKey=……..
(xyz, MyDevice, Key=… は自分のものに置き換えます。ドメイン名などもAzure環境によって違う可能性があるのでご確認ください)
ちなみにウェブ上での説明には上記の通りカッコ([ ])がありますが、これは編集時に削除しないと、IoT SDKが正常に動きません。
3-4-11). ビルドマシン上でのAzure IoTの環境変数を設定します。
~/Sources/azure-iot-sdks/tools/iot_hub_e2e_tests_params/iot_device_params.txt
ファイルをエディタで以下のように編集します。
a). IOTHUB_CONNECTION_STRING
IOTHUB_CONNECTION_STRING=HostName=xyz.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=
(xyz, Key=… は自分の文字列に変更します。こちらの中程よりちょっと上に説明があります。iothubowner
はデフォルトのものを使っていますが、ご自身で作ったユーザで置き換えもできるようです)
b). IOTHUB_EVENTHUB_CONNECTION_STRING:
IOTHUB_EVENTHUB_CONNECTION_STRING=Endpoint=sb://abc.servicebus.windows.net/;SharedAccessKeyName=iothubowner;SharedAccessKey=…
(同様に、abc, Key=…は自分の文字列に変更します。ドメイン名などもAzure環境によって違う可能性があるのでご確認ください)
c). IOTHUB_EVENTHUB_CONSUMER_GROUP:
おそらくデフォルトのままですが、$Default
という値にします。
d). IOTHUB_PARTITION_COUNT:
数字ですが自分の数に置き換えます。サンプル画像はこちらです。
ちなみにこれらも、ウェブ上の説明ではカッコ(<>) がついていますが、編集時に削除しないとIoT SDKが正常に動作しません)
3-4-12). 以下を実行します。
$cd ~/Sources/azure-iot-sdks/tools/iot_hub_e2e_tests_params/ $sudo chmod +x setiotdeviceparametersfore2etests.sh $sudo ./setiotdeviceparametersfore2etests.sh
3-4-13). マシンをリブートします。その後環境変数が有効になるので確認します。
$ set | grep IOT IOTHUB_CONNECTION_STRING='HostName=xyz.azure-devices.net;SharedAccessKeyName=iothubowner;SharedAccessKey=….’&amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp; &amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp; &amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;nbsp; IOTHUB_EVENTHUB_CONNECTION_STRING='Endpoint=sb://abc.servicebus.windows.net/;SharedAccessKeyName=iothubowner;SharedAccessKey=...' IOTHUB_EVENTHUB_CONSUMER_GROUP='$Default' IOTHUB_PARTITION_COUNT=2(ここはご自身の数字)
ちなみに文字列を間違えたら、変数は /etc/environment
に格納されるので、手動で消しリブート、再度3-4-12を実行、リブートすれば問題ありません。
3-5). IoT SDKをビルドします。
3-5-1). ここでもビルドマシン上で実行します。IoTデバイス上ではありません。
$cd ~/Source/azure-iot-sdks/c/build_all/linux $./build.sh --toolchain-file toolchain-rpi.cmake --skip-unittests --no-amqp --no-mqtt -cl -D__STDC_NO_ATOMICS__ -cl --sysroot=$RPI_ROOT | tee ~/Sources/LogFile.txt
3-5-2). ようやく、Raspberry PiのIoTデバイス上で動作する実行ファイルが生成されました。
$cd ~/Source/azure-iot-sdks/c/cmake/iotsdk_linux/iothub_client/samples/iothub_client_sample_https/
$ls -laで ‘iothub_client_sample_https’ファイルがあることを確認します。
3-5-3). IoTデバイスにリモートコピーします。
(コピー先は/home/piでなくても構いません)
$scp iothub_client_sample_https pi@<IoT_Device>:/home/pi/
これでようやく、IoT SDKでコンパイルした実行ファイルでAzure IoT Hubとデータを送受信する準備が整いました。
3-6). デバイスイベントをIoT Hubに送信する
3-6-1). Windows PCのDevice Explorerを開き、”Data”タブに移動します。適切なデバイスを選択し、Monitor
をクリックします。
ここで複数のデバイスがプルダウンで見える場合があるので(デフォルトでは関係ないものが選択されている可能性があります)、適切な該当デバイスを明示的に選ばないと結果が確認できません。
Monitor
をクリックすると、IoT Hub側でデータを待ち受けしている様子が下の”Event Hub Data”欄に表示されます。
3-6-2). IoTデバイス(Raspberry Pi)にログインして、ターミナルで下記を実行します。
$cd ~ (/home/pi またはコマンドをコピーしたディレクトリに移動) $./iothub_client_sample_https
するとターミナル上で以下のようにHTTP経由でIoT Hubにデータを送信します。
Device ExplorerではIoT Hubがデータを受け取り、下記のように表示されればOKです。
3-7). IoT Hubからメッセージを受信する
3-7-1). 上記3-6-2でHTTP実行ファイルを実行したままにしておきます。実行されていないければ同じように実行します。
3-7-2). Windows PCのDevice Explorerを開き、”Messages to Devices”タブに移動します。適切なデバイスを選択し、”Send”をクリックします。
ここでも適切な該当デバイスを明示的に選ばないと、結果が確認できません。
IoTデバイスのターミナルでは以下のように表示されればOKです。”Send”ボタンを押した回数だけ、ターミナルのほうにも同じ行数のメッセージが表示されます。
以上で IoT Hubとの通信テストが無事に終了しました。
4. Microsoft社への手順書を送付
IoT SDKのテストが終了すると以下のマテリアルをMicrosoft社にメール添付で送る必要があります。
- これら一連の手順書(テンプレートがあるのでそれに則って記載)。提出元はIoT事業者を想定するので、事業者が自社IoTデバイス製品を顧客に使ってもらう上での手順書、というフォーマットになります。
- テストが完遂したことを示す関係スクリーンショット
提出後、やはり2、3日もしないうちに次の連絡がきます。
なお今回は執筆者が開発したIoTデバイスで一連のテストをしたのですが、デバイスの種類、OSバージョン、アーキテクチャ、使用言語、テストした日付等々の違いによって独自の手順が出てくるはずで、またAzure IoT SDKの内容もいつも同じでないと思われるので、それらを逐一メモしておき、最後に手順書としてまとめると便利です。
提出した手順書はMicrosoft社の認定デバイスのリストでウェブにアップされますが、こちらから提出した書面がそのまま掲載されることはなく、Microsoft社側でかなり修正して内容を端折って校正してくれるので(HTMLのフォーマットもつけてくれます)、あまり詳細でなくてもよいという印象です。この一連のテストプロセスにおいては何か問題があると、Microsoft社も丁寧迅速にメールでサポートしてくれました。質問時には、ビルドしたログや環境変数などの情報を添付する必要があります。
次回は下記について解説します。どうぞお楽しみに!
<第2回>
IoT端末や管理サーバーがあるオンプレミスのIoT環境をVistaraで監視し、APIを使いつつアラートの状況に応じてインシデント化(サービスデスクのチケット化)または自動化ツールなどと連携
Vistara の詳細については下記をご覧ください!
https://sios.jp/products/oss-integration/service/oss_on_cloud/vistara.html