AITCシニア技術者勉強会
一から始めるIoT 5周目
第3回 インターネット連携編
2021年1月22日
先端IT活用推進コンソーシアム
シニア技術者勉強会
近藤 繁延
Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

講師紹介
⚫名前：
近藤 繁延（Shigenobu. Kondo）⚫SNS：
Twitter：のぶ（@mininobu）
Facebook：近藤 繁延（shigenobu.kondo）⚫会社：ウルシステムズ株式会社⚫好きなセンサー：
温湿度センサー、加速度センサー
Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

2

勉強会スケジュール
1. 2020/11/20 Raspberry Piのセットアップしよう
2. 2020/12/18 Raspberry Piでセンサーを操作する
3. 2021/ 1/22 Raspberry Piでインターネット連携
4. 2021/ 2下 Raspberry Piで画像認識
5. 2021/ 3下 アイデアソン＆ハッカソン
6. 2021/ 4下 ハッカソン＆成果発表会

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

3第3回のゴール• Raspberry PiとMQTTプロトコルを用いたデータ連携方法を習得する。
1. 通信環境構築
2. 基本的な使い方
1. コマンドで利用
2. スマホアプリで利用

3. センサーとの連携
4. インターネット上のサーバと連携

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

4

アジェンダ
1. MQTTとは
1. 全体像2. MQTT Brokerの種類
2. MQTT Broker「Mosquitto」とは3. Mosquittoのセットアップ
4. 実践MQTT
1. RaspberryPi編
2. スマホ編
3. センサー編
4. サーバ連携編
Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

5

参考資料
参考
第2回の資料（センサーの取り扱い）

http://cloud.aitc.jp/20201218_RaspberryPi2/

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

6

MQTTとは
MQ Telemetry Transport(Message Queuing Telemetry Transport、略称
MQTT)は、メッセージ指向ミドルウェアのアプリケーション層で使用される、TCP/IPによるPub/Sub型データ配信モデルの軽量なメッセージキュープロトコルである。
非力なデバイスやネットワークが不安定な場所でも動作しやすい様にメッセージ通信電文が軽量に設計されている事が特徴。
Pub/Sub型メッセージング·パターンには、メッセージブローカーが必要である。
ブローカーは、メッセージのTopicに基づいて、それを必要としているクライアントにメッセージ配信をしている。
アンディー·スタンフォード·クラーク（英語版）とシーラスリンクソリューションのアーレンニッパーは1999年に、プロトコルの最初のバージョンを執筆している。
wikipediaより端的に言うと・・・

IoT機器のような低スペック機器でも利用できるデータ連携用のプロトコル です。
Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

7

MQTTの全体像
サーバに受信登録（Subscribe）する

データ受信者（Subscriber）

1.Subscribe

MQTTサーバ（MQTT Broker）

受信登録者にメッセージを送信（Publish）する

データ配信者（Publisher）

3.メッセージ

データ受信者

1.Subscribe

2.Publish（メッセージ）

3.メッセージ

データ受信者

1.Subscribe

3.メッセージ

Subscribe中のユーザにメッセージを一斉配信
Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

MQTT BrokerをRaspberry Piで構築する8MQTT Brokerの種類• MQTT Brokerは様々なソフトウェア、サービスで提供されています。
提供形式

ソフトウェア／サービス名

提供元

1 ソフトウェア

Mosquitto

Eclipse Foundation

2

ActiveMQ（旧名：Apollo）

Apache Foundation

3

RabbitMQ

Pivotal4

Mosca

githubで公開

5

EMQ X Broker

githubで公開

6

VerneMQ

githubで公開

7 サービスAWS IoT

Amazon Web Services

8

Cloud IoT Core
Cloud Pub/SubGoogle

9

Azure IoT Hub

Microsoft#Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

9

Mosquittoとは• MosquittoはMQTTのリファレンス実装です。
MQTTの全仕様を網羅しています。
https://mosquitto.org/

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

10

Mosquittoをセットアップ• Raspberry Piにsshログイン後、aptコマンドでインストールします。
• 各コマンドのバージョン確認、サービスが「active状態」であれば成功です。
# Mosquittoのインストール
sudo apt install mosquitto mosquitto-clients# インストール確認（バージョンを確認）
mosquitto --help
mosquitto_sub --help
mosquitto_pub --help# mosquittoサービスのステータス確認
systemctl status mosquitto
Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

11

Mosquittoのコマンド#コマンド
1 mosquitto

内容
MQTT Brokerサービス。

2 mosquitto_sub

Subscribeコマンド。
任意のトピックを監視し、メッセージを取得する。

3 mosquitto_pub

Publishコマンド。
任意のトピックに、メッセージを送信する。

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

12

実践MQTT（RaspberryPi編）• Raspberry Piにsshターミナル2つでログインし、それぞれをPublisher、Subscriberとしてメッセージの送受信をします。
Raspberry Pi
mosquitto（Linuxデーモン）
1.Subscribe

2.Publish
topic/aitc

mosquitto_sub（sshターミナル）

3.メッセージ

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

mosquitto_pub（sshターミナル）13実践MQTT（RaspberryPi編）• mosquitto_subでトピックの監視を開始、その後mosquitto_pubでメッセージを送信
すると、mosquitto_sub側に表示されます。
$ mosquitto_sub -d -t topic/aitc -h 127.0.0.1
受信側
Client mosqsub/13382-raspberry sending CONNECT
Client mosqsub/13382-raspberry received CONNACK
Client mosqsub/13382-raspberry sending SUBSCRIBE (Mid: 1, Topic: topic/aitc, QoS: 0)
Client mosqsub/13382-raspberry received SUBACK
Subscribed (mid: 1): 0
Client mosqsub/13382-raspberry received PUBLISH (d0, q0, r0, m0, 'topic/aitc', ... (15bytes))
メッセージを受信
hello mosquitto$ mosquitto_pub -d -t topic/aitc -h 127.0.0.1 -m "hello mosquitto"
送信側
Client mosqpub/13385-raspberry sending CONNECT
Client mosqpub/13385-raspberry received CONNACK
Client mosqpub/13385-raspberry sending PUBLISH (d0, q0, r0, m1, 'topic/aitc', ... (15bytes))
Client mosqpub/13385-raspberry sending DISCONNECT
Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

14

補足：トピック• メッセージをやり取りするにあたって、エンドポイントとなるものがトピックです。
• 任意のトピックを決めることで、混線することなくメッセージの送受信ができます。
mosquitto（Linuxデーモン）
1.Subscribe

トピック
2.Publish

topic/aitc

mosquitto_sub（sshターミナル）

3.メッセージ

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

mosquitto_pub（sshターミナル）15

実践MQTT（スマホ編）• スマホのMQTTアプリでSubscribeし、Rapberry PiからPublishしたメッセージを受信します。
スマートフォン

Raspberry Pi
mosquitto（Linuxデーモン）

1.Subscribe
topic/aitc
MQTTアプリ
3.メッセージ

2.Publish
mosquitto_pub（sshターミナル）

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

16

実践MQTT（スマホ編）• 今回使用するMQTTアプリをインストールしてします。
iOSの方Androidの方

MQTTool

MQTT Client

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

17

実践MQTT（iOS編）• MQTToolを起動し、Mosquittoへの接続設定、Subscribeの設定をします。
接続設定
接続先を設定する※Hostは外部から接続できるIP

Subscribe設定
監視するトピックを設定

設定後
タップ
設定後
タップ

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

18

実践MQTT（iOS編）• Raspberry Pi上からメッセージをPublishするとMQTToolにメッセージが表示されます。
$ mosquitto_pub -d -t topic/aitc -h 127.0.0.1 -m "hello mosquitto"

Raspberry Pi

Raspberry Piから送信したメッセージがMQTToolに表示された

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

19

実践MQTT（Android編）• MQTT Clientを起動し、Mosquittoへの接続設定、Subscribeの設定をします。
接続設定

Subscribe設定

設定後
タップ
Client ID
設定

接続先を設定する

監視する
トピックを設定

設定後
タップ追加ボタンをタップ

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

20

実践MQTT（Android編）• Raspberry Pi上からメッセージをPublishするとMQTT Clientにメッセージが表示されます。
$ mosquitto_pub -d -t topic/aitc -h 127.0.0.1 -m "hello mosquitto"

Raspberry Pi

Raspberry Piから送信したメッセージがMQTT Clientに表示された

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

21

実践MQTT（センサー編）• センサーから取得したデータをメッセージとして送受信します。
Raspberry Pi
mosquitto（Linuxデーモン）
3.Publish

1.Subscribe

センシング
スクリプト

2.センシングセンサー

topic/aitc
4.メッセージ

mosquitto_sub（sshターミナル）／Subscriber
スクリプト

1.Subscribe

スマホ

4.メッセージ

MQTT
ClientCopyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

22

実践MQTT（温度センサー）• 温度センサー（DHT11）から温湿度を取得します。

参考：※第2回勉強会資料
Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

23

実践MQTT（温度センサー）• Python3用のMQTTクライアントモジュールをインストールします。
$ sudo pip3 install paho-mqttCopyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

Raspberry Pi24

実践MQTT（温度センサー）• DHT11のサンプルを修正し、温湿度取得時にメッセージを送信するように修正します。
– example.pyをコピーして dht11_example.py作成– 20行目付近に赤字部分を追加
dht11_example.py
import paho.mqtt.client as mqtt・・・
if result.is_valid():
print("Last valid input: " + str(datetime.datetime.now()))
print("Temperature: %d C" % result.temperature)
print("Humidity: %d %%" % result.humidity)# 温湿度をMQTTにPublishする
client = mqtt.Client()client.connect(‘127.0.0.1', 1883, keepalive=60)
client.publish('topic/aitc','時刻:'+ str(datetime.datetime.now()) + ' 温度:' + str(result.temperature)) + ' 湿度:' + str(result.humidity))
Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

25

実践MQTT（温度センサー）• dht11_example.pyを実行します。
– 6秒毎に温度・湿度の数値が送信されます。
$ python3 dht11_example.py

送信側$ mosquitto_sub -d -t topic/aitc -h 127.0.0.1
受信側
Client mosqsub/13382-raspberry sending CONNECT
Client mosqsub/13382-raspberry received CONNACK
Client mosqsub/13382-raspberry sending SUBSCRIBE (Mid: 1, Topic: topic/aitc, QoS: 0)
Client mosqsub/13382-raspberry received SUBACK
Subscribed (mid: 1): 0
Client mosqsub/13382-raspberry received PUBLISH (d0, q0, r0, m0, ‘topic/aitc’, ... (15bytes))
時刻:2019-05-08 17:14:10.597891 温度:26 湿度:40

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

26

実践MQTT（サーバ連携編）• インターネット上のMQTT Brokerを中継してメッセージを受信します。
※ブリッジといいます。
スマートフォン
Subscribe先はインターネット上のMQTT Broker

インターネット上のサーバ（ cloud3.aitc.jp ）MQTT Broker

Raspberry Pimosquitto（Linuxデーモン）
3.転送
topic/aitc

1.Subscribe

topic/aitc
MQTTアプリ
3.メッセージ

2.Publish
mosquitto_pub（sshターミナル）

Publish先はRaspberry Pi上のMQTT Broker
Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

27

実践MQTT（サーバ連携編）• Mosquittoでブリッジをするには、ブリッジの設定を設定ファイルに記述します。
$ cd /etc/mosquitto/conf.d$ sudo vim aitc-cloud3.conf～ 設定記述後 ～$ sudo systemctl restart mosquitto

設定ファイルの作成と反映
・・・設定ファイル作成

・・・設定ファイルを反映

connection aitc-cloud3.<名前のアルファベット>
address cloud3.aitc.jp:1883
try_private false
例

aitc-cloud3.conf

aitc-cloud3.shigenobu.kondo

topic # out 0
topic # in 0
Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

28

実践MQTT（サーバ連携編）• Mosquittoでブリッジをするには、ブリッジの設定を設定ファイルに記述します。
$ mosquitto_pub -d -t topic/aitc -h cloud3.aitc.jp -m “mosquitto direct”$ mosquitto_pub -d -t topic/aitc -h 127.0.0.1 -m “mosquitto bridge”①②

MQTTアプリの設定
Host：cloud3.aitc.jp
Port ：1833②
mosquitto_pubの送信先が異なる2つのメッセージが、「cloud3.aitc.jp」から受信できている。

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

①29

本日はここまで質疑応答

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

30

次回予告
• Webカメラで撮影した画像を解析する方法を学びます。

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

31アンケートのお願い
本日の勉強会についてご意見／ご感想をご記入ください。

http://apps.aitc.jp/senior/3.html

Copyright © 2016 Advanced IT Consortium to Evaluate, Apply and Drive All Rights Reserved.

32