Моделирование Интернета вещей с помощью MQTT - PullRequest
0 голосов
/ 29 мая 2020

, поэтому у меня возникли проблемы с частью моего кода, связанной с публикацией / подпиской. Совершенно новый, так что простите за незнание. :) Я использую Москитто.

ЭТА ЧАСТЬ ПРОСТО ГЕНЕРИРУЕТ НЕКОТОРЫЕ СЛУЧАЙНЫЕ ТЕМПЕРАТУРЫ:

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'

1 Ответ

0 голосов
/ 29 мая 2020

Из Paho Python docs :

publi sh ()

publi sh (topi c, payload = None, qos = 0, keep = False)

Похоже, вы передаете дополнительный аргумент функции publi sh.

У вас есть следующее:

  • Строка, которая должна быть topi c "TopicID"
  • Другая строка, которая выглядит как topi c, но на самом деле будет интерпретироваться как полезная нагрузка
  • Строка JSON, которая, как я полагаю, вы хотите использовать в качестве полезной нагрузки.
  • Значение QOS

Поскольку ваш код подписки предназначен только для подписки на топи c "TopicID" Я предлагаю вам удалить вторую строку, чтобы она соответствовала do c.

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