MQTTブローカーMosquittoを設置する

HomeKitを使う

今回はMQTTブローカーをインストールします。MQTTがあると、スイッチ、センサ、リレー、サーボモータなどを接続したArduinoのようなコンピュータを、ネットワーク越しにIP接続したい時にとても便利です。また、MQTTを使うスマートホーム向けサーバ、例えばZigbee2MQTTなどを使う場合にはMQTTブローカーが必須です。

先の記事では実験的に公衆MQTTサーバを使いました。でも外部から操作されては困るので、今回は自家用サーバを用意したいところです。そこで、Homebridgeがすでに動いているUbuntuコンピュータに、MosquittoというMQTTサーバをインストールします。Raspberry Piにも、これと同じ方法でインストールできます。(Raspberry Piに引っ越した記録は以下をご覧ください。)

MQTTのある暮らし

前回の復習です。MQTT (Message Queueing Telemetry Transport)は、短いメッセージを効率よく伝える用作られたIoT向きのプロトコルです。MQTTブローカーというサーバを一つ用意して、それにデータ送信側・受信側が接続します。送受信の双方は、あらかじめtopic(話題)を決めておいて、それについてのデータを送受信します。

下の図で説明します。データを送信したい側(壁スイッチ)は、topicに適当な名前(例えばswitch)をつけて、送りたいデータ(例えば文字列off)をmessageとしてpublishします。データを受信したい側(下の図ではコンピュータ)は、同じtopicを指定してsubscribeしておくと、送信側からのデータがmessageとして送られます。この仲介をするのがMQTTブローカーです。送信側は雑誌出版社、ブローカーは取次店、受信側は雑誌の定期購読者に例えられます。受け手が、興味のある雑誌 (topic) を定期購読 (subscribe) していると、新しい情報 (message) が届くという設定です。

subscribeするコンピュータでは、Pythonなどのプログラムを動かしておいても良いですし、Homebridgeなどのサーバを動かしておいても良いです。なので、MQTTブローカーが逸般の誤家庭で動いていると、スマートホームを構築する上で色々便利です。今回はオープンソースのMosquittoというMQTTブローカーをインストールします。一番よく使われる有名なブローカーソフトです。

Mosquittoをインストールする

MosquittoはWindowsにもmacOSにもインストール可能ですが、一般的にはRaspberry Pi OSやUbuntuなどのLinux系OSが多いかと思います。Homebridgeが動いているマシンにMosquittoもインストールしておけば、Homebridgeからはローカルマシンへのアクセスで利用できます。マシンの外から使わなければセキュリティ設定無しでも良いので簡単です。

Raspberry Pi OSやUbuntuなどには、aptコマンドでインストールできます。

sudo apt install mosquitto mosquitto-clients

これで終了ですので簡単です。MQTTブローカを起動するためには、

sudo systemctl start mosquitto

とします。止めるにはstartの代わりにstop, 再起動するにはrestartとします。なお、OS起動時に自動的にMQTTブローカが立ち上がるように設定するには、

sudo systemctl enable mosquitto.service

としておきます。これでMQTTブローカーが動きます。

動作確認

MQTTブローカをデフォルト設定で動作させた場合、ユーザアカウント、パスワード無しで動作します。また、このマシンの外部、つまりLAN上の他のマシンからの接続は受け付けない設定になります。動作の確認にはシェルコマンドのウィンドウを二つ開けて(Macからssh接続しているならターミナルウィンドウを2個開けてそれぞれssh接続します)、片方から以下のようにタイプします。

mosquitto_sub -h localhost -t test

mosquitto_subコマンドは、サブスクライブするコマンドです。-t引数でサブスクライブするタイプをtest、-h引数でブローカーのアドレスをlocalhostに指定してます。デフォルトではローカルからのアクセスしか許可されていないので、localhostを指定します。

別のシェルコマンドウィンドウから、以下のコマンドをタイプします。同じくMQTTブローカーに、タイプ名testで、helloというメッセージを送ってます。

mosquitto_pub -h localhost -t test -m hello

この結果、先のコマンドウィンドウに以下のようにhelloという文字が現れます。

mosquitto_sub -h localhost -t test
hello

このデフォルト設定では、ブローカーが動作しているコンピュータ外からの接続ができません。それでも、マルチタスクで動いているプログラム同士の通信ができます。例えばそのコンピュータでHomebridgeが動いていて、Homebridgeのプラグイン同士で通信する場合や、同じコンピュータ上の他のプログラムやデーモン同士で通信する場合はこれで十分です。ネットワークにデータが流れないので、セキュリティも万全です。

LANからのアクセス設定

コンピュータの外部からの接続を受け付けるためには、デフォルト設定に対して、追加設定が必要になります。LANからの匿名アクセスを受け付ける場合、 /etc/mosquitto/mosquitto.conf の最後に次の2行を追加します。

allow_anonymous true
listener 1883

listenerは受付ポート番号です。これを指定するとLANにある他のコンピュータからIPアドレスを指定しての接続が可能になります。allow_anonymousは匿名での接続を許可するかどうかの設定です。デフォルトがfalseですが、ここではtrue(匿名接続を許可)に設定しています。上の例ならば、他のマシンからも

mosquitto_sub -h 192.168.xxx.xxx -t test

というようにIPアドレスを指定してアクセスできるようになります。

ユーザ・パスワード設定

以上の設定で問題なく使用できます。さらにセキュリティを上げたい場合は、ユーザ名とパスワードを設定することもできます。その場合には、次のように記載します。

allow_anonymous false
password_file /etc/mosquitto/password.txt
listener 1883

allow_anonymousをfalseにすることで、ユーザ名なしでのアクセスを禁止します。password_fileで指定したpassword.txtというファイルは、ユーザと暗号化されたパスワードを記したファイルです。mosquitto_passwdコマンドで作成します。例えば、hogeというユーザを作りたければ、以下のようにコマンドを打てば、

% mosquitto_passwd -c passrowd.txt hoge
Password:

パスワードを聞いてきます。ここで希望するパスワードを入力して、確認すると、password.txtファイルが出来上がります。catコマンドで確認します。

% cat passrowd.txt
hoge:$7$101$4N8CFzbC9i/S4W8s$Ie0G4lQKKnBL3gIAx26JneOgrPXDsbW7bkeYJ9EsZlAMuuVvjaB2odl2jSeU9Jhi9jhqtmgPPuYnLp8FgDGyYw==

このように、ユーザ名、コロン、パスワード情報の行が出来上がるので、このテキストファイルを、/etc/mosquitto/以下に置きます。これでMQTTブローカを再起動すれば、

sudo systemctl restart mosquitto

パスワードを使うようになります。先ほどのmosquitto_subコマンドの場合、

mosquitto_sub -h 192.168.xxx.xxx -t test -u USER -P PASSWORD

というようにして、-uでユーザ名、-Pでパスワードを指定してアクセスします。

Macにインストールする

Mosquittoは、Linux系のOSだけでなく、WindowsやmacOSにもインストール可能です。WindowsやmacOSを24時間稼働のサーバとして使う人は少ないかもしれません。でも、mosquitto_subやmosquitto_pubなどのコマンドは、MQTTの状態をモニターするのにあると便利なので、ぜひインストールしておきたいです。macOSの場合は、homebrewを使って以下のようにインストールします。

brew install mosquitto

これでmosquitto_subとmosquitto_pubコマンドが使えるようになります。

NASにインストールする

QNAPやSynologyのNASを使っている場合でしたら、Homebridgeの時と同様にDockerを使ってNASにMosquittoをインストールするのも良いと思います。NASとして24時間稼働しているので、無駄になりません。QNAPの場合は、Container Stationからインストールします。下はHomebridgeとMosquittoがすでに稼働しているときのスクリーンショットです。新規に「作成」する際の検索窓にMosquittoと入れれば、Dockerイメージが見つかります。

Mosquittoを使ってLチカ

ではインストールしたMosquittoブローカーを使ってみます。前回作ったMQTT経由でLEDを点滅するESP32のプログラムを、新しくLAN内に設置したMoaquittoブローカーを使うように書き直します。そしてMacなどからmosquitto_pubコマンドでLEDを点滅させます。

変更すべき箇所は、MQTTの設定部分です。xxxはMosquittoをインストールしたコンピュータのIPアドレスに合わせておいてください。

const char  MQTTADD[] = "192.168.xxx.xxx"; //Broker addr
const short MQTTPORT = 1883; //Broker port
const char  MQTTUSER[] = "";//Can be omitted if not needed
const char  MQTTPASS[] = "";//Can be omitted if not needed
const char  SUBTOPIC[] = "espLED/seton"; //sub topic
const char  PUBTOPIC[] = "espLED/geton"; //pub topic
const char DBGTOPIC[] = "espLED/debug"; //debug topic

Topic名の始まりはespLEDにしました。分かり易ければなんでも良いです。Mosquittoでユーザとパスワードを設定しない場合は、上記のようにMQTTUSERとMQTTPASSを空にしておきます。設定してあればそれを書いておきます。こうして自宅MQTTブローカー向けに書き換えたプログラムを、コンパイルしてESP32にダウンロードします。シリアルモニターを見れば動作も確認できます。

一方で、Linux, Windows, MacなどからMosquittoのコマンドを使って操作します。

mosquitto_sub -h 192.168.xxx.xxx -t espLED/# -v

というコマンドを一つのコマンドシェルウィンドウから立ち上げておくと、動作を確認できて良いと思います。ESP32が起動した時から立ち上げてあれば、起動メッセージが見られます。

mosquitto_sub -h 192.168.xxx.xxx -t espLED/# -v
espLED/debug Connection established.

別のコマンドシェルからtrueやfalseをパブリッシュします。

mosquitto_pub -h 192.168.xxx.xxx -t espLED/seton -m true
mosquitto_pub -h 192.168.xxx.xxx -t espLED/seton -m false

するとLEDが点灯し、消灯するはずです。

モニターしているsubコマンドの方にも、以下のようにメッセージが現れるはずです。

mosquitto_sub -h 192.168.xxx.xxx -t espLED/# -v
espLED/debug Connection established.espLED/seton true
espLED/debug Message received.
espLED/geton true
espLED/seton false
espLED/debug Message received.
espLED/geton false

HomeKitからLチカする

前回の記事では、HomebridgeのHomebridge Mqttthingプラグインを使ってこのLEDをon/offしました。今回は、LAN内の新しいMosquittoブローカを使うように変更します。

公衆MQTTブローカーを指定していたHomebridgeのコンフィグを、以下のように変更して、今回設定したLAN内のMosquittoを使用するように設定します。

{
  "type": "lightbulb-OnOff",
  "name": "MQTT Light",
  "url": "mqtt://192.168.xxx.xxx:1883",
  "topics": {
    "getOn": "espLED/geton",
    "setOn": "espLED/seton"
  },
  "accessory": "mqttthing"
}

urlのxxxの部分は、Mosquittoブローカーのアドレスに合わせてください。Homebridgeが稼働している環境でMosquittoも動いているなら、”url”: “mqtt://localhost:1833″と設定しても良いです。これで保存、再起動すれば、iPhoneやMacのホーム.appからの操作で、LEDが点滅します。

   

まとめ

MQTTブローカーのMosquittoをサーバーにインストールして、これにESP 32を接続しました。前回の記事で紹介したLED点滅プログラムを、LAN内ブローカーを使う設定に変更して、Apple HomeKitからLEDを点滅させました。

MQTTはESP32からも、他のプログラム言語(例えばPython)からも使用できるので、Mqttthingプラグインと組み合わせてHomeKitと連携するDIYアクセサリを簡単に作成できます。これ以降の記事で紹介していきたいと思います。

コメント

タイトルとURLをコピーしました