pepper MQTT Publisher ボックスを作る
MQTT Publisher ボックス
MQTT の Python 用ライブラリとして、以下のライブラリを使用します。
githubからダウンロードして、
paho.mqtt.python-master/src/pahoをプロジェクトのlib配下にインポート
ますは Python ボックスを作り、入力の Type を「バン」から「文字列」に変更します。
設定項目
設定項目はこんな感じにします。
MQTT のブローカのホスト、ポート、KeepAlive 値と、メッセージ送信するトピック、QOS 値、Retain 値を指定できるようにします。
python コード
コードはこんな感じにします。各種パラメータを取得して、MQTT ブローカに接続・メッセージを送信します。
ボックス内でのライブラリの使用方法は、以下の記事を参考にさせて頂きました。
Choregraphe で接続
メッセージ内容を設定するための「Text Edit」ボックスと、作成した「MQTT」ボックスを接続します。
Subscriber 側
MQTT Publisher 側から送信するメッセージを受け取る側になる Subscriber を用意します。Pub 側と同じ Paho ライブラリを使用しています。
動作確認
Subscriber を実行
PC 上で実行し、トピックに対するメッセージを受け取るために待機します。
Publisher を実行
Choregraphe でプログラムを実行し、メッセージを送信します。
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
以下の赤の部分を追加して、debugしてみる。
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)
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 側で表示されました。
結論からいうと、githubからダウンロードしたソースコードをそのままプロジェクトにインポートするのではなくて、
該当のプロジェクトの配下でpip install paho-mqtt --target ./lib --no-compileでインストール。
原因はまだわからないけど。