所以我的代码发布/订阅部分遇到了一些问题。全新,请原谅。 :)我正在使用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'
从Paho Python docs:
publish()
发布(主题,有效载荷=无,qos = 0,保留=假)
您似乎正在将一个额外的参数传递给publish函数。
您具有以下内容:
由于您的订阅代码仅订阅主题“ TopicID”,因此建议您删除第二个字符串,使其与文档匹配。
mqtt_publisher.publish('TopicID', jmsg, 2)