2015年2月21日土曜日

CloudMQTTを使ってみた

概要

MQTT as a Service であるCloudMQTTを使ってみました
サインアップからRubyでのサンプルの動作まで実施してみました
あと最後に軽く考察しています

環境

  • CloudMQTT 2015/02/20時点
  • CentOS 6.6 64bit (Final)
  • Ruby 2.2.0

試す

サインアップ

まずはサインアップします
CloudMQTTのサイトトップにアクセスして右上のメニューの「Control Panel」をクリックします
home.png

ログイン or サインアップする画面になるので「Sign Up」側にメールアドレスを入力します
signup.png
メールアドレスを入力して「Sign Up」をクリックするとサインアップ用のURLが記載されたメールがくるのでURLにアクセスしてサインアップします

サインアップ画面では

  • E-mail
  • Company name
  • Address
  • Country
  • Password
  • Confirm password

の項目が必須になります
input_account_info.png

入力が完了したら「Submit」をクリックしてサインアップを完了しましょう

インスタンス作成

インスタンスと呼ばれるMQTTの器を作成します
インスタンスにはプランがあり無料から$299の有料版まで全4プランがあります
今回は無料プランの「Cute Cat」のインスタンスを作成します

Control Panelからインスタンスを作成します
「+Create」ボタンがあるのでクリックします

インスタンス情報を入力する画面に遷移するので必要な情報を入力してインスタンスを作成します
input_instance_info.png

  • Name・・・好きなインスタンス名を入力してください
  • Data Center・・・Northern Virginia と Ireland の2つから選択できます、どちらでもOKです
  • Plan・・・今回は「Cute Cat」を選択します

必要な情報が入力できたら「Create」をクリックしてインスタンスを作成しましょう

Control Panelに戻ると作成したインスタンスが存在することが確認できると思います
list.png

「Details」をクリックするとインスタンスの詳細を確認することができます
ここにMQTTに接続するための情報(アクセスポイントやID/PW)が記載されてます

Rubyから呼び出してみる

さて、作成したインスタンスに対してMQTTプロトコルでアクセスしてメッセージのpublishとsubscribeを実施してみたいと思います
CloudMQTTはpublisherとsubscriberのためのSDKが充実しており様々なプログラム言語やPaaSサービス(HerokuやAmazon Kinesis)からCloudMQTTにアクセスすることができるようになっています
今回はCentOS上にインストールしたRubyからCloudMQTTにアクセスしてみたいと思います

必要なGemのインストール

gem install mqtt

CloudMQTTが用意しているGemではなく既存のMQTTライブラリを使うことでアクセスすることができます

Publisher

Publisherのソースコードは以下のとおりです

  • publisher.rb
require 'mqtt'
require 'uri'

# Create a hash with the connection parameters from the URL
uri = URI.parse ENV['CLOUDMQTT_URL'] || 'Please input your MQTT URL'
conn_opts = {
  remote_host: uri.host,
  remote_port: uri.port,
  username: uri.user,
  password: uri.password,
}

MQTT::Client.connect(conn_opts) do |c|
  # publish a message to the topic 'test'
  c.publish('test', 'Hello World')
  sleep 1
end

testというトピックに対して1つのメッセージを送信します
uri = URI.parse ENV['CLOUDMQTT_URL'] || 'Please input your MQTT URL'
でアクセスするURLを指定しています
環境変数のCLOUDMQTT_URLにアクセスするURLをセットしてrubyを実行するかPlease input your MQTT URLにControl Panelに表示されているURLの部分を貼り付けてもOKです

Subscriber

subscriberのソースコードは以下のとおりです

  • subscriber.rb
require 'mqtt'
require 'uri'

# Create a hash with the connection parameters from the URL
uri = URI.parse ENV['CLOUDMQTT_URL'] || 'Please input your MQTT URL'
conn_opts = {
  remote_host: uri.host,
  remote_port: uri.port,
  username: uri.user,
  password: uri.password,
}

MQTT::Client.connect(conn_opts) do |c|
  # The block will be called when you messages arrive to the topic
  loop do
    c.get('test') do |topic, message|
      puts "#{topic}: #{message}"
    end
  end
end

Subscriberは無限ループしてtestというトピックに入ってきたメッセージを常に取得するようにします
アクセスURLに関してはpubliser.rbのときと同じです

実行してみる

まず先にsubscriber.rbを起動します
無限ループになるのでターミナルは返ってこないと思います

次にpublisher.rbを実行します
すると先に起動させておいたsubscriber.rbのターミナルの方にpublishしたメッセージの情報が表示されると思います

[root@localhost cloud_mqtt]$ ruby subscriber.rb
test: Hello World
test: Hello World

...

subscriber.rbを終了する場合はCtrl+cでOKです

その他Tips

CloudMQTTには他にも便利な機能があります

「Users and ACL」はトピックに対してアクセス制限を設けることが出来る機能で例えばAというユーザはtestというトピックに対してはsubscribeしかできないなどの設定ができます
作成したユーザを使用する場合はアクセスURLに記載されているID:PWの部分を変更すればOKです

mqtt://ID:PW@m11.cloudmqtt.com:11111

実際に試してみるとわかりますが、例えば「Read Access」のみにした場合はpublishできなくなります
Rubyスクリプトで試した場合の挙動ですが特にエラーは返却されずメッセージが投入されずに終了しました

「bridge」という機能は他のMQTTサービスにメッセージを転送する機能です
CloudMQTT側のあるトピックにきたメッセージをリモート側の指定したトピックに転送できます
ちょっとこの機能は詳細に試せていないので説明に自信がないです、すいません

あとは「Amazon Kinesis」という機能があり、おそらくこれもCloudMQTTで受け取ったメッセージをKinesisに転送できる機能かと思います

などなど様々な機能が用意されています

最後に

CloudMQTTは無料で使える割には機能が充実していると感じました
ただ無料プランは最大が10同時接続で転送量が10 Kbit/sなので公開するサービスで使うにはちょっとスペック的に厳しいかなと思います
今回みたいに試してみるだけならぴったりだと思います

CloudMQTTは非常にユーザフレンドリーに作られているような気がしました
機能も多いしドキュメントも充実しているし、導入のハードルも低いです
他のPaaSサービスとのシナジーもちゃんと考えられているのも素晴らしいと思います

あとインスタンスのステータスを確認できる画面があり、そこで裏側の情報も見れたのですが、どうやらCloudMQTTはmosquittoというオープンソースのMQTTブローカーを利用しているようです
instance_status.png

参考サイト

0 件のコメント:

コメントを投稿