MQTTブローカーのセットアップ


はじめに

このページは,

ドローン操作システムを作ろう

の1ページです.
全体を見たい場合は上記ページへお戻りください.

概要

ここでは,Ardupilot系ドローンの遠隔操作の手段として,MQTTを利用します.
MQTTについての詳細は他サイトに任せますが,
簡単に言うと近年流行しているIoTでよく使われているプロトコルです.

MQTTを選んだ理由は,

・PythonのMQTTライブラリがある.
・Pythonの辞書型,JSONライブリと相性が良い.
・JavaScriptのMQTTライブラリがある
・JavaScriptの連想型,JSONライブラリと相性が良い.

入口出口
すなわち,ドローン側のPythonと,操縦者のWebブラウザ(JavaScript)
との連絡性(簡単に通信プログラムがかけること)が良かったので採用しました.

準備するもの

今回はdronekit-sitlのために準備したUbuntu Linuxの入ったPCを利用します.
つまり,ローカルエリアだけの通信になります.

最終的には,インターネットに直結したLinuxサーバ(VPS,クラウド,自宅サーバでポート開放)を用意します.

MQTTの概略

MQTTでは,MQTTブローカーと呼ばれるサーバーを介してメッセージをやり取りします.
通信の方向は一方通行で,送信者であるpublisherと,受信者であるsubscriberが存在します(下図).

したがって,もしも1台のドローンが,
自分の情報を送信しつつ地上からのコマンドを受信したい場合には,
pulisherとsubscriberの両方になる必要があります(下図).

複数のpublisherやsubscriberがいる場合には,
トピックという,メッセージに付属したタイトルの様な文字列を使って,
自分の欲しいトピックを探します(下図).

上の図では,ドローンAがInfo1というトピック名のメッセージを投げました.
しかし,ドローンBが欲しいのはControl2というトピックなので,Info1は受け取りません.
Info1を欲しがっているのはコンピュータAなので,そちらにメッセージが流れます.
ドローンBの欲しいControl2は,コンピュータBが送信してくれました.

ブローカーは名前の通り仲買人で,
売りたい人(publisher)からデータを受け取り,買いたい人(subscriber)にを渡すのが仕事なのです.

MQTTブローカーの選定

MQTTのブローカーには様々な種類があります.

  • mosquitto
  • RabbitMQ
  • ActiveMQ
  • VerneMQ
  • Ponte

などなど

特別な処理エンジンを入れたり,Node.jsが必要だったりするブローカーは初心者には大変なので,
今回はシンプルに,最もインストールのしやすいmosquittoを使います.

このサイト1を参考にしました.
Raspberry Pi で mosquitto を使う
https://qiita.com/ekzemplaro/items/ab90dd630c3ad8e819ab

デバッグモードのコマンド-dは使いません.

ブローカーのインストール

更新があるといけないので,一応updateしておきましょう.

$sudo apt update

Mosquittoのインストールはaptで一発です.

$sudo apt install mosquitto

コマンドラインツールのインストール

ついでに,コマンドラインでMQTT通信を試せるツールもインストールしておきます.

$sudo apt install mosquitto-clients

コマンドラインでのテスト

先程インストールしたmosquitto-clientsを使用してテストします.

Sub側とPub側の2つのターミナル(端末)が必要ですので,開いておきます.
(SubscribeとかPublishとか長いので,Sub/Pubと短く書きます)

Subscriber(購読者)の起動

次のコマンドを打って,Sub側を待機させておきます.

$mosquitto_sub -h localhost -t drone/001

接続先のMQTTブローカーは自分自身(localhost,127.0.0.1)のPCです.
Subscribeするトピック名はdrone/001としました.
同トピック名を持つメッセージを誰かが投げると,勝手に受信してくれます.

Publisher(配信者)の起動

次のコマンドを打って,1回だけPubします.

mosquitto_pub -h localhost -t drone/001 -m "Hello Drone!"

こちらもMQTTブローカーは自分自身です.
トピック名をdrone/001として,同じにしないと届きません.
メッセージの中身は文字列でHello Drone!としました.

実行結果

mosquitto_sub側の端末に,Hello Drone!の文字が表示されます.

mosquitto_sub側の端末
$mosquitto_sub -h localhost -t drone/001
Hello Drone!

mosquitto_pub側を何度も実行すれば,Hello Drone!がたくさん表示されます.

また,mosquitto_pub側のトピック名をdrone/002などの別の名前に変えて実行してみてください.
sub側には届かないことが分かります.

おわりに

今回はMQTTのブローカーをセットアップし,コマンドラインで通信テストを行いました.
しかし,前もって用意されたコマンドを使っても,イマイチよくわかりませんね.

次回はPythonのプログラムで通信をしてみようと思います.


  1. Raspberry Pi で mosquitto を使う https://qiita.com/ekzemplaro/items/ab90dd630c3ad8e819ab