ブログ

Armadillo Base OS:MQTTでパブリッシュするコンテナ例(ABOSDEで作成)

at_kazutaka.bito
2025年4月21日 11時35分

Armadillo Base OSで、MQTTでパブリッシュするコンテナを作成をしてみます。
 参考)MQTTブローカーを動かす、または、MQTTでサブスクライブする場合は、下記を参照。
  Armadillo Base OS:MQTTブローカーが動くコンテナを作成(ABOSDEで作成)
  Armadillo Base OS:MQTTでサブスクライブするコンテナ例(ABOSDEで作成)

以下、ABOSDE(備考を参照)のサンプルプロジェクトから作成する手順になります。

備考)Armadillo Base OS対応製品のアプリケーション開発にあたっては、VSCode上の開発環境として
ABOSDE(※)が用意されています。
※)ABOSDE:Armadillo Base OS Development Environmetの略称

ABOSDEには、C言語/Python/Shell/GUI等、プログラミング言語や機能に応じたサンプルプロジェクトがあります。
これらのサンプルプロジェクトをベースに、ユーザー独自のアプリケーション開発が始められます。


手順1. 準備

Armadillo Base OS:開発手順・Tips集
【必須】①initial_setup
【任意】②ネットワーク設定
【任意】③拡張インターフェース設定
まで進めておきます。

手順2. MQTTでパブリッシュするコンテナ作成

下記ブログの手順で「mqtt_pub」という名前でコンテナを作成していきます。
Armadillo Base OS:アプリケーションの作り方
以下、上記ブログの内容について、ここでの「mqtt_pub」コンテナ作成時の補足のみ記述します。
1.プロジェクト作成
 プロジェクト名は「mqtt_pub」とし、「Shell New Project」でプロジェクト作成します。
 以降、上記ブログ内「example1」の表記は「mqtt_pub」に読み替えてください。
2.SSH接続設定を行う(任意)
 当該ブログでは「任意」ですが、ここでは、コンテナ内の動作確認用にSSH接続するように設定します。

3.アプリケーションコンテナ作成
プロジェクトの記述(下記、赤枠アイコンで展開した赤線のファイル)を書き換えます。


Dockerfile
このファイルの全体を下記の内容に書き換え、Alpine Linuxコンテナを作成するようにします。
(MQTTクライアントを動かすだけなので、軽量なAlpine Linuxを使うことにしました。)

ARG ARCH
FROM docker.io/${ARCH}/alpine:latest
LABEL version="2.0.0"

# Add apt download source information
COPY resources/etc/apt /etc/apt/

ARG PACKAGES
RUN apk update && apk upgrade  \
    && apk add ${PACKAGES} \
    && apk cache clean

ARG PRODUCT
COPY resources [r]esources_${PRODUCT} /


packages.txt
このファイルの全体を下記の内容に書き換えます。
デフォルトで記述されている「bash」に加え、MQTTクライアントを動かすための
「mosquitto-clients」パッケージを含めています。

bash
mosquitto-clients


app.conf
このファイルの全体を下記の内容に書き換えます。
補足)ここでは、後述の動作確認用に、「add_volumes /sys」によりLEDへのアクセス権限を付与しています。

set_image localhost/{{PROJECT}}:latest

add_volumes /var/app/rollback/volumes/{{PROJECT}}:/vol_app
add_volumes /var/app/volumes/{{PROJECT}}:/vol_data

# Allow input to containers and see output from containers
add_args -it

# Allow LED
add_volumes /sys

set_command bash /vol_app/src/main.sh


main.sh
このファイルの全体をMQTTでパブリッシュするアプリケーション(※)に書き換えます。
※)本例の説明は後述。

#!/bin/bash

# MQTT broker information
MQTT_HOST="192.168.1.10"
MQTT_PORT="1883"
MQTT_TOPIC="test1"
MQTT_USER="pub1"
MQTT_PASS="pub1pass"

#LED name depends on Armadillo (The bellow means the Armadillo-640's red LED.)
LED=/sys/class/leds/red

# Sample: MQTT publish
while :
do
  # Message: The result of date command
  MESSAGE=`date`

  # MQTT: publish
  mosquitto_pub -h $MQTT_HOST -p $MQTT_PORT -t $MQTT_TOPIC -m "$MESSAGE" -u $MQTT_USER -P $MQTT_PASS

  # Send message output to console in container
  echo ${MESSAGE}

  # LED control
  echo 1 > $LED/brightness
  sleep 1 
  echo 0 > $LED/brightness

  # sleep 0-9 seconds (random)
  SEC=`shuf -i 0-9 -n 1`
  sleep $SEC
done

上記のmain.shは、下記のように動作する例になっています。

# MQTT broker information
 アクセス先のMQTTブローカー(ここでは、下記を想定)に応じて設定します。
  ホスト名:192.168.1.10
  ポート:1883
  トピック:test1
  許可しているユーザー(※):pub1
  上記ユーザーのパスワード(※):pub1pass
  ※)MQTTブローカー側が匿名ユーザーのアクセスを許可している場合は不要です。

# LED name depends on Armadillo (The bellow means the Armadillo-640's red LED.)
 動作確認用LEDのデバイスファイルを指定しています。
 ※)「$LED」の設定は製品によって異なります。ここでは、Armadillo-640の赤LEDを使う場合です。
  他の製品を使う場合は、各製品マニュアルのLEDのデバイスファイル名を参考に「$LED」を設定ください。

# Sample: MQTT publish
 このサンプルでは、1~10秒(ランダム)毎にMQTTでパブリッシュしています。
 パブリッシュするメッセージ(MESSAGE)は、dateコマンドの実行結果にしています。

 下記の「mosquitto_pub」コマンドでMQTTブローカー(※)へメッセージをパブリッシュしています。
  mosquitto_pub -h $MQTT_HOST -p $MQTT_PORT -t $MQTT_TOPIC -m "$MESSAGE"
    -u $MQTT_USER -P $MQTT_PASS

 ※)上記# MQTT broker informationの箇所で設定したMQTTブローカー
   MQTTブローカー側で匿名ユーザーのアクセスを許可している場合は「-u $MQTT_USER -P $MQTT_PASS」
   の箇所は不要です。

 「mosquitto_pub」コマンドを実行後、パブリッシュ毎に送信したメッセージをコンテナ内のコンソールに表示し、
 LEDを1秒点灯、0~9秒(ランダム)スリープ、を繰り返します。

 
以上のプロジェクトの編集が完了したら、ビルドしてArmadilloに書き込みます。
Armadillo Base OS:アプリケーションの作り方
4.コンテナのビルド
 「Generate development swu」を実行します。
5.アップデートでSWUファイル書き込み
を実施します。

Armadilloに書き込みが終了すると、自動的に再起動し、「mqtt_pub」コンテナにより
上記main.shの記述に応じて、MQTTブローカーにパブリッシュしている状態になっています。

手順3. 動作確認

MQTTサブスクライバー側での確認方法
予め、MQTTブローカー(IPアドレス:192.168.1.10、ポート:1883)が動作中、かつ、
MQTTサブスクライバーが同MQTTブローカーのトピック「test1」をサブスクライブしている場合、
MQTTサブスクライバーは、ArmadilloがMQTTでパブリッシュした日付(※)を受信します。
※)1~10秒(ランダム)毎のdateコマンドの実行結果

Armadillo側の動作確認方法
Armadilloは、MQTTでパブリッシュしたタイミングでLED(※)を1秒点灯します。
※)# LED name depends on Armadilloで指定したLED

また、 Armadillo Base OS:アプリケーションの作り方「6.デバッグ実行(任意)」の方法で
パブリッシュしたメッセージを確認できます。

「mqtt_pub」プロジェクトが開いている状態(手順2の直後のまま)で、
6.デバッグ実行(任意)
に記載の通り、下記を実行します。
 1.App stop on Armadillo でコンテナを停止
 2.App run on Armadillo でコンテナを起動

App run on Armadillo を実行するとVScodeのコンソールにログが表示されるようになります。

「mqtt_pub」コンテナで、1~10秒(ランダム)毎にパブリッシュした日付(dateコマンドの実行結果)が表示されます。

このログの日付と、MQTTサブスクライバーが受信したメッセージ内の日付が一致していると、
ArmadilloからMQTTでパブリッシュしたメッセージが、MQTTサブスクライバーに 届いていることの確認になります。