|
@@ -15,10 +15,12 @@ class Connect(object):
|
|
|
def __init__(self, act):
|
|
|
act.connect = self
|
|
|
self.client = mqtt.Client()
|
|
|
- self.client.on_connect = self.connect
|
|
|
state = hasattr(act, 'message')
|
|
|
if state:
|
|
|
+ self.client.on_connect = self.connectAndSub
|
|
|
self.client.on_message = act.message
|
|
|
+ else:
|
|
|
+ self.client.on_connect = self.connect
|
|
|
self.client.connect(Demeter.config['mqtt']['host'], Demeter.config['mqtt']['port'], int(Demeter.config['mqtt']['timeout']))
|
|
|
if state:
|
|
|
self.client.loop_forever()
|
|
@@ -30,6 +32,9 @@ class Connect(object):
|
|
|
return self.client
|
|
|
|
|
|
def connect(self, client, userdata, flags, rc):
|
|
|
+ pass
|
|
|
+
|
|
|
+ def connectAndSub(self, client, userdata, flags, rc):
|
|
|
|
|
|
|
|
|
sub = Demeter.config['mqtt']['sub'].split(',')
|
|
@@ -59,22 +64,30 @@ class Pub(object):
|
|
|
def __del__(self):
|
|
|
pass
|
|
|
|
|
|
- def push(self, key, msg, qos=0, retain=False, callback=False, param=False):
|
|
|
+ def push(self, key, msg, qos=0, retain=False, callback=False, param=False, feedback=False):
|
|
|
result = self.connect.getClient().publish(key,payload=msg,qos=qos,retain=retain)
|
|
|
|
|
|
- if qos in (1,2):
|
|
|
- self.callback = callback
|
|
|
- self.param = param
|
|
|
+ self.callback = callback
|
|
|
+ self.param = param
|
|
|
+ if feedback == True and 'key' in self.param:
|
|
|
+ self.connect.client.on_message = self.feedback
|
|
|
+ self.connect.client.subscribe(self.param['key'])
|
|
|
+ self.connect.client.loop_forever()
|
|
|
+ elif qos in (1,2):
|
|
|
self.connect.client.on_publish = self.publish
|
|
|
self.connect.client.loop_forever()
|
|
|
else:
|
|
|
self.connect.client.disconnect()
|
|
|
return result
|
|
|
|
|
|
- def publish(self, client, userdata, mid):
|
|
|
- self.callback(self.param, client, userdata, mid)
|
|
|
+ def publish(self, client, userdata, mid, msg='ok'):
|
|
|
+ self.callback(self.param, client, userdata, mid, msg)
|
|
|
self.connect.client.disconnect()
|
|
|
|
|
|
+ def feedback(self, client, userdata, msg):
|
|
|
+ if msg.topic == self.param['key']:
|
|
|
+ self.publish(client, userdata, 0, msg.payload)
|
|
|
+
|
|
|
class Sub(object):
|
|
|
|
|
|
def __init__(self):
|