LoginSignup
9
11

More than 3 years have passed since last update.

MQTTの通信を可視化する - shiftr.io

Last updated at Posted at 2020-04-12

はじめに

  • shiftr.io っていうMQTTの通信の可視化してくれるサービス見つけたので使ってみた
  • 可視化されるのはブローカー・クライアント・トピックのトポロジ、メッセージのやりとり、およびメッセージの内容、通信量 など

shiftr.io

なかなか面白そうなのをみつけました
image.png

こんな感じで可視化されます

  • ここは誰でも試せるサンドボックスのような環境(トピック)
  • shiftr.io のトップページの Try っていうところから行ける
  • 凡例
    • 真ん中の大きい丸がブローカー
    • その周りの小さい白い丸がトピック。MQTTは building/floor/room のようにトピックを階層で表すことができるので、トピックの先にトピックがついて枝のようになっている
    • 点線でつながった丸がクライアント
    • 動いてる黒い丸がメッセージ

shiftr.io.gif

クライアントを追加する

  • ruby-mqtt を使ったクライアント mqtt.rb を動かしてみる
  • これ動かすと、mySensor がでてきて通信を始める。このクライアントは同じトピックに対して [1] のところで subscribe および [2] のところで publish を行っているので、黒い丸が行って、帰ってくるように見える
mqtt.rb
require 'rubygems'
require 'mqtt'

broker = "mqtt://try:try@broker.shiftr.io"
client_name = "mySensor"

MQTT::Client.connect(broker, client_id: client_name) do |client|
  client.subscribe '/example' # [1] topic_name to subscribe
  loop do
    client.publish 'example', 'hello' # [2] publish to topic_name, message
    while !client.queue_empty? do
      topic, message = client.get
      puts "#{topic}: #{message}"
    end
    sleep 1
  end
end

新しい Namespace を作る

  • Dashboard から New Namespace を選んで、自分の Namespace(topic)をつくることができる
  • 作ったら、Namespace Settings から token をつくる
    • トークンは 74ge91e8:63ce1cf22a17765x みたいなフォーマット
    • これをmqtt://74ge91e8:63ce1cf22a17765x@broker.shiftr.io として @より前につけると自分の Namespace へメッセージを送ったり、受けたりできる

クライアント増やして遊ぶ

トピック名 Tokyo に 3個の pub 10個の sub をぶら下げてみた

b.gif

クライアントのコードはこちら

mqtt-3pub-10sub.rb
require 'rubygems'
require 'mqtt'

broker = "mqtt://<token>@broker.shiftr.io"
topic = "tokyo"
message = "hello world"

# Publisher
(101..103).each do |i|
  Process.fork do
    client_name = "sensor" + i.to_s
    MQTT::Client.connect(broker, client_id: client_name) do |client|
      loop do
        client.publish topic, message 
        sleep 2
      end
    end
  end
end

# Subscriber
(1..10).each do |i|
  Process.fork do
    client_name = "sensor" + i.to_s
    MQTT::Client.connect(broker, client_id: client_name) do |client|
      client.subscribe topic 
      loop do
        while !client.queue_empty? do
          topic, message = client.get
          puts "#{client_name} #{topic} #{message}"
        end
        sleep 2
      end
    end
  end
end

その他

クライアントの丸をクリックすると、通信量とか、メッセージ内容とかみることができます

  • 通信量
    image.png

  • メッセージ
    image.png

まとめ

確かにセンサー類をシミュレーションする際には数が多いと訳がわからなくなるので、本番前にこういうのみながら構成をデザインして、事前にコード書いておくといいかもと思いました。shiftr.io よくてきていると思いました

シリーズ

9
11
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
11