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 Broker と Client の2つの概念がある
- Message Broker は Topicを持っている
- Client は Message Broker とやりとりする。ClientはTopicとMessageを
- (AWS SNSが思い浮かぶ、というかまぁあれはその実装の一つなんだろうけれど)
- (Publishの仕組みはよくわかるんだけれど、Subsribeはどうなっているんだろう?Clientがlistenするのだと、結局片方向に思えるし、双方向だとバッテリー問題がえげつないのではないか)
- Message Queue Telemetry Transport
- 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でもできてしまうのだが、それだとやはりピンとこないので、最小限の構成として以下のように組んでみる。

わざわざ図にする必要あるのかな、という構成だが、まぁなんでも絵にしておくに越したことはない。
インストール
さて、ソフトウェアのインストールだが、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していた画面が。

ちゃんと出力された。
コメント