Vagrant上のUbuntuにRabbitMQをたててMQTTをお試し

MQTTがだいぶ流行ってきている感がある今日この頃。 仕事上でもちょっと触る必要がでてきたのでちょっとメモっておきます。 MQTTについてはこちらの素晴らしい記事で確認して下さい。

今回はとりあえずちょっと試したいのでブローカーサーバーとしてRabbitMQを使うことにしました。

Vagrantの準備


Vagrantのインストールとか使い方は至る所に記事が転がっているのでそちらを参照して下さい。

とりあえず今回はHashicorpが提供しているubuntu/trusty64を使っています。

あと、同一ネットワーク内の様々な機器からアクセスしたいのでVagrantのネットワーク設定はPublic Networkにしておきます。

私はMacWi-Fiで接続しているので以下のような設定をVagrantfileに追加しておきます。

config.vm.network "public_network", :bridge => "en0: Wi-Fi (AirPort)"

あとはいつもどおり、vagrant upvagrant sshでサーバーに接続しましょう。

RabbitMQのインストール


細かいことは公式ページに書いてあるのでこちらを見ればいけるかと思います。

私の行った作業をメモがてら残しておきます。

まず、RabbitMQのインストール。

sudo apt-get install rabbitmq-server

次にMQTTの有効化。

sudo rabbitmq-plugins enable rabbitmq_mqtt

実行結果。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo rabbitmq-plugins enable rabbitmq_mqtt
The following plugins have been enabled:
  amqp_client
  rabbitmq_mqtt
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.

Webインターフェイスの有効化。

sudo rabbitmq-plugins enable rabbitmq_management

実行結果。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo rabbitmq-plugins enable rabbitmq_management
The following plugins have been enabled:
  mochiweb
  webmachine
  rabbitmq_web_dispatch
  rabbitmq_management_agent
  rabbitmq_management
Plugin configuration has changed. Restart RabbitMQ for changes to take effect.

RabbitMQ Serverをリスタートします。

sudo /etc/init.d/rabbitmq-server restart

起動しているか確認しましょう。 Erlang/OTPのプロセスはbeamで動きます。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo netstat -anp | grep beam
tcp        0      0 0.0.0.0:15672           0.0.0.0:*               LISTEN      2328/beam
tcp        0      0 0.0.0.0:55672           0.0.0.0:*               LISTEN      2328/beam
tcp        0      0 0.0.0.0:47761           0.0.0.0:*               LISTEN      2328/beam
tcp        0      0 127.0.0.1:34940         127.0.0.1:4369          ESTABLISHED 2328/beam
tcp6       0      0 :::1883                 :::*                    LISTEN      2328/beam
tcp6       0      0 :::5672                 :::*                    LISTEN      2328/beam

動いていますね。

1833ポートがMQTT、15672ポートがWebインターフェイスとなります。

ホスト側からWebインターフェイスにアクセスしてみましょう。

f:id:braitom:20150513145007p:plain

繋がりますね。

初期アカウントはguest/guestとなります。

f:id:braitom:20150513145011p:plain

コンソールに入れました。

これでインストールは完了です。

ブローカーサーバーに繋いでみる


さてRabbitMQが立ち上がったのでMQTTで接続してみましょう。

せっかくなのでiPhone6から使える気圧センサーの情報をPublishしてみることにします。 Subscribe側はどこでも動くように今回はPythonで書いてみます。

Publish側(iOS)

今の時代はSwiftなのでSwiftで実装します。 MQTTライブラリとして以下を使用します。

コードは以下にありますのでご確認下さい。

実際にPublishしているのはこの部分です。

self.mqttClient.publishString("\(currentTime): \(pressure)", topic: "test/iOS", qos: 0, retain: false)

Topic名は、”test/iOS"、QoSは0(最高1回。届くかは保証しない。)、Retain(メッセージをMQTTサーバーが保持)はfalseにしてあります。

Subscribe側(Python)

ライブラリは以下を使用します。有名なやつですね。

pipでサクッといれましょう。

pip install paho-mqtt

コードはこんな感じになります。サンプルなのでただコンソールに出力するだけです。

MQTT subscribe sample

ポイントとしてはsubscribeするTopic名(今回は、"test/iOS")をPublish側と合わせることくらいですかね。

実行

まずSubscribe側を実行しておきましょう。

$ python subscribe_mqtt.py
Connected with result code 0

これでブローカーサーバーに繋がりSubscribeの準備はできています。

次に、Publish側を起動しましょう。

これで気圧情報をガンガンPublishし始めます。

f:id:braitom:20150515170104p:plain

Subscribe側を見ると情報が届いているのを確認できるかと思います。

f:id:braitom:20150515165931p:plain

まとめ


このように比較的簡単にMQTTをお試しすることができました。 MQTTを実際に使うには、切断検知や再接続方法、セキュリティ等を使用用途によって考えなければなりませんが、なかなかシンプルで良いプロトコルだと思います。 今後も情報集めていきたいですねー。