带有MQTT的模拟物联网

问题描述 投票:-1回答:1

所以我的代码发布/订阅部分遇到了一些问题。全新,请原谅。 :)我正在使用Mosquitto。

此零件仅生成某些随机温度:

from random import random
class TemperatureSensor:
    sensor_type='temperature'
    units='celcius'
    instance_id='SN123'

def __init__(self, average_temperature, temperature_variation, min_temperature, max_temperature):
    self.average_temperature=average_temperature
    self.temperature_variation=temperature_variation
    self.min_temperature=min_temperature
    self.max_temperature=max_temperature
    self.value=0.0

def sense(self):
    self.value= self.simple_random()
    return self.value

def simple_random(self):
    value = self.min_temperature + (random() * (self.max_temperature - self.min_temperature))
    return value



ts = TemperatureSensor(20,20, 16, 35)

这是发布者:

    import paho.mqtt.client as mqtt
import datetime
from datetime import datetime
from Script1 import TemperatureSensor
import json


class Simulator:
    def __init__(self, interval):
        self.interval = interval

    def start(self):
        ts= TemperatureSensor(20,10,16,35)

        mqtt_publisher = mqtt.Client('Temperature publisher')
        mqtt_publisher.connect('127.0.0.1',1883,60)
        mqtt_publisher.loop_start()


        while True: 
          dt = datetime.now().strftime("%d-%m-%YT%H:%M:%S")
          message = {
             "type-id": "de.uni-stuttgart.iaas.sc." + ts.sensor_type,
             "instance-id": ts.instance_id,
             "timestamp": dt,
             "value":{
             ts.units: ts.sense()
             }

          }

          jmsg = json.dumps(message, indent=4)
          mqtt_publisher.publish('TopicID', ts.sensor_type + '/' + ts.instance_id, jmsg, 2)

          print(ts.sensor_type , ts.sense())
          time.sleep(self.interval)


s = Simulator(5)
s.start()

最后,这里是订户:

import paho.mqtt.client as mqtt
import json

def on_message(client, userdata, message):
    print('Message topic{}'.format(message.topic))
    print('Message payload:')
    print(json.message.payload.decode())

mqtt_subscriber = mqtt.Client('Temperature subscriber')
mqtt_subscriber.on_message = on_message
mqtt_subscriber.connect('127.0.0.1',1883,60)
mqtt_subscriber.subscribe('TopicID', qos=2)

mqtt_subscriber.loop_forever()

运行发布者时,出现如下错误:

Traceback (most recent call last):
  File "Script2.py", line 40, in <module>
    s.start()
  File "Script2.py", line 33, in start
    mqtt_publisher.publish('TopicID', ts.sensor_type + '/' + ts.instance_id, 2, jmsg)
  File "/Library/Python/2.7/site-packages/paho_mqtt-1.5.0.dev0-py2.7.egg/paho/mqtt/client.py", line 1300, in publish
    message.dup, message.info, message.properties)
  File "/Library/Python/2.7/site-packages/paho_mqtt-1.5.0.dev0-py2.7.egg/paho/mqtt/client.py", line 2523, in _send_publish
    command = PUBLISH | ((dup & 0x1) << 3) | (qos << 1) | retain
TypeError: unsupported operand type(s) for |: 'int' and 'str'
python-3.x mqtt iot mosquitto paho
1个回答
0
投票

从Paho Python docs

publish()

发布(主题,有效载荷=无,qos = 0,保留=假)

您似乎正在将一个额外的参数传递给publish函数。

您具有以下内容:

  • 应该是主题“ TopicID”的字符串
  • 另一个看起来像是主题的字符串,但实际上将被解释为有效负载
  • 我希望您成为有效负载的JSON字符串。
  • QOS值

由于您的订阅代码仅订阅主题“ TopicID”,因此建议您删除第二个字符串,使其与文档匹配。

mqtt_publisher.publish('TopicID', jmsg, 2)
© www.soinside.com 2019 - 2024. All rights reserved.