2015年1月15日木曜日

MQTT as a Serviceの「sango」を使ってみた

sango_logo

概要

MQTT as a Serviceであるsangoを使ってみました
MQTTとは非常に軽量なメッセージングプロトコルでIoTやM2Mといったコンテキストで最近聞かれるようになりました
技術自体は1999年にスタートしており歴史があります
ここではMQTTに関しては詳しい説明はしませんがWeb上に多くの情報があるので興味のある方は調べてみてください

sangoはMQTTを簡単に使うことができるサービスです
今回はサービスの登録から簡単なメッセージのやり取りができるRubyのサンプルまでを紹介します

環境

  • Mac OX X 10.8.5
  • Ruby 2.1.2p95 (クライアント)
  • ruby-mqtt 0.3.1 (クライアント)
  • sango 2015/1/15時点

サービス登録

まずはサービスサイトにアクセスします
アクセスすると「新規登録/ログイン」というボタンがあるのでクリックします
するとGithubアカウントでサインアップするように求められるのでGithubのアカウントを使ってサインアップします
(当たり前ですがGithubアカウントがない場合は作成しておいてください)

ログインするとsangoのダッシュボードにアクセスします
アクセスするとMQTTのbroker(サーバ)情報が表示されていると思います
dashboard.png

これでもうMQTTを使うための準備は整いました
トピックとかWebSocketとかいろいろと気になるワードもありますがまずは使ってみます

サンプルクライアントの作成と実行

gemのインストール

gem コマンドでインストールします

gem install mqtt

無事インストールできればOKです

サンプルクライアント

pub_sango.rbとsub_sango.rbという2つのスクリプトを作成します
publish(メッセージ送信)をpub_sango.rbで実行しsubscribe(メッセージ受信)をsub_sango.rbで実行します
まずはサンプル全体です

  • pub_sango.rb
require 'mqtt'

MQTT::Client.connect(
                     :host => 'lite.mqtt.shiguredo.jp',
                     :port => 1883,
                     :username => 'Please input your username',
                     :password => 'Please input your password') do |c|
  c.publish('Please input your topic', 'message')
end
  • sub_sango.rb
require 'mqtt'

MQTT::Client.connect(
                     :host => 'lite.mqtt.shiguredo.jp',
                     :port => 1883,
                     :username => 'Please input your username',
                     :password => 'Please input your password') do |c|
    # If you pass a block to the get method, then it will loop
    c.get('Please input your topic') do |topic,message|
    puts "#{topic}: #{message}"
  end
end

ポイントを説明します

sangoへの接続

まずsangoにコネクションするときに「host」「port」「username」「password」を指定する必要があります
これらはsangoのダッシュボードで確認することができ、それぞれ

  • host・・・ダッシュボードの接続先のホスト名の部分を入力
  • port・・・ダッシュボードの接続先のポート部分を入力
  • username・・・ダッシュボードのユーザー名を入力
  • password・・・ダッシュボードのパスワードを入力(パスワードを表示するには鍵マークをクリックします)

を入力すればOKです、サンプルコード中の情報はダミーなので適宜、ダッシュボードの値に変更してください
これらの情報はpublisherとsubscriberそれぞれのスクリプトで入力する必要があります

usernameとpasswordに関してはすべてのbrokerで必要というわけではありません、sangoに関してはパスワード認証でセキュリティを高めている感じです

トピックの指定

トピックとはメッセージを保存しておくための器のようなものでメッセージを送受信する際はトピックを指定します
今回はpublishメソッドとgetメソッドの引数にトピックを指定する必要があります
指定するべきトピックの情報もsangoのダッシュボードで確認することができ「アクセス先トピック」の部分を入力してください

トピックの指定にはワイルドカードが存在し「#」を指定するとすべてのトピックという意味になります
おそらくsangoのダッシュボードで確認できるトピック名は「username/#」と言う表示になっており、これを指定するとすべてのトピックに対してメッセージを送受信することになります

「#」の部分は好きな文字列に変更することができます
例えば「username/test」という風にpublishメソッドの引数に指定すれば「username/test」という1つのトピックにだけメッセージが送信されることになります
もちろんgetメソッドの引数にも同じトピックを指定しないと送信したメッセージを受信することができません

こんな感じで「#」の部分は好きなトピックを指定してあげてください

サンプルの実行

必要な情報を入力したらサンプルを実行してみましょう
ターミナルを2つ起動しておいてください

まずはsub_sango.rbを先に実行しておきます
するとメッセージの待機状態に入ります

ruby sub_sango.rb

この状態でpub_sango.rbを実行してみましょう

ruby pub_sango.rb

するとsub_sango.rb側で待機していたコンソールにpublishしたメッセージが表示されると思います
更にpub_sango.rbを実行するとまた送信したメッセージが表示されると思います
このようにsubscriberは実行されると常に接続状態となり、publisherからのメッセージの送信を常に待機しています
ちなみにこの状態でsangoのダッシュボードを確認するとコネクション数が1/6になっていることを確認できると思います
number_of_connection.png

超簡単ではありますが今回のサンプルは以上です
今回はWillやRetainといったメッセージングに特化した機能に関しては全く触れませんでしたがMQTTにはメッセージングに特化したシンプルで強力な機能がたくさんあります
そのあたりWebにいろいろと情報があると思いますので興味のある方は調べてみるといいと思います

参考サイト

0 件のコメント:

コメントを投稿