IoTでよくMQTTが使われているがまだ試したことがない。
こちらを参考にMosquittoを試してみる。
% 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を使用するとクライアント側の動作ができる。
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 は自由に使っていいのかな? どうなんだろう。