はじめに
今回は MQTT の Subscriber 側のボックスを作り、Pepper 君で動作させてみました。
Publisher 側で動作させてみた内容はこちら。
まだまだ、MQTT 勉強中です。
MQTT Subscriber ボックス
MQTT の Python 用ライブラリとして、以下のライブラリを使用します。
設定項目
MQTT のブローカの情報と、取得するトピックの情報を設定します。
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 で接続
Publisher 側
MQTT ブローカに "hello world" を飛ばすだけです。
# 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 のログビューアに内容が表示されます。
動作確認2
試しに Subscriber 側でのメッセージ受信時の処理を下の形に変えてみると、Pepper 君がしゃべってくれます。
def onMessage(self, mqttc, obj, msg):
tts = ALProxy("ALTextToSpeech")
tts.say(msg.payload)
感想
- Publisher / Subscriber と両方やりましたが、Publisher 側としては各種情報を定期的に飛ばす、Subscriber 側としてはコントロールの情報を取得して処理を変える、という感じが Pepper 君では使いやすそうかな。
- 今回は試していないですが、一対多、多対一という使い方も面白そうですね。