目次
はじめに
ここではAzure IoT Edgeコンテナを利用してiPRO Camera SDKアプリのビルドし、動作確認する手順を説明します。また、このチュートリアルではSDKのインストールディレクトリを${SDK_DIR}
として記載します。
このチュートリアルはSDK ver.2.00以降のみ対応しています。SDK ver.2.00未満では利用できませんので注意ください。
動作確認手順
Visual Studio Code上で新規のIoT Edge Solutionを作成する
以下は参考にするサンプルアプリがC版はskeleton_sample_app、Python版はadditional_info_sample_app、作成するEdge Solutionがtest_appの場合について説明します。注意点としてEdge Solutionの名称はすべて小文字である必要があります。
C版/Python版アプリの説明
C版/Python版いずれのアプリも動作確認方法はほぼ同様です。C版を例に説明しますが、異なる部分は適宜説明します。また、アプリのパスは以下の通りですので、適宜読み替えてください。
C版アプリのパス${SDK_DIR}
/src/adamapp
Python版アプリのパス${SDK_DIR}
/src/adamapp-py
[SDKフォルダ]直下でVisual Studio Codeを立ち上げます。
cd ${SDK_DIR} code .
${SDK_DIR}
/src/adamapp/skeleton_sample_app フォルダを同じフォルダ内にコピーします。
コピーしたフォルダをtest_appにリネームします。
[コピーしたフォルダ]/container/modules の「skeleton_sample_app」フォルダもtest_appにリネームします。
Visual Studio CodeのEXPLORERからコピーしたフォルダ(test_app)を右クリックし、「Find in Folder…」を選択し、SEARCHウィンドウを表示します。
検索で「skeleton_sample_app」を検索しすべて「test_app」に置き換えます。対象は以下となります。
${SDK_DIR}
\src\adamapp\test_app\container\deployment.template.json${SDK_DIR}
\src\adamapp\test_app\container\modules\test_app\module.json
作成したイメージをプッシュするコンテナレジストリの情報を入力します。
Azure Portal にログインし、対象とするコンテナレジストリを選択します。下記画面は例です。
左側のメニューから 「設定」 - 「アクセスキー」を表示します。
表示された情報をもとに、以下を入力します。
${SDK_DIR}
\src\adamapp\test_app\container\deployment.template.json
内の “registryCredentials” を以下のように入力します。 「コンテナレジストリ名」はAzure Portalの「レジストリ名」を小文字にしたもの (「ログインサーバー」の .azurecr.ioよりも前の文字列と同じ) となります。"registryCredentials": { "[コンテナレジストリ名]": { "username": "$CONTAINER_REGISTRY_USERNAME_[コンテナレジストリ名]", "password": "$CONTAINER_REGISTRY_PASSWORD_[コンテナレジストリ名]", "address": "[ログインサーバー]" } }
例えばコンテナレジストリ名がiprocv5xcontainerregistry、コンテナレジストリログインサーバーがiprocv5xcontainerregistry.azurecr.io の場合は以下のようになる。
${SDK_DIR}
\src\adamapp\test_app\container\modules\test_app\module.json
内の “repository” を以下のように入力します。"repository": "[ログインサーバー]/test_app"
コンテナレジストリログインサーバーがiprocv5xcontainerregistry.azurecr.io の場合は以下のようになる。
${SDK_DIR}
\src\adamapp\test_app\container
ディレクトリ内に.envファイルを作成し、コンテナレジストリのユーザー名、パスワードを記載して保存します。CONTAINER_REGISTRY_USERNAME_[コンテナレジストリ名]=[ユーザー名] CONTAINER_REGISTRY_PASSWORD_[コンテナレジストリ名]=[password]
例を以下に示します。
アプリのコーディング
このままVisual Studio Code上で任意にコーディングを行います。
skeleton_sample_appなどをコピーした場合、ソースファイル名がコピー前 (skeleton_sample_appの場合はskeletonSampleApp.cpp) になっているので必要に応じてリネームしてください。下記は一例です。
変更前 ${SDK_DIR}\src\adamapp\test_app\skeletonSampleApp.cpp 変更後 ${SDK_DIR}\src\adamapp\test_app\testApp.cpp
Makefile内のSRC_FILESも必要に応じて修正してください。下記は一例です。
${SDK_DIR}\src\adamapp\test_app\Makefile 変更前 SRC_FILES= skeletonSampleApp.cpp 変更後 SRC_FILES= testApp.cpp
Makefile内のPROG_NAME、configuration.txt内のAPPLICATION、deployment.template.json内のAPPLICATION_NAMEも必要に応じて修正してください。下記は一例です。
${SDK_DIR}\src\adamapp\test_app\Makefile 変更前 PROG_NAME= SkeletonSampleApp 変更後 PROG_NAME= TestApp ${SDK_DIR}\src\adamapp\test_app\configuration.txt 変更前 APPLICATION SkeletonSampleApp 変更後 APPLICATION TestApp ${SDK_DIR}\src\adamapp\test_app\container\deployment.template.json 変更前 "APPLICATION_NAME=SkeletonSampleApp" 変更後 "APPLICATION_NAME=TestApp"
アプリのビルド
ビルドを行う際はAzure IoT拡張機能の組込み機能を使用します。Visual Studio Codeのエクスプローラで${SDK_DIR}
\src\adamapp\test_app\container\deployment.template.jsonを右クリックするとビルドメニューが表示されます。
「Build IoT Edge Solution」を選択します。この操作ではビルドのみ実施されます。
初回のビルドの場合は、コンテナレジストリへのログインが要求されます。 以下はコンテナレジストリがiprocv5xcontainerregistry.azurecr.ioの場合の例です。
ERROR: failed to solve: iprocv5xcontainerregistry.azurecr.io/cadamappbase:0.0.2: failed to authorize: failed to fetch anonymous token: unexpected status: 401 Unauthorized
この時はVisual Studio Codeの端末上で下記コマンドを入力します。
docker login iprocv5xcontainerregistry.azurecr.io
続いて表示されるUsernameおよび Passwordを入力します。コンテナレジストリのIDとパスワードを入力します。
Username: [ユーザー名] Password: [password]
Login Succeeded
と表示されたらログイン成功です。
次に${SDK_DIR}
\src\adamapp\test_app\container\deployment.template.jsonを右クリックして、
「Build and Push IoT Edge Solution」を選択します。この操作ではビルドとコンテナレジストリへのプッシュを行います。
ビルドは、${SDK_DIR}
\src\adamapp\test_app\ 以下にある Dockerfile.arm64v8 ファイルに記載の通りにDocker buildx buildが実行されることで行われます。Dockerfile.の後の環境名(arm64v8)は上記の手順で選択されたアーキテクチャが選択されています。(Visual Studio Codeの下部に現在のアーキテクチャが表示されます)
ビルドしたイメージの確認
ビルドが成功すれば、そのイメージは docker images で存在が確認できます。下記は一例です。
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE iprocv5xcontainerregistry.azurecr.io/azureiot/test_app 0.0.5-arm64v8 f1772ccfed77 35 minutes ago 91.4MB
カメラへのデプロイ
左下の「AZURE IOT HUB」以下からデプロイしたいデバイスを選択し、右クリックして「1つのIoT Edgeに配置」を選択することで、カメラへデプロイされます。デプロイする内容は${SDK_DIR}
\src\adamapp\test_app\container\deployment.template.json に従います。
Visual Studio Codeの上部にプルダウンが表示されるので下記を選択します。${SDK_DIR}
\src\adamapp\test_app\container\config\deployment.arm64v8.json
Deployment Succeeded
と表示されたらデプロイ成功です。
Azure上でランタイム状態の確認
Azure Portal にログインして、IoT Hub - IoT Edge画面で追加したIoT Edgeデバイスを選択します。
画面下部に表示されているデプロイしたアプリのランタイムの状態を確認します。「running」になっていればエラーが発生していない状態です。「エラー」と表示されている場合は選択するとエラーメッセージが表示されるので、デバッグしてください。
デプロイしてしばらくはランタイムの状態は「エラー」になります。「running」になるまで時間が必要です。ただし、「running」になるまでに必要な時間はアプリに依存します。
アプリの動作確認
カメラと接続可能なPCで下記URLにアクセスします。
http://[カメラのローカルIPアドレス]/cgi-bin/cadam.cgi?methodName=getApplicationList
カメラの応答が表示されます。下記は一例です。
{ "appCount": "1", "limitationMode": "Shared", "maxAppCount": "9", "appList": [ { "appType": "0", "funcId": "0000FF01", "appInfo": { "installId": "124B569A", (中略) }
"installId": "124B569A",
と表示されている情報を使います。
下記のURLにアクセスします。
http://[カメラのローカルIPアドレス]/cgi-bin/cadam.cgi?Language=1&methodName=sendDataToAdamApplication&installId=[インストールID]&s_appDataType=0&s_appData=e3tMYW5ndWFnZToxfX0%3D
カメラのIPアドレスが192.168.100.33、"installId": "124B569A",
の場合は下記になります。
http://192.168.100.33/cgi-bin/cadam.cgi?Language=1&methodName=sendDataToAdamApplication&installId=124B569A&s_appDataType=0&s_appData=e3tMYW5ndWFnZToxfX0%3D
下記のようにアプリ動作を確認できます。下記はskeleton_sample_appを動作させた例です。
WSL環境でうまくいかない場合のチェックポイント
WSL環境でうまくいかない場合は以下をチェックしてください。
Visual Studio Codeの「LOCAL」の拡張機能で以下が有効になっていること
Dev Containers
Remote - SSH, Remote - SSH: Editing Configuration FIles, Remote - Tunnels, Remote Development, Remote Explorer
WSL
Visual Studio Codeの「WSL: UBUNTU-20.04 」の拡張機能で以下が有効になっていること
Azure Account
Azure IoT Edge
Azure IoT Hub
Visual Studio Codeの画面左下が「WSL: Ubuntu-20.04」と表示されていること
Build IoT Edge Solutionでpermission denied と表示される場合、対象のディレクトリに現在のユーザーのアクセス権があるかどうか確認する。
sudo chown -r ipro:ipro [開発ディレクトリ] ※ipro:ipro は例ですので、各環境に合わせて設定ください。
を実行して所有者を変更。