LoginSignup
8
8

More than 3 years have passed since last update.

mosquitto,paho-mqttで画像のやりとり

Last updated at Posted at 2019-02-24

MQTT通信で画像のやりとりをした際の備忘録.ここでは,MQTT通信については詳細に説明しないが,MQTTはメッセージを送信する"Publisher",メッセージを受信する"Subscriber",メッセージを仲介してやり取りする"Broker"の3端末が存在する.
なお,MQTT通信にはmosquittoとpaho-mqttで行った.

使用した技術

mosquitto

MQTTプロトコルを利用するためのオープンソースのブローカーである.mosquittoのインストールによってMQTT通信が手軽に実現できる( https://mosquitto.org/ ).

paho-mqtt

MQTT通信をアプリケーション上に実装するために必要なオープンソースのライブラリ.利用するにはmosquittoが必要.

手順

環境

Publisherに Raspberry Pi3 Model B(OS:Raspbian)を,BrokerとSubscriberにVMのUbuntu 16.04を使用した.

mosquittoのインストール

Download|Eclipse Mosquitto にあるように,Ubuntu系へのインストールはターミナルで簡単にできる.
Brokerへのインストールは

$  sudo apt install mosquitto

でできる.また,Publisher/Subscriberへのインストールは

$  sudo apt install mosquitto-clients

でできる.

なお,最新版のmosquittoが欲しい場合は上記手順の実行前に

$  sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
$  sudo apt update

を行い,mosquitto-dev PPAをリポジトリリストに追加する.

paho-mqttのインストール

pipを用いてインストールする.

$  pip install paho-mqtt

画像のやりとり

手順としては以下のとおりである.

  1. Brokerの準備
  2. SubscriberがBrokerにTOPICをSubscribeする.
  3. PublisherがBrokerに対して,TOPICとしてファイル等をPublishする.

Broker

あらかじめ,mosquittoが起動しているかどうかを確認しておく.
確認コマンドは以下の通り.

$  systemctl status mosquitto

このとき,ACTIVE: active (running)と表示されればOK.
もし,表示がされていない場合は$ systemctl start mosquittoを実行し,mosquittoを起動しておく.

SubScriber

以下のプログラムSubscribe.pyをSubscriberに保存し,変数hosttopicの値を書き換える.
※python2系とpython3系でプログラムが少し異なります.

【python2系 Subscribe.py】
Subscribe.py
# coding: UTF-8
# MQTT Pahoのインポート
import paho.mqtt.client as mqtt

##################
# hostとtopicは書き換える
##################
# MQTT Brokerの情報
host = 'XXX.XXX.XXX.XXX' # BrokerのIPアドレスを指定
port = 1883 # MQTTのポート 通常はこのままでOK
topic = 'TOPIC_NAME' # Subscribeするtopic名を記述

# MQTT Brokerへの接続する関数
def on_connect(client, userdata, flags, respons_code):
    print('status {0}'.format(respons_code))
    client.subscribe(topic)

# 受信したバイナリデータを output.jpg として保存する関数
def on_message(client, userdata, msg):
    outfile = open('./output.jpg', 'w') # python 2系の場合
                                        # python 3系の場合は第2引数を 'wb' にする
    outfile.write(msg.payload)
    outfile.close

if __name__=='__main__':
    client = mqtt.Client(protocol=mqtt.MQTTv311)
    client.on_connect = on_connect
    client.on_message = on_message
    client.connect(host, port=port, keepalive=60)
    client.loop_forever()

【python3系 Subscribe.py】
Subscribe.py
# coding: UTF-8
# MQTT Pahoのインポート
import paho.mqtt.client as mqtt

##################
# hostとtopicは書き換える
##################
# MQTT Brokerの情報
host = 'XXX.XXX.XXX.XXX' # BrokerのIPアドレスを指定
port = 1883 # MQTTのポート 通常はこのままでOK
topic = 'TOPIC_NAME' # Subscribeするtopic名を記述

# MQTT Brokerへの接続する関数
def on_connect(client, userdata, flags, respons_code):
    print('status {0}'.format(respons_code))
    client.subscribe(topic)

# 受信したバイナリデータを output.jpg として保存する関数
def on_message(client, userdata, msg):
    outfile = open('./output.jpg', 'wb') # python 3系の場合は第2引数を 'wb' にする
    outfile.write(msg.payload)
    outfile.close

if __name__=='__main__':
    client = mqtt.Client(protocol=mqtt.MQTTv311)
    client.on_connect = on_connect
    client.on_message = on_message
    client.connect(host, port=port, keepalive=60)
    client.loop_forever()

このプログラムは,指定したbrokerのTOPICに対してsubscribeを行い,受信したデータをoutput.jpgとして保存するものである.

保存後は,以下のコマンドを実行する.

$  python Subscribe.py

Publisher

最後に,Publisherが送信したい画像をPublishする.

Publisher
$  mosquitto_pub -d -h XXX.XXX.XXX.XXX -t 'TOPIC_NAME' -f Pub.jpg

使用しているオプションを以下に示す.

  • -d:デバッグモード
  • -h:BrokerのIPアドレスを指定する.何も指定しない場合はlocalhostとなる.
  • -t:topic名を指定する.(必須)
  • -f:送信するファイル名

以上で,MQTTでファイルの送受信が可能となる.

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8