ブログ

Armadillo Base OS:Visual Studio CodeとABOSDEを使った基本的なアプリケーション開発について

at_takuma.fukuda
2023年9月21日 17時26分

*注意事項
この記事の内容はArmadillo-IoT A6E製品マニュアルv2.0.0に準拠しています。これ以前のマニュアル等を参照した場合は記載内容が異なる可能性があります。ご注意ください。

はじめに

当社ではArmadilloの開発環境として、
ATDE(Atmark Techno Development Environment)という仮想マシンイメージを提供しています。
この開発環境に含まれるツール、およびArmadillo Base OSの機能によって、
Armadillo Base OS 搭載機器上で動作するソフトウェアの開発は、PC上で簡単に行う事が出来ます。

    • ABOS Web
    • Armadillo Base OSが有するWeb UI機能
      ネットワーク設定など、ホストOSの動作に関わる設定や操作を行う事が出来る
    • Armadillo Base OS Development Environment(ABOSDE)
    • Visual Studio Code にインストールできる開発用エクステンション
      アプリケーションコンテナを簡単に実装できる。


ABOSDEでは、作成したいアプリケーションの種別を選んでプロジェクトを作成すると、アプリケーションの実行環境となるコンテナ・コンテナを動作させるための設定ファイル・サンプルアプリケーションのソースコードが自動生成されます。
このサンプルアプリケーションを修正・改造することで、実行環境を意識せずアプリケーションの開発を行う事が出来ます。
さらに機能を追加したアプリケーションを作成したい場合は、生成されたものに対してアレンジを行う必要があります。

この記事ではこのような場合にABOS DEで何を変更すべきか、またどのようにすれば効率的に開発を進めることが出来るかを解説いたします。
より具体的にイメージしやすいよう、例として下記の記事のコンテナをABOS DEを使って構築します。
Armadillo-IoT A6E:Node-REDでRS-485通信させてみた

作成コンテナ概要

  • コンテナにNode-REDと各種nodeがインストールされている
  • コンテナの1880番ポートに外部からアクセスできるようになっている
  • コンテナからシリアルポートのデバイスファイルにアクセスできる
  • コンテナ起動時にnode-redコマンドを実行している

手順

用意するもの

  • Armadillo-IoT A6E(初期化状態のもの)
  • ATDEが動作するPC
    ATDEのセットアップについては下記などをご参考下さい。
    Armadillo-IoT A6E製品マニュアル 3.3.2. 開発環境のセットアップ
  • ネットワーク環境
    • PCがインターネットに接続できる状態であること
    • PCとArmadilloが同じネットワークに接続していて、DHCPサーバからIPアドレスを割り当てられていること

以下の手順では初期化状態のArmadilloに対して操作を行う事を想定しております。
鍵情報の書き込みなどが既に完了している場合はそれぞれの手順を読み飛ばしてください。
この記事ではファイルの転送やArmadilloの操作は全てネットワーク経由で行います。
必ずATDEとArmadilloを同じネットワークに接続し、ArmadilloにIPアドレスが割り当てられた状態にしておいてください。

初期設定

1.ATDEのネットワークアダプタが「ブリッジ接続」になっていることを確認する


2.ATDEがインターネットに接続していることを確認する

[ATDE ~]$ ping 8.8.8.8


3.vscodeを起動する

[ATDE ~]$ code


4.署名鍵情報とそれを書き込むためのSWUファイルの生成

Armadillo Base OSのソフトウェアアップデート機能(SWUpdate)では、
Armadillo Base OS内に保持している鍵情報とアップデート用のファイル(swuファイル)に埋め込まれた署名情報を照合し、
アップデート実行の可否を判断します。

そのため、ユーザが作成したファイルでアップデートを行うためには、あらかじめ鍵情報を書き込んでおく必要があります。

鍵情報とその鍵情報を書き込むためのswuファイル(initial_setup.swu)を生成します。
下記マニュアルの「3.3.8.1. プロジェクトの作成」と「initial_setup.swu の作成」を実行してください。
3.3.8. VSCode を使用して Armadillo のセットアップを行う

5.鍵情報の書き込み

上記で生成したinitial_setup.swuをABOS Webを使ってArmadilloへ書き込みます。

ABOS Webへのアクセス・ログインやSWUファイルのインストールについては下記を参照してください。
Armadillo-ioT A6E 製品マニュアル 3.8.2. ABOS Web へのアクセス・3.8.3. ABOS Web のパスワード登録
Armadillo-IoT A6E製品マニュアル6.12.4. SWUインストール

アプリケーションプロジェクト作成

アプリケーション開発のためのVS Codeプロジェクトを作成します。
下記製品マニュアルの「3.10.2.1. プロジェクトの作成」および「3.10.2.2. 初期設定」を実行してください。
Armadillo-ioT A6E製品マニュアル 3.10.2. VSCode 上での手順
このまま「Generate development swu」を実行するとサンプルアプリケーションが動作するコンテナが作成されます。
今回はNode-REDが動作するコンテナを作成したいので、すぐに上記を実行せずに、設定ファイルの編集を行います。

コンテナ構築準備

コンテナの構築にあたって、ベースとなるコンテナイメージを選択し、パッケージのインストールや各種設定などを行って、どのようなコンテナを構築するかは、原則としてDockerfileで定義します。
下記記事ではNode-REDインストールのための処理は別途シェルスクリプトに記述し、Dockerfileからこれを実行させていましたが、
今回は必要な処理をすべてDockerfileで実行するものとします。 Armadillo-IoT A6E:Node-REDでRS-485通信させてみた

1.packages.txt

Node-RED環境構築に必要なパッケージをインストールさせます。
Explorerで[packages.txt]をを開き、以下のように編集します。

# packages listed here will be installed in container
bash
curl
gcc
g++
make

2.Dockerfile

Node-REDはnpmパッケージとして配布されているので、最新のNode.jsをインストールし、必要なnpmパッケージをインストールさせます。
Explorerで[Dockerfile]をを開き、以下のように編集します。

# ARCH will be set appropriately by scripts/build_container_image.sh
ARG ARCH
FROM docker.io/${ARCH}/debian:bullseye-slim
LABEL version="2.0.0"
 
 
# Add extra files you want to copy to 'resources' directory
# Note 'app' itself will not be part of the container, but
# used as a volume
# copying 'resources_${PRODUCT}' is optional and will not error if missing
# thanks to the [r] path glob. It is only intended for product quirks.
ARG PRODUCT
COPY resources [r]esources_${PRODUCT} /
 
# Modify as necessary
RUN useradd -m -u 1000 atmark
 
# Add extra packages to containers/packages.txt
ARG PACKAGES
RUN apt-get update && apt-get upgrade -y \
    && apt-get install -y ${PACKAGES} \
#Node-RED
    && curl -fsSL https://deb.nodesource.com/setup_lts.x | bash - \
    && curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | tee /usr/share/keyrings/yarnkey.gpg >/dev/null \
    && echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | tee /etc/apt/sources.list.d/yarn.list \
    && apt-get update && apt-get install -y nodejs yarn \
    && npm install -g npm@10.1.0 \
    && npm install -g --unsafe-perm node-red \
    && npm install -g --unsafe-perm node-red-contrib-modbus \
    && npm install -g --unsafe-perm node-red-dashboard \
 
    && apt-get clean 

コンテナ起動設定

コンテナへのポートの割り当てやファイルのマウントなどは、confファイルに定義されている内容をコンテナ起動時に参照して設定されます。
今回はコンテナの1880番ポートとArmadillo Base OSの1880番ポートとの紐づけ、シリアル通信ポートのデバイスファイルのマウントを行います。
また、Node-REDの設定ファイルが保存される、/root/.node-redディレクトリに/var/app/volumes下のディレクトリをマウントし、
設定を常時保存可能にします。
Explorerで[shell_app.conf]をを開き、以下のように編集します。

set_image localhost/shell_app_image:latest
 
# mount app sources and data:
# - relative paths are in /var/app/rollback/volumes and can be
# rolled back on failed upgrades, suitable for application sources
# and assets.
# - /var/app/volumes is not copied on updates and more suitable
# for volatile data such as logs and databases.
add_volumes shell_app:/vol_app
add_volumes /var/app/volumes/shell_app:/vol_data
 
# Allow LED to be written. This is application specific
# and should be changed depending on your needs.
add_volumes /sys:/sys
 
# launch app
set_command bash /vol_app/src/main.sh
 
add_ports 1880:1880
add_devices /dev/ttymxc*
add_volumes /var/app/volumes/node:/root/.node-red

メインアプリケーション

Shellアプリケーションでは、コンテナ起動時に[app]ディレクトリの下のsrc/main.shというファイルが実行されます。
Shellアプリケーション以外のプロジェクトでも、コンテナ起動時に実行されるアプリケーションは[app]ディレクトリ内に格納されています。 このファイルを編集して、自分がコンテナ起動時に行わせたい処理を記述します。
今回はコンテナが起動した際に、Node-REDが起動されるようにします。
サンプルアプリケーションではCPUの温度情報の記録とLEDランプの点滅を行う処理が行われています。
これらをコメントアウトし、Node-REDの起動コマンドを実行します。
Explorerで[main.sh]をを開き、以下のように編集します。

(前略)
#log_temp
#blink
node-red

ビルド・インストール

以上の各種設定ファイルを編集したら、コンテナのビルドを行い、Armadilloに書き込んで動作確認を行います。
下記を参考にABOSDE Explorerで[Generate Development swu]を実行してください。
Armadillo-IoT A6E製品マニュアル 3.10.2.3. アプリケーション実行用コンテナイメージの作成
コンテナイメージ・コンテナ起動設定を書き込むためのswuファイルが生成されます。
生成されたswuファイルは、initial_setup.swuを書き込んだ際と同様にABOS Webからインストールしてください。
今回のようにコンテナイメージを含むswuファイルについては、インストール実行から完了までに数分以上かかることに留意してください。

動作確認

コンテナが想定通りに動作するかを確認します。
上記のコンテナイメージなどを書き込むためのswuファイルは、ファイルの書き込みだけでなくArmadillo側のsshを有効化させています。 これにより、ABOS DEからArmadilloに対してメインアプリケーションの実行ファイルの転送や、コンテナ実行時にコンソールに出力される情報をリモートで確認することができるようになっています。
この機能を使って動作確認を行うのですが、そのためにはABOS DEのプロジェクト内に対象のArmadilloのIPアドレスを設定する必要があります。
[ssh_config]というファイルを編集して対象のIPアドレスを設定するのですが、下記のように自動入力させることも可能です。
Armadillo-IoT A6E 製品マニュアル 3.10.4.3. ssh 接続に使用する IP アドレスの設定
以上を設定した上で、下記を参考に[App run on Armadillo]を実行してください。
Armadillo-IoT A6E製品マニュアル 3.10.4.4. アプリケーションの実行
ABOS DEのプロジェクト内の[app]ディレクトリ内のファイルがすべて転送されて、コンテナを起動します。
コンテナが起動すると、ABOS DEのコンソールにメッセージが表示されます。
今回のアプリケーションの場合は以下のようなメッセージが表示されます。

Welcome to Node-RED
===================
 
21 Sep 21:06:28 - [info] Node-RED version: v3.1.0
21 Sep 21:06:28 - [info] Node.js  version: v18.17.1
21 Sep 21:06:28 - [info] Linux 5.10.191-0-at arm LE
21 Sep 21:06:38 - [info] Loading palette nodes
21 Sep 21:06:55 - [info] Dashboard version 3.6.0 started at /ui
21 Sep 21:06:59 - [info] Settings file  : /root/.node-red/settings.js
21 Sep 21:06:59 - [info] Context store  : 'default' [module=memory]
21 Sep 21:06:59 - [info] User directory : /root/.node-red
21 Sep 21:06:59 - [warn] Projects disabled : editorTheme.projects.enabled=false
21 Sep 21:06:59 - [info] Flows file     : /root/.node-red/flows.json
21 Sep 21:06:59 - [warn] 
 
---------------------------------------------------------------------


[App stop on Armadillo]を実行するとコンテナが終了します。
ここまでで動作確認が完了となります。

修正・改造

動作が想定と異なっていたために修正を行いたい、機能の追加・変更などを行いたい場合も、実機上のファイルではなくABOS DE内のファイルを変更します。
変更を行う対象によって反映の仕方が異なります。

    • アプリケーションの内容変更(appディレクトリ内のファイル)
    • [App run on Armadillo]操作の都度、最新のものがArmadilloに転送される
    • コンテナ起動設定の変更(confファイル)
    • [Generate development swu]を実行してswuファイルを書き込んで反映する
    • ただし、コンテナそのものには変更がないため、[Generate development swu]を実行の際にコンテナのビルドを省略できる
    • コンテナへのパッケージなどの追加・変更
    • [Generate development swu]を実行してswuファイルを書き込んで反映する