佐藤の屋敷

技術的なことを残せれば幸い

MQTTを試してみる( 1/2 )

仕事では無縁なものだったので話には聞いていたけど全く手を出していなかったのですが、そろそろ知っておかないとなあと感じ始めましたので、やってみることにしました。(ラズパイで使う予定)

■MQTTとはなんぞや

  • 1対多の通信可能なプロトコル
  • すごく軽量
  • 仕組みが簡単
  • IoTサービスにうってつけ
  • チャットやらスマホのゲームなんかにも使われる

■目的、したいこと

  • MQTTを使ってみたい
  • サーバーはCentOSで
  • ブローカーはMosquitto
  • クライアントはJavaScriptを希望だけど、今回はPython。

■環境、用意するもの

  • Windows 8.1 64bit
  • Windows上のCentOS6.X 仮想サーバ(vargrant)でのmosquitto-1.4.5
  • Windows上のクライアントはPaho 1.1 ( Python client )

■入手元

ブローカー( Mosquitto )

クライアント( Paho )

■以下手順

  1. CentOSを準備( vagrant init puphpet/centos65-x64 ) *1
  2. CentOS起動( vagrant up )
  3. CentOSの初期の設定をごにょごにょする。(password変えたり、ユーザ作ったり)
  4. yum で mosquitto をインストールする。
  5. mosquittoを起動する。
  6. WindowsからPython接続してみる。上手くいく。
  7. JavaScript編は次回へ続く

■以下、気になるところの説明

4. yumでmosquitto をインストールする。

# cd /etc/yum.repos.d

yumリポジトリを準備します。

# wget http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-6/home:oojah:mqtt.repo

ファイルをダウンロードします

# yum install mosquitto

mosquittoをインストール

5. mosquittoを起動する。

# /etc/init.d/mosquitto start

6. WindowsからPython接続してみる。上手くいく。

WindowsにPython2.7がインストールされていることが前提です。無い場合はインストールしてください。

Takahiro Ikeuchi氏のコードを拝借して接続テストを試みます。librabuch.jp

まずは paho-mqtt というパッケージを用意します。私の場合はIntellij IDEAですので、Pythonで新規プロジェクトを準備し、内部ターミナルでpipを実行しました。
f:id:satoysan:20151111002759p:plain

それでは、コードを拝借してsub.py,pub.pyの準備を。。一部IPやらトピックなどを修正しています。

pub.py ( 1秒置きに5回ループしながら「test test」をサブスクライバーへ )

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

host = '192.168.11.52'
port = 1883
topic = 'sato/a1'

client = mqtt.Client(protocol=mqtt.MQTTv311)

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

for i in range(5):
    client.publish(topic, 'test test')
    sleep(1)

client.disconnect()

sub.py

import paho.mqtt.client as mqtt

host = '192.168.11.52'
port = 1883
topic = 'sato/a1'

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__':

    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()

で…sub.py,pub.pyを実行したのですが、接続失敗しました。なぜなら…iptablesが邪魔しておりました。22ポートを除く他のポートがALLブロックされてて…なので、まずは解放というか停止。

# /etc/init.d/iptables stop
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]

気を取り直してsub.py,pub.pyを実行。問題なく1秒置きにsub.py側に「sato/a1 test test」が出力されます。
f:id:satoysan:20151111005322p:plain

まずはめでたしめでたし。

7. JavaScript編は次回へ続く

こっちはWebSocketでハマります。CentOS用のmosquittoの闇は深いです。
次回へ続く。

*1:vagrantの起動とか設定はここでは省きます。