ブログ

Armadillo Base OS:MQTTブローカーが動くコンテナを作成(ABOSDEで作成)

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

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

bash
mosquitto


app.conf
このファイルの全体を下記の内容に書き換えます。
ここでは、MQTTの接続にポート番号:1883(TCP)を使うことにします。
ホストOSの1883番ポートをコンテナ内の1883番ポートに転送する記述を含むコンフィギュレーションにします。

set_image localhost/{{PROJECT}}:latest

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

add_ports 1883:1883

set_command bash /vol_app/src/main.sh


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

#!/bin/bash

# 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

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

# 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ブローカーを起動します。

 
以上のプロジェクトの編集が完了したら、ビルドしてArmadilloに書き込みます。
Armadillo Base OS:アプリケーションの作り方
4.コンテナのビルド
 「Generate development swu」を実行します。
5.アップデートでSWUファイル書き込み
 Armadilloに書き込みます。
上記によりArmadilloへの書き込みが終了すると、自動的に再起動して、「mqtt_br」コンテナにより
MQTTブローカーが起動している状態になります。

手順3. 動作確認

手順1で確認したMQTT通信に使用するネットワークのIPアドレスと接続可能なネットワークに
MQTTパブリッシャー/サブスクライバーを接続します。

備考)ArmadilloのIPアドレスは、コンソールからログインして「ip addr」コマンドで確認することもできます。
Armadillo-IoT ゲートウェイ G4製品マニュアル「6.16.2. IP アドレスの確認方法」を参照ください。

本手順で起動中のMQTTブローカー
 ホスト名:ArmadilloのIPアドレス
 ポート番号:1883
に対して、下記のいずれかのユーザー名、パスワード(※)
 ユーザー名:pub1、パスワード:pub1pass
 ユーザー名:sub1、パスワード:sub1pass
で、パブリッシュ/サブスクライブすることでMQTT通信することができます。

※)allow_anonymous false(上記main.shのまま)の場合、ユーザー名、パスワードは必要です。
 allow_anonymous true(上記main.shの該当箇所を改変)の場合、ユーザー名、パスワードは不要です。