LoginSignup
15
12

More than 5 years have passed since last update.

MQTT Subscriber ボックスを作る

Last updated at Posted at 2015-04-05

はじめに

今回は MQTT の Subscriber 側のボックスを作り、Pepper 君で動作させてみました。

Publisher 側で動作させてみた内容はこちら。

まだまだ、MQTT 勉強中です。

MQTT Subscriber ボックス

MQTT の Python 用ライブラリとして、以下のライブラリを使用します。

設定項目

MQTT のブローカの情報と、取得するトピックの情報を設定します。

2015040401.png

Python コード

MQTT ブローカに接続し、トピックを Subscribe します。その後、loop_forever で受信待機状態に。
プログラム終了時にはトピックを Unsubscribe します。

ボックス内でのライブラリの使用方法は、以下の記事を参考にさせて頂きました。

(なんか見直してたら、コードを直したくなってきた)

class MyClass(GeneratedClass):
    def __init__(self):
        GeneratedClass.__init__(self)

    def onLoad(self):
        self.framemanager = ALProxy("ALFrameManager")
        self.folderName = None

    def onUnload(self):
        import sys

        self.mqttc.unsubscribe(self.topic)

        if self.folderName and self.folderName in sys.path:
            sys.path.remove(self.folderName)
        self.folderName = None

    def onInput_onStart(self, payload):
        import sys, os

        self.folderName = os.path.join(
            self.framemanager.getBehaviorPath(self.behaviorId), "../lib")
        if self.folderName not in sys.path:
            sys.path.append(self.folderName)

        import paho.mqtt.client as paho

        self.host       = self.getParameter("Broker Host")
        self.port       = self.getParameter("Broker Port")
        self.keep_alive = self.getParameter("KeepAlive")
        self.topic      = self.getParameter("Topic")
        self.qos        = self.getParameter("Qos")

        self.mqttc = paho.Client()
        self.mqttc.on_message = self.onMessage
        self.mqttc.connect(self.host, self.port, self.keep_alive)
        self.mqttc.subscribe(self.topic, self.qos)

        self.mqttc.loop_forever()

    def onMessage(self, mqttc, obj, msg):
        self.logger.info("topic: " + msg.topic + ", payload: " + str(msg.payload) + ", qos: " + str(msg.qos) + ", retain: " + str(msg.retain))

    def onInput_onStop(self):
        self.onUnload()
        self.onStopped()

Choregraphe で接続

2015040402.png

Publisher 側

MQTT ブローカに "hello world" を飛ばすだけです。

pub.py
# coding=utf8

import paho.mqtt.client as paho

mqttc = paho.Client()

mqttc.connect("test.mosquitto.org", 1883, 60)
mqttc.publish("my/topic/pepper5", "hello world", 1)

動作確認

Subscriber を実行

Choregraphe でプログラムを実行し、メッセージの受信待機状態になります。

Publisher を実行

ターミナルから Publisher を実行します。

$ python pub.py

結果表示

Publisher -> Broker -> Subscriber とメッセージが伝わり、Subscriber 側である Choregraphe のログビューアに内容が表示されます。

2015040403.png

動作確認2

試しに Subscriber 側でのメッセージ受信時の処理を下の形に変えてみると、Pepper 君がしゃべってくれます。

    def onMessage(self, mqttc, obj, msg):
        tts = ALProxy("ALTextToSpeech")
        tts.say(msg.payload)

感想

  • Publisher / Subscriber と両方やりましたが、Publisher 側としては各種情報を定期的に飛ばす、Subscriber 側としてはコントロールの情報を取得して処理を変える、という感じが Pepper 君では使いやすそうかな。
  • 今回は試していないですが、一対多、多対一という使い方も面白そうですね。
15
12
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
15
12