IoT機器同士の通信方式としてデファクトスタンダードと言われるほどメジャーになっているMQTT通信について、学んだことを備忘録を兼ねて初心者向けに書き留めます。
MQTT(Message Queuing Telemetry Transport)は、接続が不安定な状態でもTCP/IP通信できるように軽量なプロトコルとして設計された通信規格です。
本記事では、ローカルネットワーク内で、パソコン、Raspberry Pi、Androidケータイやタブレット間のMQTT通信を行う方法について説明します。
※Dockerを使った方法はこちら
MQTTでは下図のようにBroker(サーバー)と複数のClientがいて、あるClientがPublish(発行、送信)した情報をあるClientがSubscribe(購読、受信)する方式で、データにトピックを付けてやり取りされます。
MQTTを始めるためには、まずBrokerを立てる必要があります。
MQTTはオープンな通信規格であり、様々なBrokerソフトが存在しています(参考:MQTT Broker比較~機能比較編)。
その中でもリファレンス環境とされるMosquittoをPC、Raspberry Pi等で立ち上げる方法と、ケータイやタブレット端末向けのMQTTアプリの一部を紹介します。
Windows PC
Windows PCにMosquittoをインストールする方法を説明します。以下のページからWindows用のインストーラ(mosquitto-*-install-windows-x*.exe )をダウンロードしてインストールします。https://mosquitto.org/download/
readmeにOpenSSLが必要と書いてあるので、以下のページからインストーラ(Win*OpenSSL_Light-*.exe)をダウンロードしてインストールします。
途中、インストール場所の選択肢があるので、Windowsシステムフォルダ(デフォルト)を選択します。
http://slproweb.com/products/Win32OpenSSL.html
次にMosquittoのインストールフォルダにパスを通します。
Windowsバーの検索窓にcontと打ち込んでコントロールパネルを開きます。
システム→システムの詳細設定→環境変数
→ユーザの環境変数Pathを選択→編集ボタン→新規ボタン
からMosquittoインストールフォルダ(C:¥Program Files¥mosquitto)を追加します。
これでインストール完了です。
実行確認
実行確認してみましょう。
Windowsバーの検索窓にcmdと打ち込んでコマンドプロンプトを立ち上げるか、powershellと打ち込んでWindows PowerShellを立ち上げ、以下コマンドを実行します。
mosquitto
何も起きませんが、これでMosquittoのBrokerが立ち上がります。
続いて、もう1つコマンドプロンプトまたはPowerShellを立ち上げ、1つ目のClientとなるSubscriberを以下コマンドで立ち上げます。
mosquitto_sub -d -t topicA
さらに、もう1つコマンドプロンプトまたはPowerShellを立ち上げ、2つ目のClientとし、Publishしてみます。
mosquitto_pub -d -t topicA -m "Hello world!"
これでSubscribeしたWindowに以下のように表示されれば成功です。
Client mosqsub|6456-user-PC received PUBLISH (d0, q0, r0, m0, 'topicA', ... (12 bytes)) Hello world!
mosquittoやmosquitto_subはCtrl+Cで止められます。
他の機器との通信
上記で1台のパソコンを使ったMQTT通信の確認ができたので、今度は他の機器との通信を行います。
IPアドレスを指定して、LANに接続している他の機器のBrokerと通信する方法を説明します。
BrokerにするWindows PCのIPアドレスを確認するにはipconfigコマンドを使います。
ipconfig
次のようなログが出ます。(抜粋)
Wireless LAN adapter ワイヤレス ネットワーク接続: 接続固有の DNS サフィックス . . . . .: リンクローカル IPv6 アドレス. . . . .: IPv4 アドレス . . . . . . . . . . . .: 192.168.179.8 ←コレ★ サブネット マスク . . . . . . . . . .: 255.255.255.0 デフォルト ゲートウェイ . . . . . . .: 192.168.179.1
上記★の部分がIPアドレスになります(環境によって異なる値になります)。
他のWindows PCから、もしくは以降で説明する他の機器からBrokerのIPアドレスを指定してPublish/Subscribeします。
mosquitto_pub, mosquitto_subの-hオプションでIPアドレスを、-pオプションでポート番号を指定できます。Mosquittoのデフォルトのポート番号は1883になっています(下記IPアドレスは一例です)。
mosquitto_sub -d -h 192.168.179.8 -p 1883 -t topicA
mosquitto_pub -d -h 192.168.179.8 -p 1883 -t topicA -m "test"
SubscribeしたWindowにtestと表示されれば成功です。
Ubuntu Linux, Raspberry Pi
Ubuntu LinuxやRaspberry PiにMosquittoをインストールする方法を説明します。
説明といっても拍子抜けするほど簡単で、以下のコマンドを実行するだけです。
sudo apt update sudo apt upgrade -y sudo apt install -y mosquitto mosquitto-clients
実行確認のコマンドはWindows PC向けに説明した内容と同じです。
IPアドレスの確認コマンドはifconfigです。
ifconfig
Mac
Macの場合、以下のコマンドでMosquittoをインストールします。
brew install mosquitto
以下にパスを通しておきます。
/usr/local/opt/mosquitto/sbin
/usr/local/opt/mosquitto/bin
IPアドレスの確認コマンドはifconfigです。
ifconfig
Android
ケータイやタブレット端末からボタン等で機器の操作を行うなどの用途でAndroidを使いたい場合、MQTT Clientアプリを利用すると簡単に実現することができます。
MQTT Dashが動作が安定していてお勧めです。
パソコン等でBrokerを立ち上げておき、Android端末からMQTT Dashを開きます。
右上の+ボタンを押し、以下のようにNameとAddress(BrokerのIPアドレス)を入力します(下図のIPアドレスは一例です)。
右上の保存マークを押すと以下のように新しいClientが作成されるので、これをタップします。
右上の+ボタンを押し、「Switch/button」を選択し、NameとTopic(sub)を入力します。
下の方にスクロールして下図の部分でボタンOn/Off時にPublishする値とボタンの絵柄、色を変更できます。
値は、デフォルトで0と1が入っていますが、任意の数値や文字列に変更できます。
絵柄の部分をタップすると以下のような候補が表示されるので、好きなものを選択します。
同様に「Text」を追加し、Publishされたデータを表示するようにします。
さらに「Image」を追加し、Publishされた画像ファイルを表示できるようにしてみます。
Topic名は先ほどのボタンのものと区別するためimgとしています。
以上でボタン、テキスト、画像のブロックができていると思います。
ボタンを押してテキスト部の値が0⇔1に変化することを確認してください。
続いてパソコンから画像をPublishしてみます。ここでも-hで指定するのはBrokerのIPアドレスです(下記IPアドレスは一例です)。
mosquitto_pub -d -h 192.168.179.8 -p 1883 -t img -f MQTT.png
以下のように画像が表示されれば成功です。
上の方にある鍵マークをタップしてロック解除すると、長タップでブロックをつかんで場所を入れ替えることができます。
これまでに設定した項目を修正する際も長タップからEditを選択することで変更できます。
なお、Android端末をBrokerにすることもできます。MQTT Broker Appが動作することを確認しています。
Android端末のIPアドレスは以下で確認できます。
設定(Settings)→システム(System)→端末情報(About phone)→端末の状態(Status)
また、Android用ターミナルアプリTermuxを使って上記Ubuntu Linuxの方法でmosquitto, mosquitto-clientsをインストールして使うこともできます。
現在のところiPhone/iPad用MQTT Dashは無いようですが、似たような機能のアプリはあるようなので、上記と同様のことができると思います。
まとめ
ローカルネットワーク内で、パソコン、Raspberry Pi、Androidケータイやタブレット間のMQTT通信を行う方法を紹介しました。
本ページでは簡単にMQTT通信を試す方法について説明しており、データは平文で(暗号化されずに)送信されます。
実際のサービスを構築する場合、セキュリティを考慮し暗号化して通信すべきで、Mosquittoにも暗号化して通信を行う機能が用意されています。
また、Brokerをクラウドサーバ上に立てることで遠隔から機器を操作することができるようになります。
下の記事でtest.mosquitto.orgという登録無しで無料で使えるクラウドのMQTT Brokerを利用して、トイドローンTelloをインターネット経由で遠隔から操縦する方法を紹介しています。
書籍紹介
インターネットを支える仕組みTCP/IPを手を動かしながら基礎から実践まで学ぶことができ、幅広い知識が身につきます。
Linuxの基本的な使い方からシェルスクリプトを使ったプログラミング、Gitによるバージョン管理な
参考文献
- MQTT Broker比較〜機能比較編(http://acro-engineer.hatenablog.com/entry/2015/06/19/120000)