-
Notifications
You must be signed in to change notification settings - Fork 1
/
MqttClient.py
143 lines (111 loc) · 4.17 KB
/
MqttClient.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import sys
from PyQt5 import QtCore
import paho.mqtt.client as mqtt
import URBasic
from Robot import MyRobot
class MqttClient(QtCore.QObject):
Disconnected = 0
Connecting = 1
Connected = 2
MQTT_3_1 = mqtt.MQTTv31
MQTT_3_1_1 = mqtt.MQTTv311
connected = QtCore.pyqtSignal()
disconnected = QtCore.pyqtSignal()
stateChanged = QtCore.pyqtSignal(int)
hostnameChanged = QtCore.pyqtSignal(str)
portChanged = QtCore.pyqtSignal(int)
keepAliveChanged = QtCore.pyqtSignal(int)
cleanSessionChanged = QtCore.pyqtSignal(bool)
protocolVersionChanged = QtCore.pyqtSignal(int)
messageSignal = QtCore.pyqtSignal(str)
def __init__(self, parent=None):
super(MqttClient, self).__init__(parent)
self.m_hostname = ""
self.m_port = 1883
self.m_keepAlive = 60
self.m_cleanSession = True
self.m_protocolVersion = MqttClient.MQTT_3_1
self.m_state = MqttClient.Disconnected
self.m_client = mqtt.Client(clean_session=self.m_cleanSession,
protocol=self.protocolVersion)
self.m_client.on_connect = self.on_connect
self.m_client.on_message = self.on_message
self.m_client.on_disconnect = self.on_disconnect
@QtCore.pyqtProperty(int, notify=stateChanged)
def state(self):
return self.m_state
@state.setter
def state(self, state):
if self.m_state == state: return
self.m_state = state
self.stateChanged.emit(state)
@QtCore.pyqtProperty(str, notify=hostnameChanged)
def hostname(self):
return self.m_hostname
@hostname.setter
def hostname(self, hostname):
if self.m_hostname == hostname: return
self.m_hostname = hostname
self.hostnameChanged.emit(hostname)
@QtCore.pyqtProperty(int, notify=portChanged)
def port(self):
return self.m_port
@port.setter
def port(self, port):
if self.m_port == port: return
self.m_port = port
self.portChanged.emit(port)
@QtCore.pyqtProperty(int, notify=keepAliveChanged)
def keepAlive(self):
return self.m_keepAlive
@keepAlive.setter
def keepAlive(self, keepAlive):
if self.m_keepAlive == keepAlive: return
self.m_keepAlive = keepAlive
self.keepAliveChanged.emit(keepAlive)
@QtCore.pyqtProperty(bool, notify=cleanSessionChanged)
def cleanSession(self):
return self.m_cleanSession
@cleanSession.setter
def cleanSession(self, cleanSession):
if self.m_cleanSession == cleanSession: return
self.m_cleanSession = cleanSession
self.cleanSessionChanged.emit(cleanSession)
@QtCore.pyqtProperty(int, notify=protocolVersionChanged)
def protocolVersion(self):
return self.m_protocolVersion
@protocolVersion.setter
def protocolVersion(self, protocolVersion):
if self.m_protocolVersion == protocolVersion: return
if protocolVersion in (MqttClient.MQTT_3_1, MQTT_3_1_1):
self.m_protocolVersion = protocolVersion
self.protocolVersionChanged.emit(protocolVersion)
#################################################################
@QtCore.pyqtSlot()
def connectToHost(self):
if self.m_hostname:
self.m_client.connect(self.m_hostname,
port=self.port,
keepalive=self.keepAlive)
self.state = MqttClient.Connecting
self.m_client.loop_start()
@QtCore.pyqtSlot()
def disconnectFromHost(self):
self.m_client.disconnect()
def subscribe(self, path):
if self.state == MqttClient.Connected:
self.m_client.subscribe(path)
#################################################################
# callbacks
def on_message(self, mqttc, obj, msg):
mstr = msg.payload.decode("ascii")
# print("on_message", mstr, obj, mqttc)
self.messageSignal.emit(mstr)
def on_connect(self, *args):
# print("on_connect", args)
self.state = MqttClient.Connected
self.connected.emit()
def on_disconnect(self, *args):
# print("on_disconnect", args)
self.state = MqttClient.Disconnected
self.disconnected.emit()