Termux環境にMQTTブローカを導入

Mosquittoロゴ(mosquitto.orgより)

Mosquittoロゴ(mosquitto.orgより)

Android TV準拠ストリーミング・メディア・プレーヤAmigo 7xJPTermux環境を導入してある。これにMQTTブローカをインストールする。Eclipse MosquittoがAptパッケージとして用意されているのでインストールは簡単。SSHトンネルでLAN内のAmigo 7xJPに外部からアクセスできるようになっているので,これを利用してMQTTブローカが外部からアクセスできるようにする。

以前はなかったようだが,MQTTブローカアプリは今は存在する。比較してないが,そちらの方が楽だったかも?

デフォルトではローカルモードで起動し,ネットワークでのアクセスは不可。ネットワークモードで動作するときのデフォルトポートは1883

Mosquittoは他の同様なコマンドなら読みそうな起動時設定ファイルを読まない

Termux版Mosquittoに関して最大にひっかかったのは,mosquitto.conf ファイル(Termux版だと/data/data/com.termux/files/usr/etc/mosquitto/下)をデフォルトでは自動で読み込まないこと。-c オプションで明示的に指定し読み込ませる必要がある。-c オプションで指定しない場合,既存の/data/data/com.termux/files/usr/etc/mosquitto/mosquitto.confファイルを読む…と思ってしまうがそうではなく,単純にデフォルト値を使用するとのこと。TermuxのGithubで-c オプションを指定しない場合そのmosquitto.confファイルを読み込まないのはバグだとレポートしたが,それは上流での仕様であるとされた。通常期待される挙動ではなく大変紛らわしい。

Mosquittoのマニュアルと読むと以下のように書いてある

(-cオプションについて)If not given, then the broker will listen on port 1883 bound to the loopback interface, and the default values as described in mosquitto.conf(5) are used.

“…the default values as described in mosquitto.conf(5) are used.” は文意が明瞭ではなく,パッと見「mosquitto.confファイルに記述されたデフォルト値が使用される」の意にとれてしまうが,「マニュアル mosquitto.conf(5)に説明のあるデフォルト値」のつもりだった,ということのよう。

さらに, ~/.mosquitto ディレクトリ下に,mosquitto.conf, mosquitto.conf~, mosquitto-passwdの3つのファイルを発見した。TermuxのMosquittoのパッケージに含まれていて,インストールされたのかと思いきや,少なくとも最新の版ではそれはない。もちろんここのmosquitto.confが自動で読み込まれるわけでもない。自分がそのようなこれらファイルを作成した覚えはないのだが…。謎。

また,インストールされたMosquittoのバージョンは2.0.11だが, “Migrating from 1.x to 2.0 | Eclipse Mosquitto” にあるように,Mosquittoが1.xから2.0にバージョンアップした際,それまでデフォルトではネットワーク上のどこからも読み書きできるようだったのがそうでなくなったため,バージョン1.xを前提に書かれた資料の内容の一部は2.xにはそのまま当てはまらないので注意

公式レファレンス

ユーザ設定

3ユーザ

そもそもなぜMQTTサーバかというと, “一人暮らしの老人の見守りに対するアプローチ” に書いたようなことを実現するプロジェクトの一環。なので以下の3つのユーザを用意することにした。

  • 自分用 — 全てのトピック($SYS以下含め)の読み書き可
  • 読み書き用 — ある特定のトピック(specific_topic)以下の読み書きが可
  • 読み専用 — ある特定のトピック(specific_topic)以下の読みのみ可

自分用は管理者としてできることが全てできるように。上記のspecific_topicはこのご高齢者に関することだけを切り分けるために導入するもので,それ以下のトピックに対して読み書きができるアカウント,読むだけのアカウントの2種類を用意する。

パスワードファイル作成

Authentication methods | Eclipse Mosquitto” にいろいろなユーザ認証の方法が記載されているが,古典的なパスワードファイルを利用することにする。

パスワードファイル作成にはmosquitto_passwdコマンドを使用するが, “[Bug]: mosquitto_passwd Fails Because It Cannot Create A Temporary File · Issue #7357 · termux/termux-packages” に報告したような問題にぶち当たった。つまりユーザ名,パスワードを引数に与えると指定したパスワードファイルにエントリを追加する -b オプション,ハッシュされてない生パスワードを含めたパスワードファイルのパスワード部分だけハッシュされたものに置き換える -U オプション(既にパスワードがハッシュされたものを含んでいる場合それは再度ハッシュされてしまいそのアカウントは使えなくなる)では一時ファイルの作成に失敗するようで,”Error: Unable to open temporary file. Permission denied.” というエラーを吐く。

ところがユーザごとにパスワードファイルを作成する -c オプションは成功する。なのでユーザ3人ごとに別々のパスワードファイルを作成し,最後にそれを連結して全体のパスワードファイルを生成。

ACLファイル作成

mosquitto.conf man page | Eclipse Mosquitto” にACLファイルの記述のしかたのが記載されている。それを参照に現在以下のようにしている:

# for everybody else
topic deny #
#
user yasuro
topic readwrite #
topic read $SYS/#
#
user read-only-user
topic read specific-topic/#
#
user read-write-user
topic readwrite specific-topic/#

ユーザyasuroには$SYS以下のトピックを含め全てのトピックが閲覧できるようにしたかったが,topic readwrite #だけでは不十分なようで,topic read $SYS/#を追加する必要があった。

SSHトンネルを介した接続

基本的なユーザ認証が用意できたのでSSHトンネルを介してアクセスできるように。

残りの設定

Persistenceやtimeoutの配慮,logging。

その他

per_listener_settingsでリスナーごとの設定をすること

Quick Guide to The Mosquitto.conf File With Examples

Mosquitto Username and Password Authentication -Configuration and Testing

Understanding and Configuring Logging – Mosquitto Broker Configuration

Termux環境にMQTTブローカを導入」への4件のフィードバック

  1. ピンバック: Androidでブロードキャスト・インテントで受け取ったデータをMQTTブローカに伝達 | あくまで暫定措置としてのブログ
  2. ピンバック: MQTTブローカにpublishされた値をそのまま別のトピックでpublish | あくまで暫定措置としてのブログ
  3. ピンバック: 新LAN構成 | あくまで暫定措置としてのブログ
  4. ピンバック: ストリーミング・メディア・プレーヤAmigo 7xJPを使ってみて | あくまで暫定措置としてのブログ

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください