2016-12-07 19 views
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() 

どのような経験をお持ちの方もいますか?前もって感謝します。

答えて

1

client.publish()はどのように配列を受け入れると思いますか?

文書の(https://pypi.python.org/pypi/paho-mqtt/1.1#publishing)に複数のメッセージを公開することについて何も言及していない場合は、送信するメッセージごとにclient.publish()を1回呼び出す必要があります。

whileループでもclient.loop()に電話する必要があります。

while True: 
    schedule.run_pending() 
    client.loop() 
    time.sleep(1) 
+0

インターネットで検索している間に見つかりました。 http://nullege.com/codes/search/paho.mqtt.publish.multiple同じ例がうまくいくと思った。しかし、とにかく、schedule.every()。minute関数の前に、すべてclient.publish関数を置かなければならないのですか? – Ling

+0

'paho.mqtt.publish.multiple()'メソッドは、呼び出されるたびに複数のメッセージを送信してブローカへの接続を構築して壊すので、より多くのメッセージを送信します。このユースケースでは、各メッセージに対して 'paho.mqtt.client.publish'を呼び出す方が意味があります。 – hardillb

関連する問題