ブログ

Armadillo Base OS:MQTTブローカー兼サブスクライバーが動くコンテナ例(ABOSDEで作成)

at_kazutaka.bito
2025年5月19日 10時31分

Armadillo Base OSで、MQTTブローカーが動くコンテナ内でメッセージをサブスクリプトして、
受信したメッセージをコンテナ内で使用する例です。

 参考)MQTTブローカー、クライアント(Publish/Subscribe)を、個別に動かす場合は、下記を参照。
  Armadillo Base OS:MQTTブローカーが動くコンテナを作成(ABOSDEで作成)
  Armadillo Base OS:MQTTでパブリッシュするコンテナ例(ABOSDEで作成)
  Armadillo Base OS:MQTTでサブスクライブするコンテナ例(ABOSDEで作成)

以下、ABOSDE(備考を参照)のサンプルプロジェクトから、MQTTブローカー兼サブスクライバーが
動くコンテナを作成する手順になります。

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

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


手順1. 準備

Armadillo Base OS:開発手順・Tips集
【必須】①initial_setup
【任意】②ネットワーク設定
  設定は任意ですが、後述の動作確認のため、MQTT通信に使用するネットワークのIPアドレスを確認しておきます。
【任意】③拡張インターフェース設定
まで進めておきます。

手順2. サンプルプロジェクトにMQTTブローカーとMQTTクライアントを追加する

下記ブログの手順で「mqtt_brsub」という名前でコンテナを作成していきます。
Armadillo Base OS:アプリケーションの作り方
以下、上記ブログの内容について、ここでの「mqtt_brsub」コンテナ作成時の補足のみ記述します。
1.プロジェクト作成
 プロジェクト名は「mqtt_brsub」とし、「Shell New Project」でプロジェクト作成します。
 以降、上記ブログ内「example1」の表記は「mqtt_brsub」に読み替えてください。
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ブローカーとMQTTクライアントを動かすための
「mosquitto」「mosquitto-clients」パッケージを含めています。

bash
mosquitto
mosquitto-clients


app.conf
このファイルの全体を下記の内容に書き換えます。
ここでは、MQTTの接続にポート番号:1883(TCP)を使うことにします。
ホストOSの1883番ポートをコンテナ内の1883番ポートに転送する記述を含むコンフィギュレーションにします。
また、後述のサブスクライブ動作確認用に、「add_volumes /sys」によりLEDへのアクセス権限を付与しています。

set_image localhost/{{PROJECT}}:latest

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

# Allow MQTT port
add_ports 1883:1883

# 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

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

# Example: setting listen port(1883)
echo "listener 1883" >> /etc/mosquitto/mosquitto.conf

# When allow_anonymous false, setting username and password
echo "allow_anonymous false" >> /etc/mosquitto/mosquitto.conf
echo "password_file /etc/mosquitto/pwfile" >> /etc/mosquitto/mosquitto.conf

# Example: setting users(pub1, sub1)
echo -n > /etc/mosquitto/pwfile
echo "pub1:pub1pass" >> /etc/mosquitto/pwfile
echo "sub1:sub1pass" >> /etc/mosquitto/pwfile
mosquitto_passwd -U /etc/mosquitto/pwfile

# If Allow anonymous access, set allow_anonymous true
# echo "allow_anonymous true" >> /etc/mosquitto/mosquitto.conf

# Start MQRT broker
mosquitto -c /etc/mosquitto/mosquitto.conf &
sleep 5

# Sample: MQTT subscribe
mosquitto_sub -h localhost -p 1883 -t test1 -u sub1 -P sub1pass | while read line; do
  # Recive message output to console in container
  echo ${line}

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

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

MQTT関連の設定
 Listenポート番号:1883
 MQTTパブリッシャーのユーザー名: pub1
 MQTTパブリッシャー(pub1)のパスワード: pub1pass
 MQTTサブスクライバーのユーザー名: sub1
 MQTTサブスクライバー(sub1)のパスワード: sub1pass
 トピック名: test1

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

# Example: setting listen port(1883)
 Listenポート番号:1883

# When allow_anonymous false, setting username and password
 アクセスにユーザー、パスワードが必要な場合「allow_anonymous false」の設定です。

# Example: setting users(pub1, sub1)
 例として、アクセス可能なユーザーを下記のように設定します。
  ユーザー名:pub1、パスワード:pub1pass
  ユーザー名:sub1、パスワード:sub1pass
 注)ここでは簡易的に、パスワードをテキストから暗号化して設定ファイル(pwfile)を生成していますが、
  実運用では、予めパスワードが暗号化された設定ファイルを用意しておくことが望ましいです。


# If Allow anonymous access, set allow_anonymous true
 アクセスにユーザー、パスワードが不要にする場合は、
  # echo "allow_anonymous true" >> /etc/mosquitto/mosquitto.conf
 の行頭の#を外して
  echo "allow_anonymous true" >> /etc/mosquitto/mosquitto.conf
 にして、「allow_anonymous true」に設定します。

# Start MQRT broker
 MQTTブローカーを起動します。
 起動後、コンテナ内でサブスクライブを開始するまで5秒待ってます。

# Sample: MQTT subscribe
 下記の「mosquitto_sub」コマンドでMQTTブローカー(※)からサブスクライブしています。
  mosquitto_sub -h localhost -p 1883 -t test1 -u sub1 -P sub1pass
 ※)コンテナ内のMQTTブローカーであるため、ホスト名は「localhost」にしています。
   MQTTブローカー側で匿名ユーザーのアクセスを許可している(上述「allow_anonymous true」に設定した)場合
   は「-u sub1 -P sub1pass」の箇所は不要です

 このサンプルでは、「mosquitto_sub」コマンドをwhile文にパイプすることで、
 サブスクライブ毎に受信したメッセージをコンテナ内のコンソールに表示し、LEDを1秒点灯します。

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

Armadilloに書き込みが終了すると、自動的に再起動し、「mqtt_brsub」コンテナにより
上記main.shの記述に応じて、コンテナ内で起動しているMQTTブローカーからサブスクライブする状態になっています。

手順3. 動作確認

予め、MQTTブローカー(IPアドレス(※)、ポート:1883)が動作中、かつ、
同MQTTブローカーのトピック「test1」へのMQTTパブリッシャーを用意します。
※)手順1の②ネットワーク設定で確認したIPアドレス。

簡易的な確認方法(サブスクライブのタイミングのみ)
MQTTブローカー(IPアドレス(上記※と同じ)、ポート:1883)のトピック「test1」へ メッセージがパブリッシュされると、
コンテナ内で起動しているMQTTブローカーからサブスクライブしたタイミングでLED(※)を1秒点灯します。
※)# LED name depends on Armadilloで指定したLED

サブスクライブしたメッセージの確認方法
上記のmain.shでは、サブスクライブしたメッセージをコンテナ内のコンソールに表示しています。
そこで、 Armadillo Base OS:アプリケーションの作り方「6.デバッグ実行(任意)」の方法で
SSH接続してコンテナ内のコンソールのログを確認します。

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

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

MQTTパブリッシャーがパブリッシュしたメッセージと、SSH接続したコンソールのログ(サブスクライブしたメッセージ)で、
MQTT通信できていることが確認できます。