こんにちは。本日は Python mini hack-a-thon 夏山合宿 2015 に来ています。

2015年10月9日にPyCon JP 2015にて、「Python x Edison x AWSではじめる IoT」と題したチュートリアルを行います。

その関係もあり IoT ネタです。

Mosquiito の導入

MQTT の broker として Mosquitto を利用します。

Ubuntu へのインストール手順を示します。apt-get で導入できるバージョンは MQTT の v3.1.1 に対応していない古いバージョンため、ソースからインストールします。

# 依存ライブラリの導入
apt-get install gcc make g++ uuid-dev libssl-dev libc-ares-dev 

# ソースからインストール
cd /usr/local/src
sudo wget http://mosquitto.org/files/source/mosquitto-1.4.3.tar.gz
sudo tar zxvf mosquitto-1.4.3.tar.gz
cd mosquitto-1.4.3
sudo make && make install

# 起動
mosquitto

最低限利用するだけなら設定変更は必要ありません。正常に起動すると port1883 で Listen します。

Publisher の用意

メッセージを送る Publisher を用意します。パッケージとして paho-mqtt を利用します。

paho-mqtt は pip インストール可能です。Python 3.4.3 で動作確認済みです。

pip install paho-mqtt

Publisher を用意します。

from time import sleep
import paho.mqtt.client as mqtt

host = '127.0.0.1'
port = 1883
topic = 'iktakahiro/a'

# インスタンス作成時に protocol v3.1.1 を指定します
client = mqtt.Client(protocol=mqtt.MQTTv311)

client.connect(host, port=port, keepalive=60)

for i in range(3):
    client.publish(topic, 'ham')
    sleep(0.2)

client.disconnect()

スクリプト pub.py を実行してみて、mosquitto をフォアグラウンドで実行しているコンソールに以下のように表示されていれば接続できていると思われます。

1441422450: New client connected from 10.0.2.2 as paho/1F1DC7CD0CC085DF16 (c1, k60).
1441422451: Client paho/1F1DC7CD0CC085DF16 disconnected.

Subscriber の用意

Publisher が送ったメッセージを受け取る Subscriber を用意します。

import paho.mqtt.client as mqtt

host = '127.0.0.1'
port = 1883
topic = 'iktakahiro/a'

def on_connect(client, userdata, flags, respons_code):
    print('status {0}'.format(respons_code))

    client.subscribe(topic)

def on_message(client, userdata, msg):
    print(msg.topic + ' ' + str(msg.payload))

if __name__ == '__main__':

    # Publisherと同様に v3.1.1を利用
    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()

topic は Publisher で利用したものと揃えておきます。on_connect() や on_message() は Callback関数で、状況に応じて呼び出されます。

動作確認

sub.py を実行後に、pub.py を実行します。sub.py を実行した側のコンソールに以下のように表示されていれば成功です。

status 0
iktakahiro/a:b'ham'
iktakahiro/a:b'ham'
iktakahiro/a:b'ham'

以上です。