Vagrant上のUbuntuにRabbitMQをたててMQTTをお試し
MQTTがだいぶ流行ってきている感がある今日この頃。 仕事上でもちょっと触る必要がでてきたのでちょっとメモっておきます。 MQTTについてはこちらの素晴らしい記事で確認して下さい。
今回はとりあえずちょっと試したいのでブローカーサーバーとしてRabbitMQを使うことにしました。
Vagrantの準備
Vagrantのインストールとか使い方は至る所に記事が転がっているのでそちらを参照して下さい。
とりあえず今回はHashicorpが提供しているubuntu/trusty64を使っています。
あと、同一ネットワーク内の様々な機器からアクセスしたいのでVagrantのネットワーク設定はPublic Networkにしておきます。
私はMacをWi-Fiで接続しているので以下のような設定をVagrantfileに追加しておきます。
config.vm.network "public_network", :bridge => "en0: Wi-Fi (AirPort)"
あとはいつもどおり、vagrant up
、vagrant 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インターフェイスにアクセスしてみましょう。
繋がりますね。
初期アカウントはguest/guestとなります。
コンソールに入れました。
これでインストールは完了です。
ブローカーサーバーに繋いでみる
さて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
コードはこんな感じになります。サンプルなのでただコンソールに出力するだけです。
ポイントとしてはsubscribeするTopic名(今回は、"test/iOS")をPublish側と合わせることくらいですかね。
実行
まずSubscribe側を実行しておきましょう。
$ python subscribe_mqtt.py Connected with result code 0
これでブローカーサーバーに繋がりSubscribeの準備はできています。
次に、Publish側を起動しましょう。
これで気圧情報をガンガンPublishし始めます。
Subscribe側を見ると情報が届いているのを確認できるかと思います。
まとめ
このように比較的簡単にMQTTをお試しすることができました。 MQTTを実際に使うには、切断検知や再接続方法、セキュリティ等を使用用途によって考えなければなりませんが、なかなかシンプルで良いプロトコルだと思います。 今後も情報集めていきたいですねー。