Shujima Blog

Apple製品,技術系の話をするブログ

Raspberry Pi同士でインターネット双方向通信【CloudMQTT】(#1 説明編)

本記事連載でやっていくこと

遠隔地で違うネットワークに接続されたRaspberry Pi同士で情報をやり取りします.

この際,ポート開放やVPNなどをRaspberry Piやルーターなどに設定する必要はありません.

純粋なネットワーク内での通信と同様にインターネットをまたいだ通信を行うことを目指します.

そのためにMQTTというものを用います.

f:id:masa_flyu:20190216134218p:plain

本記事連載で製作する環境は以下の特徴があります.

  • サーバー含め無料
  • Raspberry Pi2台で通信
  • Raspberry Piのネットワーク設定は一切いじらない
  • インターネット接続さえあれば世界中どこでも通信できる
  • Raspberry PiのプログラムはC言語で記述
  • サーバーはプログラム記述不要

という特徴があります.

Raspberry Piのプログラムは本連載ではC言語としていますが,他の多くの言語でも動作します.

各記事リンク

  1. 説明編(本記事です)
  2. Broker準備編
  3. Node-RED編
  4. C言語Mosquitto送信編
  5. C言語Mosquitto受信編

本編へ

それではまず最初の記事として,本記事では作成するプログラム,環境の概要を説明させていただきます.

MQTTとは

MQTTについてはこちらのページを参考にしています.

MQTT とはなんだったのか · GitHub

MQTT (Message Queuing Telemetry Transport)はインターネットをまたいだデバイス(クライアント)間で

  • 高速に
  • 少量の

通信を行うための規格です.

インターネットをまたいだ直接通信の問題

本来インターネットをまたぐ場合,PCやRaspberry Piなどのデバイスどうしで直接通信することはできません.

f:id:masa_flyu:20190217101653p:plain

基本的にはセキュリティの問題ですが,クライアント(デバイス)側から要求しない限りは,ネットワーク(家のルータの内側)と通信できないようになっています.

インターネットをまたいだ直接通信の3つの方法

これを回避する手段として以下の3つが挙げられます.

1. ポート開放

ルータなどの設定を変更し,特定の通信について,インターネット側からのアクセスを許可します.

受信側(Raspberry Pi)にサーバとしての機能を持たせることで,通信可能となります.

セキュリティ上の問題が大きいほか,ネットワークおよびRaspberry Piに大掛かりな設定が必要になります.

f:id:masa_flyu:20190217102653p:plain

2. VPN

インターネットをまたいだ端末間を仮想的な1つのネットワークで囲ってしまうことです.

費用がかかることが多く,またデバイス(Raspberry Pi)に設定が必要です.

f:id:masa_flyu:20190217102709p:plain

3. サーバーを経由

サーバーにデータを送信し、もう一方でそのデータを受信するという方法です.

f:id:masa_flyu:20190217102721p:plain

この中で最も一般的な手段であり,デバイス(Raspberry Pi)側に設定は特に必要ありません.

ただし,一般にサーバーは自分で用意する必要があり,多くの知識が必要です.

MQTTの優位性

この問題を解決するのがMQTTです.

MQTTはサーバーを経由する方式を用いつつ、サーバーの存在を感じないで「あたかも直接通信しているかのように」使用できるのが特徴です.

f:id:masa_flyu:20190217103956p:plain

そのため,MQTTは以下の特徴があります.

  • あたかも直接通信しているかのように利用できる
  • ネットワークの設定にほとんど影響を与えない(どこでも使える)
  • 実装コスト,インフラコストが小さい

インターネットをまたいだ通信を行う上で非常に良いツールだと思います.

また,サーバーの負担が小さいため,一部の業者が完全無料でサービスを提供しています.

一方で,サーバーにデータを格納するような用途を想定していないため,データの貯蔵はできません(クラウドではありません).

MQTT自体は2000年から標準化されており,SNSなどのバックグラウンドの技術として活躍しています.

これまで一般の人が使うことは少ない技術でしたが,IoTのブームに伴って注目が集まっています.

MQTTの構成

MQTTを構成するには

  • MQTTの出入り口となるMQTTクライアント
  • MQTTを中継するためのMQTTブローカー

を準備する必要があります.

f:id:masa_flyu:20190217135953p:plain

MQTTの通信の流れ

MQTTクライアントは送信側と受信側をそれぞれPublisher(配信者),Subscriber(購読者)と呼びます.また,その間で行われる通信の1つの単位を「Topic(話題)」といいます.

PublisherはTopicをブローカーに送信します.

ブローカーはSubscriberにそれを送信すればいいのですが,原則サーバーはクライアントを呼び出すことはできません.

そこで,Subscriberは自分が「この名前のTopicを購読する」旨をブローカーにあらかじめ送信しておきます.

サーバーはこれに対する返信という形でTopicをSubscriberに送信します.

f:id:masa_flyu:20190217140021p:plain

この仕組みのため,Publisher1つに大して複数のSubscriberを設定できるほか,Topic名を変えることで,送り先を変えることができます.

MQTTの実装

MQTTクライアントはPC(ここではRaspberry Pi)に大してライブラリをインストールすることで,MQTTブローカーはサーバーを用意してMQTTブローカー環境をインストールすることで実現できます.

ただし,MQTTブローカーについては簡単に用意するためのサービス「CroudMQTT」などがあり,ユーザー登録するだけで無料で構築できます.

またMQTTクライアントのライブラリに関しては,「Mosquitto」などが有名です.ただし,テストだけであればNode-REDというGUIで簡単に準備することができます.

f:id:masa_flyu:20190217140048p:plain

f:id:masa_flyu:20190217140329p:plain

参考

MQTT Wikipedia

MQ Telemetry Transport - Wikipedia

MQTT公式

MQTT

Brokerの比較

MQTT Broker比較~機能比較編 - Taste of Tech Topics

Pythonでの実装例

Raspberry PiでIoT(MQTTで遠隔操作編 その1)MQTTでの通信 – 株式会社インデペンデンスシステムズ横浜

MQTTのいろいろ情報

初めての MQTT · GitHub MQTT とはなんだったのか · GitHub

本記事におけるステップ

以上長々と概要を説明してきました.本記事では以下の手順でMQTTを使用していきます.

  • CloudMQTTを準備する
  • Node-REDを用いてテストする
  • MosquittoとNode-REDを併用してテストする
  • MosquittoライブラリをC言語から使用して通信する
  • 双方向通信する

というわけで,長々と説明してきました. 次の記事で,CloudMQTTの準備を行います.

当ブログをご利用いただく際には免責事項をお読みください。