MQTTで遊ぶ(導入編)

MQTTとは

次のURL参照で(他力本願)

MQTT as a Service sango

ざっくり雑にまとめると、メッセージ配信に使用する軽量なプロトコルって感じでしょうか。

導入

MQTTを扱うサーバ(MQTTブローカーというらしい)は色々あるようですが、今回はVerneMQを使用します。 vernemq.com

パッケージをダウンロードしてインストール。

Download VerneMQ

今回はさくらのVPS上に導入しますのでRedHat用のパッケージを。
・・・なんですが、0.15.2のダウンロードリンクがなぜかsrc.rpmになっているのでURLを一部書き換える必要があります。(12/25現在)

設定

VerneMQの設定ファイルは次のところにあります。

  • /etc/vernemq/vernemq.conf

とりあえず動かすところを目標にしているので匿名ユーザーの接続をOKにします。
※実際にはVPN経由でしか繋がらない様にファイアウォールでポートふさいでいます。

allow_anonymous = on 

次に使用するポートの設定

listener.tcp.default = 0.0.0.0:1883
listener.ws.default = 0.0.0.0:8888

後は初期値のまま。

起動

sudo vernemq start

起動すると、ulimit -n の値が小さいと警告が出るので、値を変更して再起動。

  • /etc/security/limits.conf
vernemq          soft    nofile          65536
verne            hard    nofile          65536

※一時的に変更する場合は次のコマンドを実行

/sbin/sysctl -w fs.file-max = 65536

設定確認

次のコマンドを実行します。

sudo vmq-admin listener show
+------+-------+-------+-----+----------+---------+
| type |status |  ip   |port |mountpoint|max_conns|
+------+-------+-------+-----+----------+---------+
| vmq  |running|0.0.0.0|44053|          |  10000  |
|mqttws|running|0.0.0.0|8888 |          |  10000  |
| mqtt |running|0.0.0.0|1883 |          |  10000  |
+------+-------+-------+-----+----------+---------+

1883番と8888番ポートが開いて使えるようになりました。

動作確認

さくっと既製のクライアントを使用して動作を確認します。

Paho - Open Source messaging for M2M

ダウンロードしたファイルを解凍して起動します。

f:id:xyzplus:20161225201425j:plain

Connectionの設定

f:id:xyzplus:20161225201459j:plain

Server URIの欄は、tcp://IPアドレス:1883 と入力し、「Connect」ボタンをクリックして接続
StatusがConnectedになればOKです。

Subscriptionの設定

f:id:xyzplus:20161225201517j:plain

「+」ボタンをクリックすると図の様にTopicとQoSを入力できるようになります。
Topicは任意の値を入力(今回はtestにしました)、QoS0 - At Most Onceを選択し、「Subscribe」ボタンをクリックします。

左側のHistoryタブにSubscribedと出ればOKです。

f:id:xyzplus:20161225201543j:plain

メッセージの発行

では実際にメッセージを発行します。

f:id:xyzplus:20161225201612j:plain

TopicはSubscriptionで設定した値(test)を入力し、Messageに任意の文言を入力したら、「Publish」をクリックします。

f:id:xyzplus:20161225201624j:plain

History欄にPublishedとReceivedのメッセージが出ています。
(今回発行と購読が一緒のマシンなので両方出ます)

f:id:xyzplus:20161225201636j:plain

Last Message欄をみると、メッセージがちゃんと受信できています。

無事動作できているようです。
次回は実際にコード書いて同様の動きを試してみます。