ひとしれずひっそり

主にソフトに関することをメモしていきます。過程をそのまま書いていたりするので間違いが含まれます。鵜呑みしない様に。

MQTT

IoTでよくMQTTが使われているがまだ試したことがない。

こちらを参考にMosquittoを試してみる。

developer.mamezou-tech.com

Macなのでインストールはbrewを使う。

% brew install mosquitto
% brew install mosquitto-clients

mosquittoはブローカーと呼ばれるサービスを立ち上げるもので、メッセージの振り分けをする感じ。
mosquitto-clientsはクライアント側でパブリッシャーという送信側とサブスクライバーという受信の役割をさせるのに使う。

mosquittoコマンドでブローカーが立ち上がる。

% mosquitto
1677944452: mosquitto version 2.0.15 starting
1677944452: Using default config.
1677944452: Starting in local only mode. Connections will only be possible from clients running on this machine.
1677944452: Create a configuration file which defines a listener to allow remote access.
1677944452: For more details see https://mosquitto.org/documentation/authentication-methods/
1677944452: Opening ipv4 listen socket on port 1883.
1677944452: Opening ipv6 listen socket on port 1883.
1677944452: mosquitto version 2.0.15 running
1677944452: New connection from ::1:65092 on port 1883.
1677944452: New client connected from ::1:65092 as auto-97553E03-8A44-9B57-C886-C97D7FB2CFB5 (p2, c1, k60).

mosquitto_subでサブスクライブする。
パブリッシャーで送信すると表示されることになる。

% mosquitto_sub -h localhost -t topic

パブリッシャーから送信。

% mosquitto_pub -h localhost -t topic -m "Hello, there"

サブスクライバーの方にHello, thereが表示された。

% mosquitto_sub -h localhost -t topic     
Hello, there

Rubyから

Rubyでも試してみる。
mqtt gemを使用するとクライアント側の動作ができる。

github.com

Quick startに従って、

require 'mqtt'

# Publish example
MQTT::Client.connect('localhost') do |c|
  c.publish('topic', 'Hello, there from ruby')
end

サブスクライバーに表示された。

% mosquitto_sub -h localhost -t topic     
Hello, there
Hello, there from ruby

今度はサブスクライバーの方。

require 'mqtt'

MQTT::Client.connect('localhost') do |c|
  # If you pass a block to the get method, then it will loop
  c.get('topic') do |topic,message|
    puts "#{topic}: #{message}"
  end
end

前のmosquitto_pubコマンド叩いたら表示された。

% ruby mqtt_sub.rb 
topic: Hello, there

同じ端末でパブリッシャーとサブスクライブすると双方向通信ができるし、ブロードキャストするのに向いてる。


M5Stack関連のソースではブローカーとして mqtt.m5stack.com が使われている。
上で localhost としていた所を mqtt.m5stack.com に置き換えて動作することを確認した。
topicは誰かと被らない様にuuidを使った。

mqtt.m5stack.com は自由に使っていいのかな? どうなんだろう。