MQTTに触れてみた その1
奥様に1日坊主と言われて久しいですが、ちゃんとこうやって書く気はあるんですよ。
MQTT
さて、今日はMQTT(MQ Telemetry Transport)というものに触れてみました。 きたるIoT時代に大活躍しそうだと噂のプロトコルです。
多くのデバイスに向けて同期的にメッセージを配信することに特化していて、 お互いにメッセージを配信し合えばリアルタイムな双方向通信もできちゃう! FacebookMessengerにも使われているんだそうな。
ちなみにMQ
が何なのかは…謎です。
特徴
以下のような特徴を持っているので、 ネットワークが不安定だったり非力だったりといった困ったデバイスでもなんとかなるようになってるみたい。
- ヘッダが軽量かつシンプルなので、通信量や処理負荷が比較的小さい
- 通信している相手の接続が途切れたら教えてくれる(Will)
- 配信に途中参加しても、配信済みの最新のメッセージを受け取れる(Retain)
- 接続が途切れても、あとで受け取り損ねたメッセージを受け取れる(Durable Subscribe)
- 状況に応じてメッセージの到達保証のレベルを指定できるので、わりとどうでもいいところに無駄なリソースを割かないようにできる(QoS)
説明してくれてるところがたくさんあるので、詳細は以下を参照してください。
大雑把に説明
登場人物
- Broker:メッセージを管理するサーバー。メッセージを受け取って、それを欲している端末に送る。
- Client:メッセージを送受信する端末
- Publisher:メッセージを送信しようとしているときにこう呼ばれる
- Subscriber:メッセージを受信しようとしているときにこう呼ばれる
Topic
メッセージにはそれぞれTopicと呼ばれるデータを設定します。
SubscriberはどのTopicのメッセージが欲しいかBrokerに伝えておけば、 Brokerがそれに応じたメッセージを配信してくれるという寸法。
Topicはhoge/piyo/fuga
といった階層構造で指定します。
Subscriberの指定にはワイルドカードが使えるので、柔軟な受け取り指定が可能です。
使えるワイルドカードは以下の2種類。
hoge/piyo/#
:piyo以降は何でもOKhoge/+/fuga
:+の部分は(1階層分)何でもOK
インストール
今回は、BrokerとしてMosquitto、Clientとしてruby-mqttを使用します。
Broker
Macで試すのでhomebrewでインストール。
$ brew install mosquitto
Client
ruby-mqttをインストール
$ gem install mqtt
とりあえずこれで準備完了。
基本の動き
Client実装
Publisher
require "mqtt" topic = ARGV[0] message = ARGV[1].dup MQTT::Client.connect(host: "127.0.0.1", port: 1883) do |c| c.publish(topic, message) end
Subscriber
require "mqtt" request_topic = ARGV[0] MQTT::Client.connect(host: "127.0.0.1", port: 1883) do |c| c.get(request_topic) do |topic,message| puts "#{topic}: #{message}" end end
動かしてみる
terminal0でBrokerを起動
$ /usr/local/opt/mosquitto/sbin/mosquitto
terminal1
$ ruby subscriber.rb hoge
terminal2
$ ruby publisher.rb hoge Hello_MQTT!
terminal1側で受信!
hoge/piyo: Hello_MQTT!
次回
とりあえず最低限動くところまで書けたので今日はここまで。 次回はワイルドカードとかWillとか試してみる。