本記事連載でやっていくこと
遠隔地で違うネットワークに接続されたRaspberry Pi同士で情報をやり取りします.
この際,ポート開放やVPNなどをRaspberry Piやルーターなどに設定する必要はありません.
純粋なネットワーク内での通信と同様にインターネットをまたいだ通信を行うことを目指します.
そのためにMQTTというものを用います.
本記事連載で製作する環境は以下の特徴があります.
- サーバー含め無料
- Raspberry Pi2台で通信
- Raspberry Piのネットワーク設定は一切いじらない
- インターネット接続さえあれば世界中どこでも通信できる
- Raspberry PiのプログラムはC言語で記述
- サーバーはプログラム記述不要
という特徴があります.
Raspberry Piのプログラムは本連載ではC言語としていますが,他の多くの言語でも動作します.
各記事リンク
本編へ
それではまず最初の記事として,本記事では作成するプログラム,環境の概要を説明させていただきます.
MQTTとは
MQTTについてはこちらのページを参考にしています.
MQTT (Message Queuing Telemetry Transport)はインターネットをまたいだデバイス(クライアント)間で
- 高速に
- 少量の
通信を行うための規格です.
インターネットをまたいだ直接通信の問題
本来インターネットをまたぐ場合,PCやRaspberry Piなどのデバイスどうしで直接通信することはできません.
基本的にはセキュリティの問題ですが,クライアント(デバイス)側から要求しない限りは,ネットワーク(家のルータの内側)と通信できないようになっています.
インターネットをまたいだ直接通信の3つの方法
これを回避する手段として以下の3つが挙げられます.
1. ポート開放
ルータなどの設定を変更し,特定の通信について,インターネット側からのアクセスを許可します.
受信側(Raspberry Pi)にサーバとしての機能を持たせることで,通信可能となります.
セキュリティ上の問題が大きいほか,ネットワークおよびRaspberry Piに大掛かりな設定が必要になります.
2. VPN
インターネットをまたいだ端末間を仮想的な1つのネットワークで囲ってしまうことです.
費用がかかることが多く,またデバイス(Raspberry Pi)に設定が必要です.
3. サーバーを経由
サーバーにデータを送信し、もう一方でそのデータを受信するという方法です.
この中で最も一般的な手段であり,デバイス(Raspberry Pi)側に設定は特に必要ありません.
ただし,一般にサーバーは自分で用意する必要があり,多くの知識が必要です.
MQTTの優位性
この問題を解決するのがMQTTです.
MQTTはサーバーを経由する方式を用いつつ、サーバーの存在を感じないで「あたかも直接通信しているかのように」使用できるのが特徴です.
そのため,MQTTは以下の特徴があります.
- あたかも直接通信しているかのように利用できる
- ネットワークの設定にほとんど影響を与えない(どこでも使える)
- 実装コスト,インフラコストが小さい
インターネットをまたいだ通信を行う上で非常に良いツールだと思います.
また,サーバーの負担が小さいため,一部の業者が完全無料でサービスを提供しています.
一方で,サーバーにデータを格納するような用途を想定していないため,データの貯蔵はできません(クラウドではありません).
MQTT自体は2000年から標準化されており,SNSなどのバックグラウンドの技術として活躍しています.
これまで一般の人が使うことは少ない技術でしたが,IoTのブームに伴って注目が集まっています.
MQTTの構成
MQTTを構成するには
- MQTTの出入り口となるMQTTクライアント
- MQTTを中継するためのMQTTブローカー
を準備する必要があります.
MQTTの通信の流れ
MQTTクライアントは送信側と受信側をそれぞれPublisher(配信者),Subscriber(購読者)と呼びます.また,その間で行われる通信の1つの単位を「Topic(話題)」といいます.
PublisherはTopicをブローカーに送信します.
ブローカーはSubscriberにそれを送信すればいいのですが,原則サーバーはクライアントを呼び出すことはできません.
そこで,Subscriberは自分が「この名前のTopicを購読する」旨をブローカーにあらかじめ送信しておきます.
サーバーはこれに対する返信という形でTopicをSubscriberに送信します.
この仕組みのため,Publisher1つに大して複数のSubscriberを設定できるほか,Topic名を変えることで,送り先を変えることができます.
MQTTの実装
MQTTクライアントはPC(ここではRaspberry Pi)に大してライブラリをインストールすることで,MQTTブローカーはサーバーを用意してMQTTブローカー環境をインストールすることで実現できます.
ただし,MQTTブローカーについては簡単に用意するためのサービス「CroudMQTT」などがあり,ユーザー登録するだけで無料で構築できます.
またMQTTクライアントのライブラリに関しては,「Mosquitto」などが有名です.ただし,テストだけであればNode-REDというGUIで簡単に準備することができます.
参考
MQTT Wikipedia
MQ Telemetry Transport - Wikipedia
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の準備を行います.