概要
前回との違いは以下です。
- Broker, Publisher, Subscriberを別々のサーバにする
- プログラムでPub-Subを確認する
環境
VM構築
Vagrantfileに以下のコードを貼り付けて実行します。
config.vm.define :broker do |node| node.vm.hostname = "broker" node.vm.network :private_network, ip: "192.168.33.11" end config.vm.define :publisher do |node| node.vm.hostname = "publisher" node.vm.network :private_network, ip: "192.168.33.12" end config.vm.define :subscriber do |node| node.vm.hostname = "subscriber" node.vm.network :private_network, ip: "192.168.33.13" end
$ vagrant up
Broker
こちらは前回と同じくMosquittoを使います。
broker:~$ sudo apt-get install mosquitto
Publisher, Subscriber共通
今回はPythonで構築します。
$ sudo apt-get install python-pip $ sudo pip install paho-mqtt
このpaho
というEclipseのプロジェクトがMQTTの開発を続けているので、クライアントに悩んだらとりあえずpaho
と書いてあるものを探すといいです。
Publisher
publisher:~$ vim pub.py
以下のソースを貼り付けて下さい。
# coding=utf8 import paho.mqtt.client as paho def on_connect(mqttc, obj, rc): print("rc: "+str(rc)) def on_message(mqttc, obj, msg): print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload)) def on_publish(mqttc, obj, mid): print("mid: "+str(mid)) if __name__ == '__main__': mqttc = paho.Client(protocol=paho.MQTTv31) mqttc.on_message = on_message mqttc.on_connect = on_connect mqttc.on_publish = on_publish mqttc.connect("192.168.33.11", 1883, 60) mqttc.publish("my/topic/string", "hello world", 1)
Subscriber
subscriber:~$ vim sub.py
同様に以下のソースを貼り付けて下さい。
# coding=utf8 import paho.mqtt.client as paho def on_connect(mqttc, obj, rc): print("rc: "+str(rc)) def on_message(mqttc, obj, msg): print(msg.topic+" "+str(msg.qos)+" "+str(msg.payload)) def on_subscribe(mqttc, obj, mid, granted_qos): print("Subscribed: "+str(mid)+" "+str(granted_qos)) if __name__ == '__main__': mqttc = paho.Client(protocol=paho.MQTTv31) mqttc.on_message = on_message mqttc.on_connect = on_connect mqttc.on_subscribe = on_subscribe mqttc.connect("192.168.33.11", 1883, 60) mqttc.subscribe("my/topic/string", 0) mqttc.loop_forever()
動作確認
ログ見やすいようにBrokerをフォアグラウンド実行します。
一度サービスを停止してから再度実行します。
broker:~$ sudo service mosquitto stop broker:~$ mosquitto 1415940762: mosquitto version 0.15 (build date 2013-08-23 19:23:43+0000) starting 1415940762: Opening ipv4 listen socket on port 1883. 1415940762: Opening ipv6 listen socket on port 1883.
Subscriberを実行して受信状態にします。
subscriber:~$ python sub.py rc: 0 Subscribed: 1 (0,)
Brokerを見ると接続できているか確認できます。
1415940965: New connection from 192.168.33.13. 1415940965: New client connected from 192.168.33.13 as paho/47D61414790CF69926.
この時に以下のエラーが出るときはバージョンが違います。3.1.1と3.1の違いみたいです。
Invalid protocol "MQTT" in CONNECT
Publisherを実行してhello world
を送信してみましょう。
publisher:~$ python pub.py
Subscriberの方を見るときちんと受信できてます。
my/topic/string 0 hello world
Brokerの方は以下の様なログが出ます。
1415941269: New connection from 192.168.33.13. 1415941269: New client connected from 192.168.33.13 as paho/EF0E5C9E20C84AFD5E. 1415941293: New connection from 192.168.33.12. 1415941293: New client connected from 192.168.33.12 as paho/7FF17CFD6C3A3D6234. 1415941293: Socket read error on client paho/7FF17CFD6C3A3D6234, disconnecting.