pepper MQTT Publisher ボックスを作る


MQTT Publisher ボックス

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

githubからダウンロードして、
paho.mqtt.python-master/src/pahoをプロジェクトのlib配下にインポート


ますは Python ボックスを作り、入力の Type を「バン」から「文字列」に変更します。

2015032101.png

設定項目

設定項目はこんな感じにします。

MQTT のブローカのホスト、ポート、KeepAlive 値と、メッセージ送信するトピック、QOS 値、Retain 値を指定できるようにします。


python コード

コードはこんな感じにします。各種パラメータを取得して、MQTT ブローカに接続・メッセージを送信します。

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

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

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

    def onUnload(self):
        import sys

        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

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

        mqttc = paho.Client()
        mqttc.connect(host, port, keep_alive)
        mqttc.publish(topic, payload, qos, retain)

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

Choregraphe で接続

メッセージ内容を設定するための「Text Edit」ボックスと、作成した「MQTT」ボックスを接続します。

2015032103.png

Subscriber 側

MQTT Publisher 側から送信するメッセージを受け取る側になる Subscriber を用意します。Pub 側と同じ Paho ライブラリを使用しています。
import paho.mqtt.client as paho

def on_message(mqttc, obj, msg):
print("topic: " + msg.topic + ", payload: " + str(msg.payload) + ", qos: \
" + str(msg.qos) + ", retain: " + str(msg.retain))

if __name__ == '__main__':
mqttc = paho.Client()

mqttc.on_message = on_message
mqttc.connect("test.mosquitto.org", 1883, 60)
mqttc.subscribe(“outan/pepper", 0)

mqttc.loop_forever()


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

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

[INFO ] behavior.box :onInput_onStart:20 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1755861472:/MQTT Publisher_1: /home/nao/.local/share/PackageManager/apps/.lastUploadedChoregrapheBehavior/behavior_1/../lib
[INFO ] behavior.box :onInput_onStart:23 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1755861472:/MQTT Publisher_1: ['/home/nao/.local/share/PackageManager/apps/biz_90010_weather-catcher/lib', '/usr/lib/python2.7/site-packages', '/usr/lib', '/usr/lib/python27.zip', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/lib/python2.7/site-packages', '/usr/lib/python2.7/site-packages/PIL', '/usr/lib/python2.7/site-packages/gst-0.10', '/usr/lib/python2.7/site-packages/gtk-2.0', '/usr/share/dialog/', '/home/nao/.local/share/PackageManager/apps/biz_10040_forbiz-reaction/ConvLexicon/', '/home/nao/.local/share/PackageManager/apps/biz_10040_forbiz-reaction/YesNoLexicon/', '/home/nao/.local/share/PackageManager/apps/biz_10040_forbiz-reaction/ChoicesLexicon/', '/home/nao/.local/share/PackageManager/apps/biz_10040_forbiz-reaction/ConvDaily/', '/home/nao/.local/share/PackageManager/apps/biz_10040_forbiz-reaction/ConvWeather/', '/home/nao/.local/share/PackageManager/apps/biz_10040_forbiz-reaction/EnqueteLexicon/', '/home/nao/.local/share/PackageManager/apps/sbr_00400_robot-health-checker/resident/..', '/home/nao/.local/share/PackageManager/apps/zzzzzz_c9da7da9-3524-4dc3-867b-7505bf884f55_b2bral/resident/..', '/home/nao/.local/share/PackageManager/apps/zzzzzz_c9da7da9-3524-4dc3-867b-7505bf884f55_b2bral/resident/..', '/home/nao/.local/share/PackageManager/apps/zzzzzz_c9da7da9-3524-4dc3-867b-7505bf884f55_b2bral/resident/..', '/home/nao/.local/share/PackageManager/apps/zzzzzz_c9da7da9-3524-4dc3-867b-7505bf884f55_b2bral/resident/..', '/home/nao/.local/share/PackageManager/apps/zzzzzz_c9da7da9-3524-4dc3-867b-7505bf884f55_b2bral/resident/..', '/home/nao/.local/share/PackageManager/apps/zzzzzz_c9da7da9-3524-4dc3-867b-7505bf884f55_b2bral/resident', '/home/nao/.local/share/PackageManager/apps/.lastUploadedChoregrapheBehavior/behavior_1/../lib']
[ERROR] behavior.box :_safeCallOfUserMethod:125 _Behavior__lastUploadedChoregrapheBehaviorbehavior_1755861472:/MQTT Publisher_1: Traceback (most recent call last):
File "/usr/lib/python2.7/site-packages/albehavior.py", line 113, in _safeCallOfUserMethod
func(functionArg)
File "", line 25, in onInput_onStart
ImportError: No module named paho.mqtt.client

pepper [0] ~/.local/share/PackageManager/apps/.lastUploadedChoregrapheBehavior $ ls -al
⇒sshでpepperにログインして、上記の配下にはなにもない。

下記の部分を削除して、chorographプロジェクトを再実行してみると、成功しました。
import paho.mqtt.client as paho

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

mqttc = paho.Client()
mqttc.connect(host, port, keep_alive)
mqttc.publish(topic, payload, qos, retain)

pepper [0] ~/.local/share/PackageManager/apps/.lastUploadedChoregrapheBehavior $ ls -al
drwxr-xr-x 4 nao nao 4096 Sep 13 11:51 .
drwxr-xr-x 216 nao nao 16384 Sep 13 11:51 ..
drwxr-xr-x 2 nao nao 4096 Sep 13 11:51 behavior_1
drwxr-xr-x 3 nao nao 4096 Sep 13 11:51 lib
-rw-r--r-- 1 nao nao 531 Sep 13 11:51 manifest.xml

└── paho
├── __init__.py
└── mqtt
├── __init__.py
├── client.py
├── publish.py
└── subscribe.py

⇒やはりgithubからダウンロードしたものをそのままprojectにインポートするやり方自体が大丈夫であるかどうかについては
きになる。

pahoのインポート方法を以下を参考:
paho-mqtt ライブラリをプロジェクトに取り込むには Choregraphe プロジェクトディレクトリ の下で次を実行します。
pip install paho-mqtt --target ./lib --no-compile


%lsal ruby:[2.2.2]
14162750 -rw-r--r--@ 1 outannexway staff - 0B 9 13 10:56:58 2016 .metadata
14184032 -rw-r--r--@ 1 outannexway staff - 2.1K 9 13 12:52:16 2016 MQTT Publisher.pml
14162751 drwxr-xr-x@ 3 outannexway staff - 102B 9 13 11:54:14 2016 behavior_1/
14170848 -rw-r--r--@ 1 outannexway staff - 474B 9 13 11:17:31 2016 manifest.xml

%pip install paho-mqtt --target ./lib --no-compile ruby:[2.2.2]
Collecting paho-mqtt
Installing collected packages: paho-mqtt
Successfully installed paho-mqtt-1.1

%lsal ruby:[2.2.2]
14162750 -rw-r--r--@ 1 outannexway staff - 0B 9 13 10:56:58 2016 .metadata
14184032 -rw-r--r--@ 1 outannexway staff - 2.1K 9 13 12:52:16 2016 MQTT Publisher.pml
14162751 drwxr-xr-x@ 3 outannexway staff - 102B 9 13 11:54:14 2016 behavior_1/
14184823 drwxr-xr-x@ 4 outannexway staff - 136B 9 13 12:57:11 2016 lib/
14170848 -rw-r--r--@ 1 outannexway staff - 474B 9 13 11:17:31 2016 manifest.xml
outannexway@MacBook-Pro ~/Dropbox/09.Pepper/project/MQTT Publisher

%tree ruby:[2.2.2]
.
├── MQTT Publisher.pml
├── behavior_1
│ └── behavior.xar
├── lib
│ ├── paho
│ │ ├── __init__.py
│ │ └── mqtt
│ │ ├── __init__.py
│ │ ├── client.py
│ │ ├── publish.py
│ │ └── subscribe.py
│ └── paho_mqtt-1.2.dist-info
│ ├── DESCRIPTION.rst
│ ├── INSTALLER
│ ├── METADATA
│ ├── RECORD
│ ├── WHEEL
│ ├── metadata.json
│ └── top_level.txt
└── manifest.xml

%diff client.py ~/Downloads/paho.mqtt.python-master/src/paho/mqtt/client.py ruby:[2.2.2]
%diff publish.py ~/Downloads/paho.mqtt.python-master/src/paho/mqtt/publish.py ruby:[2.2.2]
%diff subscribe.py ~/Downloads/paho.mqtt.python-master/src/paho/mqtt/subscribe.py
⇒githubからダウンロードしたファイルとはまったく同じだけど。
paho_mqtt-1.2.dist-infoの差しかありませんが。

Choregraphe でプログラムを実行したら、うまく出来た。
⇒成功したり、成功しなかたりする場合がある。
上記とは関係なさそうですね。

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
⇒このメッソドが怪しそうです。削除したほうがいいかな?


結果表示

Publisher -> Broker -> Subscriber とメッセージが伝わり、Subscriber 側で表示されました。

$ python sub.py
topic: outan/pepper, payload: b'Hello World from Pepper outan', qos: 0, retain: 0
結論からいうと、githubからダウンロードしたソースコードをそのままプロジェクトにインポートするのではなくて、
該当のプロジェクトの配下でpip install paho-mqtt --target ./lib --no-compileでインストール。
原因はまだわからないけど。