MQTTで送受信してみる

MQTTを使うことになったので、概念をざっくり知るのと、ごく単純な送受信をやって感じを掴むことにした。

構成としては、MacをClientとしてAWS上のEC2のサーバーにメッセージを送信して、そのメッセージを同じくMacで受信する、ということをやってみる。

スポンサーリンク

MQTTとは

まずはMQTTとはなんぞや、というところから学習を始める。これは「MQTT の基本知識」によくまとまっている。IBMの記事なんだが、そもそもMQTT自体はIBMが1990年代後半に考案したものであるらしい。なるほど。けっこう古いんだな。油田パイプラインに取り付けられたセンサーを、衛星とリンクするために用いられたとのことだ。通信プロトコルといえばHTTPがあるのに、それではダメだったのだろうか、となどと考えながら読むとわかりやすい。

その他、いくつか参考にしたサイトについても。()は感想。

  • MQTT の基本知識
    • Message Queue Telemetry Transport
      • Message Queueは全然関係ない
    • TCP/IPがベース
    • 1990年代後半にIBMが考案
      • 油田パイプラインに取り付けられたセンサーを衛星とリンクするため
    • 非同期通信なので信頼できないネットワークで有用
    • 同期的なHTTPの問題点
      • IoTはネットワークに信頼性がないことが多いし、デバイスも多いしで同期通信は不向き
      • HTTPは片方向、クライアントから接続を始める。つまりセンサーがネットワークから受動的にコマンドを受信できない
        • (これはMQTTでも真面目にやると消費電力とか別の問題が出てくるような気がするのは、今のIoTの文脈で捉えているからか)
      • 通常1vs1なので、ブロードキャストとかコストがかかる
      • ヘッダーサイズがでかいので帯域幅が必要
    • Publish/Subscribe Model
      • Message BrokerClient の2つの概念がある
      • Message Broker は Topicを持っている
      • Client は Message Broker とやりとりする。ClientはTopicとMessageを
        • (AWS SNSが思い浮かぶ、というかまぁあれはその実装の一つなんだろうけれど)
      • (Publishの仕組みはよくわかるんだけれど、Subsribeはどうなっているんだろう?Clientがlistenするのだと、結局片方向に思えるし、双方向だとバッテリー問題がえげつないのではないか)
  • IoT開発未経験者向け! IoTで注目を浴びるプロトコル、MQTTとは? | 株式会社AMG Solution
    • Willって遺言らしい
    • Subsriberは結局自分で取りにいくらしい。(これって片方向では?)
  • MQTT とはなんだったのか
    • 暗号化の通信コストの記述がなるほどという感じ。まぁそれはHTTPもだけど。。
  • IoT初心者向け!「MQTT」について簡単にまとめてみる – RAKUS Developers Blog | ラクス エンジニアブログ
    • Topicは/で区切られた階層構造
    • QoS…Quality of Service
      • QoS0…最高1回の送信で、未達の可能性あり
      • QoS1…最低1回。重複するかも
      • QoS2…1回だけの配達を保証

だいたいわかったが、とにかく実装して見ないことにはなんともいえないなぁ、ということで、何か簡単にやってみる。

送受信してみる

とにもかくにも送受信してみる。要はClientとMessage Brokerがあればよいわけだ。つまり、一台のPCでもできてしまうのだが、それだとやはりピンとこないので、最小限の構成として以下のように組んでみる。

MQTT

わざわざ図にする必要あるのかな、という構成だが、まぁなんでも絵にしておくに越したことはない。

インストール

さて、ソフトウェアのインストールだが、mosquittoを使う。Macならば、例によってHomebrewですぐにインストールできる。

$ brew install mosquitto

これで、MQTTのクライアントの機能をCLIで使うことができる。

サーバー側のほうはもう少し面倒だが、Ubuntuならばaptですんなりいける。下記の記事を参考にさせていただきました。ありがとうございました。

Raspberry Pi で mosquitto を使う – Qiita

$ sudo apt install mosquitto
$ sudo systemctl start mosquitto
$ sudo systemctl enable mosquitto

楽。port番号はどうするんだ?と思ったが、「Mosquitto(MQTT)を動かしてみた – 人と技術のマッシュアップ」によると1883らしい。

$ sudo lsof -i:1883
COMMAND     PID      USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mosquitto 11704 mosquitto    4u  IPv4 222819      0t0  TCP *:1883 (LISTEN)
mosquitto 11704 mosquitto    5u  IPv6 222820      0t0  TCP *:1883 (LISTEN)

なるほど。なので、1883番のポートで通信できるようにする必要がある。AWSの場合は、セキュリティグループをいじる。

送受信

インストールが完了したら、実際に送受信する。

まず、ClientのMacでsubscribeする。

❯❯❯ mosquitto_sub -t "test" -h EC2のホスト

Listenっぽい状態になった。これで、EC2のホストからTopic “test”をsubscribeしている状態と思われる。なので、testトピックに何かしらのメッセージをpublishしてやれば、受け取れるはず。別にターミナルを開いてやってみる。

>>> mosquitto_pub -t "test" -m "hello dayo" -h EC2のホスト

実行すると、subscribeしていた画面が。

subscribe

ちゃんと出力された。

関連コンテンツ

関連記事

スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。