爆速でMQTTのパブリックBroker環境を作る方法、Raspberry Pi からアクセスできる各種パブリッククラウドの比較

2018年2月11日

Raspberry Piを使った電子工作を進めていて、MQTTを使ってインターネット経由の通信をやりたい! と思ってあれこれ調べた情報のまとめです。

やりたいこと

MQTTのBrokerをグローバルIPでアクセスできる所に置いて自宅のローカルネットワーク環境を超えて通信を行うこと。

例えば、

  • センサーノードから計測値を集める
  • メッセージを別の端末にほぼリアルタイムで送信する
  • 大量のノードに対して一斉にメッセージを送る
  • 遠隔でロボットに指令を与える

などなど。

結論から先に言うと、「HEROKUのアドイン「CloudMQTT」を使う方法」が最速で最も簡単でした!

※ラズパイコンテスト2017応募作品に使用した要素技術の1つです。

ちなみに、MQTTって何?という方は、以下のサイトが参考になると思います。

・MQTTとは、IoT時代の通信プロトコル
https://kfep.jp/solution/iot-mqtt/mqtt
・IoT時代を支えるプロトコル「MQTT」(前編)
https://codezine.jp/article/detail/8000
・MQTT とはなんだったのか
https://gist.github.com/voluntas/e0a90f3e22316144ed3a

MQTTのBrokerを準備する

仕様書を読んで、自分で実装、、、なんて事はしていられないので、各種オープンソースを利用します。

Mosquitto

Open Source の MQTT v3.1/v3.1.1 Brokerで、よくいろんなサイトで紹介されています。
https://mosquitto.org

サイトからダウンロードしてきてもいいですし、apt-getとかyumなどのパッケージマネージャーを使ってインストールすることもできます。

Meshblu

Octblu社が提供しているBroker。
MQTTだけではなく、HTTPやWebsocketなどなど複数のプロトコルを扱えます。npmでさくっとインストールできるようです。
https://meshblu-mqtt.readme.io

最新版はgithubから
https://github.com/octoblu/meshblu

MQTT Broker用パブリッククラウドの比較

MQTT Brokerをグローバルに使うために以下の方法を検討しました。
※実際に動かしたのは、IDCFクラウドと、HEROKUです。

IDCFクラウド

日本語でMQTT ブローカーのサービスを探すとこの記事が多く見つかり、1ヶ月無料枠があったため最初に使ってみました。Docker composeで簡単にMeshbluの環境が構築されMQTTが使用可能になります。

大まかな手順(一部コマンドラインの操作が必要)

  1. IDCFのアカウント作成
  2. 仮想サーバー作成
  3. ファイアウォールの設定
  4. ポートフォワーディングの設定
  5. SSHの秘密鍵を登録
  6. SSHでログインして、適当なフォルダにMeshbluをclone
  7. Docker composeでサービスを起動
  8. Meshbluのデバイスを作成(アカウントのようなもの。trigger ×5、action ×5、owner ×1の計11個)

所感

  • 基本的にはtrigger-xがPublishして、action-xがSubscribeするというメッセージの流れになっています。(なのですが、どれからどれでもPub/Subできるようです。設定によるらしい。。。)
  • 複数の端末やプロセスから同じデバイスのtokenでSubscribeすると、同じメッセージが繰り返し受信されました。
  • IDCFチャンネルに登録して、myThingsに接続するとまた色々広がりが出てきます。
    最小構成で月額500円。
  • まだDockerに慣れていない事もあり、デバイス(trigger/action)の数を増やす方法がわからりませんでした(汗。拡張するにはもう少し勉強が必要です。

HEROKU《1番簡単!》

アドオンのCloudMQTTであっという間に設置可能でした。10 台までなら無料で使えます。現在のシステムはこちらで動いています。

英語サイトですが、実行手順は驚くほど少ないので初心者にもオススメです。
https://www.heroku.com/

大まかな手順(全てGUI上で操作が完結します。)

  1. HROKUのアカウントを作成
  2. 新しいプロジェクトを作成
  3. アドオンを検索し、CloudMQTTを追加する(無料版「Cute Cat」を選択。無料ですが、クレジットカードなどの支払方法の設定が必要です。)
  4. 登録されたアドオンを開いて、サーバー情報(ホスト名、ポートアドレスなど)を確認
  5. 必要に応じて接続用のアカウント・パスワードとトピックを作成。Read/Writeの権限を与える。

所感

  • 超絶簡単。数分でサービスが使えるようになった!
  • PaaSの凄さを実感

CloudMQTTは、それ単体としてもサービスが展開されているようです。
https://www.cloudmqtt.com

Beebotte

Cloud Platform as a Serviceで、小規模なら無料で、無料枠も比較的大きいサービスです。前出のサービスで事足りたので詳しくは追っていませんが、規模を少し広げようとする場合には候補になるかもしれません。
https://beebotte.com

無料枠(XS)はこんな感じです。チャンネル数無制限は大きい!

  • Free
  • Unlimited  Channels
  • 50,000  Messages/day
  • 5,000  Persistent Messages/day
  • 3 Months  History
  • SSL Encryption

所感

  • センサデータを高頻度で送るとか、大量のデバイスからの情報を集めるとかでなければ、かなり使えるんじゃないでしょうか。

 

AWS IoT、IBM Bluemix

実施例の情報が少なく、手順も比較的多いので見送りました。

個人の趣味で使用するには若干敷居が高く感じます(理解しなければいけない概念が多いという観点で)

ローカルネットワークで試したmosquittoのBrokerをAWS IoTにブリッジするという使い方もあるようです。

今回調べていてようやく知ったのですが、IBMのBluemix IoTサービスはMQTTで支えられているとのこと。

レンタルサーバー

全てゼロから環境を構築する方法です。
VPSなどでサーバーを準備して、OSを入れて、セキュリティ対策を施して、MQTT Brokerを入れて、、、

初心者には絶対オススメしない方法です!

※既に自由に使えるサーバーを持っていてスキルがある人は良いかもです。

この方法は設置に手間がかかる上、サイト運営に使用しているサーバーではポートが使えず断念しました。

自宅サーバー

サーバー費用などが不要なので空いてるラズパイがあればやってみても良いかもしれません。

ローカルネットワークでテストしたモノをそのまま活かせます。

グローバルIPを持っていない人もダイナミックDNSを使えばいけます。

ただ、セキュリティ的にとっても不安なので、よほどでなければパブリッククラウドを使う事をオススメします。

まとめ

各種パブリッククラウドで実現する方法+αを検討しました。初めはあまり見つけられなかったのですが、キーワードがわかってきて色々探してみると、実にたくさんのサービスがあることがわかりました。

こういった事に取り組む上で、情報を公開してくださっている先駆者の皆様の情報は本当にありがたいと思いました!

使用事例なども今後アップしていきたいと思います。

 

スペシャルサンクス

HEROKUのCloudMQTTを知る事になったブログ。まさに渡りに船の情報でした!
MQTTでドローンの自動操縦を考える(1)

IDCFクラウドを使ったMQTTの設定方法に関する情報。
IDCFクラウドを使ってMeshblu環境を最速で準備する
myThingsをはじめよう:サーバーの準備・認証