0
mqttを使用して複数のランダムなデータをブローカーに公開しようとしています。以下は、公開パートのスクリプトです。同じトピックを持つ複数のメッセージを公開するPython MQTT
import paho.mqtt.client as mqtt
import json, schedule, time, random
client = mqtt.Client()
client.connect("<broker address", 1883, 60)
def pub_message():
tempreading = random.uniform(0, 100)
pHreading = random.uniform(1,14)
oxyreading = random.uniform(0, 100)
data_string1 = str(oxyreading)
data_string2 = str(pHreading)
data_string3 = str(tempreading)
msgs = [("randomdata", data_string1),("randomdata", data_string2),("randomdata", data_string3)]
client.publish(msgs)
schedule.every(1).minutes.do(pub_message)
while True:
schedule.run_pending()
time.sleep(1)
client.disconnect()
私は、スクリプトを実行し、以下のようなエラーがあります:
Traceback (most recent call last):
File "mqttpub.py", line 27, in <module>
schedule.run_pending()
File "/usr/local/lib/python2.7/dist-packages/schedule/__init__.py", line 462, in run_pending
default_scheduler.run_pending()
File "/usr/local/lib/python2.7/dist-packages/schedule/__init__.py", line 75, in run_pending
self._run_job(job)
File "/usr/local/lib/python2.7/dist-packages/schedule/__init__.py", line 129, in _run_job
ret = job.run()
File "/usr/local/lib/python2.7/dist-packages/schedule/__init__.py", line 377, in run
ret = self.job_func()
File "mqttpub.py", line 22, in pub_message
client.publish(msgs)
File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 980, in publish
rc = self._send_publish(local_mid, topic, local_payload, qos, retain, False, info)
File "/usr/local/lib/python2.7/dist-packages/paho/mqtt/client.py", line 1979, in _send_publish
utopic = topic.encode('utf-8')
AttributeError: 'list' object has no attribute 'encode'
私はMQTTとパブリッシュ複数のメッセージについての検索が、何かいいの参照を見つけることができませんでした。私は複数のメッセージを受け取るための私のmqtt購読部分も含めました。私はこの部分についても検索しましたが、良い参考文献は見つかりませんでした。
import paho.mqtt.client as mqtt
from models import *
from sqlalchemy.orm import sessionmaker
import json
def on_connect(client, userdata, rc):
print("connected with result code" + str(rc))
client.subscribe("randomdata")
def on_message(client, userdata, msg):
print "Topic:", msg.topic + " " + "Message:" + " " + "Value1:" + str(msg.payload1) + " " + "Value2:" + str(msg.payload2) + " " + "Value3:" + str(msg.payload3)
engine = create_engine('postgresql://user:[email protected]/mydatabase')
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
session = DBSession()
# store message received into database
raw_data = _Data(Value1=msg.payload1, Value2=msg.payload2, Value3=msg.payload3, time=msg.timestamp)
session.add(raw_data)
session.commit()
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("<broker address>",1883, 60)
client.loop_forever()
どのような経験をお持ちの方もいますか?前もって感謝します。
インターネットで検索している間に見つかりました。 http://nullege.com/codes/search/paho.mqtt.publish.multiple同じ例がうまくいくと思った。しかし、とにかく、schedule.every()。minute関数の前に、すべてclient.publish関数を置かなければならないのですか? – Ling
'paho.mqtt.publish.multiple()'メソッドは、呼び出されるたびに複数のメッセージを送信してブローカへの接続を構築して壊すので、より多くのメッセージを送信します。このユースケースでは、各メッセージに対して 'paho.mqtt.client.publish'を呼び出す方が意味があります。 – hardillb