ども、cloudpackかっぱ@inokara)です。

はじめに

前回、RabbitMQ に mqtt プラグインをぶっこんでメッセージのやりとりをしつつ Raspberry Pi に繋いだ LED をチカチカさせてみましたが、mqtt のブローカーとして sango というサービスがあるので RabbitMQ with mqtt の部分を sango に置き換えて改めて試してみたいと思います。


what is sango?

概要

時雨堂という IT っぽくないオシャレな名前な会社が提供している MQTT サーバーで無償で利用出来るライトプランと月額 500 円で冗長構成あったりや同時接続数が多めのスタンダードプランがあるようです。

github アカウントですぐに始められるのが個人的には嬉しかったです。

ダッシュボード

github アカウントを使ってログインすると以下のような画面が表示されます。

sangoのダッシュボード

コネクション数や累計のメッセージ数等のステータスが表示されています。


チカチカさせる

前回で利用したスクリプトをほぼそのまま流用です。

リモコン

リモコンとなるスクリプト配下の通りです。

#!/usr/bin/env ruby

require 'mqtt'
require 'json'

host = 'xxxx.mqtt.xxxxxxx.jp'
port = 1883

client = MQTT::Client.connect(:remote_host => host, :remote_port => port,
                     :username => 'xxxxxxxx@github', :password => 'xxxxxxxxxxx')
json = {type: "test", value: ARGV[0] }.to_json
client.publish("xxxxxxxx@github/test/raspi", json , retain=false)

前回と異なる点としては…

  • host は sango のダッシュボードにある接続先を指定
  • username はダッシュボードにあるユーザー名を指定
  • password はダッシュボードにあるパスワードの鍵マークをクリックして表示されるパスワードを指定
  • Topic にはユーザー名に続けて任意のパスを指定

MQTT における Topic についてはこちらこちらに日本語で簡潔に解りやすく書かれています。こちらを参考にさせて頂いてまとめると…

  • メッセージには Topic を保持している
  • Subscriber(今回は受信機)では購読する Topic を指定する
  • Topic は / で区切られた階層構造を持っている
  • Topic の指定は完全一致ではなくても良い、Wildcard の指定が可能
  • 1 バイトの文字コードにて構成出来る(/+# は除く)
  • 最大で 32767 文字まで利用出来る

指定の方法は以下のようなパターンがあるようです。

Topic パターン例 意味
/test/atama/hage 完全一致
/test/# /test/ 以下のずべての Topic
/test/+/hage/pika /test/ 以下 hage の pika を得る

参考サイトの受け売りになってしまいますが Topic を利用することでメッセージの送信範囲の指定が柔軟に行えるメリットがあると思います。

受信機

受信機となるスクリプトの前回との差分です。

--- reciever.rb.bk  2014-11-09 03:02:07.064293784 +0900
+++ reciever.rb     2014-11-09 03:02:13.734221357 +0900
@@ -13,7 +13,8 @@
 end

def mqtt_conn
-  MQTT::Client.connect(:remote_host => config[:host], :remote_port => config[:port], :username => 'user', :password => 'pass')
+  MQTT::Client.connect(:remote_host => config[:host], :remote_port => config[:port], :username => 'xxxxx@github', :password => 'xxxxxxxxxxxxxx')
 end

def pin_init
@@ -36,7 +37,10 @@
   end
 end

-mqtt_conn.get('record') do |topic,message|
+mqtt_conn.get("xxxxxx@github/#") do |topic,message|
   record = JSON.load(message)
   action = record['value']
   pin = pin_init

ホスト名や認証の情報は置いといて Topic には xxxxxx@github/# とワイルドカードを意味する # を指定しています。

チカチカさせている図

Sango を使って Raspberry Pi に接続したLEDを点滅させる: 動作確認(1)

前回の画像の使い回しで恐縮ですが…

Sango を使って Raspberry Pi に接続したLEDを点滅させる: 動作確認(2)

こんな感じでチカチカしたり出来ます。


ということで…

チカチカさせるのは…

とても簡単で sango を利用するまでも無いかもしれませんが、ちょっとしたネタとしては面白いと思います。

Topic を利用することで…

Raspberry Pi(というか MQTT Subsvriber)が複数ある場合には MQTT Subsvriber 毎に購読する Topic を分割することで任意の MQTT Subsvriber だけをコントロールしたりすることが出来るのが非常に面白いなあと思ったり。

Sango は…

お手軽に利用出来る MQTT ブローカーで個人利用であればライトプランで十分に楽しめると思います!

元記事はこちらです。
MQTT ブローカーの Sango を使って Raspberry Pi に繋いだ LED を ON したり OFF したりする