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

# はじめに

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

# shiftr.io

なかなか面白そうなのをみつけました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32540/0606bbb1-b32e-1e06-df07-3029a2e251a8.png)


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

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

![shiftr.io.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32540/0a11e51c-019c-3ef7-121e-1fdcd103afc9.gif)

## クライアントを追加する

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

```ruby: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32540/cd7ef3ac-6795-cab2-b092-952afcaa6f24.gif)

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

```ruby: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32540/7f903fb7-13d7-2790-cc52-ecd62f5c1b3c.png)

- メッセージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32540/c6bf8380-4df5-860a-9498-bbd05c3041b5.png)

# まとめ

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

# シリーズ

- [DockerとMosquitto™でMQTTに触れる](https://qiita.com/narutaro/items/e48def9dca38036f01f9)
- [MQTTを調べている](https://qiita.com/narutaro/items/1837e392ef3255c9d6b2)
- [MQTTの通信を可視化する - shiftr.io](https://qiita.com/narutaro/items/5a9102f4a2e29e4525db)
- [Azure IoT Hub に Mosquitto™ から MQTT なげてみる](https://qiita.com/narutaro/items/1a16ff1321f5044afaf0)
- [MQTT.js でブラウザから MQTTブローカ に Pub/Sub する](https://qiita.com/narutaro/items/2819ce79eb82a87357eb)