Azure IoT Edge のインストール、設定に続いてカスタムモジュールの作成を行います。
一番最初なのでLチカします。(T先生のFPGA+IoT EdgeでLチカよりもテクノロジの無駄遣いのような気もしますね)
ただ、Lチカするだけでも罠があったりします。
あとで詳しい説明はしますけど、IoT Edgeがコンテナで動作していることが問題になります。
公式ドキュメントも参照してください。
##準備
・IoTHub
・RaspberryPi(ARM32v7以上の機種)IoT Edgeをインストール済み
・コンテナレジストリ
・Docker
・VS Code
・VS Code用Python拡張機能
・VS Code用Azure IoT Tools
・Python(3.7)
##プロジェクトの作成
1.VSCodeを起動します。F1キーを押してコマンドパレットを開きます。
2.Azure: Sign in コマンドでAzureにサインインしておきます。
3.コマンドパレットでAzure IoT Edge:New IoT Edge solution コマンドを入力して実行します。
4.ソリューションファイルを保存するフォルダーを選択します。
8.リポジトリ情報を入力します。 [registry name].azurecr.io/モジュール名 になります。
9.プロジェクト内の.envファイルを開いてユーザー名、パスワードが設定されているのを確認します。設定されいない時はコンテナレジストリのアクセスキーからユーザー名とパスワードをコピーします。
10.画面下部のターゲットプラットフォームをクリックしてプラットフォームを「ARM32v7」に変更します。
11.画面下部の使用言語がPython3.7になっているのを確認します。違う場合にはコマンドパレットで選択しなおします。
12.main.pyを開き次の内容に変更します。
import time
import RPi.GPIO as gpio
gpio.setmode(gpio.BCM)
gpio.setup(26,gpio.OUT)
try:
while True:
gpio.output(26,1)
time.sleep(.5)
gpio.output(26,0)
time.sleep(.5)
except KeyboardInterrupt:
gpio.cleanup()
13.Dockerfile.arm32v7を開き次のように変更します。
FROM arm32v7/python:3.7-slim-buster
WORKDIR /app
RUN apt update && apt install -y \
build-essential
COPY requirements.txt ./
RUN pip install -r requirements.txt
RUN pip install RPi.GPIO
COPY . .
CMD [ "python3", "-u", "./main.py" ]
14.deployment.template.jsonを開き、67行目以降を変更します。この設定がキモになります。
通常コンテナ内からデバイスのハードウェアへのアクセスはできません。コンテナからアクセスするためにはprivilegedオプションを使うことで可能になりますが、Dockerのようにコマンドラインで指定することはできません。そこでdeployment.template.json内でオプションを追加することでアクセスすることができるようになります。デバイスのGPIO以外にBluetoothやネットワークにアクセスする必要がある場合にはこのようなオプションの追加が必要になります。(しかし、この情報が公式にでてないのはどうしてなのかな。見落としている?)
~省略~
"createOptions": {
"NetworkingConfig": {
"EndpointsConfig": {
"host": {}
}
},
"HostCOnfig": {
"NetworkMode": "host",
"Privileged": true
}
}
~省略~
15.deployment.template.jsonを右クリックして「Build and Push IoT Edge Solution」をクリックします。
問題がなければコンテナレジストリにビルドしたソリューションファイルが登録されます。
16.Auzre IoT HubセクションからDevicesを展開し、デプロイしたいデバイスを右クリックし「1つのIoT Edgeに配置」をクリックします。
17.configフォルダを開き「deployment.arm32v7.json」を選択します。
18.問題がなければしばらくしてLEDが点滅を始めます。
19.試しにmain.pyの14,18行目のtime.sleepの中の数値を変更してみてください。
20.module.json内の7行目の「version」の数値を大きくして保存します。
21.再び手順15から進めると変更した内容がデバイスに反映されるはずです。
IoT Edgeを利用してリモートデプロイをすることができました。
いかがでしたでしょうか。