【问题标题】:Simulated IoT with MQTT使用 MQTT 模拟物联网
【发布时间】:2020-05-29 15:33:16
【问题描述】:

所以我的代码的发布/订阅部分存在一些问题。全新的,所以请原谅无知。 :) 我正在使用蚊子。

这部分只是产生一些随机温度:

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】:

    来自 Paho Python docs

    发布()

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

    您似乎向发布函数传递了一个额外的参数。

    你有以下:

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

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

    mqtt_publisher.publish('TopicID', jmsg, 2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多